From c28cf8abef7afe64bbc97f1ac7c1f063ba55968e Mon Sep 17 00:00:00 2001 From: Phil Ewels Date: Mon, 7 Jun 2021 20:13:57 +0200 Subject: [PATCH 001/852] Copy over code for fetchngs. At first, this pipeline was called nf-core/fetchfastq. After initial release we found that this name was already taken by another bioinformatics tool. We took the decision to rename to nf-core/fetchngs. In this commit I am taking the released code with the new pipeline name and putting it into a single commit. --- .github/CONTRIBUTING.md | 4 +- .github/workflows/awsfulltest.yml | 8 +- .github/workflows/awstest.yml | 5 - .github/workflows/ci.yml | 34 ++++- .nf-core-lint.yaml | 13 ++ CHANGELOG.md | 25 +++- CITATIONS.md | 16 ++- README.md | 30 ++--- assets/schema_input.json | 36 +----- assets/sendmail_template.txt | 25 ---- bin/sra_ids_to_runinfo.py | 170 +++++++++++++++++++++++++ bin/sra_runinfo_to_ftp.py | 107 ++++++++++++++++ conf/base.config | 7 - conf/modules.config | 22 +++- conf/test.config | 7 +- conf/test_full.config | 7 +- docs/output.md | 50 ++------ docs/usage.md | 58 +++------ lib/NfcoreSchema.groovy | 3 +- lib/NfcoreTemplate.groovy | 26 +--- lib/WorkflowFetchngs.groovy | 57 +++------ lib/WorkflowMain.groovy | 22 +--- main.nf | 8 -- modules/local/sra_fastq_ftp.nf | 50 ++++++++ modules/local/sra_ids_to_runinfo.nf | 36 ++++++ modules/local/sra_merge_samplesheet.nf | 31 +++++ modules/local/sra_runinfo_to_ftp.nf | 30 +++++ modules/local/sra_to_samplesheet.nf | 54 ++++++++ nextflow.config | 25 +--- nextflow_schema.json | 84 +++--------- workflows/fetchngs.nf | 159 +++++++++++------------ 31 files changed, 748 insertions(+), 461 deletions(-) create mode 100644 .nf-core-lint.yaml create mode 100755 bin/sra_ids_to_runinfo.py create mode 100755 bin/sra_runinfo_to_ftp.py create mode 100644 modules/local/sra_fastq_ftp.nf create mode 100644 modules/local/sra_ids_to_runinfo.nf create mode 100644 modules/local/sra_merge_samplesheet.nf create mode 100644 modules/local/sra_runinfo_to_ftp.nf create mode 100644 modules/local/sra_to_samplesheet.nf diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 4d6668f2..981e9187 100755 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -75,9 +75,7 @@ If you wish to contribute a new step, please use the following coding standards: 8. Add any new software to the `scrape_software_versions.py` script in `bin/` and the version command to the `scrape_software_versions` process in `main.nf`. 9. Do local tests that the new code works properly and as expected. 10. Add a new test command in `.github/workflow/ci.yml`. -11. If applicable add a [MultiQC](https://https://multiqc.info/) module. -12. Update MultiQC config `assets/multiqc_config.yaml` so relevant suffixes, name clean up, General Statistics Table column order, and module figures are in the right order. -13. Optional: Add any descriptions of MultiQC report sections and output files to `docs/output.md`. +11. Add any descriptions of output files to `docs/output.md`. ### Default values diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index f69a0703..bd653ac5 100755 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -8,7 +8,6 @@ on: types: [published] workflow_dispatch: - env: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} @@ -17,7 +16,6 @@ env: AWS_JOB_QUEUE: ${{ secrets.AWS_JOB_QUEUE }} AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }} - jobs: run-awstest: name: Run AWS full tests @@ -32,14 +30,10 @@ jobs: - name: Install awscli run: conda install -c conda-forge awscli - name: Start AWS batch job - # TODO nf-core: You can customise AWS full pipeline tests as required - # Add full size test data (but still relatively small datasets for few samples) - # on the `test_full.config` test runs with only one set of parameters - # Then specify `-profile test_full` instead of `-profile test` on the AWS batch command run: | aws batch submit-job \ --region eu-west-1 \ --job-name nf-core-fetchngs \ --job-queue $AWS_JOB_QUEUE \ --job-definition $AWS_JOB_DEFINITION \ - --container-overrides '{"command": ["nf-core/fetchngs", "-r '"${GITHUB_SHA}"' -profile test --outdir s3://'"${AWS_S3_BUCKET}"'/fetchngs/results-'"${GITHUB_SHA}"' -w s3://'"${AWS_S3_BUCKET}"'/fetchngs/work-'"${GITHUB_SHA}"' -with-tower"], "environment": [{"name": "TOWER_ACCESS_TOKEN", "value": "'"$TOWER_ACCESS_TOKEN"'"}]}' + --container-overrides '{"command": ["nf-core/fetchngs", "-r '"${GITHUB_SHA}"' -profile test_full --outdir s3://'"${AWS_S3_BUCKET}"'/fetchngs/results-'"${GITHUB_SHA}"' -w s3://'"${AWS_S3_BUCKET}"'/fetchngs/work-'"${GITHUB_SHA}"' -with-tower"], "environment": [{"name": "TOWER_ACCESS_TOKEN", "value": "'"$TOWER_ACCESS_TOKEN"'"}]}' diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index 67ec91a9..79805554 100755 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -6,7 +6,6 @@ name: nf-core AWS test on: workflow_dispatch: - env: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} @@ -15,7 +14,6 @@ env: AWS_JOB_QUEUE: ${{ secrets.AWS_JOB_QUEUE }} AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }} - jobs: run-awstest: name: Run AWS tests @@ -30,9 +28,6 @@ jobs: - name: Install awscli run: conda install -c conda-forge awscli - name: Start AWS batch job - # TODO nf-core: You can customise CI pipeline run tests as required - # For example: adding multiple test runs with different parameters - # Remember that you can parallelise this by using strategy.matrix run: | aws batch submit-job \ --region eu-west-1 \ diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c01e1fce..d149562c 100755 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,7 +23,7 @@ jobs: strategy: matrix: # Nextflow versions: check pipeline minimum and current latest - nxf_ver: ['21.04.0', ''] + nxf_ver: ["21.04.0", ""] steps: - name: Check out pipeline code uses: actions/checkout@v2 @@ -36,8 +36,34 @@ jobs: sudo mv nextflow /usr/local/bin/ - name: Run pipeline with test data - # TODO nf-core: You can customise CI pipeline run tests as required - # For example: adding multiple test runs with different parameters - # Remember that you can parallelise this by using strategy.matrix run: | nextflow run ${GITHUB_WORKSPACE} -profile test,docker + + parameters: + name: Test workflow parameters + if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/fetchngs') }} + runs-on: ubuntu-latest + env: + NXF_VER: ${{ matrix.nxf_ver }} + NXF_ANSI_LOG: false + strategy: + matrix: + parameters: + [ + "--nf_core_pipeline rnaseq", + "--ena_metadata_fields run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5", + --skip_fastq_download, + ] + steps: + - name: Check out pipeline code + uses: actions/checkout@v2 + + - name: Install Nextflow + env: + CAPSULE_LOG: none + run: | + wget -qO- get.nextflow.io | bash + sudo mv nextflow /usr/local/bin/ + - name: Run pipeline with various parameters + run: | + nextflow run ${GITHUB_WORKSPACE} -profile test,docker ${{ matrix.parameters }} diff --git a/.nf-core-lint.yaml b/.nf-core-lint.yaml new file mode 100644 index 00000000..d472f25c --- /dev/null +++ b/.nf-core-lint.yaml @@ -0,0 +1,13 @@ +files_unchanged: + - .github/CONTRIBUTING.md + - .github/ISSUE_TEMPLATE/bug_report.md + - .github/PULL_REQUEST_TEMPLATE.md + - .github/workflows/linting.yml + - assets/sendmail_template.txt + - docs/README.md + - lib/NfcoreSchema.groovy + - .gitignore +files_exist: + - .github/markdownlint.yml + - bin/markdown_to_html.py +actions_awsfulltest: False diff --git a/CHANGELOG.md b/CHANGELOG.md index 15c9b7d6..04618e30 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,14 +3,29 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## v1.0dev - [date] +## [[1.0](https://github.com/nf-core/fetchngs/releases/tag/1.0)] - 2021-06-08 Initial release of nf-core/fetchngs, created with the [nf-core](https://nf-co.re/) template. -### `Added` +## Pipeline summary -### `Fixed` +Via a single file of ids, provided one-per-line the pipeline performs the following steps: -### `Dependencies` +1. Resolve database ids back to appropriate experiment-level ids and to be compatible with the [ENA API](https://ena-docs.readthedocs.io/en/latest/retrieval/programmatic-access.html) +2. Fetch extensive id metadata including direct download links to FastQ files via ENA API +3. Download FastQ files in parallel via `curl` and perform `md5sum` check +4. Collate id metadata and paths to FastQ files in a single samplesheet -### `Deprecated` +## Supported database ids + +Currently, the following types of example identifiers are supported: + +| `SRA` | `ENA` | `GEO` | +|--------------|--------------|------------| +| SRR11605097 | ERR4007730 | GSM4432381 | +| SRX8171613 | ERX4009132 | GSE147507 | +| SRS6531847 | ERS4399630 | | +| SAMN14689442 | SAMEA6638373 | | +| SRP256957 | ERP120836 | | +| SRA1068758 | ERA2420837 | | +| PRJNA625551 | PRJEB37513 | | diff --git a/CITATIONS.md b/CITATIONS.md index 523339ee..00f85a25 100755 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -10,10 +10,20 @@ ## Pipeline tools -* [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) +* [Python](http://www.python.org) -* [MultiQC](https://www.ncbi.nlm.nih.gov/pubmed/27312411/) - > Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. +* [Requests](https://docs.python-requests.org/) + +## Pipeline resources + +* [ENA](https://pubmed.ncbi.nlm.nih.gov/33175160/) + > Harrison PW, Ahamed A, Aslam R, Alako BTF, Burgin J, Buso N, Courtot M, Fan J, Gupta D, Haseeb M, Holt S, Ibrahim T, Ivanov E, Jayathilaka S, Kadhirvelu VB, Kumar M, Lopez R, Kay S, Leinonen R, Liu X, O'Cathail C, Pakseresht A, Park Y, Pesant S, Rahman N, Rajan J, Sokolov A, Vijayaraja S, Waheed Z, Zyoud A, Burdett T, Cochrane G. The European Nucleotide Archive in 2020. Nucleic Acids Res. 2021 Jan 8;49(D1):D82-D85. doi: 10.1093/nar/gkaa1028. PubMed PMID: 33175160; PubMed Central PMCID: PMC7778925. + +* [SRA](https://pubmed.ncbi.nlm.nih.gov/21062823/) + > Leinonen R, Sugawara H, Shumway M, International Nucleotide Sequence Database Collaboration. The sequence read archive. Nucleic Acids Res. 2011 Jan;39 (Database issue):D19-21. doi: 10.1093/nar/gkq1019. Epub 2010 Nov 9. PubMed PMID: 21062823; PubMed Central PMCID: PMC3013647. + +* [GEO](https://pubmed.ncbi.nlm.nih.gov/23193258/) + > Barrett T, Wilhite SE, Ledoux P, Evangelista C, Kim IF, Tomashevsky M, Marshall KA, Phillippy KH, Sherman PM, Holko M, Yefanov A, Lee H, Zhang N, Robertson CL, Serova N, Davis S, Soboleva A. NCBI GEO: archive for functional genomics data sets--update. Nucleic Acids Res. 2013 Jan;41(Database issue):D991-5. doi: 10.1093/nar/gks1193. Epub 2012 Nov 27. PubMed PMID: 23193258; PubMed Central PMCID: PMC3531084. ## Software packaging/containerisation tools diff --git a/README.md b/README.md index 598d2567..54fa6ed2 100755 --- a/README.md +++ b/README.md @@ -16,20 +16,22 @@ ## Introduction - -**nf-core/fetchngs** is a bioinformatics best-practice analysis pipeline for Pipeline to fetch metadata and raw FastQ files from public databases. +**nf-core/fetchngs** is a bioinformatics pipeline to fetch metadata and raw FastQ files from public databases. At present, the pipeline supports SRA / ENA / GEO ids (see [usage docs](https://nf-co.re/fetchngs/usage#introduction)). -The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. Where possible, these processes have been submitted to and installed from [nf-core/modules](https://github.com/nf-core/modules) in order to make them available to all nf-core pipelines, and to everyone within the Nextflow community! +The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. - On release, automated continuous integration tests run the pipeline on a full-sized dataset on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources. The results obtained from the full-sized test can be viewed on the [nf-core website](https://nf-co.re/fetchngs/results). ## Pipeline summary - +Via a single file of ids, provided one-per-line (see [example input file](https://raw.githubusercontent.com/nf-core/test-datasets/rnaseq/samplesheet/public_database_ids.txt)) the pipeline performs the following steps: -1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/)) -2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/)) +1. Resolve database ids back to appropriate experiment-level ids and to be compatible with the [ENA API](https://ena-docs.readthedocs.io/en/latest/retrieval/programmatic-access.html) +2. Fetch extensive id metadata including direct download links to FastQ files via ENA API +3. Download FastQ files in parallel via `curl` and perform `md5sum` check +4. Collate id metadata and paths to FastQ files in a single samplesheet + +The columns in the auto-created samplesheet can be tailored to be accepted out-of-the-box by selected nf-core pipelines, these currently include [nf-core/rnaseq](https://nf-co.re/rnaseq/usage#samplesheet-input) and [nf-core/viralrecon](https://nf-co.re/viralrecon/usage#illumina-samplesheet-format). You can use the `--nf_core_pipeline` parameter to customise this behaviour e.g. `--nf_core_pipeline rnaseq`. More pipelines will be supported in due course as we adopt and standardise samplesheet input across nf-core. ## Quick Start @@ -49,10 +51,8 @@ On release, automated continuous integration tests run the pipeline on a full-si 4. Start running your own analysis! - - ```console - nextflow run nf-core/fetchngs -profile --input samplesheet.csv --genome GRCh37 + nextflow run nf-core/fetchngs -profile --input ids.txt ``` ## Documentation @@ -61,11 +61,7 @@ The nf-core/fetchngs pipeline comes with documentation about the pipeline [usage ## Credits -nf-core/fetchngs was originally written by Harshil Patel. - -We thank the following people for their extensive assistance in the development of this pipeline: - - +nf-core/fetchngs was originally written by Harshil Patel ([@drpatelh](https://github.com/drpatelh)) from [The Bioinformatics & Biostatistics Group](https://www.crick.ac.uk/research/science-technology-platforms/bioinformatics-and-biostatistics/) at [The Francis Crick Institute, London](https://www.crick.ac.uk/) and Jose Espinosa-Carrasco ([@JoseEspinosa](https://github.com/JoseEspinosa)) from [The Comparative Bioinformatics Group](https://www.crg.eu/en/cedric_notredame) at [The Centre for Genomic Regulation, Spain](https://www.crg.eu/). ## Contributions and Support @@ -75,10 +71,8 @@ For further information or help, don't hesitate to get in touch on the [Slack `# ## Citations - - +If you use nf-core/fetchngs for your analysis, please cite it using the following doi: [10.5281/zenodo.XXXXXX](https://doi.org/10.5281/zenodo.XXXXXX) - An extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file. You can cite the `nf-core` publication as follows: diff --git a/assets/schema_input.json b/assets/schema_input.json index a3eb1209..b4141272 100755 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -5,35 +5,11 @@ "description": "Schema for the file provided with params.input", "type": "array", "items": { - "type": "object", - "properties": { - "sample": { - "type": "string", - "pattern": "^\\S+$", - "errorMessage": "Sample name must be provided and cannot contain spaces" - }, - "fastq_1": { - "type": "string", - "pattern": "^\\S+\\.f(ast)?q\\.gz$", - "errorMessage": "FastQ file for reads 1 must be provided, cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz'" - }, - "fastq_2": { - "errorMessage": "FastQ file for reads 2 cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz'", - "anyOf": [ - { - "type": "string", - "pattern": "^\\S+\\.f(ast)?q\\.gz$" - }, - { - "type": "string", - "maxLength": 0 - } - ] - } - }, - "required": [ - "sample", - "fastq_1" - ] + "type": "array", + "items": { + "type": "string", + "pattern": "^[SEPG][RAS][RXSMPAJXE][EN]?[AB]?\\d{4,9}$", + "errorMessage": "Please provide a valid SRA, GEO or ENA identifier" + } } } diff --git a/assets/sendmail_template.txt b/assets/sendmail_template.txt index 5e636e55..0c0ebc2c 100755 --- a/assets/sendmail_template.txt +++ b/assets/sendmail_template.txt @@ -25,29 +25,4 @@ Content-Disposition: inline; filename="nf-core-fetchngs_logo.png" flatten(). join( '\n' ) %> -<% -if (mqcFile){ -def mqcFileObj = new File("$mqcFile") -if (mqcFileObj.length() < mqcMaxSize){ -out << """ ---nfcoremimeboundary -Content-Type: text/html; name=\"multiqc_report\" -Content-Transfer-Encoding: base64 -Content-ID: -Content-Disposition: attachment; filename=\"${mqcFileObj.getName()}\" - -${mqcFileObj. - bytes. - encodeBase64(). - toString(). - tokenize( '\n' )*. - toList()*. - collate( 76 )*. - collect { it.join() }. - flatten(). - join( '\n' )} -""" -}} -%> - --nfcoremimeboundary-- diff --git a/bin/sra_ids_to_runinfo.py b/bin/sra_ids_to_runinfo.py new file mode 100755 index 00000000..f78eb31f --- /dev/null +++ b/bin/sra_ids_to_runinfo.py @@ -0,0 +1,170 @@ +#!/usr/bin/env python + +import os +import re +import sys +import csv +import errno +import requests +import argparse + +## Example ids supported by this script +SRA_IDS = ['PRJNA63463', 'SAMN00765663', 'SRA023522', 'SRP003255', 'SRR390278', 'SRS282569', 'SRX111814'] +ENA_IDS = ['ERA2421642', 'ERP120836', 'ERR674736', 'ERS4399631', 'ERX629702', 'PRJEB7743', 'SAMEA3121481'] +GEO_IDS = ['GSE18729', 'GSM465244'] +ID_REGEX = r'^[A-Z]+' +PREFIX_LIST = sorted(list(set([re.search(ID_REGEX,x).group() for x in SRA_IDS + ENA_IDS + GEO_IDS]))) + +## List of meta fields fetched from the ENA API - can be overriden by --ena_metadata_fields +## Full list of accepted fields can be obtained here: https://www.ebi.ac.uk/ena/portal/api/returnFields?dataPortal=ena&format=tsv&result=read_run +ENA_METADATA_FIELDS = [ + 'accession', 'run_accession', 'experiment_accession', 'sample_accession', 'secondary_sample_accession', 'study_accession', 'secondary_study_accession', 'parent_study', 'submission_accession', + 'run_alias', 'experiment_alias', 'sample_alias', 'study_alias', + 'library_layout', 'library_selection', 'library_source', 'library_strategy', 'library_name', + 'instrument_model', 'instrument_platform', + 'base_count', 'read_count', + 'tax_id', 'scientific_name', + 'sample_title', 'experiment_title', 'study_title', + 'description', 'sample_description', + 'fastq_md5', 'fastq_bytes', 'fastq_ftp', 'fastq_galaxy', 'fastq_aspera' +] + +def parse_args(args=None): + Description = 'Download and create a run information metadata file from SRA/ENA/GEO identifiers.' + Epilog = 'Example usage: python fetch_sra_runinfo.py ' + + parser = argparse.ArgumentParser(description=Description, epilog=Epilog) + parser.add_argument('FILE_IN', help="File containing database identifiers, one per line.") + parser.add_argument('FILE_OUT', help="Output file in tab-delimited format.") + parser.add_argument('-ef', '--ena_metadata_fields', type=str, dest="ENA_METADATA_FIELDS", default='', help="Comma-separated list of ENA metadata fields to fetch. (default: {}).".format(','.join(ENA_METADATA_FIELDS))) + return parser.parse_args(args) + +def validate_csv_param(param, valid_vals, param_desc): + valid_list = [] + if param: + user_vals = param.split(',') + intersect = [i for i in user_vals if i in valid_vals] + if len(intersect) == len(user_vals): + valid_list = intersect + else: + print("ERROR: Please provide a valid value for {}!\nProvided values = {}\nAccepted values = {}".format(param_desc,param,','.join(valid_vals))) + sys.exit(1) + return valid_list + +def make_dir(path): + if not len(path) == 0: + try: + os.makedirs(path) + except OSError as exception: + if exception.errno != errno.EEXIST: + raise + +def fetch_url(url, encoding='utf-8'): + try: + r = requests.get(url) + except requests.exceptions.RequestException as e: + raise SystemExit(e) + if r.status_code != 200: + print("ERROR: Connection failed\nError code '{}'".format(r.status_code)) + sys.exit(1) + return r.content.decode(encoding).splitlines() + +def id_to_srx(db_id): + ids = [] + url = 'https://trace.ncbi.nlm.nih.gov/Traces/sra/sra.cgi?save=efetch&db=sra&rettype=runinfo&term={}'.format(db_id) + for row in csv.DictReader(fetch_url(url), delimiter=','): + ids.append(row['Experiment']) + return ids + +def id_to_erx(db_id): + ids = [] + fields = ['run_accession', 'experiment_accession'] + url = 'http://www.ebi.ac.uk/ena/data/warehouse/filereport?accession={}&result=read_run&fields={}'.format(db_id,','.join(fields)) + for row in csv.DictReader(fetch_url(url), delimiter='\t'): + ids.append(row['experiment_accession']) + return ids + +def gse_to_srx(db_id): + ids = [] + url = 'https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc={}&targ=gsm&view=data&form=text'.format(db_id) + gsm_ids = [x.split('=')[1].strip() for x in fetch_url(url) if x.find('GSM') != -1] + for gsm_id in gsm_ids: + ids += id_to_srx(gsm_id) + return ids + +def get_ena_fields(): + fields = [] + url = 'https://www.ebi.ac.uk/ena/portal/api/returnFields?dataPortal=ena&format=tsv&result=read_run' + for row in csv.DictReader(fetch_url(url), delimiter='\t'): + fields.append(row['columnId']) + return fields + +def fetch_sra_runinfo(file_in, file_out, ena_metadata_fields=ENA_METADATA_FIELDS): + total_out = 0 + seen_ids = []; run_ids = [] + header = [] + make_dir(os.path.dirname(file_out)) + with open(file_in,"r") as fin, open(file_out,"w") as fout: + for line in fin: + db_id = line.strip() + match = re.search(ID_REGEX, db_id) + if match: + prefix = match.group() + if prefix in PREFIX_LIST: + if not db_id in seen_ids: + + ids = [db_id] + ## Resolve/expand these ids against GEO URL + if prefix in ['GSE']: + ids = gse_to_srx(db_id) + + ## Resolve/expand these ids against SRA URL + elif prefix in ['GSM', 'PRJNA', 'SAMN', 'SRR']: + ids = id_to_srx(db_id) + + ## Resolve/expand these ids against ENA URL + elif prefix in ['ERR']: + ids = id_to_erx(db_id) + + ## Resolve/expand to get run identifier from ENA and write to file + for id in ids: + url = 'http://www.ebi.ac.uk/ena/data/warehouse/filereport?accession={}&result=read_run&fields={}'.format(id,','.join(ena_metadata_fields)) + csv_dict = csv.DictReader(fetch_url(url), delimiter='\t') + for row in csv_dict: + run_id = row['run_accession'] + if not run_id in run_ids: + if total_out == 0: + header = row.keys() + fout.write('{}\n'.format('\t'.join(header))) + else: + if header != row.keys(): + print("ERROR: Metadata columns do not match for id {}!\nLine: '{}'".format(run_id,line.strip())) + sys.exit(1) + fout.write('{}\n'.format('\t'.join([row[x] for x in header]))) + total_out += 1 + run_ids.append(run_id) + seen_ids.append(db_id) + + if not ids: + print("ERROR: No matches found for database id {}!\nLine: '{}'".format(db_id,line.strip())) + sys.exit(1) + + else: + id_str = ', '.join([x + "*" for x in PREFIX_LIST]) + print("ERROR: Please provide a valid database id starting with {}!\nLine: '{}'".format(id_str,line.strip())) + sys.exit(1) + else: + id_str = ', '.join([x + "*" for x in PREFIX_LIST]) + print("ERROR: Please provide a valid database id starting with {}!\nLine: '{}'".format(id_str,line.strip())) + sys.exit(1) + +def main(args=None): + args = parse_args(args) + ena_metadata_fields = args.ENA_METADATA_FIELDS + if not args.ENA_METADATA_FIELDS: + ena_metadata_fields = ','.join(ENA_METADATA_FIELDS) + ena_metadata_fields = validate_csv_param(ena_metadata_fields, valid_vals=get_ena_fields(), param_desc='--ena_metadata_fields') + fetch_sra_runinfo(args.FILE_IN, args.FILE_OUT, ena_metadata_fields) + +if __name__ == '__main__': + sys.exit(main()) diff --git a/bin/sra_runinfo_to_ftp.py b/bin/sra_runinfo_to_ftp.py new file mode 100755 index 00000000..a6f02136 --- /dev/null +++ b/bin/sra_runinfo_to_ftp.py @@ -0,0 +1,107 @@ +#!/usr/bin/env python + +import os +import sys +import errno +import argparse +import collections + +def parse_args(args=None): + Description = "Create samplesheet with FTP download links and md5ums from sample information obtained via 'sra_ids_to_runinfo.py' script." + Epilog = 'Example usage: python sra_runinfo_to_ftp.py ' + + parser = argparse.ArgumentParser(description=Description, epilog=Epilog) + parser.add_argument('FILES_IN', help="Comma-separated list of metadata file created from 'sra_ids_to_runinfo.py' script.") + parser.add_argument('FILE_OUT', help="Output file containing paths to download FastQ files along with their associated md5sums.") + return parser.parse_args(args) + +def make_dir(path): + if not len(path) == 0: + try: + os.makedirs(path) + except OSError as exception: + if exception.errno != errno.EEXIST: + raise + +def parse_sra_runinfo(file_in): + runinfo_dict = {} + with open(file_in, "r") as fin: + header = fin.readline().strip().split('\t') + for line in fin: + line_dict = dict(zip(header,line.strip().split('\t'))) + line_dict = collections.OrderedDict(list(line_dict.items())) + run_id = line_dict['run_accession'] + exp_id = line_dict['experiment_accession'] + library = line_dict['library_layout'] + fastq_files = line_dict['fastq_ftp'] + fastq_md5 = line_dict['fastq_md5'] + + db_id = exp_id + sample_dict = collections.OrderedDict() + if library == 'SINGLE': + sample_dict = collections.OrderedDict([('fastq_1',''), ('fastq_2',''), ('md5_1',''), ('md5_2',''), ('single_end','true')]) + if fastq_files: + sample_dict['fastq_1'] = fastq_files + sample_dict['md5_1'] = fastq_md5 + else: + ## In some instances FTP links don't exist for FastQ files + ## These have to be downloaded via fastq-dump / fasterq-dump / parallel-fastq-dump via the run id + db_id = run_id + + elif library == 'PAIRED': + sample_dict = collections.OrderedDict([('fastq_1',''), ('fastq_2',''), ('md5_1',''), ('md5_2',''), ('single_end','false')]) + if fastq_files: + fq_files = fastq_files.split(';')[-2:] + fq_md5 = fastq_md5.split(';')[-2:] + if len(fq_files) == 2: + if fq_files[0].find('_1.fastq.gz') != -1 and fq_files[1].find('_2.fastq.gz') != -1: + sample_dict['fastq_1'] = fq_files[0] + sample_dict['fastq_2'] = fq_files[1] + sample_dict['md5_1'] = fq_md5[0] + sample_dict['md5_2'] = fq_md5[1] + else: + print("Invalid FastQ files found for database id:'{}'!.".format(run_id)) + else: + print("Invalid number of FastQ files ({}) found for paired-end database id:'{}'!.".format(len(fq_files), run_id)) + else: + db_id = run_id + + if sample_dict: + sample_dict.update(line_dict) + if db_id not in runinfo_dict: + runinfo_dict[db_id] = [sample_dict] + else: + if sample_dict in runinfo_dict[db_id]: + print("Input run info file contains duplicate rows!\nLine: '{}'".format(line)) + else: + runinfo_dict[db_id].append(sample_dict) + + return runinfo_dict + +def sra_runinfo_to_ftp(files_in, file_out): + samplesheet_dict = {} + for file_in in files_in: + runinfo_dict = parse_sra_runinfo(file_in) + for db_id in runinfo_dict.keys(): + if db_id not in samplesheet_dict: + samplesheet_dict[db_id] = runinfo_dict[db_id] + else: + print("Duplicate sample identifier found!\nID: '{}'".format(db_id)) + + ## Write samplesheet with paths to FastQ files and md5 sums + if samplesheet_dict: + out_dir = os.path.dirname(file_out) + make_dir(out_dir) + with open(file_out, "w") as fout: + header = ['id'] + list(samplesheet_dict[list(samplesheet_dict.keys())[0]][0].keys()) + fout.write("\t".join(header) + "\n") + for db_id in sorted(samplesheet_dict.keys()): + for idx,val in enumerate(samplesheet_dict[db_id]): + fout.write('\t'.join(["{}_T{}".format(db_id,idx+1)] + [val[x] for x in header[1:]]) + '\n') + +def main(args=None): + args = parse_args(args) + sra_runinfo_to_ftp([x.strip() for x in args.FILES_IN.split(',')], args.FILE_OUT) + +if __name__ == '__main__': + sys.exit(main()) diff --git a/conf/base.config b/conf/base.config index a4d68207..bfff487a 100755 --- a/conf/base.config +++ b/conf/base.config @@ -10,7 +10,6 @@ process { - // TODO nf-core: Check the defaults for all processes cpus = { check_max( 1 * task.attempt, 'cpus' ) } memory = { check_max( 6.GB * task.attempt, 'memory' ) } time = { check_max( 4.h * task.attempt, 'time' ) } @@ -20,12 +19,6 @@ process { maxErrors = '-1' // Process-specific resource requirements - // NOTE - Please try and re-use the labels below as much as possible. - // These labels are used and recognised by default in DSL2 files hosted on nf-core/modules. - // If possible, it would be nice to keep the same label naming convention when - // adding in your local modules too. - // TODO nf-core: Customise requirements for specific processes. - // See https://www.nextflow.io/docs/latest/config.html#config-process-selectors withLabel:process_low { cpus = { check_max( 2 * task.attempt, 'cpus' ) } memory = { check_max( 12.GB * task.attempt, 'memory' ) } diff --git a/conf/modules.config b/conf/modules.config index 0b1bfdec..4059a911 100755 --- a/conf/modules.config +++ b/conf/modules.config @@ -22,11 +22,25 @@ params { modules { - 'fastqc' { - args = "--quiet" + 'sra_ids_to_runinfo' { + publish_dir = 'metadata' + publish_files = false } - 'multiqc' { - args = "" + 'sra_runinfo_to_ftp' { + publish_dir = 'metadata' + publish_files = ['tsv':''] + } + 'sra_fastq_ftp' { + publish_dir = 'fastq' + publish_files = ['fastq.gz':'', 'md5':'md5'] + args = '-C - --max-time 1200' + } + 'sra_to_samplesheet' { + publish_dir = 'samplesheet' + publish_files = false + } + 'sra_merge_samplesheet' { + publish_dir = 'samplesheet' } } } diff --git a/conf/test.config b/conf/test.config index 8fadc49c..ee909409 100755 --- a/conf/test.config +++ b/conf/test.config @@ -20,10 +20,5 @@ params { max_time = 6.h // Input data - // TODO nf-core: Specify the paths to your test data on nf-core/test-datasets - // TODO nf-core: Give any required params for the test so that command line flags are not needed - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv' - - // Genome references - genome = 'R64-1-1' + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/rnaseq/samplesheet/public_database_ids.txt' } diff --git a/conf/test_full.config b/conf/test_full.config index 759deae1..a5aea2dc 100755 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -15,10 +15,5 @@ params { config_profile_description = 'Full test dataset to check pipeline function' // Input data for full size test - // TODO nf-core: Specify the paths to your full test data ( on nf-core/test-datasets or directly in repositories, e.g. SRA) - // TODO nf-core: Give any required params for the test so that command line flags are not needed - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/viralrecon/samplesheet/samplesheet_full_illumina_amplicon.csv' - - // Genome references - genome = 'R64-1-1' + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/rnaseq/samplesheet/public_database_ids.txt' } diff --git a/docs/output.md b/docs/output.md index fa3c1cd8..f2cc20a5 100755 --- a/docs/output.md +++ b/docs/output.md @@ -2,56 +2,33 @@ ## Introduction -This document describes the output produced by the pipeline. Most of the plots are taken from the MultiQC report, which summarises results at the end of the pipeline. - -The directories listed below will be created in the results directory after the pipeline has finished. All paths are relative to the top-level results directory. - - +This document describes the output produced by the pipeline. The directories listed below will be created in the results directory after the pipeline has finished. All paths are relative to the top-level results directory. ## Pipeline overview The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using the following steps: -* [FastQC](#fastqc) - Raw read QC -* [MultiQC](#multiqc) - Aggregate report describing results and QC from the whole pipeline +* [FastQ download](#fastq-download) - Download FastQ files via SRA / ENA / GEO ids * [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution -### FastQC +### FastQ download
Output files -* `fastqc/` - * `*_fastqc.html`: FastQC report containing quality metrics. - * `*_fastqc.zip`: Zip archive containing the FastQC report, tab-delimited data file and plot images. +* `fastq/` + * `*.fastq.gz`: Paired-end/single-end reads downloaded from the ENA / SRA. +* `fastq/md5/` + * `*.md5`: Files containing `md5` sum for FastQ files downloaded from the ENA / SRA. +* `samplesheet/` + * `samplesheet.csv`: Auto-created samplesheet with collated metadata and paths to downloaded FastQ files. +* `metadata/` + * `*.runinfo_ftp.tsv`: Re-formatted metadata file downloaded from the ENA + * `*.runinfo.tsv`: Original metadata file downloaded from the ENA
-[FastQC](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/) gives general quality metrics about your sequenced reads. It provides information about the quality score distribution across your reads, per base sequence content (%A/T/G/C), adapter contamination and overrepresented sequences. For further reading and documentation see the [FastQC help pages](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/). - -![MultiQC - FastQC sequence counts plot](images/mqc_fastqc_counts.png) - -![MultiQC - FastQC mean quality scores plot](images/mqc_fastqc_quality.png) - -![MultiQC - FastQC adapter content plot](images/mqc_fastqc_adapter.png) - -> **NB:** The FastQC plots displayed in the MultiQC report shows _untrimmed_ reads. They may contain adapter sequence and potentially regions with low quality. - -### MultiQC - -
-Output files - -* `multiqc/` - * `multiqc_report.html`: a standalone HTML file that can be viewed in your web browser. - * `multiqc_data/`: directory containing parsed statistics from the different tools used in the pipeline. - * `multiqc_plots/`: directory containing static images from the report in various formats. - -
- -[MultiQC](http://multiqc.info) is a visualization tool that generates a single HTML report summarising all samples in your project. Most of the pipeline QC results are visualised in the report and further statistics are available in the report data directory. - -Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQC. The pipeline has special steps which also allow the software versions to be reported in the MultiQC output for future traceability. For more information about how to use MultiQC reports, see . +Please see the [usage documentation](https://nf-co.re/fetchngs/usage#introduction) for a list of supported public repository identifiers and how to provide them to the pipeline. The final sample information for all identifiers is obtained from the ENA which provides direct download links for FastQ files as well as their associated md5sums. If download links exist, the files will be downloaded in parallel by FTP otherwise they will NOT be downloaded. This is intentional because the tools such as `parallel-fastq-dump`, `fasterq-dump`, `prefetch` etc require pre-existing configuration files in the users home directory which makes automation tricky across different platforms and containerisation. ### Pipeline information @@ -61,7 +38,6 @@ Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQ * `pipeline_info/` * Reports generated by Nextflow: `execution_report.html`, `execution_timeline.html`, `execution_trace.txt` and `pipeline_dag.dot`/`pipeline_dag.svg`. * Reports generated by the pipeline: `pipeline_report.html`, `pipeline_report.txt` and `software_versions.csv`. - * Reformatted samplesheet files used as input to the pipeline: `samplesheet.valid.csv`. diff --git a/docs/usage.md b/docs/usage.md index e75b575e..68c1422d 100755 --- a/docs/usage.md +++ b/docs/usage.md @@ -6,58 +6,40 @@ ## Introduction - +The pipeline has been set-up to automatically download and process the raw FastQ files from public repositories. Identifiers can be provided in a file, one-per-line via the `--input` parameter. Currently, the following types of example identifiers are supported: -## Samplesheet input +| `SRA` | `ENA` | `GEO` | +|--------------|--------------|------------| +| SRR11605097 | ERR4007730 | GSM4432381 | +| SRX8171613 | ERX4009132 | GSE147507 | +| SRS6531847 | ERS4399630 | | +| SAMN14689442 | SAMEA6638373 | | +| SRP256957 | ERP120836 | | +| SRA1068758 | ERA2420837 | | +| PRJNA625551 | PRJEB37513 | | -You will need to create a samplesheet with information about the samples you would like to analyse before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 3 columns, and a header row as shown in the examples below. +If `SRR`/`ERR` run ids are provided then these will be resolved back to their appropriate `SRX`/`ERX` ids to be able to merge multiple runs from the same experiment. This is conceptually the same as merging multiple libraries sequenced from the same sample. -```bash ---input '[path to samplesheet file]' -``` - -### Multiple runs of the same sample - -The `sample` identifiers have to be the same when you have re-sequenced the same sample more than once e.g. to increase sequencing depth. The pipeline will concatenate the raw reads before performing any downstream analysis. Below is an example for the same sample sequenced across 3 lanes: - -```bash -sample,fastq_1,fastq_2 -CONTROL_REP1,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz -CONTROL_REP1,AEG588A1_S1_L003_R1_001.fastq.gz,AEG588A1_S1_L003_R2_001.fastq.gz -CONTROL_REP1,AEG588A1_S1_L004_R1_001.fastq.gz,AEG588A1_S1_L004_R2_001.fastq.gz -``` - -### Full samplesheet +The final sample information for all identifiers is obtained from the ENA which provides direct download links for FastQ files as well as their associated md5 sums. If download links exist, the files will be downloaded in parallel by FTP otherwise they will NOT be downloaded. This is intentional because tools such as `parallel-fastq-dump`, `fasterq-dump`, `prefetch` etc require pre-existing configuration files in the users home directory which makes automation tricky across different platforms and containerisation. We may add this functionality in later releases. -The pipeline will auto-detect whether a sample is single- or paired-end using the information provided in the samplesheet. The samplesheet can have as many columns as you desire, however, there is a strict requirement for the first 3 columns to match those defined in the table below. +As a bonus, the columns in the auto-created samplesheet can be tailored to be accepted out-of-the-box by selected nf-core pipelines, these currently include [nf-core/rnaseq](https://nf-co.re/rnaseq/usage#samplesheet-input) and [nf-core/viralrecon](https://nf-co.re/viralrecon/usage#illumina-samplesheet-format). You can use the `--nf_core_pipeline` parameter to customise this behaviour e.g. `--nf_core_pipeline rnaseq`. More pipelines will be supported in due course as we adopt and standardise samplesheet input across nf-core. It is highly recommended that you double-check that all of the identifiers you defined using `--input` are represented in the samplesheet. Also, public databases don't reliably hold information such as strandedness information so you may need to amend these entries too if for example your samplesheet was created by providing `--nf_core_pipeline rnaseq`. -A final samplesheet file consisting of both single- and paired-end data may look something like the one below. This is for 6 samples, where `TREATMENT_REP3` has been sequenced twice. +All of the sample metadata obtained from the ENA will be appended as additional columns to help you manually curate the samplesheet before you run the pipeline. You can customise the metadata fields that are appended to the samplesheet via the `--ena_metadata_fields` parameter. The default list of fields used by the pipeline can be found at the top of the [`bin/sra_ids_to_runinfo.py`](https://github.com/nf-core/fetchngs/blob/master/bin/sra_ids_to_runinfo.py) script within the pipeline repo. However, this pipeline requires a minimal set of fields to download FastQ files i.e. `'run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5'`. A comprehensive list of accepted metadata fields can be obtained from the [ENA API](https://www.ebi.ac.uk/ena/portal/api/returnFields?dataPortal=ena&format=tsv&result=read_run]). -```bash -sample,fastq_1,fastq_2 -CONTROL_REP1,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz -CONTROL_REP2,AEG588A2_S2_L002_R1_001.fastq.gz,AEG588A2_S2_L002_R2_001.fastq.gz -CONTROL_REP3,AEG588A3_S3_L002_R1_001.fastq.gz,AEG588A3_S3_L002_R2_001.fastq.gz -TREATMENT_REP1,AEG588A4_S4_L003_R1_001.fastq.gz, -TREATMENT_REP2,AEG588A5_S5_L003_R1_001.fastq.gz, -TREATMENT_REP3,AEG588A6_S6_L003_R1_001.fastq.gz, -TREATMENT_REP3,AEG588A6_S6_L004_R1_001.fastq.gz, -``` +If you have a GEO accession (found in the data availability section of published papers) you can directly download a text file containing the appropriate SRA ids to pass to the pipeline: -| Column | Description | -|----------------|-----------------------------------------------------------------------------------------------------------------------------| -| `sample` | Custom sample name. This entry will be identical for multiple sequencing libraries/runs from the same sample. | -| `fastq_1` | Full path to FastQ file for Illumina short reads 1. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | -| `fastq_2` | Full path to FastQ file for Illumina short reads 2. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | +* Search for your GEO accession on [GEO](https://www.ncbi.nlm.nih.gov/geo) +* Click `SRA Run Selector` at the bottom of the GEO accession page +* Select the desired samples in the `SRA Run Selector` and then download the `Accession List` -An [example samplesheet](../assets/samplesheet.csv) has been provided with the pipeline. +This downloads a text file called `SRR_Acc_List.txt` which can be directly provided to the pipeline e.g. `--public_data_ids SRR_Acc_List.txt`. ## Running the pipeline The typical command for running the pipeline is as follows: ```bash -nextflow run nf-core/fetchngs --input samplesheet.csv --genome GRCh37 -profile docker +nextflow run nf-core/fetchngs --input ids.txt -profile docker ``` This will launch the pipeline with the `docker` configuration profile. See below for more information about profiles. diff --git a/lib/NfcoreSchema.groovy b/lib/NfcoreSchema.groovy index 16986434..8d6920dd 100755 --- a/lib/NfcoreSchema.groovy +++ b/lib/NfcoreSchema.groovy @@ -121,7 +121,8 @@ class NfcoreSchema { def params_ignore = params.schema_ignore_params.split(',') + 'schema_ignore_params' def expectedParamsLowerCase = expectedParams.collect{ it.replace("-", "").toLowerCase() } def specifiedParamLowerCase = specifiedParam.replace("-", "").toLowerCase() - if (!expectedParams.contains(specifiedParam) && !params_ignore.contains(specifiedParam) && !expectedParamsLowerCase.contains(specifiedParamLowerCase)) { + def isCamelCaseBug = (specifiedParam.contains("-") && !expectedParams.contains(specifiedParam) && expectedParamsLowerCase.contains(specifiedParamLowerCase)) + if (!expectedParams.contains(specifiedParam) && !params_ignore.contains(specifiedParam) && !isCamelCaseBug) { // Temporarily remove camelCase/camel-case params #1035 def unexpectedParamsLowerCase = unexpectedParams.collect{ it.replace("-", "").toLowerCase()} if (!unexpectedParamsLowerCase.contains(specifiedParamLowerCase)){ diff --git a/lib/NfcoreTemplate.groovy b/lib/NfcoreTemplate.groovy index b6e689ec..b8fd59ab 100755 --- a/lib/NfcoreTemplate.groovy +++ b/lib/NfcoreTemplate.groovy @@ -42,7 +42,7 @@ class NfcoreTemplate { // // Construct and send completion email // - public static void email(workflow, params, summary_params, projectDir, log, multiqc_report=[]) { + public static void email(workflow, params, summary_params, projectDir, log) { // Set up the e-mail variables def subject = "[$workflow.manifest.name] Successful: $workflow.runName" @@ -80,24 +80,6 @@ class NfcoreTemplate { email_fields['projectDir'] = workflow.projectDir email_fields['summary'] = summary << misc_fields - // On success try attach the multiqc report - def mqc_report = null - try { - if (workflow.success) { - mqc_report = multiqc_report.getVal() - if (mqc_report.getClass() == ArrayList && mqc_report.size() >= 1) { - if (mqc_report.size() > 1) { - log.warn "[$workflow.manifest.name] Found multiple reports from process 'MULTIQC', will use only one" - } - mqc_report = mqc_report[0] - } - } - } catch (all) { - if (multiqc_report) { - log.warn "[$workflow.manifest.name] Could not attach MultiQC report to summary email" - } - } - // Check if we are only sending emails on failure def email_address = params.email if (!params.email && params.email_on_fail && !workflow.success) { @@ -116,8 +98,7 @@ class NfcoreTemplate { def email_html = html_template.toString() // Render the sendmail template - def max_multiqc_email_size = params.max_multiqc_email_size as nextflow.util.MemoryUnit - def smail_fields = [ email: email_address, subject: subject, email_txt: email_txt, email_html: email_html, projectDir: "$projectDir", mqcFile: mqc_report, mqcMaxSize: max_multiqc_email_size.toBytes() ] + def smail_fields = [ email: email_address, subject: subject, email_txt: email_txt, email_html: email_html, projectDir: "$projectDir" ] def sf = new File("$projectDir/assets/sendmail_template.txt") def sendmail_template = engine.createTemplate(sf).make(smail_fields) def sendmail_html = sendmail_template.toString() @@ -133,9 +114,6 @@ class NfcoreTemplate { } catch (all) { // Catch failures and try with plaintext def mail_cmd = [ 'mail', '-s', subject, '--content-type=text/html', email_address ] - if ( mqc_report.size() <= max_multiqc_email_size.toBytes() ) { - mail_cmd += [ '-A', mqc_report ] - } mail_cmd.execute() << email_html log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Sent summary e-mail to $email_address (mail)-" } diff --git a/lib/WorkflowFetchngs.groovy b/lib/WorkflowFetchngs.groovy index bd9b9ebe..ccff938b 100755 --- a/lib/WorkflowFetchngs.groovy +++ b/lib/WorkflowFetchngs.groovy @@ -7,53 +7,26 @@ class WorkflowFetchngs { // // Check and validate parameters // - public static void initialise(params, log) { - genomeExistsError(params, log) - - if (!params.fasta) { - log.error "Genome fasta file not specified with e.g. '--fasta genome.fa' or via a detectable config file." + public static void initialise(params, log, valid_params) { + // Check minimal ENA fields are provided to download FastQ files + def ena_metadata_fields = params.ena_metadata_fields ? params.ena_metadata_fields.split(',').collect{ it.trim().toLowerCase() } : valid_params['ena_metadata_fields'] + if (!ena_metadata_fields.containsAll(valid_params['ena_metadata_fields'])) { + log.error "Invalid option: '${params.ena_metadata_fields}'. Minimally required fields for '--ena_metadata_fields': '${valid_params['ena_metadata_fields'].join(',')}'" System.exit(1) } } // - // Get workflow summary for MultiQC + // Print a warning after pipeline has completed // - public static String paramsSummaryMultiqc(workflow, summary) { - String summary_section = '' - for (group in summary.keySet()) { - def group_params = summary.get(group) // This gets the parameters of that particular group - if (group_params) { - summary_section += "

$group

\n" - summary_section += "
\n" - for (param in group_params.keySet()) { - summary_section += "
$param
${group_params.get(param) ?: 'N/A'}
\n" - } - summary_section += "
\n" - } - } - - String yaml_file_text = "id: '${workflow.manifest.name.replace('/','-')}-summary'\n" - yaml_file_text += "description: ' - this information is collected when the pipeline is started.'\n" - yaml_file_text += "section_name: '${workflow.manifest.name} Workflow Summary'\n" - yaml_file_text += "section_href: 'https://github.com/${workflow.manifest.name}'\n" - yaml_file_text += "plot_type: 'html'\n" - yaml_file_text += "data: |\n" - yaml_file_text += "${summary_section}" - return yaml_file_text - } - - // - // Exit pipeline if incorrect --genome key provided - // - private static void genomeExistsError(params, log) { - if (params.genomes && params.genome && !params.genomes.containsKey(params.genome)) { - log.error "=============================================================================\n" + - " Genome '${params.genome}' not found in any config files provided to the pipeline.\n" + - " Currently, the available genome keys are:\n" + - " ${params.genomes.keySet().join(", ")}\n" + - "===================================================================================" - System.exit(1) - } + public static void curateSamplesheetWarn(log) { + log.warn "=============================================================================\n" + + " Please double-check the samplesheet that has been auto-created by the pipeline.\n\n" + + " Public databases don't reliably hold information such as strandedness\n" + + " information, controls etc\n\n" + + " All of the sample metadata obtained from the ENA has been appended\n" + + " as additional columns to help you manually curate the samplesheet before\n" + + " running nf-core/other pipelines.\n" + + "===================================================================================" } } diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index e8304ec2..a15e60d8 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -9,9 +9,8 @@ class WorkflowMain { // public static String citation(workflow) { return "If you use ${workflow.manifest.name} for your analysis please cite:\n\n" + - // TODO nf-core: Add Zenodo DOI for pipeline after first release - //"* The pipeline\n" + - //" https://doi.org/10.5281/zenodo.XXXXXXX\n\n" + + "* The pipeline\n" + + " https://doi.org/10.5281/zenodo.XXXXXXX\n\n" + "* The nf-core framework\n" + " https://doi.org/10.1038/s41587-020-0439-x\n\n" + "* Software dependencies\n" + @@ -22,7 +21,7 @@ class WorkflowMain { // Print help to screen if required // public static String help(workflow, params, log) { - def command = "nextflow run ${workflow.manifest.name} --input samplesheet.csv --genome GRCh37 -profile docker" + def command = "nextflow run ${workflow.manifest.name} --input ids.txt -profile docker" def help_string = '' help_string += NfcoreTemplate.logo(workflow, params.monochrome_logs) help_string += NfcoreSchema.paramsHelp(workflow, params, command) @@ -74,21 +73,8 @@ class WorkflowMain { // Check input has been provided if (!params.input) { - log.error "Please provide an input samplesheet to the pipeline e.g. '--input samplesheet.csv'" + log.error "Please provide an input samplesheet to the pipeline e.g. '--input ids.txt'" System.exit(1) } } - - // - // Get attribute from genome config file e.g. fasta - // - public static String getGenomeAttribute(params, attribute) { - def val = '' - if (params.genomes && params.genome && params.genomes.containsKey(params.genome)) { - if (params.genomes[ params.genome ].containsKey(attribute)) { - val = params.genomes[ params.genome ][ attribute ] - } - } - return val - } } diff --git a/main.nf b/main.nf index 56291035..f28f690f 100755 --- a/main.nf +++ b/main.nf @@ -11,14 +11,6 @@ nextflow.enable.dsl = 2 -/* -======================================================================================== - GENOME PARAMETER VALUES -======================================================================================== -*/ - -params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') - /* ======================================================================================== VALIDATE & PRINT PARAMETER SUMMARY diff --git a/modules/local/sra_fastq_ftp.nf b/modules/local/sra_fastq_ftp.nf new file mode 100644 index 00000000..126c0647 --- /dev/null +++ b/modules/local/sra_fastq_ftp.nf @@ -0,0 +1,50 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +params.options = [:] +options = initOptions(params.options) + +process SRA_FASTQ_FTP { + tag "$meta.id" + label 'process_medium' + label 'error_retry' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } + + conda (params.enable_conda ? "conda-forge::sed=4.7" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img" + } else { + container "biocontainers/biocontainers:v1.2.0_cv1" + } + + input: + tuple val(meta), val(fastq) + + output: + tuple val(meta), path("*fastq.gz"), emit: fastq + tuple val(meta), path("*md5") , emit: md5 + + script: + if (meta.single_end) { + """ + bash -c 'until curl $options.args -L ${fastq[0]} -o ${meta.id}.fastq.gz; do sleep 1; done'; + + echo "${meta.md5_1} ${meta.id}.fastq.gz" > ${meta.id}.fastq.gz.md5 + md5sum -c ${meta.id}.fastq.gz.md5 + """ + } else { + """ + bash -c 'until curl $options.args -L ${fastq[0]} -o ${meta.id}_1.fastq.gz; do sleep 1; done'; + + echo "${meta.md5_1} ${meta.id}_1.fastq.gz" > ${meta.id}_1.fastq.gz.md5 + md5sum -c ${meta.id}_1.fastq.gz.md5 + + bash -c 'until curl $options.args -L ${fastq[1]} -o ${meta.id}_2.fastq.gz; do sleep 1; done'; + + echo "${meta.md5_2} ${meta.id}_2.fastq.gz" > ${meta.id}_2.fastq.gz.md5 + md5sum -c ${meta.id}_2.fastq.gz.md5 + """ + } +} diff --git a/modules/local/sra_ids_to_runinfo.nf b/modules/local/sra_ids_to_runinfo.nf new file mode 100644 index 00000000..d5b9705c --- /dev/null +++ b/modules/local/sra_ids_to_runinfo.nf @@ -0,0 +1,36 @@ +// Import generic module functions +include { saveFiles; getSoftwareName } from './functions' + +params.options = [:] + +process SRA_IDS_TO_RUNINFO { + tag "$id" + label 'error_retry' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } + + conda (params.enable_conda ? "conda-forge::requests=2.24.0" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/requests:2.24.0" + } else { + container "quay.io/biocontainers/requests:2.24.0" + } + + input: + val id + val fields + + output: + path "*.tsv", emit: tsv + + script: + def metadata_fields = fields ? "--ena_metadata_fields ${fields}" : '' + """ + echo $id > id.txt + sra_ids_to_runinfo.py \\ + id.txt \\ + ${id}.runinfo.tsv \\ + $metadata_fields + """ +} diff --git a/modules/local/sra_merge_samplesheet.nf b/modules/local/sra_merge_samplesheet.nf new file mode 100644 index 00000000..423be634 --- /dev/null +++ b/modules/local/sra_merge_samplesheet.nf @@ -0,0 +1,31 @@ +// Import generic module functions +include { saveFiles; getSoftwareName } from './functions' + +params.options = [:] + +process SRA_MERGE_SAMPLESHEET { + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } + + conda (params.enable_conda ? "conda-forge::sed=4.7" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img" + } else { + container "biocontainers/biocontainers:v1.2.0_cv1" + } + + input: + path ('samplesheets/*') + + output: + path "*csv", emit: csv + + script: + """ + head -n 1 `ls ./samplesheets/* | head -n 1` > samplesheet.csv + for fileid in `ls ./samplesheets/*`; do + awk 'NR>1' \$fileid >> samplesheet.csv + done + """ +} diff --git a/modules/local/sra_runinfo_to_ftp.nf b/modules/local/sra_runinfo_to_ftp.nf new file mode 100644 index 00000000..1418bf34 --- /dev/null +++ b/modules/local/sra_runinfo_to_ftp.nf @@ -0,0 +1,30 @@ +// Import generic module functions +include { saveFiles; getSoftwareName } from './functions' + +params.options = [:] + +process SRA_RUNINFO_TO_FTP { + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } + + conda (params.enable_conda ? "conda-forge::python=3.8.3" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/python:3.8.3" + } else { + container "quay.io/biocontainers/python:3.8.3" + } + + input: + path runinfo + + output: + path "*.tsv", emit: tsv + + script: + """ + sra_runinfo_to_ftp.py \\ + ${runinfo.join(',')} \\ + ${runinfo.toString().tokenize(".")[0]}.runinfo_ftp.tsv + """ +} diff --git a/modules/local/sra_to_samplesheet.nf b/modules/local/sra_to_samplesheet.nf new file mode 100644 index 00000000..a30e0f5e --- /dev/null +++ b/modules/local/sra_to_samplesheet.nf @@ -0,0 +1,54 @@ +// Import generic module functions +include { saveFiles; getSoftwareName } from './functions' + +params.options = [:] +params.results_dir = '' + +process SRA_TO_SAMPLESHEET { + tag "$meta.id" + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } + + memory 100.MB + + input: + tuple val(meta), path(fastq) + val pipeline + + output: + tuple val(meta), path("*csv"), emit: csv + + exec: + // Remove custom keys needed to download the data + def meta_map = meta.clone() + meta_map.remove("id") + meta_map.remove("fastq_1") + meta_map.remove("fastq_2") + meta_map.remove("md5_1") + meta_map.remove("md5_2") + meta_map.remove("single_end") + + // Add relevant fields to the beginning of the map + pipeline_map = [ + sample : "${meta.id.split('_')[0..-2].join('_')}", + fastq_1 : "${params.outdir}/${params.results_dir}/${fastq[0]}", + fastq_2 : meta.single_end ? '' : "${params.outdir}/${params.results_dir}/${fastq[1]}" + ] + + // Add nf-core pipeline specific entries + if (pipeline) { + if (pipeline == 'rnaseq') { + pipeline_map << [ strandedness: 'unstranded' ] + } + } + pipeline_map << meta_map + + // Create a samplesheet + csv = pipeline_map.keySet().collect{ '"' + it + '"'}.join(",") + '\n' + csv += pipeline_map.values().collect{ '"' + it + '"'}.join(",") + + // Write to file + def file = task.workDir.resolve("${meta.id}.samplesheet.csv") + file.text = csv +} diff --git a/nextflow.config b/nextflow.config index 1b9e9ad4..94ddb47f 100755 --- a/nextflow.config +++ b/nextflow.config @@ -9,19 +9,11 @@ // Global default params, used in configs params { - // TODO nf-core: Specify your pipeline's command line flags // Input options input = null - - // References - genome = null - igenomes_base = 's3://ngi-igenomes/igenomes/' - igenomes_ignore = false - - // MultiQC options - multiqc_config = null - multiqc_title = null - max_multiqc_email_size = '25.MB' + nf_core_pipeline = null + ena_metadata_fields = null + skip_fastq_download = false // Boilerplate options outdir = './results' @@ -34,7 +26,7 @@ params { help = false validate_params = true show_hidden_params = false - schema_ignore_params = 'genomes,modules' + schema_ignore_params = 'modules,igenomes_base' enable_conda = false singularity_pull_docker_container = false @@ -68,13 +60,6 @@ try { System.err.println("WARNING: Could not load nf-core/config profiles: ${params.custom_config_base}/nfcore_custom.config") } -// Load igenomes.config if required -if (!params.igenomes_ignore) { - includeConfig 'conf/igenomes.config' -} else { - params.genomes = [:] -} - profiles { debug { process.beforeScript = 'echo $HOSTNAME' } conda { @@ -161,7 +146,7 @@ manifest { description = 'Pipeline to fetch metadata and raw FastQ files from public databases' mainScript = 'main.nf' nextflowVersion = '!>=21.04.0' - version = '1.0dev' + version = '1.0' } // Function to ensure that resource requirements don't go beyond diff --git a/nextflow_schema.json b/nextflow_schema.json index 4b88f9e5..e5b24df1 100755 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -17,12 +17,27 @@ "input": { "type": "string", "format": "file-path", - "mimetype": "text/csv", - "pattern": "\\.csv$", + "mimetype": "text/plain", + "pattern": "\\.txt$", "schema": "assets/schema_input.json", - "description": "Path to comma-separated file containing information about the samples in the experiment.", - "help_text": "You will need to create a design file with information about the samples in your experiment before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 3 columns, and a header row. See [usage docs](https://nf-co.re/fetchngs/usage#samplesheet-input).", - "fa_icon": "fas fa-file-csv" + "fa_icon": "fas fa-file-excel", + "description": "File containing SRA/ENA/GEO identifiers one per line to download their associated metadata and FastQ files." + }, + "ena_metadata_fields": { + "type": "string", + "fa_icon": "fas fa-columns", + "description": "Comma-separated list of ENA metadata fields to fetch before downloading data.", + "help_text": "The default list of fields used by the pipeline can be found at the top of the [`bin/sra_ids_to_runinfo.py`](https://github.com/nf-core/fetchngs/blob/master/bin/sra_ids_to_runinfo.py) script within the pipeline repo. This pipeline requires a minimal set of fields to download FastQ files i.e. `'run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5'`. Full list of accepted metadata fields can be obtained from the [ENA API](https://www.ebi.ac.uk/ena/portal/api/returnFields?dataPortal=ena&format=tsv&result=read_run])." + }, + "nf_core_pipeline": { + "type": "string", + "fa_icon": "fab fa-apple", + "description": "Name of supported nf-core pipeline e.g. 'rnaseq'. A samplesheet for direct use with the pipeline will be created with the appropriate columns." + }, + "skip_fastq_download": { + "type": "boolean", + "fa_icon": "fas fa-fast-forward", + "description": "Only download metadata for public data database ids and don't download the FastQ files." }, "outdir": { "type": "string", @@ -36,49 +51,6 @@ "fa_icon": "fas fa-envelope", "help_text": "Set this parameter to your e-mail address to get a summary e-mail with details of the run sent to you when the workflow exits. If set in your user config file (`~/.nextflow/config`) then you don't need to specify this on the command line for every run.", "pattern": "^([a-zA-Z0-9_\\-\\.]+)@([a-zA-Z0-9_\\-\\.]+)\\.([a-zA-Z]{2,5})$" - }, - "multiqc_title": { - "type": "string", - "description": "MultiQC report title. Printed as page header, used for filename if not otherwise specified.", - "fa_icon": "fas fa-file-signature" - } - } - }, - "reference_genome_options": { - "title": "Reference genome options", - "type": "object", - "fa_icon": "fas fa-dna", - "description": "Reference genome related files and options required for the workflow.", - "properties": { - "genome": { - "type": "string", - "description": "Name of iGenomes reference.", - "fa_icon": "fas fa-book", - "help_text": "If using a reference genome configured in the pipeline using iGenomes, use this parameter to give the ID for the reference. This is then used to build the full paths for all required reference genome files e.g. `--genome GRCh38`. \n\nSee the [nf-core website docs](https://nf-co.re/usage/reference_genomes) for more details." - }, - "fasta": { - "type": "string", - "format": "file-path", - "mimetype": "text/plain", - "pattern": "\\.fn?a(sta)?(\\.gz)?$", - "description": "Path to FASTA genome file.", - "help_text": "This parameter is *mandatory* if `--genome` is not specified. If you don't have a BWA index available this will be generated for you automatically. Combine with `--save_reference` to save BWA index for future runs.", - "fa_icon": "far fa-file-code" - }, - "igenomes_base": { - "type": "string", - "format": "directory-path", - "description": "Directory / URL base for iGenomes references.", - "default": "s3://ngi-igenomes/igenomes", - "fa_icon": "fas fa-cloud-download-alt", - "hidden": true - }, - "igenomes_ignore": { - "type": "boolean", - "description": "Do not load the iGenomes reference config.", - "fa_icon": "fas fa-ban", - "hidden": true, - "help_text": "Do not load `igenomes.config` when running the pipeline. You may choose this option if you observe clashes between custom parameters and those supplied in `igenomes.config`." } } }, @@ -214,25 +186,12 @@ "fa_icon": "fas fa-remove-format", "hidden": true }, - "max_multiqc_email_size": { - "type": "string", - "description": "File size limit when attaching MultiQC reports to summary emails.", - "default": "25.MB", - "fa_icon": "fas fa-file-upload", - "hidden": true - }, "monochrome_logs": { "type": "boolean", "description": "Do not use coloured log outputs.", "fa_icon": "fas fa-palette", "hidden": true }, - "multiqc_config": { - "type": "string", - "description": "Custom config file to supply to MultiQC.", - "fa_icon": "fas fa-cog", - "hidden": true - }, "tracedir": { "type": "string", "description": "Directory to keep pipeline Nextflow logs and reports.", @@ -274,9 +233,6 @@ { "$ref": "#/definitions/input_output_options" }, - { - "$ref": "#/definitions/reference_genome_options" - }, { "$ref": "#/definitions/institutional_config_options" }, diff --git a/workflows/fetchngs.nf b/workflows/fetchngs.nf index 2541ff11..4ba08fb3 100755 --- a/workflows/fetchngs.nf +++ b/workflows/fetchngs.nf @@ -4,27 +4,26 @@ ======================================================================================== */ +def valid_params = [ + ena_metadata_fields : ['run_accession', 'experiment_accession', 'library_layout', 'fastq_ftp', 'fastq_md5'] +] + def summary_params = NfcoreSchema.paramsSummaryMap(workflow, params) // Validate input parameters -WorkflowFetchngs.initialise(params, log) - -// TODO nf-core: Add all file path parameters for the pipeline to the list below -// Check input path parameters to see if they exist -def checkPathParamList = [ params.input, params.multiqc_config, params.fasta ] -for (param in checkPathParamList) { if (param) { file(param, checkIfExists: true) } } +WorkflowFetchngs.initialise(params, log, valid_params) // Check mandatory parameters -if (params.input) { ch_input = file(params.input) } else { exit 1, 'Input samplesheet not specified!' } - -/* -======================================================================================== - CONFIG FILES -======================================================================================== -*/ - -ch_multiqc_config = file("$projectDir/assets/multiqc_config.yaml", checkIfExists: true) -ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multiqc_config) : Channel.empty() +if (params.input) { + Channel + .from(file(params.input, checkIfExists: true)) + .splitCsv(header:false, sep:'', strip:true) + .map { it[0] } + .unique() + .set { ch_ids } +} else { + exit 1, 'Input file with public database ids not specified!' +} /* ======================================================================================== @@ -35,30 +34,11 @@ ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multi // Don't overwrite global params.modules, create a copy instead and use that within the main script. def modules = params.modules.clone() -// -// MODULE: Local to the pipeline -// -include { GET_SOFTWARE_VERSIONS } from '../modules/local/get_software_versions' addParams( options: [publish_files : ['csv':'']] ) - -// -// SUBWORKFLOW: Consisting of a mix of local and nf-core/modules -// -include { INPUT_CHECK } from '../subworkflows/local/input_check' addParams( options: [:] ) - -/* -======================================================================================== - IMPORT NF-CORE MODULES/SUBWORKFLOWS -======================================================================================== -*/ - -def multiqc_options = modules['multiqc'] -multiqc_options.args += params.multiqc_title ? Utils.joinModuleArgs(["--title \"$params.multiqc_title\""]) : '' - -// -// MODULE: Installed directly from nf-core/modules -// -include { FASTQC } from '../modules/nf-core/software/fastqc/main' addParams( options: modules['fastqc'] ) -include { MULTIQC } from '../modules/nf-core/software/multiqc/main' addParams( options: multiqc_options ) +include { SRA_IDS_TO_RUNINFO } from '../modules/local/sra_ids_to_runinfo' addParams( options: modules['sra_ids_to_runinfo'] ) +include { SRA_RUNINFO_TO_FTP } from '../modules/local/sra_runinfo_to_ftp' addParams( options: modules['sra_runinfo_to_ftp'] ) +include { SRA_FASTQ_FTP } from '../modules/local/sra_fastq_ftp' addParams( options: modules['sra_fastq_ftp'] ) +include { SRA_TO_SAMPLESHEET } from '../modules/local/sra_to_samplesheet' addParams( options: modules['sra_to_samplesheet'], results_dir: modules['sra_fastq_ftp'].publish_dir ) +include { SRA_MERGE_SAMPLESHEET } from '../modules/local/sra_merge_samplesheet' addParams( options: modules['sra_merge_samplesheet'] ) /* ======================================================================================== @@ -66,61 +46,67 @@ include { MULTIQC } from '../modules/nf-core/software/multiqc/main' addParams( o ======================================================================================== */ -// Info required for completion email and summary -def multiqc_report = [] - workflow FETCHNGS { - ch_software_versions = Channel.empty() - // - // SUBWORKFLOW: Read in samplesheet, validate and stage input files + // MODULE: Get SRA run information for public database ids // - INPUT_CHECK ( - ch_input + SRA_IDS_TO_RUNINFO ( + ch_ids, + params.ena_metadata_fields ?: '' ) // - // MODULE: Run FastQC + // MODULE: Parse SRA run information, create file containing FTP links and read into workflow as [ meta, [reads] ] // - FASTQC ( - INPUT_CHECK.out.reads + SRA_RUNINFO_TO_FTP ( + SRA_IDS_TO_RUNINFO.out.tsv ) - ch_software_versions = ch_software_versions.mix(FASTQC.out.version.first().ifEmpty(null)) - // - // MODULE: Pipeline reporting - // - ch_software_versions - .map { it -> if (it) [ it.baseName, it ] } - .groupTuple() - .map { it[1][0] } - .flatten() - .collect() - .set { ch_software_versions } - - GET_SOFTWARE_VERSIONS ( - ch_software_versions.map { it }.collect() - ) - - // - // MODULE: MultiQC - // - workflow_summary = WorkflowFetchngs.paramsSummaryMultiqc(workflow, summary_params) - ch_workflow_summary = Channel.value(workflow_summary) - - ch_multiqc_files = Channel.empty() - ch_multiqc_files = ch_multiqc_files.mix(Channel.from(ch_multiqc_config)) - ch_multiqc_files = ch_multiqc_files.mix(ch_multiqc_custom_config.collect().ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) - ch_multiqc_files = ch_multiqc_files.mix(GET_SOFTWARE_VERSIONS.out.yaml.collect()) - ch_multiqc_files = ch_multiqc_files.mix(FASTQC.out.zip.collect{it[1]}.ifEmpty([])) - - MULTIQC ( - ch_multiqc_files.collect() - ) - multiqc_report = MULTIQC.out.report.toList() - ch_software_versions = ch_software_versions.mix(MULTIQC.out.version.ifEmpty(null)) + SRA_RUNINFO_TO_FTP + .out + .tsv + .splitCsv(header:true, sep:'\t') + .map { + meta -> + meta.single_end = meta.single_end.toBoolean() + [ meta, [ meta.fastq_1, meta.fastq_2 ] ] + } + .unique() + .set { ch_sra_reads } + + if (!params.skip_fastq_download) { + // + // MODULE: If FTP link is provided in run information then download FastQ directly via FTP and validate with md5sums + // + SRA_FASTQ_FTP ( + ch_sra_reads.map { meta, reads -> if (meta.fastq_1) [ meta, reads ] } + ) + + // + // MODULE: Stage FastQ files downloaded by SRA together and auto-create a samplesheet + // + SRA_TO_SAMPLESHEET ( + SRA_FASTQ_FTP.out.fastq, + params.nf_core_pipeline ?: '' + ) + + // + // MODULE: Create a merged samplesheet across all samples for the pipeline + // + SRA_MERGE_SAMPLESHEET ( + SRA_TO_SAMPLESHEET.out.csv.collect{it[1]} + ) + + // + // If ids don't have a direct FTP download link write them to file for download outside of the pipeline + // + def no_ids_file = ["${params.outdir}", "${modules['sra_fastq_ftp'].publish_dir}", "IDS_NOT_DOWNLOADED.txt" ].join(File.separator) + ch_sra_reads + .map { meta, reads -> if (!meta.fastq_1) "${meta.id.split('_')[0..-2].join('_')}" } + .unique() + .collectFile(name: no_ids_file, sort: true, newLine: true) + } } /* @@ -130,8 +116,9 @@ workflow FETCHNGS { */ workflow.onComplete { - NfcoreTemplate.email(workflow, params, summary_params, projectDir, log, multiqc_report) + NfcoreTemplate.email(workflow, params, summary_params, projectDir, log) NfcoreTemplate.summary(workflow, params, log) + WorkflowFetchngs.curateSamplesheetWarn(log) } /* From 7a7b57323519b37462588390ceceed2e9ae0e6ad Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 7 Jun 2021 21:56:22 +0100 Subject: [PATCH 002/852] Be explicit about Illumina mode of viralrecon --- README.md | 4 ++-- docs/usage.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 54fa6ed2..0eb5cbfb 100755 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ Via a single file of ids, provided one-per-line (see [example input file](https: 3. Download FastQ files in parallel via `curl` and perform `md5sum` check 4. Collate id metadata and paths to FastQ files in a single samplesheet -The columns in the auto-created samplesheet can be tailored to be accepted out-of-the-box by selected nf-core pipelines, these currently include [nf-core/rnaseq](https://nf-co.re/rnaseq/usage#samplesheet-input) and [nf-core/viralrecon](https://nf-co.re/viralrecon/usage#illumina-samplesheet-format). You can use the `--nf_core_pipeline` parameter to customise this behaviour e.g. `--nf_core_pipeline rnaseq`. More pipelines will be supported in due course as we adopt and standardise samplesheet input across nf-core. +The columns in the auto-created samplesheet can be tailored to be accepted out-of-the-box by selected nf-core pipelines, these currently include [nf-core/rnaseq](https://nf-co.re/rnaseq/usage#samplesheet-input) and the Illumina processing mode of [nf-core/viralrecon](https://nf-co.re/viralrecon/usage#illumina-samplesheet-format). You can use the `--nf_core_pipeline` parameter to customise this behaviour e.g. `--nf_core_pipeline rnaseq`. More pipelines will be supported in due course as we adopt and standardise samplesheet input across nf-core. ## Quick Start @@ -52,7 +52,7 @@ The columns in the auto-created samplesheet can be tailored to be accepted out-o 4. Start running your own analysis! ```console - nextflow run nf-core/fetchngs -profile --input ids.txt + nextflow run nf-core/fetchngs --input ids.txt -profile ``` ## Documentation diff --git a/docs/usage.md b/docs/usage.md index 68c1422d..2852035b 100755 --- a/docs/usage.md +++ b/docs/usage.md @@ -22,7 +22,7 @@ If `SRR`/`ERR` run ids are provided then these will be resolved back to their ap The final sample information for all identifiers is obtained from the ENA which provides direct download links for FastQ files as well as their associated md5 sums. If download links exist, the files will be downloaded in parallel by FTP otherwise they will NOT be downloaded. This is intentional because tools such as `parallel-fastq-dump`, `fasterq-dump`, `prefetch` etc require pre-existing configuration files in the users home directory which makes automation tricky across different platforms and containerisation. We may add this functionality in later releases. -As a bonus, the columns in the auto-created samplesheet can be tailored to be accepted out-of-the-box by selected nf-core pipelines, these currently include [nf-core/rnaseq](https://nf-co.re/rnaseq/usage#samplesheet-input) and [nf-core/viralrecon](https://nf-co.re/viralrecon/usage#illumina-samplesheet-format). You can use the `--nf_core_pipeline` parameter to customise this behaviour e.g. `--nf_core_pipeline rnaseq`. More pipelines will be supported in due course as we adopt and standardise samplesheet input across nf-core. It is highly recommended that you double-check that all of the identifiers you defined using `--input` are represented in the samplesheet. Also, public databases don't reliably hold information such as strandedness information so you may need to amend these entries too if for example your samplesheet was created by providing `--nf_core_pipeline rnaseq`. +As a bonus, the columns in the auto-created samplesheet can be tailored to be accepted out-of-the-box by selected nf-core pipelines, these currently include [nf-core/rnaseq](https://nf-co.re/rnaseq/usage#samplesheet-input) and the Illumina processing mode of [nf-core/viralrecon](https://nf-co.re/viralrecon/usage#illumina-samplesheet-format). You can use the `--nf_core_pipeline` parameter to customise this behaviour e.g. `--nf_core_pipeline rnaseq`. More pipelines will be supported in due course as we adopt and standardise samplesheet input across nf-core. It is highly recommended that you double-check that all of the identifiers you defined using `--input` are represented in the samplesheet. Also, public databases don't reliably hold information such as strandedness information so you may need to amend these entries too if for example your samplesheet was created by providing `--nf_core_pipeline rnaseq`. All of the sample metadata obtained from the ENA will be appended as additional columns to help you manually curate the samplesheet before you run the pipeline. You can customise the metadata fields that are appended to the samplesheet via the `--ena_metadata_fields` parameter. The default list of fields used by the pipeline can be found at the top of the [`bin/sra_ids_to_runinfo.py`](https://github.com/nf-core/fetchngs/blob/master/bin/sra_ids_to_runinfo.py) script within the pipeline repo. However, this pipeline requires a minimal set of fields to download FastQ files i.e. `'run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5'`. A comprehensive list of accepted metadata fields can be obtained from the [ENA API](https://www.ebi.ac.uk/ena/portal/api/returnFields?dataPortal=ena&format=tsv&result=read_run]). From 9f0e7d60a9d663df8eb5558a45ab471db131346f Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 7 Jun 2021 22:38:55 +0100 Subject: [PATCH 003/852] Delete check_samplesheet.py --- bin/check_samplesheet.py | 148 --------------------------------------- 1 file changed, 148 deletions(-) delete mode 100755 bin/check_samplesheet.py diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py deleted file mode 100755 index 15ba80dc..00000000 --- a/bin/check_samplesheet.py +++ /dev/null @@ -1,148 +0,0 @@ -#!/usr/bin/env python - -# TODO nf-core: Update the script to check the samplesheet -# This script is based on the example at: https://raw.githubusercontent.com/nf-core/test-datasets/viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv - -import os -import sys -import errno -import argparse - - -def parse_args(args=None): - Description = "Reformat nf-core/fetchngs samplesheet file and check its contents." - Epilog = "Example usage: python check_samplesheet.py " - - parser = argparse.ArgumentParser(description=Description, epilog=Epilog) - parser.add_argument("FILE_IN", help="Input samplesheet file.") - parser.add_argument("FILE_OUT", help="Output file.") - return parser.parse_args(args) - - -def make_dir(path): - if len(path) > 0: - try: - os.makedirs(path) - except OSError as exception: - if exception.errno != errno.EEXIST: - raise exception - - -def print_error(error, context="Line", context_str=""): - error_str = "ERROR: Please check samplesheet -> {}".format(error) - if context != "" and context_str != "": - error_str = "ERROR: Please check samplesheet -> {}\n{}: '{}'".format( - error, context.strip(), context_str.strip() - ) - print(error_str) - sys.exit(1) - - -# TODO nf-core: Update the check_samplesheet function -def check_samplesheet(file_in, file_out): - """ - This function checks that the samplesheet follows the following structure: - - sample,fastq_1,fastq_2 - SAMPLE_PE,SAMPLE_PE_RUN1_1.fastq.gz,SAMPLE_PE_RUN1_2.fastq.gz - SAMPLE_PE,SAMPLE_PE_RUN2_1.fastq.gz,SAMPLE_PE_RUN2_2.fastq.gz - SAMPLE_SE,SAMPLE_SE_RUN1_1.fastq.gz, - - For an example see: - https://raw.githubusercontent.com/nf-core/test-datasets/viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv - """ - - sample_mapping_dict = {} - with open(file_in, "r") as fin: - - ## Check header - MIN_COLS = 2 - # TODO nf-core: Update the column names for the input samplesheet - HEADER = ["sample", "fastq_1", "fastq_2"] - header = [x.strip('"') for x in fin.readline().strip().split(",")] - if header[: len(HEADER)] != HEADER: - print("ERROR: Please check samplesheet header -> {} != {}".format(",".join(header), ",".join(HEADER))) - sys.exit(1) - - ## Check sample entries - for line in fin: - lspl = [x.strip().strip('"') for x in line.strip().split(",")] - - # Check valid number of columns per row - if len(lspl) < len(HEADER): - print_error( - "Invalid number of columns (minimum = {})!".format(len(HEADER)), - "Line", - line, - ) - num_cols = len([x for x in lspl if x]) - if num_cols < MIN_COLS: - print_error( - "Invalid number of populated columns (minimum = {})!".format(MIN_COLS), - "Line", - line, - ) - - ## Check sample name entries - sample, fastq_1, fastq_2 = lspl[: len(HEADER)] - if sample: - if sample.find(" ") != -1: - print_error("Sample entry contains spaces!", "Line", line) - else: - print_error("Sample entry has not been specified!", "Line", line) - - ## Check FastQ file extension - for fastq in [fastq_1, fastq_2]: - if fastq: - if fastq.find(" ") != -1: - print_error("FastQ file contains spaces!", "Line", line) - if not fastq.endswith(".fastq.gz") and not fastq.endswith(".fq.gz"): - print_error( - "FastQ file does not have extension '.fastq.gz' or '.fq.gz'!", - "Line", - line, - ) - - ## Auto-detect paired-end/single-end - sample_info = [] ## [single_end, fastq_1, fastq_2] - if sample and fastq_1 and fastq_2: ## Paired-end short reads - sample_info = ["0", fastq_1, fastq_2] - elif sample and fastq_1 and not fastq_2: ## Single-end short reads - sample_info = ["1", fastq_1, fastq_2] - else: - print_error("Invalid combination of columns provided!", "Line", line) - - ## Create sample mapping dictionary = { sample: [ single_end, fastq_1, fastq_2 ] } - if sample not in sample_mapping_dict: - sample_mapping_dict[sample] = [sample_info] - else: - if sample_info in sample_mapping_dict[sample]: - print_error("Samplesheet contains duplicate rows!", "Line", line) - else: - sample_mapping_dict[sample].append(sample_info) - - ## Write validated samplesheet with appropriate columns - if len(sample_mapping_dict) > 0: - out_dir = os.path.dirname(file_out) - make_dir(out_dir) - with open(file_out, "w") as fout: - fout.write(",".join(["sample", "single_end", "fastq_1", "fastq_2"]) + "\n") - for sample in sorted(sample_mapping_dict.keys()): - - ## Check that multiple runs of the same sample are of the same datatype - if not all(x[0] == sample_mapping_dict[sample][0][0] for x in sample_mapping_dict[sample]): - print_error("Multiple runs of a sample must be of the same datatype!", "Sample: {}".format(sample)) - - for idx, val in enumerate(sample_mapping_dict[sample]): - fout.write(",".join(["{}_T{}".format(sample, idx + 1)] + val) + "\n") - else: - print_error("No entries to process!", "Samplesheet: {}".format(file_in)) - - -def main(args=None): - args = parse_args(args) - check_samplesheet(args.FILE_IN, args.FILE_OUT) - - -if __name__ == "__main__": - sys.exit(main()) From 1081387eefbe7654d00c719a04e0f87e2b391054 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 7 Jun 2021 22:47:21 +0100 Subject: [PATCH 004/852] Delete files not required by pipeline --- assets/multiqc_config.yaml | 11 - assets/nf-core-fetchfastq_logo.png | Bin 19699 -> 0 bytes assets/samplesheet.csv | 3 - conf/igenomes.config | 432 ------------------ docs/images/mqc_fastqc_adapter.png | Bin 23458 -> 0 bytes docs/images/mqc_fastqc_counts.png | Bin 33918 -> 0 bytes docs/images/mqc_fastqc_quality.png | Bin 55769 -> 0 bytes docs/images/nf-core-fetchfastq_logo.png | Bin 37015 -> 0 bytes modules/nf-core/software/fastqc/functions.nf | 68 --- modules/nf-core/software/fastqc/main.nf | 47 -- modules/nf-core/software/fastqc/meta.yml | 51 --- modules/nf-core/software/multiqc/functions.nf | 68 --- modules/nf-core/software/multiqc/main.nf | 35 -- modules/nf-core/software/multiqc/meta.yml | 39 -- 14 files changed, 754 deletions(-) delete mode 100755 assets/multiqc_config.yaml delete mode 100644 assets/nf-core-fetchfastq_logo.png delete mode 100755 assets/samplesheet.csv delete mode 100755 conf/igenomes.config delete mode 100755 docs/images/mqc_fastqc_adapter.png delete mode 100755 docs/images/mqc_fastqc_counts.png delete mode 100755 docs/images/mqc_fastqc_quality.png delete mode 100644 docs/images/nf-core-fetchfastq_logo.png delete mode 100755 modules/nf-core/software/fastqc/functions.nf delete mode 100755 modules/nf-core/software/fastqc/main.nf delete mode 100755 modules/nf-core/software/fastqc/meta.yml delete mode 100755 modules/nf-core/software/multiqc/functions.nf delete mode 100755 modules/nf-core/software/multiqc/main.nf delete mode 100755 modules/nf-core/software/multiqc/meta.yml diff --git a/assets/multiqc_config.yaml b/assets/multiqc_config.yaml deleted file mode 100755 index 77679f83..00000000 --- a/assets/multiqc_config.yaml +++ /dev/null @@ -1,11 +0,0 @@ -report_comment: > - This report has been generated by the nf-core/fetchngs - analysis pipeline. For information about how to interpret these results, please see the - documentation. -report_section_order: - software_versions: - order: -1000 - nf-core-fetchngs-summary: - order: -1001 - -export_plots: true diff --git a/assets/nf-core-fetchfastq_logo.png b/assets/nf-core-fetchfastq_logo.png deleted file mode 100644 index a725c75e44616c3b1bf7051c5dd2e18d525196e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19699 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 diff --git a/assets/samplesheet.csv b/assets/samplesheet.csv deleted file mode 100755 index 5f653ab7..00000000 --- a/assets/samplesheet.csv +++ /dev/null @@ -1,3 +0,0 @@ -sample,fastq_1,fastq_2 -SAMPLE_PAIRED_END,/path/to/fastq/files/AEG588A1_S1_L002_R1_001.fastq.gz,/path/to/fastq/files/AEG588A1_S1_L002_R2_001.fastq.gz -SAMPLE_SINGLE_END,/path/to/fastq/files/AEG588A4_S4_L003_R1_001.fastq.gz, diff --git a/conf/igenomes.config b/conf/igenomes.config deleted file mode 100755 index 855948de..00000000 --- a/conf/igenomes.config +++ /dev/null @@ -1,432 +0,0 @@ -/* -======================================================================================== - Nextflow config file for iGenomes paths -======================================================================================== - Defines reference genomes using iGenome paths. - Can be used by any config that customises the base path using: - $params.igenomes_base / --igenomes_base ----------------------------------------------------------------------------------------- -*/ - -params { - // illumina iGenomes reference file paths - genomes { - 'GRCh37' { - fasta = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/README.txt" - mito_name = "MT" - macs_gsize = "2.7e9" - blacklist = "${projectDir}/assets/blacklists/GRCh37-blacklist.bed" - } - 'GRCh38' { - fasta = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.bed" - mito_name = "chrM" - macs_gsize = "2.7e9" - blacklist = "${projectDir}/assets/blacklists/hg38-blacklist.bed" - } - 'GRCm38' { - fasta = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/README.txt" - mito_name = "MT" - macs_gsize = "1.87e9" - blacklist = "${projectDir}/assets/blacklists/GRCm38-blacklist.bed" - } - 'TAIR10' { - fasta = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/README.txt" - mito_name = "Mt" - } - 'EB2' { - fasta = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/README.txt" - } - 'UMD3.1' { - fasta = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/README.txt" - mito_name = "MT" - } - 'WBcel235' { - fasta = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Annotation/Genes/genes.bed" - mito_name = "MtDNA" - macs_gsize = "9e7" - } - 'CanFam3.1' { - fasta = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/README.txt" - mito_name = "MT" - } - 'GRCz10' { - fasta = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Annotation/Genes/genes.bed" - mito_name = "MT" - } - 'BDGP6' { - fasta = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.bed" - mito_name = "M" - macs_gsize = "1.2e8" - } - 'EquCab2' { - fasta = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/README.txt" - mito_name = "MT" - } - 'EB1' { - fasta = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/README.txt" - } - 'Galgal4' { - fasta = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Annotation/Genes/genes.bed" - mito_name = "MT" - } - 'Gm01' { - fasta = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/README.txt" - } - 'Mmul_1' { - fasta = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/README.txt" - mito_name = "MT" - } - 'IRGSP-1.0' { - fasta = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Annotation/Genes/genes.bed" - mito_name = "Mt" - } - 'CHIMP2.1.4' { - fasta = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/README.txt" - mito_name = "MT" - } - 'Rnor_5.0' { - fasta = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Annotation/Genes/genes.bed" - mito_name = "MT" - } - 'Rnor_6.0' { - fasta = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Annotation/Genes/genes.bed" - mito_name = "MT" - } - 'R64-1-1' { - fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.bed" - mito_name = "MT" - macs_gsize = "1.2e7" - } - 'EF2' { - fasta = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/README.txt" - mito_name = "MT" - macs_gsize = "1.21e7" - } - 'Sbi1' { - fasta = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/README.txt" - } - 'Sscrofa10.2' { - fasta = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/README.txt" - mito_name = "MT" - } - 'AGPv3' { - fasta = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Annotation/Genes/genes.bed" - mito_name = "Mt" - } - 'hg38' { - fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Annotation/Genes/genes.bed" - mito_name = "chrM" - macs_gsize = "2.7e9" - blacklist = "${projectDir}/assets/blacklists/hg38-blacklist.bed" - } - 'hg19' { - fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/README.txt" - mito_name = "chrM" - macs_gsize = "2.7e9" - blacklist = "${projectDir}/assets/blacklists/hg19-blacklist.bed" - } - 'mm10' { - fasta = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/README.txt" - mito_name = "chrM" - macs_gsize = "1.87e9" - blacklist = "${projectDir}/assets/blacklists/mm10-blacklist.bed" - } - 'bosTau8' { - fasta = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Annotation/Genes/genes.bed" - mito_name = "chrM" - } - 'ce10' { - fasta = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/README.txt" - mito_name = "chrM" - macs_gsize = "9e7" - } - 'canFam3' { - fasta = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/README.txt" - mito_name = "chrM" - } - 'danRer10' { - fasta = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Annotation/Genes/genes.bed" - mito_name = "chrM" - macs_gsize = "1.37e9" - } - 'dm6' { - fasta = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Annotation/Genes/genes.bed" - mito_name = "chrM" - macs_gsize = "1.2e8" - } - 'equCab2' { - fasta = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/README.txt" - mito_name = "chrM" - } - 'galGal4' { - fasta = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/README.txt" - mito_name = "chrM" - } - 'panTro4' { - fasta = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/README.txt" - mito_name = "chrM" - } - 'rn6' { - fasta = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Annotation/Genes/genes.bed" - mito_name = "chrM" - } - 'sacCer3' { - fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BismarkIndex/" - readme = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Annotation/README.txt" - mito_name = "chrM" - macs_gsize = "1.2e7" - } - 'susScr3' { - fasta = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BWAIndex/genome.fa" - bowtie2 = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/README.txt" - mito_name = "chrM" - } - } -} diff --git a/docs/images/mqc_fastqc_adapter.png b/docs/images/mqc_fastqc_adapter.png deleted file mode 100755 index 361d0e47acfb424dea1f326590d1eb2f6dfa26b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23458 zcmeFZ2UJtryD!S#x<#o93es(Ww4k)maRbte0-+a?-g^xY-3myTE`8G_KvA54)F1tn})nJ5u%TA4Y;^!^{48eL_}p#q-Umo0M|F1 z74+PQh^X8N|9_jcWbq~ zzn+tZC9B75nKdz=gQ8wo9GJ$P{D~3knlI_`-PRhCw34f1oYDLr^;oEbgxa#A^J%*2 z>FfDE*(~JzKFs$t_oeLz))qDU?s}%Q?7b~3Y;lUi^Oy-2@3g?joA4Wkgb6-2=ih*jub)~7yZ`T=L=Z`B`{1jhkB-iSjea94&Eo9A zxN59pv1p_}RO1>EC^q}Z2)ZI;b7JV_x4lMr=Bker2+EK;8~!;JO7re*@ZkDmoV878S*N^yX(F@U1yqt?Is3nnV>7}#(5pk`V3C) zWhB8;CwWIwsVIjH+`<9=YA(j&3DgQdFOOGU~*`36wNC&QDv8> zr?h2PQgnHkp&t^S)q^K!68h~`$PjZW&-Wns;Zlw$M2sc z1xR!u{m|Kih*|Hht#M@eOMM#8O*={^6b9k5B5^eBsrnhVHD7XZ5BWO&F?q(>Y=QFl z`f>yQ9NCoxZCH-1F{#mz_j{QeyY~4h*VeyYZ#S@Z(Pnb7G=ud!RW)5svqM*&GI_za zzn;8LkOTT?``1Ygt6w!2;5arK*o5k15cdIJnMg)IQhF_zVK%!ma$z&jL zZt>Q{!PqKl^`Qw?nJUOEm@@qX(y(TwSJ~dqW&M@7-N4Wk_wC4izx(xJMrmNjsl$XR zCyK&INt}7@FzNAbbg-nW)sJ>3->I1+2~YdlPsaS}^X-H0GR_CEsw`PGjpq`uX}8VP zJ)HC34>D(z{KR9;E&z=@?@q_|I{NPOj~g>w!$gR?Tlu~F+L$Mk%}xQEm+{&T(5zkH zacVy0k3w!T9r*p2sgX@V;^+PfUYUrEde07XSV=KSDbkIZU!j!Rk3MQV=h-!y@kWVB zdYkmu^fiU~pp#ixe4hBEMx7^LdHa z_L*14aVIHtrsR)SO?=&kQS&JR#^AVvln=P=bUXEIy$QB&!s34znCV@y(C%j9V=}SU zoYLHn+-Lalm0$-=QQ}a(+2dR*{DPF+)J4y!ukiA_T%dF zVKEk;c?LWheG#A5{A20}CKjMw5G%2}cT5@Oce=wqdobHC70=kY7}dxt3diH9(Zcwr zCabx8yObHQ@#e_wjl%wp8s_!Wvxe5f-Duin@obgt>qOcqN$$@{X^C_rEDh3fmM;|X z$zu4;D`{YRbaJ?o!KkazII&|th9v5MG2Mao$ytOHtW+wo;XJJdtLuGjg;d020qT++ zpD}e&o?SeKSqR`}4`OdkWNC7K)Wltn zbwBrWGM;bBGm8uP_RiqfwvDD1f+uRX>b=nTH9Y%vpg{ka0e*E>%<+3!G3#s*-1D>q zHg~1@BT52a*L>mVcP>6y*0iX8@!3tDFJLE+sRlnU(cl``hF`0Q>e4i6P8|wKmqIqI zoY+a0V*Bib0`F9nG#sR(8$^!IWLR)cE8@7XZTN%L-ucJ{9yijy)w5Pom%XG7V<^PX z$Z$U82w0qgcGmld-O6*e)?pm$g@!6`Pps5SPKccjDf(|vX9zcLs7t!7cyyckZI#R* z#lj(HqfVeqyZ+Va{)>65sAb3IQ%a{9W^_F!5!;w=XD}ZUHFH$8=Xjw+VE)s$q(nt> zE2^aDYki5`e73RQ=DxaBNZ6CK?XKCv@V}=y(g?YHnFaHfXnl}Lo;36@?471W;&#Se z>pE*@M{Y?CevLG8il9#HXG#W3>;o$1``EYBY5i<;JlBqj2M8Y2!+6bPj1(S_bOksY z<34UQE;=Z>KiL``pYd}5fpOOT)GJQnXfNiAc5wgJ>F|$Eqw&D*Vmz+#mM0oFD^`-^ zB~SXe{T+5hd$gnKd7Afo9cy&Lii@syPDFDK)^V{iWEAEO@?xzx1bd`ta z;$(vG+=i3~9|D=GX%f~<>eOVjy~-yRAhLf2dR8V<@M_`C^ev(yOTg{uf=L3uyDb-w z&)l7KXS_HTo87BxI}fXF{ge&5p&IHk9M1}eNAwqw)`eZSOPFhqjS70{hyE@C{oSN$ zam*`-UH3RF-RWEP`^Su1q#n_J{AncekkV4m7YITf%QHBo60h@pk4N4O}hhf%rxuIZGiQpprVMal%h7?8+cY#L>pYnx6v!EnuIgInW` z)w!NuTp;fz9md^}*x@K9+`^2LO*bZp1^?BG#iS@(4i%AB6YP023T8Eb?M5K7ElSpe z9-wA22Mm}VwDkmECLd*}a=7bCf(}@SHs6UBe)Xvk(+hQ^^unj5JBeo$=><{4PBI%P z4_9XQ=XnE``;1Daa6f`~rGwNj9{YXY)eIw3G90Ip+QEWg0%?g=i$UHuQ?Qc0OR0!w zv?BvlQa!QMyI*IP!0>goBt$xo2^hlD&wRp?$=}}#?q~Yw z{**_|5&yL*Epz|4V#SJjg-lNaIx_{sCL3R=_VH&_;oOn5J2P=h!0enu-i%FAZ- zw`Hm*u6N*}&A7pAqr>-?%0(lveb{r8>hpDmex?Yo*8!-%1?YV0R~VEPBFp>)ba=mv+2(#>WEy0yxHZX=Cr2 zKmew%=^>HsD3BtRR*#H!@!TTGcI&fHrVh)P&|X;>)OHML+uWDn(dlsDjXa;5uBM$r zdt!r~ig?5iGbx!GpH+kdG8k0%;~)Q#0L6wFROJ}^Z%DvO3x#yNk13^&ccd&l)BP9h zD5cU-qZg-rV3Sg&?)`x}cI3`zw#zq{-eN4pNf(+?QuOG4oZ7zMGSVqOUe>`u=GfKM z{xPCciJFw9%Pk+uDSoormR&c=fS#hGOk=RGUtizBOoY^8P(>!Si|I9i=1ZCQbcc)5 zgE6UED;+b$4u&#dhZjdXwO3tpG0QaQwXrLOx5YP#TOaS@FP!h|G!z!Pbv?hTp0eQL zoUsiv4d@*Ck#ID9-ua|zPbQepcC4a>>9-bJApd()Wg%}hj#%A4pO-q{jIJ$f-SL7- zo&=keG_jhq$Ty4e|J^l6j6TQ=W)|~&Ei6gRn<{*^cFG*tS19#kHpMD7Y;wb~!3_%X zS_-3NQoGiWCX!M-Id;Nsg7oSi4VJ=Hi{bYNfjnmTq?IyK@@&_uacfb&8h@DIe70-Q zZ^KaT(4UX*vf7@A7CY;P!IVGIuXPRIe^&71Z1EyHO5&^=jUUKHF+h&m!4!dOA+!Ed zfA#uQ&p6vD7|O8(?5`bf8^gK)6p`>+$c*yG?Sw29;OD+tp}kDD9augDAEXWbSVoie zpHF1Wj8lWfIZ}mx%(2XREqF9!{fNd&iurAaoQDMCSNo!vRHE8wH%QLLZf9u;ADqnxOaAD#VE%Yg z?Gb?EmGbY}a0|vSZPlF3z6;Kf669Bf%h zlSGiY-}E4LFurm_CJN)(*l?=uX);o&R&qLuzENz?9I%S&YQ2>rVhx#c!hbvWLL!CI zA8mXM$zjnnJ#Me@-99}hjxCE!w8|9w{SBlj%Miq#dvS5GHP!DxO$sDx^4PF^#`;A! zb=bZ1pyj{R#9h$r7svB$QlJqeF1cp*ubT12UZ!deKFG%1N<@S2x&2UtqsVz zn=gF&$D4i3x7&vdoa#^cS?bQuP69OpspVPxm*%@DSWf!NG`o`y^R~o1Hvta;#!r%i zvEB~Jsi~sJ7Y35P!bf?OQin->fAk+TpU$Ow1st|l9|i2rrOneBP3&aDyoUj3K{a7! zOYpnJyYD#nr4GNJ;@$ce2dSN=eS7f-VptzM(|Ek^ze)mPVrpAEgrFs3mL>f(ZwriH zCZ65HdO0|W@2<+v9t?J=-4U9>bvM@@Ew4uVZy@c^Ovw9`k|$!+CTAn(u#4kC7TVTB zXuy#d+GC@RIMaPyp|Y2jS%RJkktCracCaLqfs^i^XFqK#3z+d}n02*VDF&My)vp)lNzWx<< zGB7hEAH?7_joYR?>+&+JIas*%Oiux%kr*X*B=8N8Ulowx0MkRK?pR)K1F_m8>dSe54 z)48k>#|F!OV#yOs7xQNQ@1iun5pl;py{tx+o044?r{W2O{f}3r{#QS#4bf(|f9R3y#6*0YY) z5Ey{M`dj)yHl)B{sdmvti^b0IE5xFx%jJM&5w69;`PGy0vGk2ztSW|5H3~zhXO?mn z+4mo>;Y7=4&gC}HifyMO`#70u3H6;0|| z!l=0lP|zVF`bfxm{%i98943^7y4Iz};Z9F$oY3iUI*FIsYa=o=nS^d`;3?*wDxi&| z=?oqs6uDcd1e_e5z7M5q(+I^PilSRE(T6%z<=U8%sq63V!wELY9Rj%#Y@2Y+TEJ8(f_Kh0ih?l6E6~wDl3~?-5%7>d{ zKs0XHUeORoi5+U#M{kE!Ae%|)^dabh1DsJI9N~LVXp*8$XlOfc6J+Cc?}SM zsc3N~L7hzcpXn2>b(_YN=J*C0N}$f_NINTiV!~L}nA{wn^XfBogd5hu!G?*THg^mF zFJm@9m{X~X3t5{7 z#lWIO++R8;BTByGl7U;fz|JBB^*4R|bLvm18x;DF*U`=kyxbH2nD*RIH5AWfJ4^5o z&Nr;*|NreNKo$fUI5}~n#Xcbjr0T-7MV;wZXA(QPt^`x;=ZK)5^`AFgQM?7ry_(Tm z0|EhWs&cYJW?|uvc3af(tfuyDf$28~R=HOa#}3Edru##Wwm0a$Vnk=_8+eQ; zfyq+GVt0Twr^QS*HtI+&&>_<%-Gq-!{iQr-3LYn-6bqW0VW)>%iat!2IP)Jd+LgnS zgI+jJ-I9HMJ8Z*$2FjwK1T0RpF%U`&x)S{3HqRJ z5^;r?VoA(k7*aP@tzB`O5Y26jv#x54xNH;E`KzzLxC)FEnQ<}IR#w*>9sq|zFzZq< zdM1%ynXvcLfZ{Xm=l(Op?=XGV8`BwRiQ%@@A-GnjD+y3K zN2Pm011b!s`3368%P&MapW-PDulXKfpeyRXNjN`lKKgC%CplwE#GrRw#0FE#Q4>R+ z23B4CmO%uy8Y@;F$hCHU6+oJ}_cKgm|4Amr{$`38ue-?+GX1T!hd$w@x=z{w30Z*W za@$MLl^=f#*oR+8(&a&`E@Bj{{1O;DPjj$g9U7~{m*?^Tj}Rrc^wc=(SycXVT?bW{ zUus*6{74fo{nOh@zQyv0g{)t}Qekl*>KXQYCI9m2jqge|&Ntj{V?gLs*_GkeODYhf zW39Q1L1~vk+#E^S!nCyO&z9Wh}2=K}`9#{=`j&)^}8=U|lz}DqgAteVsos){s zDhK`>&pK%cVuhO7tPu7@Y4|yXAdHs!(uKDuLL@i$Okc6Gs;2456Br??ZNZiONAe!~ zvY5w1(C)E9fRmpWgWU2Su0u6~9{@wIm<-lha;uuEN>&C^FJ#^|oopkg``l#i0&{OX z%rI6Q>l^9J++K19D;HrFU#V9o0M`MBTT#-(q&A{|n-`T~CgAFET=$E_&pIQTPE;J#&nrwf2N^I*d zH)ev~7d=Sy8<@syK<`PFvNtyfa#8^JceG^ua^o%!fl6R&j--jGkz8wS`EgfEZouOD zr97H059Dj(#$*$-!UQLvb92wS40!wJc!4K~lq-K2h2rXunCs?SjQERnvv9Fs?tF;y zWUTcQ&PtDMbsUY6_&np`UGMS0ZZIhnDh~p{`Bryj7XS~*R}%z6 zUO^hJn$_-CW(;$)hHu0ej1BNqv^o%*D2gR6zUvCZyw)ddNB6JE$;okhf7PEEz|dRN z$sP&o`MU(L_I8mDW33;)3!U*;HRm$zVV%%zaDn^*Qj~RdWdFNb;^fRhnF&{oeY-tv zq$p~pZw)Ls$EWKsEZubtx_9bpdCfsjdy*<8_Io8VtCIC+8kk@Qxdti>xnu}nRYJ-y zp8$3YP7u;u+YlPQ2`o_>S?mpXvd0-x!Z3=}>ceWDg*e)+#wQLE)Uwhneo z;*y`VfoY<#lwT^k4BP(ytfI;M`FoYsedi}L{1V|Ho}ciBs=`@vtgnieHdpWz%Vyy$ zlnn?k0KJWOnlJD9>6y64*X=G{lyl&%pV8Uo&>tXw%1za!6*YYVB$jR$Y0XhB#1mVx zvjd8N4X~{Dd&28RVEkCw9TLN9*Ng!?9F88l2Bl)w%7!97mtx5(Qx%1u6h+$OGa4#qGGGI{Pj4d)5yg8F4O2sfu61u0uM}?$_nH8=0St?`ogZ@1LAr@*uC4Z9(|dIQ z?OH<_%?PD56K*Kty@PQT;W#)tazY~|I7-aq)tQ($$#Q?{gEbJwJK3mnk)|l>XgmJQ z_POHzee+4NEWu0i0zUFmLTF(zvD3B%sp1_F7 z<|O7{-oZ2>t9k~zX0MDQ(4&(YZ#~baV{$ah?o_K1p$Ad`PAvgtuhW(xO{@bMjNb>Y z-k>lsDx?xX;x5*9RSpJe~BwLtb79%{p~+JTs5HZ&#({u>j3kAOLx*Y zW{7^+`OD%vhcxVW39F$jZ;I@H`3X?>Wwt@269f1o{V4-t-|dX4x7L3j zUHltoa@jqToWvn&=0CF%6%D0h50m^)qaXkRMC&Owv8iG~$}1PBgld3nBE#Rg(5)8n zga7!2@yjoBBoF_e3M$ongy7N1L_hT@!LUaCXX6QLZFKcq1r;;Z$sca}zfwaCji7PcbfW7H9p`7Eh$-j*7-=%{5f&}TidFWiMr=NYvc}Q@gh_z)<;^d&F zd@za3ugvK(BbprUX|)`Rk0&+6)#sm5S8a7;dzrqn*f)iXpvW$BVu6u)bR+ywtGne@B61Om=Q)yvb`45S}|LKt&5@)wSOfk;LhZ^UofjlQz0h zm)>a9f&40n$;-ndr=xntY3nOFGmA5POfiIsfgTzT*Cl zU{P;It;qo}n}IeEA1&?GRONCJp3=_!ce2$kKRZonNV+tS_uFPWzeS zhqSPws(Jp?TsgNT7yGtphSz=h2-}y#HTWNE#@LHFs^pseT#RfN*P8yLUm`jG1N5s* zfU25qv2akmjD=Q`s4SJxi@i`xIOCdT5B%W6wj1Fz8)Kuv*iB`}b^(em~z zz4~VcUB9M5@W}s3-SOWXu+*?)Al7p)Bw?jh8_#s)>lYp{{b%_vCY00=iC@I3$FcpY zYuOjg948l-C~}cDxL!%j&X1(H6ZC7U5?oVLQ<)zh*qg)k6HdNPB;PQcbVRXucl7>@ zE`Ga=^8RPrIRE!3E#e-v8MTy%%a1yk_k{s|V-=5ML7(Mg#S@LA3;rEyjF&X1w*^R&VJ>2%B@{=W9BD)oa@0!_Gl{G8Oe+Vki1QQWd~<<~Et zEV_YlJ=t8VXv>#L|FKXIJ)GZ1(d6xUoSPZVFOzMhM$6tgyhWq=@}=HzWm&b4o8R}L zQd7<0PV(LqaHYNNcXtTN4rc2ov$)VeRm&}XS-vamGB^G4tspa#HrPa5#22^pb?s&W zS%!p!fba6R+WLMjkeUo!qpKob}#cMpU4(`C+U6R8i>qlJ&Hbh52enW<`FmyjlhwlfIlxyu$Pg z3uS-Qau7K~%A$hBFocIe2<$LBIbEI!uddh9(JX=++R9aM|DO2#5*qKh#Zq^~O40f6 z0#s@~v{DPy=4^A}ieKe(Idu22Ex4~>p=#u?w_Lx>bHE@Z4Dh%iKrDJj2IJ+qNDIxj&WPRXRSaNz$JyFkpFK#gLAB6G;4KKql{+5w z{2yWKln-fjDCc()q_W&mmIx?JvpXPb{)hR&ok40*!M7lC!&?b|=efwVb@r0;FeD2( z*x!h~5OA8DEVr>6PS6o_oYt+7HY+d${lh@ruB?hP=`vq;@uLNGIb%@~*X54+`NY0- z35nZLFQArwtL~;t?sb(T6k;wi@v0FFLV}%b1@;p|R%u%8ROV= zRWO3*fG33>>}We#nQ5Vk3gY2ODY5fL+-E@ zvWG%=(;1n3UEEjqSDn9V_C*FMSXjR{uYKa`>$>D#@FacqRX4qmy{)y4&Gf)@V_BVr zvNEa@r<%e5HW?jhEb!SY6v|~N%22Y0992I>~ud8In`Lf`QStH3E)x@G=`2&AraN&V){PF%a=v)Pu{I zuQ7a;TZAlAgDiVUO+`B+z-8%M0kCiylcazP7I(w|^h*D4Sn6R#-jd7ZMN@iJo=6v2GyL zo;~Df{e7CCta*U4B1pD0lfi=EwI3CTf2}#(`mwSD-u-%XLU(&V?BTG?P-Fx}R5*E5 zcvSdpxqh`s3e`yRJ6%Efp|NYd2}SjJ)h@$9391YRLSU!qq4E=W9yx#}_KqRcG)(~r z!+&i&OckDJQ2El}fI8mdeCHPcJ2=byp-dT&ZFDzLuqc{lvh)^vKB2 zL}g}~j~QUN0Fo{!0BTTKwrDjx#j6KVb>MsCz=!G& z0?uz!q)+3>Q|KAM0zy>+^zjMt4}XE)t2HIfc*Tmi?$;KdI7B#Aw9_O-Zg>98L}4}% zna0Es9syWr5+f5RGVqawtNUt}*r|Zy#6ay+mEGaSGMmMOW%88u6mXzDD_wlGT6!zy zpLOrO442P{0J&IYJjqwrVrEF87ZDTT<9iz5xv)C#pUTTj+d73+z7GI`Ehx*q&zxS(F>^b?4*udLeSbU~XBKKi_PI+| z`R!s3tpv7gX^R3~Cce0vX(P9@UCS)XwG6mNX_eM`6X(`UW>OMp*nTlrcUU?`gCzDr zKR0P?yj9z#ME0=e!>GupM|%&t{Qcx)sN)wVzW*5E>yxt5g6NEc!GR+F(!Nysd6n&^ zN?K|Q@t>y$%H^ z1}}eMB%-GY`CK5%Pj}AkUNRem1zBUE6y}0KA;6;dZu&VyB`KCwPfdQ5Xri>Osl*$@qxi zNUlL!r3OOxC4C`xXPqL4Ec)b`ajpfaw12E4xMZ6=Yyb-WN0LL2RUzLj zAKS$6X%>ekm|3yQ$#-`3N8ah|B+0f4bxDc4nfJcHZ{dlBeXYRL5bY2afSAF|vcc%G!HPxGS8==1)_U|T zNvWWGt}f~OGmCtqW8>q3f@5Go0Rce)p>g@dgop$3UUF3))$Wn6gRX7M3GQ}?tC)i6 z5#2fg?U#)GsvTF-;w zY-Nw9hPGMC9F9(W5F-PUEmiuS(F06nlcE{I)}b=%A7_~A6cEH$BClS~DB|X6Z*IT2 zIpOX|#S?qiLR2Osk#^=DtNG&ym+&FR*Kv8P<@ep!ZLZtJSjcEO2t@V!3dE-*!yhNO z<`xWq;JT2z{)iLD9MQ;&^p<*B%Gv z9;zH_>TGtlGO@9MT_xDkFS4=QaZA)){{?|_B)8Hw-q)H3IPzKPiHM2|2?0GNX^+EI zRf5>q`4yE?GgaPuK8|(quyuVfv-aF(wlXs_w}4}Na=7tnIA2P*pcwxEhcBp%Q-6rI3Rc0j@jnbz>h=|(@M6C7U>fx%lJG+#q2Q4af?@H7>c`6Fw&JpwfW1WFvJ!J#H z%4DH$Nww@r6h6K-1K$M;1QOi8g)GMGRywKGssy2=E7s%k;ESt|W)#O-pRtb)vf8-D zxR2gI3De!E>)xMZTl>m(C!Tx|_c}u7mC!FmY~hT4&*t)mO76L0VQ$Zm)=+l7>+9FH zfQZjFC%h{enbPhuNz~lx(beZsjm#JG@8B$iw_cTSX-?0fRc}lkFJafCcF=wqJsUd8 zMn~$&N!wK2xp3mXuom2=TlzBdg~W^u`*x0IxUuITUpwpCCpIqO47DsRfB}i?8mn+k zO?VOK*oa)bFN6F7oN04eyGiZR6q#;01`nk`g-ro<5USFo8#dEMz{N z)FLtwpl>inBl;{0syyqD<@D`l$#Jfl)EJHXIv_2TJFdCbB1tJq2^~2}iq9XvxA^o{ zn0YLREmF;vJ(gM2^u>gGlpZOM>hd=@e@%v3L4CC$gdajz11>;t>9B37u4gN+c2EaN z7N{PzCO`Ov_B8QVS#5&Tgk_TYRF@xdXvUjab#=&lP?prpL~g4|3*W;OC@JF8+0RZoP6YS5=9t%X5j<@=9s zJZx5j1kEdx-027b#7vEm4TRT9soiaOv=y$Y#MT=^nhP%|fDdU^7Ez#Ft2I{)2fQ7` zW7SkW?%wkBWnL)w_~|{}hkUWMk@uEt@uS1%?(3-dK@CnX)?b$25^pIgnsh^HS!eiB z?gK|C)llrf;ga;b^r9EOF`p3yYRe*y*MIBz1Bd-qR8TlBdJn2ur@`?phF`DfaY8;D zCwmvCvRQoWVlI$tetKk}o?MNTX9H3!Y@C`PXWV>S%$VZ{%|p4jHr#UH_Ryyow;{{;KtygLxrG7(#ca)wTYK z-Y0sN6h;=V$f!GPone8y(zPnL+1N>PyLSs(y=`1y*FQ1lR8e`3s=cW#m$+c=3)Tb3 zN7!8_R~a%Ek8tTvTN6~|O}BoxmiKrt8Mkh0)vSD{hV=%yVvnL*%!|m2!23pSnTfsT zwQ-^GnI8{pLlWXKtGU!5h-Pk2LFIGB{oj=);~!Nlji{=PmP~Mqtb8I%bKzXfV~y`v zhZpp~H7qb%5D%?Sa5$&Vmvl)54qk6v;W{B~UlL4_ z81zf;L5bb3SJPuc^~%Ua_>tB)$VLK>FZvy&b%*eB+g)qdbU(k_R*eJS(gX< zJxL0apH$ji6sKDr)n`3{aNlN^Qwkhtd8DRdnV96&?L&8b5Co{7; zvmmb;3CdwVs8W1GMY~|zn1^&RO1t0hBt(ULtGJTf^IAMxRpD7HU;6{ij?XXdjHv`a zw9!c(a5cYpR_vk~eKYL+k6gM+5023LHvMEY_p}y=4k&Q!!C<*zC^2Ia3C3Ji zL1sbM+*p_j602gKXP|mF$s?~%_vnUv zj52~Vd_MWnLq+!(*+*-Lw~%K)_w>^_onjFhcBsl-1z4eAVzf$ZoD9yB+;Sysedi;%NXg8B1{e-#F_eG|zvUc4YC2OlIpARjmdsP@u05 zr*U3jsq00uHQh{r5KWSeeT?KjD!)FjzCJInzFM??L^jL9NcW`?Lr-^4X;Bzlu&Q?y z02M)ULBT=3$s#1Y9wAzg8-+0n||g$cI`eH$?LAzF9rpS6h3c^3UB*o~o`&^2bx~YDhrzULrno%G+^r zq3*RFmK+#R^m@8?svWLq){v0z;Az zxet5`c$dkiO>9f|6fbU>MAIx-Kjc(r4SckyK$1&9Ug3)mVCA8Y1>GV0bcjayWKU?1 z;d6`Ui1G&YLMmdtb&4SB(ffffFqD_1Okq%F3-y=7Xr$+V_G^RS{QgC zXKOBBq9L5K2Qnz3y##l~^f-q^dVo0JTO6ysmtjFF?tQ4=Mh9FhB)1vUcK2(Quo8ja4+LSJ)Y<8ba zuA}O{%Nltg%FD9=r+$Zri;I)XEgq8j;?A9Ap0;b5j5DIM+@eRt2of>UaXBan>ZY7* zVXIJgT25e+vU`n3vm9;wD-XX>S5Izts;k7?q0ifUbXFZ ztu890yFSO?daUUr!gp4FD4cm`X`a_ImZ)oY+O^`2sgS=Z-sfHvxbI807yFk_pf??D z)@elHpxFmUW>0G7ey-bx)DpdGO}*NS(z-#}PYqNxLg1@YN}fvhUtBLqKc+GUT;OW% zO_B<`R#rcqET`udx*1pLFro0I)_p#G&G^C(J)_;ph87-;WP@^*-yrWnJiD`bUJP4q znYR1%sd_A6GDQ|qpc%2A)KEGs;Y;857S{2jmRaCehP?GUgH%@%HTz-B?uYLBrVgP} zH@h;%V${F6+&AJkBG1T_xqmSr-oU0c++uF-EFD zir8XIv!Ke#t=O)W|8PyRa?ZUc=)2$4uI5;dauysN?Iuy7nk&-rwtj_ zbqWwtQli>QcMkpbLD<<#ef^2AtKAu7XV^+t%ng>C+4%Wb9$F58#E^h`#n9f!Ps zj#E`k*Ev&FK`3R|?l*-YBQmL)w`1e~thLbiWK69X#vg3g_b_#aGcF(hyvqEk72SD; zu~^e}9oE2m94b1C2NhicobMMlg}U1!FA|mJle8de9Xe&=-H(MvA(68kA0+z|@_;-# z&(b*W+h^U$FizY_L_j1L?db`Rywq|kJ8nKA;QjfTaq4P?Nw-t8PTt*s02E}f>sbOX zogFNsq@})oI`S|>iHp=g?5*Ri>{ zfB@dk5v}dqihux<=+%{)tOw&-*p;K#;k0?3?5LDv#-^~Bshk-i29xz)oSMVH0{UfE_@k=$Td6mLADmA5HCS>H;8Elg7$zuRGQ_PzI@ zO7f{m&I)ngat~(Q!A^05yQ_P6@m+rB1*YFo4Y=~o+^59v4+%;&=jKhGbUydp4sH`1 zy;I`gK$wj(W`yp3Yj2)F9^2eqVW8uZJUv^BWHR7|G0X^Vuta6p*nh6WK_UPW?g|4H zCB73}#_XrDiYLG?L;{a;A`xflU$&e61X|e>FFS;FXT~~Nej^;8D;T+(JOGZ)-YCl! zDic2c`~DhIAgQ(OXEkNRICxKJ<<&$(86$}P>l1x?yCEt=imFk`Pe$TW&4$L37fnx4(%*=smL>0uH114m_}1+sdfuU!A0Zqzr@~p)h_Rae)3fnObHlP6C?me#TrO zCzi%;E6iC);zLiV*o22GEXIF{NL2tM-wS{K&aCtKGNF+iOQ+JaXYw|H4%FRB?7R&T z1KbAY2p!11zb8icU0Q6TPkZCL#ztpG;uZYw`xg!FyJfa%ZgI;OhQyI`fsLCle_S+t z4uqjjj%#Gy0#Ipt92R{W{euP*jXIOxh~qaUFM9L1FgE=XM~3_=Bba|6C*-;_c4HdFiehcxh0 z3i5W02=DV{(OsRR{NTp{O}%1D0O?=QOrHWG;?)^(Uyagt?*2oVuw0Pnoh8{=0EzL^H|PjFP(dF&|L7WETT0GcVgY_ zx1oq}^k1#{aimB=*)HzvnsDIHm*|-4-oMfmwO_ThrZR-9o)Q(i2K8OOn)fj<5|I>i zrMN-NYx$b70)BeTtJLb1l@(5>DzdL{44E$Db`c|6v{j8rk`njaT(d`!Q+zvdV+~uc zwOi(`abOznKOr4><!y3?&Pn`#_&3l#Gef?)=p3_f^Ui;vfzaAOR#H0C- zC_m1^677NRcZrEQlhb%^AG}2eIicl$V9+BoV;Y&B{w1=n5~3`>l3tCJ_iei91O5sJ zlfRNrKdWsWxAWWhrxQmbuci*ftO7n7Oc}WO%lj>uVaUiDKPF^(#js~|dl-WEB(b%;R&%wBZo4s*Feg>11~T!zk!KqRO#H>GQupBCvQnt=r+5tC~|_jcwZextGmQ=bxnE*pJAI!;`6FR9y=}o5@Ho683hnm=2#mq1!K9 z;~t#M?%xqQa&ju$A*O`A5Y;)3bM=^-yRtSfb`+m*&?NHD1^&k_^1V`zUUp zBQjO}+aSl}wx4UqTg2FEd)wQlHv^*CRVd!3FhGRo(ku4))jpO12ugP&rZjKiwWfRW zYw>!=HK|cBWxk2w*r^o8&xo`u5~q#7C$1%JvzI7GnjkBxN}y~)MsK5FzthqT)I+i9 zLQUJe#tLyOp$}IIr$A@HkBqga9H3%Ak12)kQ{#!2%+*+9#70XhbyV%2UkvY~D0|mM zOicCza3cpNf8-DDqMQ{MkW2mhk21pBOx#yO@k>+nz1ZeIc+LzQXaBES&Mc^@EREx+ zqiBmVE)B9tyJ8C(1%!qWVxu&JY>L`J5QAF>)IcL^2uZMMRMdci4TdEsixgYJCJ-=e z(Lp2&ix5o$VGm(RSON)Tn;Yzh>4%xBd6>6bx9&ano^!tXf8ROv|DAg`e-7-iRZ8cm z=ml-2W49d)ss}v#)i{V&<{UK+J~DWlkr^ixT(|EP4_lGEv+7l6mX7 z`rnoA>yKLGlLdp#ymRS3uTeX~bc`pDe>eR8u{uRKGM^xch?2hX5Bxxz6(kXw^chB# z#7h9KbJ}H`x6PI{mOk`b>sfNpaaH^>y|DfmqK}?)K;U6OD{UDN0WtzaUnVZ#(spqZ zVUr8UHtKKJjt*vN1d8xgpq!jad2C3(uDSb@6AQqAzw;SdN2f_9m=Y%6(PT^t2e zg=!ibR|V#v11NDo)>*m?5o>hTQnM~G5obZpgu!tGj(YQzF70x0uAV}pwc8nXX9bNO zbd)kXD!8@U4%A|o<87&s*`|`dnky@hr;;ZAo2~Bu2g7qn%3zfDbCVL7wu5 zo6Tn~<`BAK((ct9AG1D;F6BcA^^r>vEU%LrOxsOA%-~5M z#X&|sFPm7+R$g01eYw6pxAtP}a&bw{TPi%16;?Qf0?g2_F$#<3}XnXEmOcm0X z!{Mfdfq*I2fU-a1TZs929@5Rg{4M{z@?9Cko|M^ReIRLnw|jnGRaL}G1ibFOa|A7s z+co|6Dsuoxs)B@lW!!Fy@jnb5RF(!^gPXPin?1IG|04fYi3yRqp(DWls)4f1ZERc>4-}4==@QsXQg#VCX`Pjnxeb({{Mj4zJ&j-1gzqTJ&ZexJiN=qXShYkaMiouM$* zihdgSA>BBh>UG8sz{fP)%#B>6)ZZ=Zve3ylD#}%J_s_FUjp|p?zS5nme$D^s9D%?1 zd2a%1f&hF>jr5)w_Qg&=>>L|+n_ZGJ{}HuB-aWy6I|{a6W`Hnb;cfm6{HJ~AA5ZV+ zO^P4X_D8eT5KMzCi0L0n3XE^`Xqp2~J~>=whP^9u!!3KaNy^5JOLz)Qwu7R8tf2ks zjisRN+T82EvVNsTX1X}xJ+r&E1Ana8Qpn2QD&fVB#c4QXwtxn8H8-fA^k_PfU1K3X z>IqazcZf<=_}R)j8P@aQ7;I*x%o;+#m133p4|1XdRsx)DWgq8qRCq~o16CxrvV~U` z$2#Ub_snsmq87&UH8fBu1S$k8W-@S#nO1mvLoQ#oa#qzo1j5WsbiT7n#x9E6xctup zJJ%*Op$=MhR$JZqbv_dwGf|=jmqw4H=Qe2mw@dI%LXLx+E_G`7=_yvYv(qNF3xrZR3f^9WzweTrZ7WqEQ>&+*-xiy?FBw3-ZWJN4Th}bQmbtp<+ZqlYjQPJ zzNJfa4MuhJC8X&CS?MdFHTA9?=isQw$nkr*(2+Po!G*E?U$K}~)F4_CUzSe8@O3kZ^Er5IyP;Rw( z35J!UL`-m9!A;qPy7nr*dZ@-uSCrN8P)B_V9{n(?zi#F`+gKxs#*j zIH*Icy{ipTSyFy2@?sB~?5qc-cE2IAHt=n!gOV&jwpC}hxH_Kx% ztE2W0xmBmGr@cJg0cyO-?r1X(kr9xzu3+5V>1YzBtuK6Ra+RToix@7>2?<#qlBORE zbPI%~d_ybB0wTJa@)1vVt^ENOxF^N8TUJ5l82Ua|j9w5GM!ns$6;8y2MsryfV`-qN zEznw|%v2>{C)I{qY-dkz`?}Fkw&fQ zBN#PretyOeaJs1{;WawCpt=$SI;XBPp7InnGa1cDG>a+B>Gj%*6DIE9rWl)H8{q`X zVd*sdD=SM1z|Vy6zDVL-OqDUa_)7$Y%8SwTNc$fK$`(EpOnd?|qD%^KF$$pzZLs>; zv5g|58uwUn(Y{xXl&jn#G4$KyOX%KD$tr1&*MWVUnx;mKg3#9O_l|8-Q|n3o{>>eu z!`5^oYumbF>)9rC1!*L0!jnc)RWy#I)ou2c_^7-jK29i+|GW6{gJ3&?o*?PGQU4@` z$7-B=gU6FGBh1l6I?5Y{G*rvYh!1zuM?w70^DH5@`^PXicUM2_WGwV*Cy$rqr&KUs z;}joZDc2XLy+|3^isfRqI4kTS5mliCSf3Z_X+6tS(ggtRztKx~?*aru3zmUEkLmby!sE-ZloZO_Y`t>6Y$Ly1P@lk?ycSK)R&6OFD*7$sq=57)m6D?#^$`jN9!w z$Ftw}yzlq@^{wmjQf8PnYd!0E?%(f@$3O)+@w>P1Z=s-|+?A9NQ9?mM?L$Gi>i)-7 z;FZH#{oBA_R~(hZpP`gM2$z8$uA4oTeTsro7IypWIV$k;%@-1yjwmP?PVhfhrcFuQ zP*C1rN{T#HanoBrM|UIK_dfItqc6S?i^K#wb=ab?`wf!gEn-xkev5WY+aryTcai40c^)|>K>E+ec<8oTH!6Jvz?Pot=)BPAz*Z5>N7QUnkVti;^*btsSu9JUB@m~FS*n@cgXc6=9G3|4JYC@2aKBbRSEYonlO za7Xp=p9IuQxwVwM&PZnCJ#%x~OjH`hZAy4prD3VfDMm6~t%mQtl1`0vY z*HSSM%jBKyrWm|{+j6?LEI}Y3GvqKEDtH)kdJrmQRpWguolR0j=(SSeI_c4Jel05F zE(*$y81yR2r!Hccg3dmurS^Q(HErm&J9Lcb19agHm=hjsYU3Xc8JP81a5~KKILPL7JFyC z^*y&LQk#x%OoY^&&%X9NV8Xxp!e{Yo1&Fv(yp%lKzl_l9%%8x6n5Y`}aGHU!@%d=C z%jwtMQ?X)wPTTQXsI6($fxrBiWKUnp@$!V6r|EpIV72dz`))g5bBFxBNjs7q0h_?| z+eB8$4^{il7xeGQr?`&Hv+-V>O$Tf^Z*KOwdfAV%mO|c1H&BWl2sj+taB>rPpM2Ks zBTjfYnw03!%t6XgR&N&9DCQ*5^#-(%(Jz$S5s>P!v_TB(teM{aHrGek#kJFI=zD-| zcF#h8!oH(eZMS`5FU^Vlw!V6P zQzEMlGS7gS9xjcGDfav+vr-4~BAJaDGUC(`T{j2v{X^#xw?pNF?_27&6{QB-d@81T z-jvQ!gz*74P}1rns(}HmjXUJydQr5B-n6IgyBo%&<#RShWtQss{dV*2*RaN!muBb} zZBwb|QQl@PVS=EU>8^+Z)QZ_ATzx_hx8TNFo3PrwHnftOgs4nG#~VdD!^6)nyJlbO z60GZ^q1Vss__}XBJROZK>0Z}AUiyRIlw@c7XzjF`2{syyG6|e@>Q88&&ncr@ zyL*nFhnc(7S6a{Y@q4H*1@~P-uU$@Y??fFAT^^bIgMnpt^lYt6P)Fa+jKb4p zZ?a(y9I-9h^0XbT>Ehd`CI8bVkHh_97f{nGrvBL(!@$zC_yMt0=!XydN3CR@_mZc# zzSR&{_SqO)=z+GUr^3#2Z|8}7`RJTNUqcfKh?g2YU$bK6U3AHNE#Iz@u-ounY9?{0 z-hv)})tBIH+I?|E1_`mA!fP^WBqy3Y4a;XR(;wR(FXiVP^nw}5Q*d-Ej6L8FeIGK` z%;B=&-IU%>;#5Q2qwWxVl-YB)%VX;np!}q(Hrr5%~#e840K*K^J zXcHTx3)+WF6rWzaCOLOne!#;jc)rSiKz3TfJ8HH{jDli7`g34i??`x8>?ZHGakeMr ztT#S{d9E&*&kEl+Jr9sDc9uJ{rKTST%iDCs3SLZK9zkHq@v^LBWkl&IM4ozkJwiOb zFJ@BFr3c!#LQ)h73OTLoo<_E(o`IQKgW`QBL8B`n1TD=mdM|4BpF!RqRe0{f z!}sj9;oIzeC<8$;nc#j@&rR`xcC?El2&4SX+3Fm*)tPOw4vf0Cqe0)YKCS5&Gt~@r zw0Ch`M8b9}Ac`y5Jh^pQ;}Om0p;gUQhyK-E=%sI<`?H{G4fJCE8Bg0~Yw`eyyzlZ$ z0{*b26E)cV%nm-^VM5cm%T8daTZY4zIv?Z-=4^S0c1e}bT|tl0Q2xF!2)*JqxoqPu zzwg1BW^PPsEACOnTf)3YM2VZz=W7+7O@!6*ZcbkFflHf{n<}Jb=R0k%wKvp8K{95! z$pt;c_|DCr`-q29D}0Jo1$0`sIRo}!YjT$oixKNbi+kz)J?`?l;~g>YNifUW=0DG- zYBrDfcnL$m0;t6Onbp&hY^G8DV;IwC;Q3l8RRB%qZ4@Cjcp0VdUOW2yl8X4`m3NTNM5AZhNpzK~ z&uW>?=+MOHR+1U}-QJq1&EjV(W>ck82ABBmrymA;NF&-Rd0H%aM(Q(##X91M6JK1h zncX~}GIHf%?%Gl(hQdac_|HqCK*lo7_1hODTyeKpJCZ``dDdph+Zf*EjY@iNgKfUEl!h{(dmX0U zNbz!;kR{sBr3x_OwFRwzHcMjq+Qd^|;_NSb_QkcJeIirtLHIsFi9?W?mw5}-ntn@w zp8ke;z?rkP`_|2xrp?dKrxG{l6MPoj=vB_NSmHOjeCA(FV=LXNeov;i7%CAVc28G9 z@mmb6hyFD8B|rL1Rd%Mk%g!+s02W^9s-9O+^623Mj%Ds*tiBicI(O9ew4&MLXpmsU z^r71~MeXK;ldWsM2Wu6V=byFJqzATP#3zt}Dvptv`red+?eANkC&_Tz^}X6lIz4QT z=4|gqkA#pk4_}<`Z8htj)rv+ko*pr928n7rCSsBi*6(HW;cM+m29P2} z!v`B^9BA)Z01N_^hi#`)S9UH|+jgs0bD&Dk5vERZb3*!ZH>T|x0ZVYP*VcijfX(_@ zUGo`;5LO${U%N>I@>!{7n%wXrt*M;e83%!iq%TYl2Q6T%O|_HmG6MnCTs1}_o}a12 zmX_+frrnPAIVWAZxGn5czTuRDpLn{lWgd>$xrCl&94NcW4WeSC4<8m=z>K0w~a56+P1wDksK7nRmdn4Ee zq=bJC5eDh$Rl;@wG!s7z9W8A>EKEHl7uX-2KHbtCX+rmz6ZCCyq+AJ}JL=rJ9XaG> zc0_4LFR^}Nqu(@GPlJ{U<%~RiBSj!!U+O(`X~9)oy?SiFzO8#ni7%Pq)>~AwwRPmE ze_7!j-)1dPzAo*;;{0NBCUkzAQ$uN$Dg)j2qs!sZXqAq8_glj4a-dQO+U3WY9(o@K zpZe4dRjqQ`o(k4zxSoPv&Q{9ykqo5Z$7Yp)1U;p{WA(VZs*`H@nl$cjcABq(>)V z4s?5N_!w`pHsiSp$B%E%>iSm8TTbt6;YQAcua^$WT|6m2^lZuSvvmlU-t|Yju5Ca5Cb>mVJixq34`PMiwUGtt}AZ4}nLGr6Kod{&6Y zL23K+JOusXTZFb&$KkZ^W+s%0(kz*mg_oJfTo7q5DSX1X@*xE5(7!Q*j*vk2PPuCYwgK zvyhqQUV+>`k?(d+J}#z)d*3Qfo3=a9DO}4r_BxH4XV_0)Gl?0IWpq%Yub)OOVcJzs z@5FQn_}c7jruw>Kr>!mumWzMqYjm9{gbh+4*yAQFA z`s72sHv3!!_uuPgnCw$EZFA~3wt-&mR~@(I9$pBYf-i)lQkcnfn=dui!fKp`f=qMf zGFt>Mv~3KG=W#P_DMC)VM_j%4>g6vMd$p@|Mu$n8G62@#JE88MO+eyvu>Dd0q4p}r z*_wDCKkHd0uK2x1i}li`xrDIGkxl>2S{v!n?{=e@WS*C+Df7D1Zgah99)mCAHRME+#PX!(3lN1tyq=wT z4A#BN&r~(!hl?8D-(8q?pbPBoHJJs7`@|k~muzS?`<%BY3SNMFYl-# zSpNE*;$dCwjgys>^i6)kf_KLvz&kOo>VZ$g4^g2h;ERF7FZdOpHo%Xx4-x>mh95zJ z|G&Qk*S3oEGcz-Fb#*srb?`S+5oBUZl{ ztFc@4{$KCIbmON+V<1@XIkP&EV_d%Z0;RhHk5Kd@szVHg4sn+t6ke?YtZ=e*eNt@7uFX{LH`VP z^yuQ?DeNfC5hYr{6eFhO_!#y4>pYskSNdV*DC%HvK6rS&(8|h66ttI=%Cy&vI|72Om90UCr7>1mT5s8(#7L*CZeotBrN>eyyZ1y+y3kbcz4m? z-vfEW9v<~|b#Ecyu9c+N*w~Yk;0f+g-I}NLF)?J~p&BI4_yh!^1j|KeVf%`?#l^Cf zv(LTd?p?oHTwI)S7k&r8o%W^hPxSYbLb=HYu?J!Y7IGNu8gRMHF{b0PPqda(o9krR zfCnMf6Qi!TJs-u~PfeG_a3P`Xb)Ooz&ok_V>L=2FGr426Yed6D4eK>rI!RThXoL4Z zf2^+%$BEOJta5P6g<@7tw5Ju^!y9>3s}{sORA`w4DiS%(2m&pAJtZrv1$}_V7~jip zOlV{Z8)9#aa}htS_B@PZG!k5PB|W?gp&jRqcTImZWJBXR1eZCp-`6w51l2PLP|JP? zM$46ErF!W+LZau+=Gv}Q_oJR`^%63KCl{3lVv+O3mipCrU+{*qhztYzH!4Ls@KlV9 zp08Tsu#;Of1_r<4-;nw|U0ANUrWLkt`PuyYD>oUUo_8iJG~f_f*>(A;6&+44G*3=T zbFcz(rmCcU8N}ho36_>(W3DtVOQVP$Bs#|Z* zzeLHps63DlHS0g@i0LH|%|vN`Za4Nohl=1@0dJZp$=57}*hGUn2NtW5n!(AZ*Vktm zgb#drNEu4r#HCy(|6t@_DQD^g*UbT-8!9iDXT%o1zFtNZxGX%fxzTzQd37vPC2Qk_ zLtZd{996+m**lZV_Ps!9M#nrmp<4kB0ZJL(mKp;pt304=i3{bIYumgICnbo}q3k%= zLnN_OI8Z6hEj$$h`9sW&(#zf|)4A$uDQX)jgtU_L@|SfKiabuqpk*}sBu(z^6IGS& zVGu<$C;=?*AyPZ`c)55`TYzyxjnXG3D*#(2~YjfQBB=%Uc-N3od4ttKbpexVfi(dnjDP% zP)qx|aoO*D;_YcU(mOdDB9Dz$&}67?NX@m<*)uSEN{rrkFB&Lw@4G-`4dPsWuNcfI zBg&^zY{;aN#>#Us4ou&w3Nr6q^XFxvA=R`H4b%#FA1tlnsitVzCpKBH6?-hTqo#US zQmfRH!n0Ebx<;b*87&`E?4wSGru(E;y7_a1h~btRvq^RYgfcZD<`*=R~q$@dq?Wh%Bt%nbs1AI*a|w7 zm4RUOm;mts1-ZOP?fOaDIt19VbY`!y%b%Z7U9MYY0PibYEos;ZqDp-qD5jY%RU%k0 zf0A~;2pBOERR`qNsA0f|6F7vJ;leEZz{33b5<`tt32|_%Q`uU$a6!E)&g$#u&Sqis zjAgY}3tMtkROU4yPgRMY6rtJ|V;SYC56ie}1|EoFyY{CaiW}OyGFQ=o36(tAJ@tw6 ztvs04Ll0~YH<)zWeFiq4Z4e~I?>kj@U+>ZbVPZ^wLel_o!6A8pQE#O`*m*xGm2yt|-dK zogz9zqRwH56>=3Xpz*o*i)8CNc^iH>-a=8&G;LookL4Cin=-g;U{(gya0yHQBN*#V z-+9Djl$3?2p?)jnMYMI&ZTFvgu1Ol6gztlRnVYgu4ydv7d6NiN4Eq)WX+7u-$D5hG zzejcxt`LNOA>B-m&f|^isE63nL>{UhSZ^hY8QNd z%9wY=@rL0}Gm4O^7DVQ;35b6}ESjs#M4n=;_g0~g;S$;%PlI=3#T5TN(1vIx?RG|& ze?9D=$d!>9Kz$#HT;vNmrq7>$K4ItKfesHZloYtZd!?*Cneqz4G95ori}yN13AMYs zw@=c+oYS`n+4=%iskM8R1uwzArwQi34YnZPTKkws->Nji~nkb z-JKxW#*N=)Wo1kCrt}!YlB73}wlQU8L+;+ai|AZCw&yw$6A}pUS40VjfesufM~jO% zJXCarj#^q;E2~VlFdf&a8)YhLd6BDOKe4HUJCHUYvD(XAw|k|Uvh3E)k+~7JUI;{P zbwQ};*;OQkIPt1B?M0N7QYl{P~Z32{(ltt)fva$`&O@I;js25et z^u|d}?fNZ&B|_gU27y1YynqVGMFqIb!0}1ymy(7o9!I`}yT|?LvRaAB@yV_=Xo%l4 zc?lGXp&^M;o&Jqo$9=ST3k1{%9j8m#E;|&?kFc>5r;=f58-FfQ9GaYLD5&n?feBtL zqZQx9J?999Xtt42MeV`4%QxS zvSxn6oF~cKdM|UzA~2LWuf6@t$S}R7#DE7TE~@8b%&SIqlZvq_;??0-{jI3mA9y}I z=r&f0BuGqvrgGJCXGuOdyt*1G`gG9nz;-B{QxrMhhcmV+MZ?;@M`Fm{VbG+f?v6~q zn|1Z3w}^WEF8(a3T?nOX;hQhz#`u9l?S!oJvOxp}ol}Vpn3zN12FD^2R@LN#~aAA#Z%DCzEEK4h?B5E47AWNEtgHd_*&qz=gnKjQADb(QFEGm z=k_MMV*S*9_G1JV*GIwaek=EA`_b5Fq8BLfUVB69jYkY&0#7~Ny2Beu93_J3W-B$N zeR`OMwW!P{pnPjYKU$V>TTNAmijMm<|E2)R3pki=YaH0gq}I-}1f1N+deP}gO##jI zr;x2Gsn8DMs(8O+7&a3z=t_b2I)M>89E!MRKTF4dtw7I%e^Y_L8MHScesK~fXOvdL z`=2Ozb0TD9L-K^B?@HSb5*`W#=Sp!`IlRVIIznnIDh(#t4B%IkuaXtBaMNNuZPnMb z>gxG@b3a8e0FAuo#Ut0rE=Zo?x_hqjEly%-I#sJMF)*P+#$m_aMjrpI_IxdZd-zaW zGc`q9xfmU*O%H4Pguzr9TjZp60LB_Y5@O>;=?#C+5|j%@{;B>rwE^`fWpT_*B#5rR za!?D|4jL=|Re#)ZjA4XA0c+?@7 zrL9%1YoxjaPml%ZLv8RuCq9{T0U2^&Cu3QoB*ty~svl6uS&zTQ^{lWSmUmzUI0I`G zH4RXH$_lev+b9b73#qHj$ZT~Py1gje3k&?oi$@zH`Hd-UTq2oFK&+{qbykpzK|3{Q zB@Ob#(f>ppxZ7+8%_td4ch)l=2>hNm9J8jV&3Mf@_XB6hV@W+xIl8U?E~wpsh}$8n zv9YnNOtCV;7EmmztE&-O1T#B3_8-@^w6zfs-W)|GpTh51otY_I=_rvyH~gVG`u0F< z5TcwEJhbSh5Q2VxE%X^!-=$wG7rrN50kSc`k*4*V2KYBG*~?`NETlx4Ygux6eYqg` zZ1q&@Lt=9A?dxj8(VB*NzL$mj&g>cX{XG!KjjJyc5`ulwSSp|J@`?jgA~CVBShvbj zwHQeqI61YowaxZJ5kEa|d_Fwf&pobc2|I(9Is;!59O8&^{H>A~UK5h8)H~E#bO(%7 z71>&06own{+sY2Et*uq+-D{;K2P(=U3|8D{W;Ie&CeR$DD&e}f)DI{*i;Jd6fydDB z%gKw8zgWun$ukL#+w$k;=Hx&pCRSJS z7UIDkZ9wVOYpidSA>oeuv^__akbqBsk1v9##B&{Cob2qJY(v2ud_Vyj931TJWdLfV z8mzLia%fcD09lwTb%t!V#iwvcqA9n5(vvA=yYON#_RlsZ534sy@DzM`j+{*Rz-0R1 zh@or!v&7~_A{)eyk$}!zc1e*j9Dh(HxYmnS2 zQ?TOqoZ+2SHlA=}foXlWR3%eEZScKDL5yHfaK5hOVmP#L{B%b`chJ+qwbBmc>buNx z5aoj#$vGD3UQxcaCugdTD8y0-6G)(9oV+V>Vq(T`rTEv1l(+=1Nbhl&{ZmF_ z%pZ4@l_tyRMfXl^JQIk1AraetCnEB?X9k#F@@By6NbZfeRO*SSr;(G6pvUn6js2L2 z^_XXkn#*wVj$e^_4L8NQJTu76fiJj8u*7?Eza&)LEAw_IN0vR2%Af*hI`-BQ|-sIu32GbNaWR!8W# z(^e18lCO$alRw7TJbpcCPsf`XR0T_xqnUK0FIFk$$ER@Y44ftz1ZBF6J;!ZUZFwp@ z(J1m+D_5$d%9X#Gt9MzRlGFW3fC!h!5R#C@(EP6}mRH|`b?R-&TlvSRtcdGQ%fJ$- z77Y{wt#4CZm_4n=d~o`o6fe-5t_%@MG$sGvHWgjoZV{Y1uvitC!9`TPX-tCpIJbYN{& zxKz6lvqs8lQ4!_EZDx-XA6ap^ml(rgL;Jc(kdfQOFf#U54)Wom=4)zbeDnzk4RvvL zt}CQXQC{QlHdUIAu^XhvpC!YsqTDz;d*x%k6LNSJt=G{In^tspzRzdJ*H;%VP!+W2 z3SeJ+!Oh4h(-99Pw6L?Yv$n>v$x2K~DJd?tv9iLnag&jiMZNlRWJC>t-JA2^D6_tl z^`)iz>x7ZZQtUYl3$H4(U%_jW---y-;b!>%f=Yd@j~%v=HN?g!>L|8INKQ_EDfE-U zTy#c|0Tm^`un@B_d}FCUlYxPux3?EboLXB&00%-D(@sMZC_hD`^MHm2@FpZ)DN>B0 zy*2O#ILvPW)}*Z`DP{MP+uZ{KUF%tE0P!Qnmil%U1D)yfryl#om;!>Ojprp}Sco^G z(E-hDa0FxNVqY$m#H3NzJGU&Q8A*;7-Z)~!Fdim}3@WwEVjj%=p?7=W%jBB1?xT+d z{%o|EfKjuaB;@TKqC%!dI<+=wU2O8B{yuk>OCIKQlH)+QFad+y&V_2*wkfE|b9Nh( zIsi!=7R}H_Z5O+^I7$Sv22GIho?vb+DH zJP6)BFnqZ)?mN;%hrh7QnpziCncZrC1I~ef=N9u9yERF!25LrxL^Gonyj(03v50h! zf6BQRZ>TD_7`|e=Dz)BfdMD`i@YBr|oxKkrXYyE=ImB6nu=Cc+7##W_O-*@^wcHgl zyh8zrqkyU-qNd>OTIX~KexxXJWvF19VwhyV5iVyloo5Y2`YfM!Xti09UN5ic1$l+Z3$%;>iTx!rb0 zULiG>g|rJ?byj@y33+{3zf&#nGG-MrT*_i!F-RHBhZoo~KrJ$1Fx)-ir~nwgo`;!Q z5#l#@-E`3!h0yS9#HP$_e=X8n7AOD zg^kMw-{3pMo77am+Wy6SH4i&4Ec+>N*E3`X)7JSQh2N(!li3Q8L7+hgnp615{MiP1 zHL#zx)Qz*UvlrqQ^*o>>=-xLOOMNQW@6ri!2U(>p{lEdJYE2fz89qVi=EyTW+zU zR>$w{Baxi7K>9eBVOu2xOPZchP5(Y%8FtSqTu}~p_zH-&_uevjA=h7;PW12BY}Z1$ z3l1wF?C*aG=tNwKU-@U53^uu#$-KwQWqZm**gXO*5mDp!s}S!hm`G^jC}${&26Y&A z_W>GtDdpRtXAuAEh<9nPTS#+Au|aKc?KJhK;k?*@>r38`E5!g7H=s_gf1!Je#&~j3 zOCF!FqT*+-^NAWr$pMFg?LXM~1wm%;ewq~j9)%^Y70p-%n;4^|>?G0#pRMzcn~ujW zgn#Z)O`Pjx?%}kjJez`mz-~P6W*y8iqwE>rd|!PjWMx%oPB!(A-t-S85)L|kufnUN zX#lTU-5mP2`&=??rI#I6tCMcAHTtXptNIP9#dBMiYR3B-s=|gJ0wLS8E^=v2O=1NP z3d3z(Y^z7g3)Cv%Yvm(PE@Xv(hl&6h7+6lKS1oko?0W^--mdWW6H)WHtH zqena(0y+4QqT_Fuhe=z5r={)Lm_;gy(N1O6c-`*q#sT~Rprp}TXfE>^1em^ z@ZuQlS6JF)dAM=;7+>@Ycc9k`C=mi=fXog2_$^WE;;~`&_aKY#(XAu|Xwm?$@w?cH zm$F1GZ3Rg^q{CAqG0?zXJQ-a)X?EYk{`1B2-dbgwZ|ro1btIzv72A5W9xd!w8ZM zfhDYjv{3U57gDQR|Ea2K<~(``s9Q9%^9nyc?F9UmQ?L?UiFu7iBVR^?jZDx%KL67) z7BHU5@JoZrG$|wlNb7nMMg2>m#c34GARf!YKrU1i{VaxHn*O}UZAR0W=nr38(wB(1 z9z1#d2jUWs$ZWu3@Fx5_!(%&UKzzGH^&0WmP&BUoS%X{e>AXL>LZ&&;mVVFSN6!+j z+xz9qt9>gcr^>>@Ze7*wB*PjD`@r&suA0Xok`clMS`CBPy?sne0hH){>kQiOs&4f*+X>FIii<^3Tg z#n#p~9Z?~(v$LC0AmEHIJh1vzj(6FQXOlz(xYptM9uhOZlAr6?`IlCEr28dcIP-LL zoSmITkcp2JX)3FC4AO#tvaFS=pO~14^dtfUZ?3jzDl13*(1|Fu_5WB-Dk_5fNgm*C z`OhSc{f(t^W=9XmC2W3~+p1!B*M$&itpNT@caWw=xSsdwo4!6PyXIAEczzW)gt$p< zG?{G}UT)}b?j0+ROprydSpH=&Pbk$-)-&W@l`SRVWl~f9h%f1Ywq1+;vUp+sl}Ug3 zer@=L6*88L-G$C)SZ5PNA?(>uDW4Sy55SRPauXINCgw z3`mG1^w{^1$_CZqYQ!y-QC!7s^u07KtHO_Ei$S)$ewJTkGKzjtNVH8{`|HW!_|kkP zGM;kBZ61iOfcYBcKOr?s1!ka+X6?9Rk(~5Sqv2M!+~4;Gu{09!42cvM_mIiWdJcom z^cPng;}I7u6i;_qnXMhIWiJY9TUmIpU}L0IDZhR*C`J-)7GBRhR(n-;yWs<=YA9eS6R?za z39lg~N7|b|+lL44!Q4Zf23!wi^!6@35dUJ5KDGfvxPvQn-9+Qa$$UOZ#5&pMy%sR@ z8vz_o@Q_MbaT~7`ag78RA%Z6-KI*9J zdk=3+U5c^=8UKe`GftW@f}3YNvZ-rD7S&s_+VIdQ{P@+*{Efr;^Q9kE($d;@CPI1F z5IYiQE$A!2z6&iS@8G68detTm4m4N}qdG%oYo_(s1s>zaEd2276sQm@1fUc3>FG@+ zp%5_8aoDd6<@@{J04O?7hxl7(h_0&*ru08l*k70f*yrzxrEusY4Frs56ICC;4QHC^LBg3uSO9cY?v)Fk{Rve4!L zIh|cfrhD932NcF)3`VmyM#wcjS$_T%A)Qm*fi4piK zNG%{dRY^vB&qq}ox7X-PXfGaT_BTq3h=O@zLPlyHW;iPKEFtw9g}ec2Z85`x%CuH% zAf+M{GB!YYy{_!t_@<6wH;-;7o`+UkeG539QTjzk_nVy*Zsbx4S8xD?=TQpfRe~PE zzzl0wx`MrYQdS(rfCk4`-^4gk1*g47muU8QIs zbl)W83cI?bw!0NMAzS5@zP71;k+-;YFc(o4^rd`yu`to0Yl%Z%892f4{75|UZgeM- z5q9d+jMxBjilqc(mGD_)mbHpQTt!vk`pVRCte>R9+7=~oH*5(x10G5-+mv-`51ZFy zbqtu@sdJKLO%89%wpLSO4I5ag0Q}R0e34y(;YhJS9&su=B#NQ}&R$!FwfZ`c7~J>+ z*C=l^KhH35S!yU{J<6cwRfbaDeegE1vQB(?TXq_e%VT&k5}EpsyeT}Odqv(#e}WNSLsXX|#4qM^5(OCX zv0;GRx4ym}5)zUT;sp3DRaI3sHZ~b|!+=b)(4((VC@maT&XW1uch<%$h=_r=(pqJ+(64TIjLi_UZ7fNiR_W; z>c*i^oPpsDQ99}sQO8zVF_p3r;=PjUJVH&c3 ztXlM}{=d>lkVy9ckz)RtX2_IcL_DD1Bsczw{lOr8pb13v^D7sEmPg8^B zu+-4tv2m-LI*y{CzP@3S%2lo5;T=xI+Dl7%fwUo){=}==4{E7Lha~3I@Lc`PV7F6lk0Dch*+& zLTjd`-XfCK71T6fA~P5v@ zwe}q)3=_{C|8D*ox=44fnHIz_`t7I(Sp-j)TCQfe%Z!yhoXf$Q%pzBcNqXOcDoVBZ zfwVX(j`Lb)cauBf8`Bb^^`I;m6}hMsrq|pbUbAeC-^kXGO!RcfD>FW6O^Vr6Pt_TL8bS*QSUbok1spKPn97(M zu`f@B3AS`5iDa>)>{qi0zbb3KCl1a-u z`W2{TSOklXmq1zlJ*FNo0<}+Bu?=G|CXauD>a#7X=oMW%Zydm|;bIMpEH~lg<}$N~ zIJ(K+@b=Y-l<94J8hRU#0@*Nj$^H`^eGf!YB@#WOiD%|*6!CvCV*YN4{NI2+9Ygpk zN;3?vR$(2$Awhbdm7+>PzrT=s?3)zTiIzJB*IeiB ze1%82N*XPlz0-g!_pAL{cG-%Gia`(VpRwo~fz)EnikyxsA zfiE#JTHH&z>;n%vj+nw=>s)sb6B8cTz^?fCsPSavW@_r_w9n}Hd*nVRKZj>XX=$o? zdU-dqs79Rn7f@8F$#$x9)|Nv}&=YjgE21}yIuB(p{Exzf_k;k z@|I*~`Sei{ovr|#!+zqSYAj%HWj*tCCQW4eSsW5ep2sepN89 zc8}AB`%lfQ>t%j^X0sQ<67;*}&_UEJ4pquW@K$8wp&|Jbn*XwjvQ=u@fIxMX0T3=Q zwgAG>8k3rv$Y^%RdudRn_r#PgB7eXW92q%j?*f^<(;uE?pfNQb#plPIS8(n7muwf~ zendM75555+qcUQ{i%>S8aiV5Ao~g=A;qWiY>Jd6ftV?&k*J}Tg-z_rq7?7zdg^Pk+ zs4(vfN~u_vXv};##Y{{TPQbEf`p5`25(ffo3M)7n1#I31$r=c3RmmQZ(SDyk{o$d~ zE zP~2h+p&5sT(E2>ry&!a>$>>*!(IN$rQTDZIeyxP8SZysRVW(Iab} zWu98km0)kVV2Txmyb1|rpl!vdTJ6TaW?3RtxicccWo~{gB^Z<$cqWVpfnW2W4emEW z(B;&;w(r1>5|^BgND2qcJs(%`AK?5+{+~Nfr3Gu&@nM(!4KL|W@AScWH;PI)@5WK1#JpZVwXm|XGO!w}s#Fnb+wUDa8fC;f$y3QckY`UL7=2`i?%yvE*DGCSWCqz=|Hr_5R5yxxG)E9x0Ig zF$Bn#KVz|_g@8-;r+=3Y_;*1F--_39QAW0x7J&!rC7|lSY!(qx4WyW@^3$aId#e3^ z&!qdEevXj!H->BEj?Nkm4nP0|LzI8P*~sZpjIC3PoD$^vSO}o4%kD0Y1i9Eu#5=MZ zV)IevQmWUK0=Wh3^;4=N?9$uGQ8B~ZK-ge^-$@SGRnr_FA5~RV$f&1zxLPvtD7Nc9 zGF!k!r3epuwK(2oYGkETOXtzS;mY>re+*v>Lg3oD(3xN)1S9AOkl99p%J25PDANqv zF#oTZdhLsRBF$gh-vS)?|A2*}kdQZ_^cg^QY-L~zqk9xC5FtCoV9AUvd$GdupbAjr zDA(_=W=sLQ>Nx)->DIRQER58zWRQLa2o(rW9rPj>`f%3& z3~7zmB?z9(D{!SU^B^8Z8cVbeG^4{AJalq{RXl@w0yA6T83JsCqqnmQBdBeUAaoCUQCy4(yz%qwVj~CIj|`+;wBz z2&LRXuaWDz!XMKH>_r6j3MR-88QK@jYw->mfidcCdNhMF&oXcvC7f9aGJcqrGXH%5 z?mg6j9Ndh_;wwBu5{oV+fLMr57l?r<_+tf(I>rt0i2KQtV!wU+_DE@ee}72{qw8=Ge2VrekHh((m8dC;yac0QM;ZTR;%GrGWi}$&nE;n6Zho9I#i~$S4!x zsvvi=Sn<~Z0>Xd2Veda>?q*see=&DJx`Wr9pB@=X?VIVdRi=k?Mu;tYlmaLHVSEQ; zHKJs8$XykPsqkCU{!3@5NTCkjDuIOvrj~VmFNta49ZpFDwd1X*vJdLUDorE`Tb7#E z(h)gGsMd7BMSVAQ?Pzm-l?UC+EH05gMv)+g!?lv0-o}O4$$;)_zz#tJ6NJneO;#|k zcV|I|Vw5k9DheyOY33$9Mh_`_20)v=C3&+19$1cH^-^67btEHpCk9sJ-lXw_$W%O3XhRC$M_ZTzqZTW1rMQrh;#tCrYJsL`$&n$ zV4xJnZ7Q*9ES8HLx@R$8Wikv7DY?15J5Q3iSH+tqInTZtJxF(@Hj)Vf_SH$wzPQkY zM_dg*Fh*Yy2&9J(r@+O%%eHY z{fdsKWLh=Vfau|*|J=&_@HZh0A!rggMZJi1)D#fHxR<{&l99~e@sAxG$|s7wMSWi| z9tkE~EN9v75A&HX>u6%YcL(y_KQ@JhI03PIKF~5#=u9;Mdjb&2 zi+Mx%rZ4$^ZUMO@uKuwxgo8W0o;-TlSj@aXgMlE)8II+=K4)&q%8tUqjR+KA=I5W9 zoP34=2Vjq{H-B;zJPl~NXbfnLh%9|aPtW^(?vMCCT;2vigC~KJ7yJ+G-D9s~ zHhJvs>WP?|3OInj0&IYB>cw6c5LEa5nqr}8Wb>!asOlgcr%h2)cJ3`M$J}5NfeJ!4 z!v7|;#uMad=D5uRtAbso<_Ni)t^R&<7%=$2rJF&L^7A#@#+%ALHXB)iF0SDJly{zC zO{H7kcg9g%ac%cTYalgN&8m;+>7;sRAQzKcsL! z9pdSp-)^vD46y^}ZSo8jw7~|G+H&sxaLztL2KDbbZ0?mi)ClgWC9UwIH- z17CgkS`JW8#g)EVwxU^5+l4f*{DI-wYZ4s7KrOL2cH>;^Xnc(=#Kr}~2eBT{{rL|d z+T{I0lC7_u7L1*@nrq^;#*J{QMywSe;GdeohQ!z2&9Usb4zV2je%+=8FuN-Wo4osyaw zOG%I|3KuP~O(nBoAZKvJ6A99jOgB+t0cj4+Lo|*^>p>a>K0)hdeQ;2Wa;}St#?YC# zjqH^IvcbLR39D`;M=8&11eM|>vtMMy>F8U)yuzWf&YxuZ`#?v2-hm>X!;}?Q@tB8` z!fOmsT#}Re+TGXCMhEnH$C*(=;_j?TzK#I@Ha!F&iI-)cfvO?E8!?-H!PX~Qs5H>v`6bfxFdo14N~kp_>vNA47z9PSn7%X5y^mcq};(@5$Yu`t-EWoV}Nke?`&98vC<*d=66R>Ot`8# z&|CP-8zazRrzcgs{y+q9pK1zgX=wp%_ij|<3-f&wm;7*oWDp6(W09gQ^?%W3)zQ`@ zzb#zM(6}c2hLvGwM~6Y$Vc`5p7&xHw=!*Y~s(2_abuNrPxCD|&3ZLl?0n1h_W93W6 zFEtnb*4Fnm5r3wf;R3RsCNFa5`GaNrx3MNj=_*sq%2s7biEbNm29*0`N+J z?>wQ`W|IhmA&~T7V>k%FP@5# zIm6X<<~=8J)gLm7G<$|s_klLm>pVM&mt!%X>V{ z8OkVf2)fqC1ux?`7>>0(P8yDl9eONSW-J802x>U_D7SKUVN8OdWk4J=8-pFp!QLzd zQ%7n6R@!8d(e^m}AW)q8#|XNO65@Hx-2Y3)5!FR3g(cfI~Sf_55# z2s+Q)#^7fO;5k~N$-(_(>659=$+0#FiLsZUhdqwx`I<~ zHJ^Q!4_~#&g-4JXVg8$PBEVpu$lIAT^{I`@OmXtS5TUWE%kBwo!4fhe^S4{{(awhkNpg=`Jfxt7In5W3@)d7Pu!C9DL?p53ulWm`KA<$hwy zq|f8_?1?44Zy54Vm(HE2uSTB_I+peknNFArf~kp+JZ9*00w|{PTT3>oo<;tUdKP;E zy3bp;%Lhlg%MoWZ%*s8ohb!q*bw_O%fZ<+mo_x_QS2Ig97-(r{b~x1dX;w(Ahb3P@ zhB;Alm@+MXF1aLp@Qm?jd?)fPdg$v)W)C_WnY`pBO^y}|gCZsZQvLGB&i0}7jVtQ4 zJF#^&B;?E?-DxY9y?KP`1a+kHKbQ(h?p5%cI-ETT&0w^qwUaaj4qjZ2f1|$t&3}D0 z=~Qp!^=;k*bN=5r0H|vh{?%{)sc*Hc?H`6{zFYe$%gej})i-mCY?U-p=O-g_;x;c1 z`5Tfk0{;XE5c;eAZ%apj{E;*OJV&qN{r!zUqns`1R*`?yMtRU__9FUccfm@=5%t>o z?GxnE^u3F+rkLTd{Cg(8CbL<;l{g`}i)|vBn-57K zgG0xIe}6tAb`OVR+#5H$A-{lbmRKc1&N^fc4GkH!=M5*buiqLGE^I;Tj{?kcbTdyxjot~Y4)i{T@hjy<+1ZtZ6PrYMk#S__K>z!*sk7$GKuvkx z?Djz=T;wW-XPZA})EM)jR{O|pP}9628^AQ~KT|3*P(rZ--w8P$(%*a3&ZNbbSHVA= zSSGuu62hoS|SV#5o~d8Ie%3Kn`pAEv$wGmycK$6 ze2tBqH2Gep-~V1)3x<$uYp13^YwHA1TXQJD*?-6^4+O%+rmG?xOed7*-k1l0A%y=; zo+&mm`J)$+vXlK+AJ>@J-q3;xcxli~dtfOboSmlY92GpecZHh?CF9sl(lAfhRNWWM zS%{$~_s|hk3?4am*~o(9T@QU=P`KarDm_!i*_LDL%FD<{HfKPzgzMUSJ74=1`@zxV z$zvx=tug__=U0JRc+R9+5pkQ|S1`rD&hp@UF6ZZePd%IOY?4w>Go}>l*@NnwtOf?l zNfmKVC=2@BGUqJ4=s;c|>1}a3!>md^EtYnIogbdvoH@It#ZV)P(E0qw*=GJP)G$AF zNo#UDhNK1p>`?3tho8JH$#>;i7FThZyp{;Wn8=TSgW-^4?RQ#+;u0n4ORbwuGN?V& zW*`w|wo(VHzF8mtAtkMN&W-w^n(tU5k-g#!ov#Xj2@Cn>({ds{Y)Z@PWUO1W*0RWrMHS< znBh&n?wo%r=RcECC0y5m1D&HcJ|^j#>#_g;G++H4`2p&|1&=PJPlJSdw(L1z3E~^1 zeF2=%`h77B`~ZyTCXt=x*T*ByS<{=XHUM5n7UgQL)Z)5`>Yjm-b_L13+3FNOZ{DL` zN~Q*m$Ayp(+}AlOWUh8LBO~K{aslYufSv+iH+}-SC^;|1)(1xG0n+WW|Ji(Gz9$%e zKS#nT0^CdknSN%p)XG8T=afjZ8w<3PWlG=~KQOWyC_OpwKK>PIY5DNrYbq-WF88}D z=%5>{>1wlm&Gt2LAjGU0B^}<~|2DW|_Mct+|NU>}{s0=fkxOzeVt898QykPk8WzyC zN)(a`?^2$3WL45|84$tLP3Fx&)eG4o=bgqD%<~KP!{u4iFP#)~J`LgE7=y)&f*=9#d);a7Q8)-D$BoJ^VS zw)A8ajO299nwOo#LNTv>@nxfy+|-&&Y|Juq+c=H=RaWNdxL^ExT-==3J-$u%NR<0|q1J2|-=;+~ zZvV89e1rUh!wxsG3>03jkj!n}M;a9p+h!V#*OkUI-{2e1C3qKF))`H`pwXSmRZI8m zN!63M$~>)KK?NJ27VWY*W zQ)DezvXGXox+lf_XG3Y=;j-Q;AX9Fpc3lBjt^GyOe9CK!=1*F6+I%S)mnNLzBgdiW z5wRFv3J(0jCurDdnG4<#Se5veK#DPYDG#lEbGMmv-sbX81BaIQ6tv<-UF~T@P{n4x zdqIkQA zOodNJUK(13$SPhA9L3h7bd3rL{ z1}>QfUr6?f$HV>3vIIu>u_zfUYk3sixQ{=dyjyP)*-<>Rl-WpN;Dk@-#=pbd%1u;3 zI}77;buE^c4VC9g#%G%EG`Ky6xkT|SFxAOSJyz1}vVNK+j@;#k@1UGcsw;Np7(&b#e*M}=eAT-#<-voHLR(k94qFB!M`88NHLy&+9NzwOjvB}Dc^j3w*(SZ! z$>r%KIZ-I3PZ}Bm!Q#}d$##p4_|J~8xGT$(l(aiTeGJQ`=l@vfn_jb#F&cHx#281d zTV%aw&vzZvj?=#Pz9;X6=dy%dptg@S3bVx_!D5ioU43vZt5prXDPW-JTi^nY1 zduhn)cB})E7hrmc9eMY`%JodPjoov$CC*+P+7*}y&>@`DE7s{&`FQyYe25|qj*sh9 z`FJE?gKs#H-I-fS?fs&SLeXwLh5ls;$cD%L*3U**Whf>~YD1+`W=9V*;xM(IzwO*e z5MUNS69f8NQ{#1e#Q3Xh6%5qWu9#MPj#Ad)f=maFvUlyYhEMJz?Iq`e5U>r05PT={ zY;$ziZ&6YieT26!PTJ8DTg}E9DJf`ZDi)aZ|ImzJ-&8H8OCe&{N{F(&_|`l68AV9K z`~xF-A~F}$=&>=4Ma;DphRLhaC{9z&_a8s{jIhivFePR;dFWJ_8IM9Zz|%DwRQ82> zCe+sOMnYGIms+(lz9Zl|Sa;r}br;K=ZJ0JD-|iR3+2yX$xlGI`GTSN8mrKM~RL|3X zG_wFXTFzjlE>t6VXMfQK`6U;3x__y~qE~{gTXQ!hR#rM?njmwN_Z2jIP4C2BjheDf zalH&D&klP1KAXgJF~~+CJg&m&o}=_;*qPijdrEQ7hcGCywgBAV$TK6Sw>h7P=gNk% z#D$2sT8pYK`jcq*lw`tuvb?1HFJMKX*X<@bK2UUBR@ee3AC=bTM_FA2tCz0^D~h8n zsy7B*rI`Q5Y|MjxWxFU%rvEqlmp#5&#T3nOLuCGlU_i;MYLE!O`|@%;cLx>55t=*F z+@g(5+4YKAzx8%8V?-)@s_?{a?dL(3TLtE+C1+^cG50=E0P$`2?F%HXIh1-29v^_q zj9;xJ(r~x;A_M8}__gSs*rOSlQn#wL2)l6EuZJJqaCQs}m^$LnQyPn6@6YLprz!j< za9!FrVMslV2|VmfHJ*7mA}bAvQj!Ffw$~> z+aXTVb@q9_-aO<6ux|$DeWb~l;!U;xqWp%Qmg{M48sE^Bb!>@J1j0( znVzA#l=qu0x16mf!IOJL2%$BYL0u9h^BQ-RcTXNbY{Pokw}^jmrd{%i+D;ioXf6as zeF*`8h>S;x7i0qNZ0&Y*sA!Z2-$70HnrdRKelU?9)CqTQaP-o)kaPj?`n$1??|{_* zOkn+g^jmK&{duW1DX6-u<$$m5@lp(vzdVKw=p6S*o}D;aAgjr-;;Zedm*W?oavRyS zkxd4}w%V0#mO$C&k|hZk>BpO`iZ^Preg+8VGqsXjpc#<!dv!hWLF=PxZdsvP zxxdjp(oJ3Btv>~>HJNW8_X1;AW_8enh_2;GL)Qg_}dl$aoik?y6oCZzkgwBS*tGN zWq+e*&En@~`5T(W>VhE4hw~R=61r!`UueU#prxGCMG;es6dM89yOkjb&yJZH7VozX zVLHwAe~4XeGZPTi^}Wh17IOhOGCjMjKw)u&4C%B{QR?7qyNcjq6a!|;a;*%xrrnoE z1R+Y;N?E#XR^d2E!kOh_OiW#%WJ2jY=zV-3Pk?Y)SxRfFw#Qd8OgD#7X&simU$O}k ztavikwkFOkJb}D(UL+LR{l9Tfa<9Xskn%CEpK<|yb z%cMqs@~)iOIKvItCbOF!ze=7RLYtlAbcCqF6C_>QTRWvKC+4o)xaId{{bn_ZG!=^P zQXiZ4>vslir3*HSg}h)<98;`<#-iudnoVrEV}&l}KBd$H)By4W%;gCtY2xILTO{(G z9V!@4%}`SUgPL-~&e%&+$%f&=yG0(qIrl{3NbXKur)g?Kp-3=zf>Z9a=H_d(DS zW{09il11yfqvVbxD5jM)p55zRGO=cs@-E$WRZAkyq?Qj)jt)IJ23P}UGJhzH4yw0n zFTkb~RtJjie>}l_V9)#iXa|Ts%no$j^;Rcysx-s_n7VHaF)|0PPY_l2Cx4I&vp#G{p!F-iaeM|p}i^0f+VJ;eAR^MA{7~hUf+n)w> zh%sR>=|pTNdh`MV6sAw#d=>!&pErXCTY{uBricm=D+SU5939lkdQBS;liLVrnqB$~ zzKbZf-|0#iTIkJ|ml#9Ku;9lgs3Jh!{H34?MzMCMmKb@AaslO7un~1lx=N72_QfSF-e(t>6VS4+W?n1q(M(FE1yW)@S&9g@Z(#V-pv60ZT`MAxOH1}X9w(ma~ltK zkz#Rj)1Mh_edt51gJ#ui4Qe}LO7xfO^nbb8e|5bktt7}8veHbS7PmFrPDwMYzg#oD z{Lwx7k}B9bM2~mY!bil`bjC!SAJR1_Dk+ZHH)|V*jx}sXbcqXgjzbeuA6Y9<>z#z+ z7MqccdbWm3uQA?w{w!jxr?2)TC@k+@Q$y0t3O?O=FdV#OyJ8_AAnBj9XV8gf_yQd@ z%R_=3DvPA=X_y+F`_&ig=$vy}g}w=g!@oUhZ<;9NF6$rY)g8RbvX5A=)2Uuc{bJ)| z3R4)pNbC2EX-CC2v$4V$QHj`DHBOdY4wP0&XB&K^m@Lrevl@k5ZUhYnzRMnI_(uU_ z@tD_)%qc|;D#R?BLMOi&*m64}_$~f?P?)!mPk2_=r-6aW%F3{tgnpmdy~IoCj9N^lB3VLA*FFw0(l*lnVV+3&PuyJ2b3Y6J5D3U-^fXYjp#seSEaJ3C4sJw-vVrNw4Te&sQ3yZO^Uu;)9 zAkoki_0WebPq)Mm zw+dv!g$ix$!6Ns)bY*BcT7ZM_{lF+b{i`78Eb8@*2I$7x&9J_L``(FQCsZ~pt=&-8 zG3lSxqc|&->?wL5IhbRcDU0iflJtJaQj!lH%($2=@U{waSqxXb4(*mqoC)0Kv$IT_ zH42b{pfk^m2oIPrpCCrr%~aU;QZ;NEUyZo=Q;d*}OY7w|xnBguX2i_6SF^j4cVcUC zv0Jt5!Qceh(W-p@r{;o=&uqS_n}>nW4lJtR_ALgm8xVgJ41(Ks+NeR zFZ%UML6MR>1F+!~eh~zeOWoDxRGOcFEhzbap?;!mA_I)N(-f*5Wa#spDGU z3Fh>CdOyuNEHay*mGr@ibE_<_HH|RnnIE%xeQVGbp`_E%d85PA&_le>1J6Q4qFrlO z!Jy`liFaRU{Z2CxW_RXVTxvObOq4^VXYFw!B#RgsBjQ~TIFn&jR?QX;zqz@Wl1F1YlWBeEWsWBJj=nNkCOvK(k4cYPWYD_ot+aYV;7X+7 zI7P6x_gGy+_g3`nI=j7Lw=`%1U8VKSmuoph_9!QjQ8bFKc-wOX<~lSTM5Q+9W4wZ7mwpdC{~$5n#h%3)AK*U6)o} zdv&9DlP<~!DQE7Cq`u!{4>sRzV+;O50eO70dc@yf?>A4@&M&v|J)0Wz{s=8dMZ5Sli6wZCTqbg1 z?BgTW7>b_5IMlM(w#gCOTmjKko*bhE9Ko4htrr(dK@$AH!&{6=he+0th5;bg-KOZ98*t1i7d(5%nP=ag3FOAMZl+T8U$4nc->{a?L;C>flNRi zplitg`cJtJq_-!%{+56LU%uB5P9$3L+j40a9^aH9M%4`By43^kv@=3>r~GEIdz;(n zz;r8t0AeUIenpCf&ek_ zno^0AIi3)fg&{*e~y@EJqFwi!ipU__DEJ#qQ-16{S z|DA|a*G?q5O0iV7i(~(D6kl4E{cEYy_BBE@==cV8lj#gjFUXbf@>n=b zEJMbnZqy}v!6f+6%(8<2Y$UwDAFi~=Q&>wt8FfXri$1iOoABPdws zqp4Fuq@c@$;J8b5){re~y#^Ji-qxefjCD`a#-j2dMgkCus)7Z(^5Cq6TAati zYguGLr0DXY_ihR{LPF?m(?y&>3v5>+k&z4QeFnt0fC_ghUBafT%Md?QuNKo zai}G~GY-WHamRcpCBiEB4Trm4q!Nr~*^ zn{_>80{RM3`+JWeo5c%fb2krHP5;I@y)#h8>^)rSvV5H%^C7XhAmhoBj5M!dO?hl$ zBhL6Wfz5breR5*QV5vhDWmnw!$bGnYcIl3ZV_e{T-vLP3{=%$yj=& z!hNZ)8~fzwbtamRjIC`6b?s-EeiS)RguQhYmDf~jz_070-W;*v0~f)4uGx0kp^UC( zaV1p7ZL9Avn-3J>yfU*yk<412vaUdwZ9eQmInrKOwXeEw=uU<1nQMO#CX6;7sFxUt z)8iQE_Z#0y9AJzaDR?kku5*h$-zv*Ogs2TwOZ{9C6Ukjz7SmxEw^}zuoBQPlZl9PuT?ut@#>I4jtKjOCkMqHdziOPd>sSE(3jidh}P9 z&>ODr9aGYG!0lOlqs;yTgX-HLYii(20Dr>&;*%fYezh diff --git a/docs/images/mqc_fastqc_quality.png b/docs/images/mqc_fastqc_quality.png deleted file mode 100755 index a4b89bf56ab2ba88cab87841916eb680a816deae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55769 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�)v~C(0C)c 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 M)78&qol`;+0Fu7JivR!s diff --git a/docs/images/nf-core-fetchfastq_logo.png b/docs/images/nf-core-fetchfastq_logo.png deleted file mode 100644 index e8b665e8effdfdb4912d8d8d8ae6b7b32ad70310..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37015 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 !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } - } -} diff --git a/modules/nf-core/software/fastqc/main.nf b/modules/nf-core/software/fastqc/main.nf deleted file mode 100755 index 7ce76adf..00000000 --- a/modules/nf-core/software/fastqc/main.nf +++ /dev/null @@ -1,47 +0,0 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -params.options = [:] -options = initOptions(params.options) - -process FASTQC { - tag "$meta.id" - label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } - - conda (params.enable_conda ? "bioconda::fastqc=0.11.9" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/fastqc:0.11.9--0" - } else { - container "quay.io/biocontainers/fastqc:0.11.9--0" - } - - input: - tuple val(meta), path(reads) - - output: - tuple val(meta), path("*.html"), emit: html - tuple val(meta), path("*.zip") , emit: zip - path "*.version.txt" , emit: version - - script: - // Add soft-links to original FastQs for consistent naming in pipeline - def software = getSoftwareName(task.process) - def prefix = options.suffix ? "${meta.id}.${options.suffix}" : "${meta.id}" - if (meta.single_end) { - """ - [ ! -f ${prefix}.fastq.gz ] && ln -s $reads ${prefix}.fastq.gz - fastqc $options.args --threads $task.cpus ${prefix}.fastq.gz - fastqc --version | sed -e "s/FastQC v//g" > ${software}.version.txt - """ - } else { - """ - [ ! -f ${prefix}_1.fastq.gz ] && ln -s ${reads[0]} ${prefix}_1.fastq.gz - [ ! -f ${prefix}_2.fastq.gz ] && ln -s ${reads[1]} ${prefix}_2.fastq.gz - fastqc $options.args --threads $task.cpus ${prefix}_1.fastq.gz ${prefix}_2.fastq.gz - fastqc --version | sed -e "s/FastQC v//g" > ${software}.version.txt - """ - } -} diff --git a/modules/nf-core/software/fastqc/meta.yml b/modules/nf-core/software/fastqc/meta.yml deleted file mode 100755 index 8eb9953d..00000000 --- a/modules/nf-core/software/fastqc/meta.yml +++ /dev/null @@ -1,51 +0,0 @@ -name: fastqc -description: Run FastQC on sequenced reads -keywords: - - quality control - - qc - - adapters - - fastq -tools: - - fastqc: - description: | - FastQC gives general quality metrics about your reads. - It provides information about the quality score distribution - across your reads, the per base sequence content (%A/C/G/T). - You get information about adapter contamination and other - overrepresented sequences. - homepage: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/ - documentation: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/ -input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - reads: - type: file - description: | - List of input FastQ files of size 1 and 2 for single-end and paired-end data, - respectively. -output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - html: - type: file - description: FastQC report - pattern: "*_{fastqc.html}" - - zip: - type: file - description: FastQC report archive - pattern: "*_{fastqc.zip}" - - version: - type: file - description: File containing software version - pattern: "*.{version.txt}" -authors: - - "@drpatelh" - - "@grst" - - "@ewels" - - "@FelixKrueger" diff --git a/modules/nf-core/software/multiqc/functions.nf b/modules/nf-core/software/multiqc/functions.nf deleted file mode 100755 index da9da093..00000000 --- a/modules/nf-core/software/multiqc/functions.nf +++ /dev/null @@ -1,68 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } - } -} diff --git a/modules/nf-core/software/multiqc/main.nf b/modules/nf-core/software/multiqc/main.nf deleted file mode 100755 index da780800..00000000 --- a/modules/nf-core/software/multiqc/main.nf +++ /dev/null @@ -1,35 +0,0 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -params.options = [:] -options = initOptions(params.options) - -process MULTIQC { - label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } - - conda (params.enable_conda ? "bioconda::multiqc=1.10.1" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/multiqc:1.10.1--py_0" - } else { - container "quay.io/biocontainers/multiqc:1.10.1--py_0" - } - - input: - path multiqc_files - - output: - path "*multiqc_report.html", emit: report - path "*_data" , emit: data - path "*_plots" , optional:true, emit: plots - path "*.version.txt" , emit: version - - script: - def software = getSoftwareName(task.process) - """ - multiqc -f $options.args . - multiqc --version | sed -e "s/multiqc, version //g" > ${software}.version.txt - """ -} diff --git a/modules/nf-core/software/multiqc/meta.yml b/modules/nf-core/software/multiqc/meta.yml deleted file mode 100755 index 532a8bb1..00000000 --- a/modules/nf-core/software/multiqc/meta.yml +++ /dev/null @@ -1,39 +0,0 @@ -name: MultiQC -description: Aggregate results from bioinformatics analyses across many samples into a single report -keywords: - - QC - - bioinformatics tools - - Beautiful stand-alone HTML report -tools: - - multiqc: - description: | - MultiQC searches a given directory for analysis logs and compiles a HTML report. - It's a general use tool, perfect for summarising the output from numerous bioinformatics tools. - homepage: https://multiqc.info/ - documentation: https://multiqc.info/docs/ -input: - - multiqc_files: - type: file - description: | - List of reports / files recognised by MultiQC, for example the html and zip output of FastQC -output: - - report: - type: file - description: MultiQC report file - pattern: "multiqc_report.html" - - data: - type: dir - description: MultiQC data dir - pattern: "multiqc_data" - - plots: - type: file - description: Plots created by MultiQC - pattern: "*_data" - - version: - type: file - description: File containing software version - pattern: "*.{version.txt}" -authors: - - "@abhi18av" - - "@bunop" - - "@drpatelh" From af973d4e877f7576656b13bf5998c1dab247bcda Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 7 Jun 2021 23:10:15 +0100 Subject: [PATCH 005/852] Remove samplesheet_check.nf module --- modules/local/samplesheet_check.nf | 31 ------------------------------ 1 file changed, 31 deletions(-) delete mode 100755 modules/local/samplesheet_check.nf diff --git a/modules/local/samplesheet_check.nf b/modules/local/samplesheet_check.nf deleted file mode 100755 index 77f58557..00000000 --- a/modules/local/samplesheet_check.nf +++ /dev/null @@ -1,31 +0,0 @@ -// Import generic module functions -include { saveFiles } from './functions' - -params.options = [:] - -process SAMPLESHEET_CHECK { - tag "$samplesheet" - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'pipeline_info', meta:[:], publish_by_meta:[]) } - - conda (params.enable_conda ? "conda-forge::python=3.8.3" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/python:3.8.3" - } else { - container "quay.io/biocontainers/python:3.8.3" - } - - input: - path samplesheet - - output: - path '*.csv' - - script: // This script is bundled with the pipeline, in nf-core/fetchngs/bin/ - """ - check_samplesheet.py \\ - $samplesheet \\ - samplesheet.valid.csv - """ -} From df21619d8aefb87f0d6fdd90922ab460d3cd0fc5 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 21 Jun 2021 14:08:19 +0100 Subject: [PATCH 006/852] Change container for sra_ids_to_runinfo.nf process --- CHANGELOG.md | 6 ++++++ modules/local/sra_ids_to_runinfo.nf | 6 +++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 04618e30..4c4fae10 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [[1.1](https://github.com/nf-core/fetchngs/releases/tag/1.1)] - 2021-06-22 + +### Enhancements & fixes + +* [[#12](https://github.com/nf-core/fetchngs/issues/12)] - Error when using singularity - /etc/resolv.conf doesn't exist in container + ## [[1.0](https://github.com/nf-core/fetchngs/releases/tag/1.0)] - 2021-06-08 Initial release of nf-core/fetchngs, created with the [nf-core](https://nf-co.re/) template. diff --git a/modules/local/sra_ids_to_runinfo.nf b/modules/local/sra_ids_to_runinfo.nf index d5b9705c..b277197e 100644 --- a/modules/local/sra_ids_to_runinfo.nf +++ b/modules/local/sra_ids_to_runinfo.nf @@ -10,11 +10,11 @@ process SRA_IDS_TO_RUNINFO { mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } - conda (params.enable_conda ? "conda-forge::requests=2.24.0" : null) + conda (params.enable_conda ? "conda-forge::sed=4.7" : null) if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/requests:2.24.0" + container "https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img" } else { - container "quay.io/biocontainers/requests:2.24.0" + container "biocontainers/biocontainers:v1.2.0_cv1" } input: From 6586c08da2dbb82fb1cdd04b27490372eb80be3c Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 21 Jun 2021 14:34:39 +0100 Subject: [PATCH 007/852] Updates relative to rnaseq --- bin/scrape_software_versions.py | 4 ++-- docs/output.md | 2 +- docs/usage.md | 8 ++++---- main.nf | 10 +++++----- modules/local/get_software_versions.nf | 2 +- nextflow.config | 2 +- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/bin/scrape_software_versions.py b/bin/scrape_software_versions.py index 71b81eff..a4e45493 100755 --- a/bin/scrape_software_versions.py +++ b/bin/scrape_software_versions.py @@ -30,7 +30,7 @@ print("
{}
{}
".format(k, v)) print(" ") -# Write out regexes as csv file: -with open("software_versions.csv", "w") as f: +# Write out as tsv file: +with open("software_versions.tsv", "w") as f: for k, v in sorted(results.items()): f.write("{}\t{}\n".format(k, v)) diff --git a/docs/output.md b/docs/output.md index f2cc20a5..31653ad6 100755 --- a/docs/output.md +++ b/docs/output.md @@ -37,7 +37,7 @@ Please see the [usage documentation](https://nf-co.re/fetchngs/usage#introductio * `pipeline_info/` * Reports generated by Nextflow: `execution_report.html`, `execution_timeline.html`, `execution_trace.txt` and `pipeline_dag.dot`/`pipeline_dag.svg`. - * Reports generated by the pipeline: `pipeline_report.html`, `pipeline_report.txt` and `software_versions.csv`. + * Reports generated by the pipeline: `pipeline_report.html`, `pipeline_report.txt` and `software_versions.tsv`. diff --git a/docs/usage.md b/docs/usage.md index 2852035b..0ca76395 100755 --- a/docs/usage.md +++ b/docs/usage.md @@ -38,7 +38,7 @@ This downloads a text file called `SRR_Acc_List.txt` which can be directly provi The typical command for running the pipeline is as follows: -```bash +```console nextflow run nf-core/fetchngs --input ids.txt -profile docker ``` @@ -46,7 +46,7 @@ This will launch the pipeline with the `docker` configuration profile. See below Note that the pipeline will create the following files in your working directory: -```bash +```console work # Directory containing the nextflow working files results # Finished results (configurable, see below) .nextflow_log # Log file from Nextflow @@ -57,7 +57,7 @@ results # Finished results (configurable, see below) When you run the above command, Nextflow automatically pulls the pipeline code from GitHub and stores it as a cached version. When running the pipeline after this, it will always use the cached version if available - even if the pipeline has been updated since. To make sure that you're running the latest version of the pipeline, make sure that you regularly update the cached version of the pipeline: -```bash +```console nextflow pull nf-core/fetchngs ``` @@ -221,6 +221,6 @@ Some HPC setups also allow you to run nextflow within a cluster job submitted yo In some cases, the Nextflow Java virtual machines can start to request a large amount of memory. We recommend adding the following line to your environment to limit this (typically in `~/.bashrc` or `~./bash_profile`): -```bash +```console NXF_OPTS='-Xms1g -Xmx4g' ``` diff --git a/main.nf b/main.nf index f28f690f..475c87a8 100755 --- a/main.nf +++ b/main.nf @@ -25,12 +25,12 @@ WorkflowMain.initialise(workflow, params, log) ======================================================================================== */ -workflow NFCORE_FETCHNGS { +include { FETCHNGS } from './workflows/fetchngs' - // - // WORKFLOW: Run main nf-core/fetchngs analysis pipeline - // - include { FETCHNGS } from './workflows/fetchngs' +// +// WORKFLOW: Run main nf-core/fetchngs analysis pipeline +// +workflow NFCORE_FETCHNGS { FETCHNGS () } diff --git a/modules/local/get_software_versions.nf b/modules/local/get_software_versions.nf index 5b6ad7ad..4d37bd6a 100755 --- a/modules/local/get_software_versions.nf +++ b/modules/local/get_software_versions.nf @@ -21,7 +21,7 @@ process GET_SOFTWARE_VERSIONS { path versions output: - path "software_versions.csv" , emit: csv + path "software_versions.tsv" , emit: tsv path 'software_versions_mqc.yaml', emit: yaml script: // This script is bundled with the pipeline, in nf-core/fetchngs/bin/ diff --git a/nextflow.config b/nextflow.config index 94ddb47f..92b4c669 100755 --- a/nextflow.config +++ b/nextflow.config @@ -146,7 +146,7 @@ manifest { description = 'Pipeline to fetch metadata and raw FastQ files from public databases' mainScript = 'main.nf' nextflowVersion = '!>=21.04.0' - version = '1.0' + version = '1.1' } // Function to ensure that resource requirements don't go beyond From 34e32ec384d0d44be05e0a9610a8bea9a69aaa3a Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 21 Jun 2021 14:45:35 +0100 Subject: [PATCH 008/852] Actually get_software_versions --- modules/local/sra_runinfo_to_ftp.nf | 5 ++++- workflows/fetchngs.nf | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/modules/local/sra_runinfo_to_ftp.nf b/modules/local/sra_runinfo_to_ftp.nf index 1418bf34..b0421aea 100644 --- a/modules/local/sra_runinfo_to_ftp.nf +++ b/modules/local/sra_runinfo_to_ftp.nf @@ -19,12 +19,15 @@ process SRA_RUNINFO_TO_FTP { path runinfo output: - path "*.tsv", emit: tsv + path "*.tsv" , emit: tsv + path "*.version.txt", emit: version script: """ sra_runinfo_to_ftp.py \\ ${runinfo.join(',')} \\ ${runinfo.toString().tokenize(".")[0]}.runinfo_ftp.tsv + + python --version | sed -e "s/Python //g" > python.version.txt """ } diff --git a/workflows/fetchngs.nf b/workflows/fetchngs.nf index 4ba08fb3..f03ae14a 100755 --- a/workflows/fetchngs.nf +++ b/workflows/fetchngs.nf @@ -39,6 +39,7 @@ include { SRA_RUNINFO_TO_FTP } from '../modules/local/sra_runinfo_to_ftp' include { SRA_FASTQ_FTP } from '../modules/local/sra_fastq_ftp' addParams( options: modules['sra_fastq_ftp'] ) include { SRA_TO_SAMPLESHEET } from '../modules/local/sra_to_samplesheet' addParams( options: modules['sra_to_samplesheet'], results_dir: modules['sra_fastq_ftp'].publish_dir ) include { SRA_MERGE_SAMPLESHEET } from '../modules/local/sra_merge_samplesheet' addParams( options: modules['sra_merge_samplesheet'] ) +include { GET_SOFTWARE_VERSIONS } from '../modules/local/get_software_versions' addParams( options: [publish_files : ['tsv':'']] ) /* ======================================================================================== @@ -48,6 +49,8 @@ include { SRA_MERGE_SAMPLESHEET } from '../modules/local/sra_merge_samplesheet' workflow FETCHNGS { + ch_software_versions = Channel.empty() + // // MODULE: Get SRA run information for public database ids // @@ -74,6 +77,7 @@ workflow FETCHNGS { } .unique() .set { ch_sra_reads } + ch_software_versions = ch_software_versions.mix(SRA_RUNINFO_TO_FTP.out.version.first().ifEmpty(null)) if (!params.skip_fastq_download) { // @@ -107,6 +111,21 @@ workflow FETCHNGS { .unique() .collectFile(name: no_ids_file, sort: true, newLine: true) } + + // + // MODULE: Pipeline reporting + // + ch_software_versions + .map { it -> if (it) [ it.baseName, it ] } + .groupTuple() + .map { it[1][0] } + .flatten() + .collect() + .set { ch_software_versions } + + GET_SOFTWARE_VERSIONS ( + ch_software_versions.map { it }.collect() + ) } /* From f0f21384a7742d9b2a87fc26f94d89977bec1057 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 21 Jun 2021 16:03:45 +0100 Subject: [PATCH 009/852] Add --sample_mapping_fields parameter --- CHANGELOG.md | 1 + docs/output.md | 7 +++++-- modules/local/sra_merge_samplesheet.nf | 7 +++++++ modules/local/sra_to_samplesheet.nf | 29 +++++++++++++++++++++++--- nextflow.config | 1 + nextflow_schema.json | 8 ++++++- workflows/fetchngs.nf | 6 ++++-- 7 files changed, 51 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c4fae10..66d1f812 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Enhancements & fixes * [[#12](https://github.com/nf-core/fetchngs/issues/12)] - Error when using singularity - /etc/resolv.conf doesn't exist in container +* Added `--sample_mapping_fields` parameter to create a separate `mappings.tsv` with selected fields that can be used to rename samples in general and in [MultiQC](https://multiqc.info/docs/#bulk-sample-renaming) ## [[1.0](https://github.com/nf-core/fetchngs/releases/tag/1.0)] - 2021-06-08 diff --git a/docs/output.md b/docs/output.md index 31653ad6..b501dbc2 100755 --- a/docs/output.md +++ b/docs/output.md @@ -22,12 +22,15 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d * `*.md5`: Files containing `md5` sum for FastQ files downloaded from the ENA / SRA. * `samplesheet/` * `samplesheet.csv`: Auto-created samplesheet with collated metadata and paths to downloaded FastQ files. + * `mappings.tsv`: File with selected fields that can be used to rename samples in general and in [MultiQC](https://multiqc.info/docs/#bulk-sample-renaming); see [`--sample_mapping_fields`](https://nf-co.re/fetchngs/parameters#sample_mapping_fields) parameter to customise this behaviour. * `metadata/` - * `*.runinfo_ftp.tsv`: Re-formatted metadata file downloaded from the ENA - * `*.runinfo.tsv`: Original metadata file downloaded from the ENA + * `*.runinfo_ftp.tsv`: Re-formatted metadata file downloaded from the ENA. + * `*.runinfo.tsv`: Original metadata file downloaded from the ENA. +Added `--sample_mapping_fields` parameter to create a separate `mappings.tsv` with selected fields that can be used to rename samples in general and in [MultiQC](https://multiqc.info/docs/#bulk-sample-renaming) + Please see the [usage documentation](https://nf-co.re/fetchngs/usage#introduction) for a list of supported public repository identifiers and how to provide them to the pipeline. The final sample information for all identifiers is obtained from the ENA which provides direct download links for FastQ files as well as their associated md5sums. If download links exist, the files will be downloaded in parallel by FTP otherwise they will NOT be downloaded. This is intentional because the tools such as `parallel-fastq-dump`, `fasterq-dump`, `prefetch` etc require pre-existing configuration files in the users home directory which makes automation tricky across different platforms and containerisation. ### Pipeline information diff --git a/modules/local/sra_merge_samplesheet.nf b/modules/local/sra_merge_samplesheet.nf index 423be634..29b08783 100644 --- a/modules/local/sra_merge_samplesheet.nf +++ b/modules/local/sra_merge_samplesheet.nf @@ -17,9 +17,11 @@ process SRA_MERGE_SAMPLESHEET { input: path ('samplesheets/*') + path ('mappings/*') output: path "*csv", emit: csv + path "*tsv", emit: tsv script: """ @@ -27,5 +29,10 @@ process SRA_MERGE_SAMPLESHEET { for fileid in `ls ./samplesheets/*`; do awk 'NR>1' \$fileid >> samplesheet.csv done + + head -n 1 `ls ./mappings/* | head -n 1` > mappings.tsv + for fileid in `ls ./mappings/*`; do + awk 'NR>1' \$fileid >> mappings.tsv + done """ } diff --git a/modules/local/sra_to_samplesheet.nf b/modules/local/sra_to_samplesheet.nf index a30e0f5e..9eb8be05 100644 --- a/modules/local/sra_to_samplesheet.nf +++ b/modules/local/sra_to_samplesheet.nf @@ -15,11 +15,17 @@ process SRA_TO_SAMPLESHEET { input: tuple val(meta), path(fastq) val pipeline + val mapping_fields output: tuple val(meta), path("*csv"), emit: csv + tuple val(meta), path("*tsv"), emit: tsv exec: + // + // Create samplesheet containing metadata + // + // Remove custom keys needed to download the data def meta_map = meta.clone() meta_map.remove("id") @@ -48,7 +54,24 @@ process SRA_TO_SAMPLESHEET { csv = pipeline_map.keySet().collect{ '"' + it + '"'}.join(",") + '\n' csv += pipeline_map.values().collect{ '"' + it + '"'}.join(",") - // Write to file - def file = task.workDir.resolve("${meta.id}.samplesheet.csv") - file.text = csv + // Write samplesheet to file + def samplesheet_file = task.workDir.resolve("${meta.id}.samplesheet.csv") + samplesheet_file.text = csv + + // + // Create sample id mappings file + // + mappings_map = pipeline_map.clone() + def fields = mapping_fields ? ['sample'] + mapping_fields.split(',').collect{ it.trim().toLowerCase() } : [] + if ((mappings_map.keySet() + fields).unique().size() != mappings_map.keySet().size()) { + error("Invalid option for '--sample_mapping_fields': ${mapping_fields}.\nValid options: ${mappings_map.keySet().join(', ')}") + } + + // Create mappings + tsv = fields.join("\t") + '\n' + tsv += mappings_map.subMap(fields).values().join("\t") + + // Write mappings to file + def mappings_file = task.workDir.resolve("${meta.id}.mappings.tsv") + mappings_file.text = tsv } diff --git a/nextflow.config b/nextflow.config index 92b4c669..5ac246e5 100755 --- a/nextflow.config +++ b/nextflow.config @@ -13,6 +13,7 @@ params { input = null nf_core_pipeline = null ena_metadata_fields = null + sample_mapping_fields = 'run_accession,sample_accession,experiment_alias,run_alias,sample_alias,experiment_title,sample_title,sample_description,description' skip_fastq_download = false // Boilerplate options diff --git a/nextflow_schema.json b/nextflow_schema.json index e5b24df1..bf5961b4 100755 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -29,6 +29,12 @@ "description": "Comma-separated list of ENA metadata fields to fetch before downloading data.", "help_text": "The default list of fields used by the pipeline can be found at the top of the [`bin/sra_ids_to_runinfo.py`](https://github.com/nf-core/fetchngs/blob/master/bin/sra_ids_to_runinfo.py) script within the pipeline repo. This pipeline requires a minimal set of fields to download FastQ files i.e. `'run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5'`. Full list of accepted metadata fields can be obtained from the [ENA API](https://www.ebi.ac.uk/ena/portal/api/returnFields?dataPortal=ena&format=tsv&result=read_run])." }, + "sample_mapping_fields": { + "type": "string", + "fa_icon": "fas fa-globe-americas", + "description": "Comma-separated list of ENA metadata fields used to create mappings file for sample id mapping or renaming.", + "default": "run_accession,sample_accession,experiment_alias,run_alias,sample_alias,experiment_title,sample_title,sample_description,description" + }, "nf_core_pipeline": { "type": "string", "fa_icon": "fab fa-apple", @@ -243,4 +249,4 @@ "$ref": "#/definitions/generic_options" } ] -} +} \ No newline at end of file diff --git a/workflows/fetchngs.nf b/workflows/fetchngs.nf index f03ae14a..d73cd374 100755 --- a/workflows/fetchngs.nf +++ b/workflows/fetchngs.nf @@ -92,14 +92,16 @@ workflow FETCHNGS { // SRA_TO_SAMPLESHEET ( SRA_FASTQ_FTP.out.fastq, - params.nf_core_pipeline ?: '' + params.nf_core_pipeline ?: '', + params.sample_mapping_fields ) // // MODULE: Create a merged samplesheet across all samples for the pipeline // SRA_MERGE_SAMPLESHEET ( - SRA_TO_SAMPLESHEET.out.csv.collect{it[1]} + SRA_TO_SAMPLESHEET.out.csv.collect{it[1]}, + SRA_TO_SAMPLESHEET.out.tsv.collect{it[1]} ) // From a13196432de534fb0c14aa067e2d5358ce9b5a26 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 21 Jun 2021 16:07:36 +0100 Subject: [PATCH 010/852] Fix ECLint --- nextflow_schema.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index bf5961b4..8bb27a97 100755 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -249,4 +249,5 @@ "$ref": "#/definitions/generic_options" } ] -} \ No newline at end of file +} + From 389d3d118dfbe50daf1a0ff3d0489680cd9425ba Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 21 Jun 2021 16:11:36 +0100 Subject: [PATCH 011/852] Tweak CI tests to deal with new parameter --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d149562c..26785ea1 100755 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -51,7 +51,7 @@ jobs: parameters: [ "--nf_core_pipeline rnaseq", - "--ena_metadata_fields run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5", + "--ena_metadata_fields run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5 --sample_mapping_fields run_accession,library_layout", --skip_fastq_download, ] steps: From 9ecb14857a44922a4ec661d952a8671301dfd873 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 21 Jun 2021 16:12:41 +0100 Subject: [PATCH 012/852] Tidy up docs --- docs/output.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/output.md b/docs/output.md index b501dbc2..e9918347 100755 --- a/docs/output.md +++ b/docs/output.md @@ -29,8 +29,6 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d -Added `--sample_mapping_fields` parameter to create a separate `mappings.tsv` with selected fields that can be used to rename samples in general and in [MultiQC](https://multiqc.info/docs/#bulk-sample-renaming) - Please see the [usage documentation](https://nf-co.re/fetchngs/usage#introduction) for a list of supported public repository identifiers and how to provide them to the pipeline. The final sample information for all identifiers is obtained from the ENA which provides direct download links for FastQ files as well as their associated md5sums. If download links exist, the files will be downloaded in parallel by FTP otherwise they will NOT be downloaded. This is intentional because the tools such as `parallel-fastq-dump`, `fasterq-dump`, `prefetch` etc require pre-existing configuration files in the users home directory which makes automation tricky across different platforms and containerisation. ### Pipeline information From 957d89cf555def8130fa5534d1bbd9bfe2dec779 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 21 Jun 2021 18:03:18 +0100 Subject: [PATCH 013/852] Generate multiqc_config.yml for sample name mappings --- CHANGELOG.md | 2 +- bin/multiqc_mappings_config.py | 14 ++++++++++ conf/modules.config | 3 +++ docs/output.md | 3 ++- modules/local/multiqc_mappings_config.nf | 33 ++++++++++++++++++++++++ workflows/fetchngs.nf | 22 +++++++++++----- 6 files changed, 69 insertions(+), 8 deletions(-) create mode 100755 bin/multiqc_mappings_config.py create mode 100644 modules/local/multiqc_mappings_config.nf diff --git a/CHANGELOG.md b/CHANGELOG.md index 66d1f812..e707b208 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Enhancements & fixes * [[#12](https://github.com/nf-core/fetchngs/issues/12)] - Error when using singularity - /etc/resolv.conf doesn't exist in container -* Added `--sample_mapping_fields` parameter to create a separate `mappings.tsv` with selected fields that can be used to rename samples in general and in [MultiQC](https://multiqc.info/docs/#bulk-sample-renaming) +* Added `--sample_mapping_fields` parameter to create a separate `mappings.tsv` and `multiqc_config.yml` with selected fields that can be used to rename samples in general and in [MultiQC](https://multiqc.info/docs/#bulk-sample-renaming) ## [[1.0](https://github.com/nf-core/fetchngs/releases/tag/1.0)] - 2021-06-08 diff --git a/bin/multiqc_mappings_config.py b/bin/multiqc_mappings_config.py new file mode 100755 index 00000000..5ee68e9b --- /dev/null +++ b/bin/multiqc_mappings_config.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python + +import sys + +with open(sys.argv[1], "r") as fin, open(sys.argv[2], "w") as fout: + header = fin.readline().split('\t') + config = "sample_names_rename_buttons:\n" + config += "\n".join([' - ' + x for x in header]) + config += "sample_names_rename:\n" + for line in fin: + lspl = ['"' + x + '"' for x in line.strip().split('\t')] + config += f" - [{', '.join(lspl)}]\n" + fout.write(config) + diff --git a/conf/modules.config b/conf/modules.config index 4059a911..3ae76b68 100755 --- a/conf/modules.config +++ b/conf/modules.config @@ -42,5 +42,8 @@ params { 'sra_merge_samplesheet' { publish_dir = 'samplesheet' } + 'multiqc_mappings_config' { + publish_dir = 'samplesheet' + } } } diff --git a/docs/output.md b/docs/output.md index e9918347..0c2485aa 100755 --- a/docs/output.md +++ b/docs/output.md @@ -22,7 +22,8 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d * `*.md5`: Files containing `md5` sum for FastQ files downloaded from the ENA / SRA. * `samplesheet/` * `samplesheet.csv`: Auto-created samplesheet with collated metadata and paths to downloaded FastQ files. - * `mappings.tsv`: File with selected fields that can be used to rename samples in general and in [MultiQC](https://multiqc.info/docs/#bulk-sample-renaming); see [`--sample_mapping_fields`](https://nf-co.re/fetchngs/parameters#sample_mapping_fields) parameter to customise this behaviour. + * `mappings.tsv`: File with selected fields that can be used to rename samples to more informative names; see [`--sample_mapping_fields`](https://nf-co.re/fetchngs/parameters#sample_mapping_fields) parameter to customise this behaviour. + * `multiqc_config.yml`: [MultiQC](https://multiqc.info/docs/#bulk-sample-renaming) config file that can be passed to most nf-core pipelines via the `--multiqc_config` parameter for bulk renaming of sample names from database ids; [`--sample_mapping_fields`](https://nf-co.re/fetchngs/parameters#sample_mapping_fields) parameter to customise this behaviour * `metadata/` * `*.runinfo_ftp.tsv`: Re-formatted metadata file downloaded from the ENA. * `*.runinfo.tsv`: Original metadata file downloaded from the ENA. diff --git a/modules/local/multiqc_mappings_config.nf b/modules/local/multiqc_mappings_config.nf new file mode 100644 index 00000000..4d78e456 --- /dev/null +++ b/modules/local/multiqc_mappings_config.nf @@ -0,0 +1,33 @@ +// Import generic module functions +include { saveFiles; getSoftwareName } from './functions' + +params.options = [:] + +process MULTIQC_MAPPINGS_CONFIG { + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } + + conda (params.enable_conda ? "conda-forge::python=3.8.3" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/python:3.8.3" + } else { + container "quay.io/biocontainers/python:3.8.3" + } + + input: + path tsv + + output: + path "*yml" , emit: yml + path "*.version.txt", emit: version + + script: + """ + multiqc_mappings_config.py \\ + $tsv \\ + multiqc_config.yml + + python --version | sed -e "s/Python //g" > python.version.txt + """ +} diff --git a/workflows/fetchngs.nf b/workflows/fetchngs.nf index d73cd374..8d6c5218 100755 --- a/workflows/fetchngs.nf +++ b/workflows/fetchngs.nf @@ -34,12 +34,13 @@ if (params.input) { // Don't overwrite global params.modules, create a copy instead and use that within the main script. def modules = params.modules.clone() -include { SRA_IDS_TO_RUNINFO } from '../modules/local/sra_ids_to_runinfo' addParams( options: modules['sra_ids_to_runinfo'] ) -include { SRA_RUNINFO_TO_FTP } from '../modules/local/sra_runinfo_to_ftp' addParams( options: modules['sra_runinfo_to_ftp'] ) -include { SRA_FASTQ_FTP } from '../modules/local/sra_fastq_ftp' addParams( options: modules['sra_fastq_ftp'] ) -include { SRA_TO_SAMPLESHEET } from '../modules/local/sra_to_samplesheet' addParams( options: modules['sra_to_samplesheet'], results_dir: modules['sra_fastq_ftp'].publish_dir ) -include { SRA_MERGE_SAMPLESHEET } from '../modules/local/sra_merge_samplesheet' addParams( options: modules['sra_merge_samplesheet'] ) -include { GET_SOFTWARE_VERSIONS } from '../modules/local/get_software_versions' addParams( options: [publish_files : ['tsv':'']] ) +include { SRA_IDS_TO_RUNINFO } from '../modules/local/sra_ids_to_runinfo' addParams( options: modules['sra_ids_to_runinfo'] ) +include { SRA_RUNINFO_TO_FTP } from '../modules/local/sra_runinfo_to_ftp' addParams( options: modules['sra_runinfo_to_ftp'] ) +include { SRA_FASTQ_FTP } from '../modules/local/sra_fastq_ftp' addParams( options: modules['sra_fastq_ftp'] ) +include { SRA_TO_SAMPLESHEET } from '../modules/local/sra_to_samplesheet' addParams( options: modules['sra_to_samplesheet'], results_dir: modules['sra_fastq_ftp'].publish_dir ) +include { SRA_MERGE_SAMPLESHEET } from '../modules/local/sra_merge_samplesheet' addParams( options: modules['sra_merge_samplesheet'] ) +include { MULTIQC_MAPPINGS_CONFIG } from '../modules/local/multiqc_mappings_config' addParams( options: modules['multiqc_mappings_config'] ) +include { GET_SOFTWARE_VERSIONS } from '../modules/local/get_software_versions' addParams( options: [publish_files : ['tsv':'']] ) /* ======================================================================================== @@ -104,6 +105,15 @@ workflow FETCHNGS { SRA_TO_SAMPLESHEET.out.tsv.collect{it[1]} ) + // + // MODULE: Create a MutiQC config file with sample name mappings + // + if (params.sample_mapping_fields) { + MULTIQC_MAPPINGS_CONFIG ( + SRA_MERGE_SAMPLESHEET.out.tsv + ) + } + // // If ids don't have a direct FTP download link write them to file for download outside of the pipeline // From 3d25a0e38c318f58faa6dd71f963d0dd410f3ccd Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 21 Jun 2021 18:04:49 +0100 Subject: [PATCH 014/852] Fix ECLint --- modules/local/multiqc_mappings_config.nf | 2 +- workflows/fetchngs.nf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/local/multiqc_mappings_config.nf b/modules/local/multiqc_mappings_config.nf index 4d78e456..9a4984e3 100644 --- a/modules/local/multiqc_mappings_config.nf +++ b/modules/local/multiqc_mappings_config.nf @@ -27,7 +27,7 @@ process MULTIQC_MAPPINGS_CONFIG { multiqc_mappings_config.py \\ $tsv \\ multiqc_config.yml - + python --version | sed -e "s/Python //g" > python.version.txt """ } diff --git a/workflows/fetchngs.nf b/workflows/fetchngs.nf index 8d6c5218..7d708927 100755 --- a/workflows/fetchngs.nf +++ b/workflows/fetchngs.nf @@ -113,7 +113,7 @@ workflow FETCHNGS { SRA_MERGE_SAMPLESHEET.out.tsv ) } - + // // If ids don't have a direct FTP download link write them to file for download outside of the pipeline // From 7a940d8569c3736920f33421dddfca8753e045c3 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 21 Jun 2021 18:33:26 +0100 Subject: [PATCH 015/852] Remove extra spaces --- docs/output.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/output.md b/docs/output.md index 0c2485aa..d867898a 100755 --- a/docs/output.md +++ b/docs/output.md @@ -23,7 +23,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d * `samplesheet/` * `samplesheet.csv`: Auto-created samplesheet with collated metadata and paths to downloaded FastQ files. * `mappings.tsv`: File with selected fields that can be used to rename samples to more informative names; see [`--sample_mapping_fields`](https://nf-co.re/fetchngs/parameters#sample_mapping_fields) parameter to customise this behaviour. - * `multiqc_config.yml`: [MultiQC](https://multiqc.info/docs/#bulk-sample-renaming) config file that can be passed to most nf-core pipelines via the `--multiqc_config` parameter for bulk renaming of sample names from database ids; [`--sample_mapping_fields`](https://nf-co.re/fetchngs/parameters#sample_mapping_fields) parameter to customise this behaviour + * `multiqc_config.yml`: [MultiQC](https://multiqc.info/docs/#bulk-sample-renaming) config file that can be passed to most nf-core pipelines via the `--multiqc_config` parameter for bulk renaming of sample names from database ids; [`--sample_mapping_fields`](https://nf-co.re/fetchngs/parameters#sample_mapping_fields) parameter to customise this behaviour. * `metadata/` * `*.runinfo_ftp.tsv`: Re-formatted metadata file downloaded from the ENA. * `*.runinfo.tsv`: Original metadata file downloaded from the ENA. From 627b63238797efa48f76f6082bd9b9abea7b97b5 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 21 Jun 2021 21:19:00 +0100 Subject: [PATCH 016/852] Output csv for mappings file instead of tsv --- bin/multiqc_mappings_config.py | 7 +++---- docs/output.md | 2 +- modules/local/multiqc_mappings_config.nf | 4 ++-- modules/local/sra_merge_samplesheet.nf | 8 ++++---- modules/local/sra_to_samplesheet.nf | 18 +++++++++--------- workflows/fetchngs.nf | 6 +++--- 6 files changed, 22 insertions(+), 23 deletions(-) diff --git a/bin/multiqc_mappings_config.py b/bin/multiqc_mappings_config.py index 5ee68e9b..a7fc92ba 100755 --- a/bin/multiqc_mappings_config.py +++ b/bin/multiqc_mappings_config.py @@ -3,12 +3,11 @@ import sys with open(sys.argv[1], "r") as fin, open(sys.argv[2], "w") as fout: - header = fin.readline().split('\t') + header = fin.readline().split(',') config = "sample_names_rename_buttons:\n" - config += "\n".join([' - ' + x for x in header]) + config += "\n".join([' - ' + x.strip('"') for x in header]) config += "sample_names_rename:\n" for line in fin: - lspl = ['"' + x + '"' for x in line.strip().split('\t')] - config += f" - [{', '.join(lspl)}]\n" + config += f" - [{', '.join(line.strip().split(','))}]\n" fout.write(config) diff --git a/docs/output.md b/docs/output.md index d867898a..c0916e6d 100755 --- a/docs/output.md +++ b/docs/output.md @@ -22,7 +22,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d * `*.md5`: Files containing `md5` sum for FastQ files downloaded from the ENA / SRA. * `samplesheet/` * `samplesheet.csv`: Auto-created samplesheet with collated metadata and paths to downloaded FastQ files. - * `mappings.tsv`: File with selected fields that can be used to rename samples to more informative names; see [`--sample_mapping_fields`](https://nf-co.re/fetchngs/parameters#sample_mapping_fields) parameter to customise this behaviour. + * `id_mappings.csv`: File with selected fields that can be used to rename samples to more informative names; see [`--sample_mapping_fields`](https://nf-co.re/fetchngs/parameters#sample_mapping_fields) parameter to customise this behaviour. * `multiqc_config.yml`: [MultiQC](https://multiqc.info/docs/#bulk-sample-renaming) config file that can be passed to most nf-core pipelines via the `--multiqc_config` parameter for bulk renaming of sample names from database ids; [`--sample_mapping_fields`](https://nf-co.re/fetchngs/parameters#sample_mapping_fields) parameter to customise this behaviour. * `metadata/` * `*.runinfo_ftp.tsv`: Re-formatted metadata file downloaded from the ENA. diff --git a/modules/local/multiqc_mappings_config.nf b/modules/local/multiqc_mappings_config.nf index 9a4984e3..63121b40 100644 --- a/modules/local/multiqc_mappings_config.nf +++ b/modules/local/multiqc_mappings_config.nf @@ -16,7 +16,7 @@ process MULTIQC_MAPPINGS_CONFIG { } input: - path tsv + path csv output: path "*yml" , emit: yml @@ -25,7 +25,7 @@ process MULTIQC_MAPPINGS_CONFIG { script: """ multiqc_mappings_config.py \\ - $tsv \\ + $csv \\ multiqc_config.yml python --version | sed -e "s/Python //g" > python.version.txt diff --git a/modules/local/sra_merge_samplesheet.nf b/modules/local/sra_merge_samplesheet.nf index 29b08783..e3c1314a 100644 --- a/modules/local/sra_merge_samplesheet.nf +++ b/modules/local/sra_merge_samplesheet.nf @@ -20,8 +20,8 @@ process SRA_MERGE_SAMPLESHEET { path ('mappings/*') output: - path "*csv", emit: csv - path "*tsv", emit: tsv + path "samplesheet.csv", emit: samplesheet + path "id_mappings.csv" , emit: mappings script: """ @@ -30,9 +30,9 @@ process SRA_MERGE_SAMPLESHEET { awk 'NR>1' \$fileid >> samplesheet.csv done - head -n 1 `ls ./mappings/* | head -n 1` > mappings.tsv + head -n 1 `ls ./mappings/* | head -n 1` > id_mappings.csv for fileid in `ls ./mappings/*`; do - awk 'NR>1' \$fileid >> mappings.tsv + awk 'NR>1' \$fileid >> id_mappings.csv done """ } diff --git a/modules/local/sra_to_samplesheet.nf b/modules/local/sra_to_samplesheet.nf index 9eb8be05..c4fc9af7 100644 --- a/modules/local/sra_to_samplesheet.nf +++ b/modules/local/sra_to_samplesheet.nf @@ -18,8 +18,8 @@ process SRA_TO_SAMPLESHEET { val mapping_fields output: - tuple val(meta), path("*csv"), emit: csv - tuple val(meta), path("*tsv"), emit: tsv + tuple val(meta), path("*samplesheet.csv"), emit: samplesheet + tuple val(meta), path("*mappings.csv") , emit: mappings exec: // @@ -51,12 +51,12 @@ process SRA_TO_SAMPLESHEET { pipeline_map << meta_map // Create a samplesheet - csv = pipeline_map.keySet().collect{ '"' + it + '"'}.join(",") + '\n' - csv += pipeline_map.values().collect{ '"' + it + '"'}.join(",") + samplesheet = pipeline_map.keySet().collect{ '"' + it + '"'}.join(",") + '\n' + samplesheet += pipeline_map.values().collect{ '"' + it + '"'}.join(",") // Write samplesheet to file def samplesheet_file = task.workDir.resolve("${meta.id}.samplesheet.csv") - samplesheet_file.text = csv + samplesheet_file.text = samplesheet // // Create sample id mappings file @@ -68,10 +68,10 @@ process SRA_TO_SAMPLESHEET { } // Create mappings - tsv = fields.join("\t") + '\n' - tsv += mappings_map.subMap(fields).values().join("\t") + mappings = fields.collect{ '"' + it + '"'}.join(",") + '\n' + mappings += mappings_map.subMap(fields).values().collect{ '"' + it + '"'}.join(",") // Write mappings to file - def mappings_file = task.workDir.resolve("${meta.id}.mappings.tsv") - mappings_file.text = tsv + def mappings_file = task.workDir.resolve("${meta.id}.mappings.csv") + mappings_file.text = mappings } diff --git a/workflows/fetchngs.nf b/workflows/fetchngs.nf index 7d708927..1602494f 100755 --- a/workflows/fetchngs.nf +++ b/workflows/fetchngs.nf @@ -101,8 +101,8 @@ workflow FETCHNGS { // MODULE: Create a merged samplesheet across all samples for the pipeline // SRA_MERGE_SAMPLESHEET ( - SRA_TO_SAMPLESHEET.out.csv.collect{it[1]}, - SRA_TO_SAMPLESHEET.out.tsv.collect{it[1]} + SRA_TO_SAMPLESHEET.out.samplesheet.collect{it[1]}, + SRA_TO_SAMPLESHEET.out.mappings.collect{it[1]} ) // @@ -110,7 +110,7 @@ workflow FETCHNGS { // if (params.sample_mapping_fields) { MULTIQC_MAPPINGS_CONFIG ( - SRA_MERGE_SAMPLESHEET.out.tsv + SRA_MERGE_SAMPLESHEET.out.mappings ) } From 721621f3d056494640c10e1f92fd35f01b9e558c Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 21 Jun 2021 21:20:09 +0100 Subject: [PATCH 017/852] Update CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e707b208..3cc14bd0 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Enhancements & fixes * [[#12](https://github.com/nf-core/fetchngs/issues/12)] - Error when using singularity - /etc/resolv.conf doesn't exist in container -* Added `--sample_mapping_fields` parameter to create a separate `mappings.tsv` and `multiqc_config.yml` with selected fields that can be used to rename samples in general and in [MultiQC](https://multiqc.info/docs/#bulk-sample-renaming) +* Added `--sample_mapping_fields` parameter to create a separate `id_mappings.csv` and `multiqc_config.yml` with selected fields that can be used to rename samples in general and in [MultiQC](https://multiqc.info/docs/#bulk-sample-renaming) ## [[1.0](https://github.com/nf-core/fetchngs/releases/tag/1.0)] - 2021-06-08 From ea7bd2f77e86db1158e8294a150e6befcdc09d10 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 22 Jun 2021 10:52:11 +0100 Subject: [PATCH 018/852] Change console to bash --- README.md | 4 ++-- docs/usage.md | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 0eb5cbfb..e78820f8 100755 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ The columns in the auto-created samplesheet can be tailored to be accepted out-o 3. Download the pipeline and test it on a minimal dataset with a single command: - ```console + ```bash nextflow run nf-core/fetchngs -profile test, ``` @@ -51,7 +51,7 @@ The columns in the auto-created samplesheet can be tailored to be accepted out-o 4. Start running your own analysis! - ```console + ```bash nextflow run nf-core/fetchngs --input ids.txt -profile ``` diff --git a/docs/usage.md b/docs/usage.md index 0ca76395..2e5675a9 100755 --- a/docs/usage.md +++ b/docs/usage.md @@ -38,7 +38,7 @@ This downloads a text file called `SRR_Acc_List.txt` which can be directly provi The typical command for running the pipeline is as follows: -```console +```bash nextflow run nf-core/fetchngs --input ids.txt -profile docker ``` @@ -57,7 +57,7 @@ results # Finished results (configurable, see below) When you run the above command, Nextflow automatically pulls the pipeline code from GitHub and stores it as a cached version. When running the pipeline after this, it will always use the cached version if available - even if the pipeline has been updated since. To make sure that you're running the latest version of the pipeline, make sure that you regularly update the cached version of the pipeline: -```console +```bash nextflow pull nf-core/fetchngs ``` @@ -221,6 +221,6 @@ Some HPC setups also allow you to run nextflow within a cluster job submitted yo In some cases, the Nextflow Java virtual machines can start to request a large amount of memory. We recommend adding the following line to your environment to limit this (typically in `~/.bashrc` or `~./bash_profile`): -```console +```bash NXF_OPTS='-Xms1g -Xmx4g' ``` From 8f03fa7fc741e12b129643361fdeab43569413f7 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 22 Jun 2021 10:52:30 +0100 Subject: [PATCH 019/852] Add description about files generated by --sample_mapping_fields --- nextflow_schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 8bb27a97..8d1a1c44 100755 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -32,7 +32,7 @@ "sample_mapping_fields": { "type": "string", "fa_icon": "fas fa-globe-americas", - "description": "Comma-separated list of ENA metadata fields used to create mappings file for sample id mapping or renaming.", + "description": "Comma-separated list of ENA metadata fields used to create a separate 'id_mappings.csv' and 'multiqc_config.yml' with selected fields that can be used to rename samples in general and in MultiQC.", "default": "run_accession,sample_accession,experiment_alias,run_alias,sample_alias,experiment_title,sample_title,sample_description,description" }, "nf_core_pipeline": { From faf03eae7ab42e2d32f2da5569fd94b899a8456a Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 22 Jun 2021 11:52:36 +0100 Subject: [PATCH 020/852] Bump version to 1.2dev --- CHANGELOG.md | 4 ++++ nextflow.config | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3cc14bd0..e28098c8 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unpublished Version / DEV] + +### Enhancements & fixes + ## [[1.1](https://github.com/nf-core/fetchngs/releases/tag/1.1)] - 2021-06-22 ### Enhancements & fixes diff --git a/nextflow.config b/nextflow.config index 5ac246e5..1c7eb664 100755 --- a/nextflow.config +++ b/nextflow.config @@ -147,7 +147,7 @@ manifest { description = 'Pipeline to fetch metadata and raw FastQ files from public databases' mainScript = 'main.nf' nextflowVersion = '!>=21.04.0' - version = '1.1' + version = '1.2dev' } // Function to ensure that resource requirements don't go beyond From 8a02f251e26805f872af073b8cbbab81c71a3f49 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 5 Jul 2021 16:02:57 +0100 Subject: [PATCH 021/852] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e78820f8..ba2fa9fa 100755 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![GitHub Actions CI Status](https://github.com/nf-core/fetchngs/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/fetchngs/actions?query=workflow%3A%22nf-core+CI%22) [![GitHub Actions Linting Status](https://github.com/nf-core/fetchngs/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/fetchngs/actions?query=workflow%3A%22nf-core+linting%22) [![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/fetchngs/results) -[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) +[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.5070524) [![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A521.04.0-23aa62.svg?labelColor=000000)](https://www.nextflow.io/) [![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/) @@ -71,7 +71,7 @@ For further information or help, don't hesitate to get in touch on the [Slack `# ## Citations -If you use nf-core/fetchngs for your analysis, please cite it using the following doi: [10.5281/zenodo.XXXXXX](https://doi.org/10.5281/zenodo.XXXXXX) +If you use nf-core/fetchngs for your analysis, please cite it using the following doi: [10.5281/zenodo.5070524](https://doi.org/10.5281/zenodo.5070524) An extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file. From d71aaa29e3072958926871acdb8c471bad697b9b Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 5 Jul 2021 16:03:20 +0100 Subject: [PATCH 022/852] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ba2fa9fa..fec02f01 100755 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![GitHub Actions CI Status](https://github.com/nf-core/fetchngs/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/fetchngs/actions?query=workflow%3A%22nf-core+CI%22) [![GitHub Actions Linting Status](https://github.com/nf-core/fetchngs/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/fetchngs/actions?query=workflow%3A%22nf-core+linting%22) [![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/fetchngs/results) -[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.5070524) +[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.5070524-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.5070524) [![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A521.04.0-23aa62.svg?labelColor=000000)](https://www.nextflow.io/) [![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/) From 67b1faa47dcac9171027da3db05a38a966921bd3 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 5 Jul 2021 16:03:55 +0100 Subject: [PATCH 023/852] Update WorkflowMain.groovy --- lib/WorkflowMain.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index a15e60d8..a7fb8c70 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -10,7 +10,7 @@ class WorkflowMain { public static String citation(workflow) { return "If you use ${workflow.manifest.name} for your analysis please cite:\n\n" + "* The pipeline\n" + - " https://doi.org/10.5281/zenodo.XXXXXXX\n\n" + + " https://doi.org/10.5281/zenodo.5070524\n\n" + "* The nf-core framework\n" + " https://doi.org/10.1038/s41587-020-0439-x\n\n" + "* Software dependencies\n" + From e603b346cf6d1bac944284f49aae3541464a3db7 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 13 Jul 2021 17:16:52 +0100 Subject: [PATCH 024/852] Update CHANGELOG --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e28098c8..e95c4850 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Enhancements & fixes +* Updated pipeline template to [nf-core/tools 2.0.1](https://github.com/nf-core/tools/releases/tag/2.0.1) + ## [[1.1](https://github.com/nf-core/fetchngs/releases/tag/1.1)] - 2021-06-22 ### Enhancements & fixes From 672a40fc6dcd36f63e7732617f67e4882639cd95 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 13 Jul 2021 17:41:39 +0100 Subject: [PATCH 025/852] Fix nf-core lint --- .nf-core-lint.yaml | 13 ------------- .nf-core.yml | 6 ++++++ modules.json | 14 -------------- 3 files changed, 6 insertions(+), 27 deletions(-) delete mode 100644 .nf-core-lint.yaml create mode 100644 .nf-core.yml delete mode 100644 modules.json diff --git a/.nf-core-lint.yaml b/.nf-core-lint.yaml deleted file mode 100644 index d472f25c..00000000 --- a/.nf-core-lint.yaml +++ /dev/null @@ -1,13 +0,0 @@ -files_unchanged: - - .github/CONTRIBUTING.md - - .github/ISSUE_TEMPLATE/bug_report.md - - .github/PULL_REQUEST_TEMPLATE.md - - .github/workflows/linting.yml - - assets/sendmail_template.txt - - docs/README.md - - lib/NfcoreSchema.groovy - - .gitignore -files_exist: - - .github/markdownlint.yml - - bin/markdown_to_html.py -actions_awsfulltest: False diff --git a/.nf-core.yml b/.nf-core.yml new file mode 100644 index 00000000..04dd88d8 --- /dev/null +++ b/.nf-core.yml @@ -0,0 +1,6 @@ +lint: + files_unchanged: + - .github/CONTRIBUTING.md + - assets/sendmail_template.txt + - bin/scrape_software_versions.py + - lib/NfcoreTemplate.groovy diff --git a/modules.json b/modules.json deleted file mode 100644 index e4a8a64f..00000000 --- a/modules.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "nf-core/fetchngs", - "homePage": "https://github.com/nf-core/fetchngs", - "repos": { - "nf-core/modules": { - "fastqc": { - "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" - }, - "multiqc": { - "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" - } - } - } -} From bcd7aece348e54b0509d97832d40ce720f1ab672 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 20 Jul 2021 20:16:50 +0100 Subject: [PATCH 026/852] Ignore newlines at the end of JSON files --- .editorconfig | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.editorconfig b/.editorconfig index afb20bb1..95549501 100644 --- a/.editorconfig +++ b/.editorconfig @@ -11,6 +11,9 @@ indent_style = space [*.{yml,yaml}] indent_size = 2 +[*.json] +insert_final_newline = unset + # These files are edited and tested upstream in nf-core/modules [/modules/nf-core/**] charset = unset From b8d80937e3d505d1c40fc44ecd55127275ac04a6 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 20 Jul 2021 20:34:14 +0100 Subject: [PATCH 027/852] Bump version to v1.2 --- CHANGELOG.md | 2 +- nextflow.config | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e95c4850..fac42c14 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unpublished Version / DEV] +## [[1.2](https://github.com/nf-core/fetchngs/releases/tag/1.2)] - 2021-07-26 ### Enhancements & fixes diff --git a/nextflow.config b/nextflow.config index 1c7eb664..3b3ea780 100644 --- a/nextflow.config +++ b/nextflow.config @@ -147,7 +147,7 @@ manifest { description = 'Pipeline to fetch metadata and raw FastQ files from public databases' mainScript = 'main.nf' nextflowVersion = '!>=21.04.0' - version = '1.2dev' + version = '1.2' } // Function to ensure that resource requirements don't go beyond From 16c7cb0aac937af1ae070f60183775fce9e869b6 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 20 Jul 2021 20:34:33 +0100 Subject: [PATCH 028/852] Small updates to pipeline template --- lib/NfcoreTemplate.groovy | 22 +++++++++++++--------- workflows/fetchngs.nf | 4 +++- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/lib/NfcoreTemplate.groovy b/lib/NfcoreTemplate.groovy index b8fd59ab..3dd46e64 100755 --- a/lib/NfcoreTemplate.groovy +++ b/lib/NfcoreTemplate.groovy @@ -24,17 +24,21 @@ class NfcoreTemplate { public static void hostName(workflow, params, log) { Map colors = logColours(params.monochrome_logs) if (params.hostnames) { - def hostname = "hostname".execute().text.trim() - params.hostnames.each { prof, hnames -> - hnames.each { hname -> - if (hostname.contains(hname) && !workflow.profile.contains(prof)) { - log.info "=${colors.yellow}====================================================${colors.reset}=\n" + - "${colors.yellow}WARN: You are running with `-profile $workflow.profile`\n" + - " but your machine hostname is ${colors.white}'$hostname'${colors.reset}.\n" + - " ${colors.yellow_bold}Please use `-profile $prof${colors.reset}`\n" + - "=${colors.yellow}====================================================${colors.reset}=" + try { + def hostname = "hostname".execute().text.trim() + params.hostnames.each { prof, hnames -> + hnames.each { hname -> + if (hostname.contains(hname) && !workflow.profile.contains(prof)) { + log.info "=${colors.yellow}====================================================${colors.reset}=\n" + + "${colors.yellow}WARN: You are running with `-profile $workflow.profile`\n" + + " but your machine hostname is ${colors.white}'$hostname'${colors.reset}.\n" + + " ${colors.yellow_bold}Please use `-profile $prof${colors.reset}`\n" + + "=${colors.yellow}====================================================${colors.reset}=" + } } } + } catch (Exception e) { + log.warn "[$workflow.manifest.name] Could not determine 'hostname' - skipping check. Reason: ${e.message}." } } } diff --git a/workflows/fetchngs.nf b/workflows/fetchngs.nf index 1602494f..12733f07 100644 --- a/workflows/fetchngs.nf +++ b/workflows/fetchngs.nf @@ -147,7 +147,9 @@ workflow FETCHNGS { */ workflow.onComplete { - NfcoreTemplate.email(workflow, params, summary_params, projectDir, log) + if (params.email || params.email_on_fail) { + NfcoreTemplate.email(workflow, params, summary_params, projectDir, log) + } NfcoreTemplate.summary(workflow, params, log) WorkflowFetchngs.curateSamplesheetWarn(log) } From cc3d5fe19dbedad65452a2b8da51b1ec49442ec8 Mon Sep 17 00:00:00 2001 From: Alain Domissy Date: Thu, 22 Jul 2021 07:34:18 -0700 Subject: [PATCH 029/852] update ebi api url in fetch_sra_runinfo --- bin/sra_ids_to_runinfo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/sra_ids_to_runinfo.py b/bin/sra_ids_to_runinfo.py index f78eb31f..5d276e08 100755 --- a/bin/sra_ids_to_runinfo.py +++ b/bin/sra_ids_to_runinfo.py @@ -128,7 +128,7 @@ def fetch_sra_runinfo(file_in, file_out, ena_metadata_fields=ENA_METADATA_FIELDS ## Resolve/expand to get run identifier from ENA and write to file for id in ids: - url = 'http://www.ebi.ac.uk/ena/data/warehouse/filereport?accession={}&result=read_run&fields={}'.format(id,','.join(ena_metadata_fields)) + url = 'http://www.ebi.ac.uk/ena/portal/api/filereport?accession={}&result=read_run&fields={}'.format(id,','.join(ena_metadata_fields)) csv_dict = csv.DictReader(fetch_url(url), delimiter='\t') for row in csv_dict: run_id = row['run_accession'] From 5101495c33345ed91c9d237cb8b70b164896947d Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 22 Jul 2021 17:29:56 +0100 Subject: [PATCH 030/852] Update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fac42c14..159bfadb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Enhancements & fixes * Updated pipeline template to [nf-core/tools 2.0.1](https://github.com/nf-core/tools/releases/tag/2.0.1) +* [[#26](https://github.com/nf-core/fetchngs/pull/26)] - Update ebi api url in fetch_sra_runinfo ## [[1.1](https://github.com/nf-core/fetchngs/releases/tag/1.1)] - 2021-06-22 From d2fd73d15a8f61613cae91b852bb4a29e560eaa3 Mon Sep 17 00:00:00 2001 From: jahdoos Date: Fri, 23 Jul 2021 15:02:55 -0700 Subject: [PATCH 031/852] ena portal API update Fixes error i started getting - presumably ena changed their api --- bin/sra_ids_to_runinfo.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/sra_ids_to_runinfo.py b/bin/sra_ids_to_runinfo.py index f78eb31f..1480e8f2 100755 --- a/bin/sra_ids_to_runinfo.py +++ b/bin/sra_ids_to_runinfo.py @@ -79,7 +79,7 @@ def id_to_srx(db_id): def id_to_erx(db_id): ids = [] fields = ['run_accession', 'experiment_accession'] - url = 'http://www.ebi.ac.uk/ena/data/warehouse/filereport?accession={}&result=read_run&fields={}'.format(db_id,','.join(fields)) + url = 'https://www.ebi.ac.uk/ena/portal/api/filereport?accession={}&result=read_run&fields={}'.format(db_id,','.join(fields)) for row in csv.DictReader(fetch_url(url), delimiter='\t'): ids.append(row['experiment_accession']) return ids @@ -128,7 +128,7 @@ def fetch_sra_runinfo(file_in, file_out, ena_metadata_fields=ENA_METADATA_FIELDS ## Resolve/expand to get run identifier from ENA and write to file for id in ids: - url = 'http://www.ebi.ac.uk/ena/data/warehouse/filereport?accession={}&result=read_run&fields={}'.format(id,','.join(ena_metadata_fields)) + url = 'https://www.ebi.ac.uk/ena/portal/api/filereport?accession={}&result=read_run&fields={}'.format(id,','.join(ena_metadata_fields)) csv_dict = csv.DictReader(fetch_url(url), delimiter='\t') for row in csv_dict: run_id = row['run_accession'] From b49a905d5e8e9b4ac9b0f8eae5ae4fd3bad46266 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 26 Jul 2021 17:38:04 +0100 Subject: [PATCH 032/852] Fix last remaining EBI API URL change --- bin/sra_ids_to_runinfo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/sra_ids_to_runinfo.py b/bin/sra_ids_to_runinfo.py index 5d276e08..febc2a01 100755 --- a/bin/sra_ids_to_runinfo.py +++ b/bin/sra_ids_to_runinfo.py @@ -79,7 +79,7 @@ def id_to_srx(db_id): def id_to_erx(db_id): ids = [] fields = ['run_accession', 'experiment_accession'] - url = 'http://www.ebi.ac.uk/ena/data/warehouse/filereport?accession={}&result=read_run&fields={}'.format(db_id,','.join(fields)) + url = 'http://www.ebi.ac.uk/ena/portal/api/filereport?accession={}&result=read_run&fields={}'.format(db_id,','.join(fields)) for row in csv.DictReader(fetch_url(url), delimiter='\t'): ids.append(row['experiment_accession']) return ids From 4b01759274b10dc3821f8466e02d709ad2435a0a Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 26 Jul 2021 17:44:19 +0100 Subject: [PATCH 033/852] Update CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 159bfadb..db16ac8e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [[1.2](https://github.com/nf-core/fetchngs/releases/tag/1.2)] - 2021-07-26 +## [[1.2](https://github.com/nf-core/fetchngs/releases/tag/1.2)] - 2021-07-28 ### Enhancements & fixes From e7a0d02e10a8916888c03ef5f3aa27ff4d40a859 Mon Sep 17 00:00:00 2001 From: Oliver Ziff <41295194+ojziff@users.noreply.github.com> Date: Mon, 26 Jul 2021 21:30:52 +0100 Subject: [PATCH 034/852] Update usage.md update public_data_ids argument to input --- docs/usage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/usage.md b/docs/usage.md index 2e5675a9..dc2edc19 100755 --- a/docs/usage.md +++ b/docs/usage.md @@ -32,7 +32,7 @@ If you have a GEO accession (found in the data availability section of published * Click `SRA Run Selector` at the bottom of the GEO accession page * Select the desired samples in the `SRA Run Selector` and then download the `Accession List` -This downloads a text file called `SRR_Acc_List.txt` which can be directly provided to the pipeline e.g. `--public_data_ids SRR_Acc_List.txt`. +This downloads a text file called `SRR_Acc_List.txt` which can be directly provided to the pipeline e.g. `--input SRR_Acc_List.txt`. ## Running the pipeline From fdba0bf660afb1473efee12e06a154628b5ee08c Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 26 Jul 2021 22:54:58 +0100 Subject: [PATCH 035/852] Update usage.md --- docs/usage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/usage.md b/docs/usage.md index dc2edc19..1aebaa3e 100755 --- a/docs/usage.md +++ b/docs/usage.md @@ -32,7 +32,7 @@ If you have a GEO accession (found in the data availability section of published * Click `SRA Run Selector` at the bottom of the GEO accession page * Select the desired samples in the `SRA Run Selector` and then download the `Accession List` -This downloads a text file called `SRR_Acc_List.txt` which can be directly provided to the pipeline e.g. `--input SRR_Acc_List.txt`. +This downloads a text file called `SRR_Acc_List.txt` that can be directly provided to the pipeline e.g. `--input SRR_Acc_List.txt`. ## Running the pipeline From 383dcbe4f6939ed8cd3fac2a8c5a96a7e62a1a63 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 27 Jul 2021 21:26:59 +0100 Subject: [PATCH 036/852] Update CHANGELOG --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index db16ac8e..be77eb6f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,8 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Enhancements & fixes -* Updated pipeline template to [nf-core/tools 2.0.1](https://github.com/nf-core/tools/releases/tag/2.0.1) -* [[#26](https://github.com/nf-core/fetchngs/pull/26)] - Update ebi api url in fetch_sra_runinfo +* Updated pipeline template to [nf-core/tools 2.1](https://github.com/nf-core/tools/releases/tag/2.1) +* [[#26](https://github.com/nf-core/fetchngs/pull/26)] - Update broken EBI API URL ## [[1.1](https://github.com/nf-core/fetchngs/releases/tag/1.1)] - 2021-06-22 From 8f310d715fec4935bb095622d5aaa9ef7a47b90e Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 27 Jul 2021 21:31:22 +0100 Subject: [PATCH 037/852] Amend files_unchanged in .nf-core.yml --- .nf-core.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.nf-core.yml b/.nf-core.yml index 04dd88d8..12fe7aa8 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -2,5 +2,4 @@ lint: files_unchanged: - .github/CONTRIBUTING.md - assets/sendmail_template.txt - - bin/scrape_software_versions.py - lib/NfcoreTemplate.groovy From ed853c1c5dc9c143e8f9e61def3e98a534b0d978 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 14 Sep 2021 23:35:20 +0100 Subject: [PATCH 038/852] Replace requests with urllib --- bin/sra_ids_to_runinfo.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/bin/sra_ids_to_runinfo.py b/bin/sra_ids_to_runinfo.py index 1480e8f2..41a5c0ee 100755 --- a/bin/sra_ids_to_runinfo.py +++ b/bin/sra_ids_to_runinfo.py @@ -5,8 +5,9 @@ import sys import csv import errno -import requests import argparse +from urllib.request import urlopen +from urllib.error import URLError, HTTPError ## Example ids supported by this script SRA_IDS = ['PRJNA63463', 'SAMN00765663', 'SRA023522', 'SRP003255', 'SRR390278', 'SRS282569', 'SRX111814'] @@ -61,13 +62,17 @@ def make_dir(path): def fetch_url(url, encoding='utf-8'): try: - r = requests.get(url) - except requests.exceptions.RequestException as e: - raise SystemExit(e) - if r.status_code != 200: - print("ERROR: Connection failed\nError code '{}'".format(r.status_code)) + with urlopen(url) as f: + r = f.read().decode(encoding).splitlines() + except HTTPError as e: + print('The server couldn\'t fulfill the request.') + print('Error code: {}'.format(e.code)) sys.exit(1) - return r.content.decode(encoding).splitlines() + except URLError as e: + print('We failed to reach a server.') + print('Reason: {}'.format(e.reason)) + sys.exit(1) + return r def id_to_srx(db_id): ids = [] From 79444d5605404c85ba20404ffdc86185a6c51321 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 14 Sep 2021 23:35:35 +0100 Subject: [PATCH 039/852] Bump Python version to 3.9.5 --- modules/local/get_software_versions.nf | 6 +++--- modules/local/multiqc_mappings_config.nf | 6 +++--- modules/local/sra_ids_to_runinfo.nf | 6 +++--- modules/local/sra_runinfo_to_ftp.nf | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/modules/local/get_software_versions.nf b/modules/local/get_software_versions.nf index 4d37bd6a..65b7f340 100644 --- a/modules/local/get_software_versions.nf +++ b/modules/local/get_software_versions.nf @@ -8,11 +8,11 @@ process GET_SOFTWARE_VERSIONS { mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'pipeline_info', meta:[:], publish_by_meta:[]) } - conda (params.enable_conda ? "conda-forge::python=3.8.3" : null) + conda (params.enable_conda ? "conda-forge::python=3.9.5" : null) if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/python:3.8.3" + container "https://depot.galaxyproject.org/singularity/python:3.9--1" } else { - container "quay.io/biocontainers/python:3.8.3" + container "quay.io/biocontainers/python:3.9--1" } cache false diff --git a/modules/local/multiqc_mappings_config.nf b/modules/local/multiqc_mappings_config.nf index 63121b40..8360cd34 100644 --- a/modules/local/multiqc_mappings_config.nf +++ b/modules/local/multiqc_mappings_config.nf @@ -8,11 +8,11 @@ process MULTIQC_MAPPINGS_CONFIG { mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } - conda (params.enable_conda ? "conda-forge::python=3.8.3" : null) + conda (params.enable_conda ? "conda-forge::python=3.9.5" : null) if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/python:3.8.3" + container "https://depot.galaxyproject.org/singularity/python:3.9--1" } else { - container "quay.io/biocontainers/python:3.8.3" + container "quay.io/biocontainers/python:3.9--1" } input: diff --git a/modules/local/sra_ids_to_runinfo.nf b/modules/local/sra_ids_to_runinfo.nf index b277197e..3d3fc063 100644 --- a/modules/local/sra_ids_to_runinfo.nf +++ b/modules/local/sra_ids_to_runinfo.nf @@ -10,11 +10,11 @@ process SRA_IDS_TO_RUNINFO { mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } - conda (params.enable_conda ? "conda-forge::sed=4.7" : null) + conda (params.enable_conda ? "conda-forge::python=3.9.5" : null) if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img" + container "https://depot.galaxyproject.org/singularity/python:3.9--1" } else { - container "biocontainers/biocontainers:v1.2.0_cv1" + container "quay.io/biocontainers/python:3.9--1" } input: diff --git a/modules/local/sra_runinfo_to_ftp.nf b/modules/local/sra_runinfo_to_ftp.nf index b0421aea..f426f4ab 100644 --- a/modules/local/sra_runinfo_to_ftp.nf +++ b/modules/local/sra_runinfo_to_ftp.nf @@ -8,11 +8,11 @@ process SRA_RUNINFO_TO_FTP { mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } - conda (params.enable_conda ? "conda-forge::python=3.8.3" : null) + conda (params.enable_conda ? "conda-forge::python=3.9.5" : null) if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/python:3.8.3" + container "https://depot.galaxyproject.org/singularity/python:3.9--1" } else { - container "quay.io/biocontainers/python:3.8.3" + container "quay.io/biocontainers/python:3.9--1" } input: From 74b7f148b5462998d8b5f485ad0bad55f73e2ef3 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 14 Sep 2021 23:35:43 +0100 Subject: [PATCH 040/852] Update CHANGELOG --- CHANGELOG.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index be77eb6f..eae33fae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,18 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [[1.3](https://github.com/nf-core/fetchngs/releases/tag/1.3)] - 2021-09-15 + +### Enhancements & fixes + +* Replaced Python `requests` with `urllib` to fetch ENA metadata + +### Software dependencies + +| Dependency | Old version | New version | +|-------------|-------------|-------------| +| `python` | 3.8.3 | 3.9.5 | + ## [[1.2](https://github.com/nf-core/fetchngs/releases/tag/1.2)] - 2021-07-28 ### Enhancements & fixes From 48c53f268f2d7738df1f9c0c09cc81e378079cf3 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 14 Sep 2021 23:35:54 +0100 Subject: [PATCH 041/852] Bump pipeline version --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 3b3ea780..52382140 100644 --- a/nextflow.config +++ b/nextflow.config @@ -147,7 +147,7 @@ manifest { description = 'Pipeline to fetch metadata and raw FastQ files from public databases' mainScript = 'main.nf' nextflowVersion = '!>=21.04.0' - version = '1.2' + version = '1.3' } // Function to ensure that resource requirements don't go beyond From 57a303ca77439a7334b0517303c8bb243c836765 Mon Sep 17 00:00:00 2001 From: "Moritz E. Beber" Date: Wed, 15 Sep 2021 14:21:59 +0200 Subject: [PATCH 042/852] refactor: introduce logging to replace print --- bin/sra_ids_to_runinfo.py | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/bin/sra_ids_to_runinfo.py b/bin/sra_ids_to_runinfo.py index 41a5c0ee..24c6af0d 100755 --- a/bin/sra_ids_to_runinfo.py +++ b/bin/sra_ids_to_runinfo.py @@ -6,9 +6,13 @@ import csv import errno import argparse +import logging from urllib.request import urlopen from urllib.error import URLError, HTTPError + +logger = logging.getLogger() + ## Example ids supported by this script SRA_IDS = ['PRJNA63463', 'SAMN00765663', 'SRA023522', 'SRP003255', 'SRR390278', 'SRS282569', 'SRX111814'] ENA_IDS = ['ERA2421642', 'ERP120836', 'ERR674736', 'ERS4399631', 'ERX629702', 'PRJEB7743', 'SAMEA3121481'] @@ -48,7 +52,7 @@ def validate_csv_param(param, valid_vals, param_desc): if len(intersect) == len(user_vals): valid_list = intersect else: - print("ERROR: Please provide a valid value for {}!\nProvided values = {}\nAccepted values = {}".format(param_desc,param,','.join(valid_vals))) + logger.error(f"Please provide a valid value for {param_desc}!\nProvided values = {param}\nAccepted values = {','.join(valid_vals)}") sys.exit(1) return valid_list @@ -65,12 +69,12 @@ def fetch_url(url, encoding='utf-8'): with urlopen(url) as f: r = f.read().decode(encoding).splitlines() except HTTPError as e: - print('The server couldn\'t fulfill the request.') - print('Error code: {}'.format(e.code)) + logger.error("The server couldn't fulfill the request.") + logger.error(f"Status: {e.code} {e.reason}") sys.exit(1) except URLError as e: - print('We failed to reach a server.') - print('Reason: {}'.format(e.reason)) + logger.error('We failed to reach a server.') + logger.error(f"Reason: {e.reason}") sys.exit(1) return r @@ -143,7 +147,7 @@ def fetch_sra_runinfo(file_in, file_out, ena_metadata_fields=ENA_METADATA_FIELDS fout.write('{}\n'.format('\t'.join(header))) else: if header != row.keys(): - print("ERROR: Metadata columns do not match for id {}!\nLine: '{}'".format(run_id,line.strip())) + logger.error(f"Metadata columns do not match for id {run_id}!\nLine: '{line.strip()}'") sys.exit(1) fout.write('{}\n'.format('\t'.join([row[x] for x in header]))) total_out += 1 @@ -151,16 +155,16 @@ def fetch_sra_runinfo(file_in, file_out, ena_metadata_fields=ENA_METADATA_FIELDS seen_ids.append(db_id) if not ids: - print("ERROR: No matches found for database id {}!\nLine: '{}'".format(db_id,line.strip())) + logger.error(f"No matches found for database id {db_id}!\nLine: '{line.strip()}'") sys.exit(1) else: id_str = ', '.join([x + "*" for x in PREFIX_LIST]) - print("ERROR: Please provide a valid database id starting with {}!\nLine: '{}'".format(id_str,line.strip())) + logger.error(f"Please provide a valid database id starting with {id_str}!\nLine: '{line.strip()}'") sys.exit(1) else: id_str = ', '.join([x + "*" for x in PREFIX_LIST]) - print("ERROR: Please provide a valid database id starting with {}!\nLine: '{}'".format(id_str,line.strip())) + logger.error(f"Please provide a valid database id starting with {id_str}!\nLine: '{line.strip()}'") sys.exit(1) def main(args=None): @@ -172,4 +176,5 @@ def main(args=None): fetch_sra_runinfo(args.FILE_IN, args.FILE_OUT, ena_metadata_fields) if __name__ == '__main__': + logging.basicConfig(level='INFO', format='[%(levelname)s] %(message)s') sys.exit(main()) From 2e132dcced092335dd2fcbc5460f4f53e63928d8 Mon Sep 17 00:00:00 2001 From: "Moritz E. Beber" Date: Wed, 15 Sep 2021 14:25:05 +0200 Subject: [PATCH 043/852] refactor: make global constants immutable tuples --- bin/sra_ids_to_runinfo.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/bin/sra_ids_to_runinfo.py b/bin/sra_ids_to_runinfo.py index 24c6af0d..eadfd8e5 100755 --- a/bin/sra_ids_to_runinfo.py +++ b/bin/sra_ids_to_runinfo.py @@ -14,15 +14,15 @@ logger = logging.getLogger() ## Example ids supported by this script -SRA_IDS = ['PRJNA63463', 'SAMN00765663', 'SRA023522', 'SRP003255', 'SRR390278', 'SRS282569', 'SRX111814'] -ENA_IDS = ['ERA2421642', 'ERP120836', 'ERR674736', 'ERS4399631', 'ERX629702', 'PRJEB7743', 'SAMEA3121481'] -GEO_IDS = ['GSE18729', 'GSM465244'] +SRA_IDS = ('PRJNA63463', 'SAMN00765663', 'SRA023522', 'SRP003255', 'SRR390278', 'SRS282569', 'SRX111814') +ENA_IDS = ('ERA2421642', 'ERP120836', 'ERR674736', 'ERS4399631', 'ERX629702', 'PRJEB7743', 'SAMEA3121481') +GEO_IDS = ('GSE18729', 'GSM465244') ID_REGEX = r'^[A-Z]+' PREFIX_LIST = sorted(list(set([re.search(ID_REGEX,x).group() for x in SRA_IDS + ENA_IDS + GEO_IDS]))) ## List of meta fields fetched from the ENA API - can be overriden by --ena_metadata_fields ## Full list of accepted fields can be obtained here: https://www.ebi.ac.uk/ena/portal/api/returnFields?dataPortal=ena&format=tsv&result=read_run -ENA_METADATA_FIELDS = [ +ENA_METADATA_FIELDS = ( 'accession', 'run_accession', 'experiment_accession', 'sample_accession', 'secondary_sample_accession', 'study_accession', 'secondary_study_accession', 'parent_study', 'submission_accession', 'run_alias', 'experiment_alias', 'sample_alias', 'study_alias', 'library_layout', 'library_selection', 'library_source', 'library_strategy', 'library_name', @@ -32,7 +32,7 @@ 'sample_title', 'experiment_title', 'study_title', 'description', 'sample_description', 'fastq_md5', 'fastq_bytes', 'fastq_ftp', 'fastq_galaxy', 'fastq_aspera' -] + ) def parse_args(args=None): Description = 'Download and create a run information metadata file from SRA/ENA/GEO identifiers.' From 99c9a620096a1d9e41a1aa664d2abc85f7d8eb1a Mon Sep 17 00:00:00 2001 From: "Moritz E. Beber" Date: Wed, 15 Sep 2021 14:29:49 +0200 Subject: [PATCH 044/852] refactor: use compiled regex pattern --- bin/sra_ids_to_runinfo.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bin/sra_ids_to_runinfo.py b/bin/sra_ids_to_runinfo.py index eadfd8e5..c70df48d 100755 --- a/bin/sra_ids_to_runinfo.py +++ b/bin/sra_ids_to_runinfo.py @@ -17,8 +17,8 @@ SRA_IDS = ('PRJNA63463', 'SAMN00765663', 'SRA023522', 'SRP003255', 'SRR390278', 'SRS282569', 'SRX111814') ENA_IDS = ('ERA2421642', 'ERP120836', 'ERR674736', 'ERS4399631', 'ERX629702', 'PRJEB7743', 'SAMEA3121481') GEO_IDS = ('GSE18729', 'GSM465244') -ID_REGEX = r'^[A-Z]+' -PREFIX_LIST = sorted(list(set([re.search(ID_REGEX,x).group() for x in SRA_IDS + ENA_IDS + GEO_IDS]))) +ID_REGEX = re.compile(r'[A-Z]+') +PREFIX_LIST = sorted({ID_REGEX.match(x).group() for x in SRA_IDS + ENA_IDS + GEO_IDS}) ## List of meta fields fetched from the ENA API - can be overriden by --ena_metadata_fields ## Full list of accepted fields can be obtained here: https://www.ebi.ac.uk/ena/portal/api/returnFields?dataPortal=ena&format=tsv&result=read_run @@ -116,7 +116,7 @@ def fetch_sra_runinfo(file_in, file_out, ena_metadata_fields=ENA_METADATA_FIELDS with open(file_in,"r") as fin, open(file_out,"w") as fout: for line in fin: db_id = line.strip() - match = re.search(ID_REGEX, db_id) + match = ID_REGEX.match(db_id) if match: prefix = match.group() if prefix in PREFIX_LIST: From 2ea9dd7173e449f93650169936f195a4ec985ac2 Mon Sep 17 00:00:00 2001 From: "Moritz E. Beber" Date: Wed, 15 Sep 2021 14:32:54 +0200 Subject: [PATCH 045/852] refactor: use set for better lookup performance --- bin/sra_ids_to_runinfo.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/bin/sra_ids_to_runinfo.py b/bin/sra_ids_to_runinfo.py index c70df48d..f90f7d9d 100755 --- a/bin/sra_ids_to_runinfo.py +++ b/bin/sra_ids_to_runinfo.py @@ -110,7 +110,8 @@ def get_ena_fields(): def fetch_sra_runinfo(file_in, file_out, ena_metadata_fields=ENA_METADATA_FIELDS): total_out = 0 - seen_ids = []; run_ids = [] + seen_ids = set() + run_ids = set() header = [] make_dir(os.path.dirname(file_out)) with open(file_in,"r") as fin, open(file_out,"w") as fout: @@ -120,7 +121,7 @@ def fetch_sra_runinfo(file_in, file_out, ena_metadata_fields=ENA_METADATA_FIELDS if match: prefix = match.group() if prefix in PREFIX_LIST: - if not db_id in seen_ids: + if db_id not in seen_ids: ids = [db_id] ## Resolve/expand these ids against GEO URL @@ -141,7 +142,7 @@ def fetch_sra_runinfo(file_in, file_out, ena_metadata_fields=ENA_METADATA_FIELDS csv_dict = csv.DictReader(fetch_url(url), delimiter='\t') for row in csv_dict: run_id = row['run_accession'] - if not run_id in run_ids: + if run_id not in run_ids: if total_out == 0: header = row.keys() fout.write('{}\n'.format('\t'.join(header))) @@ -151,8 +152,8 @@ def fetch_sra_runinfo(file_in, file_out, ena_metadata_fields=ENA_METADATA_FIELDS sys.exit(1) fout.write('{}\n'.format('\t'.join([row[x] for x in header]))) total_out += 1 - run_ids.append(run_id) - seen_ids.append(db_id) + run_ids.add(run_id) + seen_ids.add(db_id) if not ids: logger.error(f"No matches found for database id {db_id}!\nLine: '{line.strip()}'") From 473b2378f51104148b61b2737c39357e0c9a10a3 Mon Sep 17 00:00:00 2001 From: "Moritz E. Beber" Date: Wed, 15 Sep 2021 15:19:04 +0200 Subject: [PATCH 046/852] feat: enable decompression and decoding from HTTP headers --- bin/sra_ids_to_runinfo.py | 84 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 80 insertions(+), 4 deletions(-) diff --git a/bin/sra_ids_to_runinfo.py b/bin/sra_ids_to_runinfo.py index f90f7d9d..1aef2cfe 100755 --- a/bin/sra_ids_to_runinfo.py +++ b/bin/sra_ids_to_runinfo.py @@ -7,6 +7,9 @@ import errno import argparse import logging +import gzip +import zlib +import cgi from urllib.request import urlopen from urllib.error import URLError, HTTPError @@ -34,6 +37,79 @@ 'fastq_md5', 'fastq_bytes', 'fastq_ftp', 'fastq_galaxy', 'fastq_aspera' ) + +class Response: + """ + Define an HTTP response class. + + This class should not have to be instantiated directly. + + Attributes: + status (int): The numeric HTTP status code of the response. + reason (str): The response's reason phrase. + body (bytes): The response's decompressed body content as bytes. + + Methods: + text: The response's body as a decoded string. + + """ + + def __init__(self, *, response, **kwargs) -> None: + """ + Initialize an HTTP response object. + + Args: + response (http.client.HTTPResponse): A standard library response object + that is wrapped by this class. + **kwargs: Passed to parent classes. + + """ + super().__init__(**kwargs) + self._response = response + # Immediately read the body while the response context is still available. + self._raw = self._response.read() + self._content = None + + def _decompress(self): + """Decompress the response body if necessary.""" + method = self._response.getheader("Content-Encoding", "") + if not method: + self._content = self._raw + return + if method == "gzip": + self._content = gzip.decompress(self._raw) + elif method == "deflate": + self._content = zlib.decompress(self._raw) + else: + raise ValueError(f"Unsupported compression: {method}") + + @property + def status(self): + """Get the response's HTTP status code.""" + return self._response.status + + @property + def reason(self): + """Get the response's reason phrase.""" + return self._response.reason + + @property + def body(self): + """Get the response's decompressed body content as bytes.""" + if self._content is None: + self._decompress() + return self._content + + def text(self, encoding=None): + """Return the response's body as a decoded string.""" + if encoding is not None: + return self._content.decode(encoding) + + _, params = cgi.parse_header(self._response.getheader("Content-Type", "")) + encoding = params.get("charset", "utf-8") + return self._content.decode(encoding) + + def parse_args(args=None): Description = 'Download and create a run information metadata file from SRA/ENA/GEO identifiers.' Epilog = 'Example usage: python fetch_sra_runinfo.py ' @@ -64,10 +140,10 @@ def make_dir(path): if exception.errno != errno.EEXIST: raise -def fetch_url(url, encoding='utf-8'): +def fetch_url(url): try: - with urlopen(url) as f: - r = f.read().decode(encoding).splitlines() + with urlopen(url) as response: + result = Response(response=response).text().splitlines() except HTTPError as e: logger.error("The server couldn't fulfill the request.") logger.error(f"Status: {e.code} {e.reason}") @@ -76,7 +152,7 @@ def fetch_url(url, encoding='utf-8'): logger.error('We failed to reach a server.') logger.error(f"Reason: {e.reason}") sys.exit(1) - return r + return result def id_to_srx(db_id): ids = [] From 7798aa1a63d68e9162c7dc4714f78a9775dc7011 Mon Sep 17 00:00:00 2001 From: "Moritz E. Beber" Date: Wed, 15 Sep 2021 15:25:33 +0200 Subject: [PATCH 047/852] refactor: use f-strings where possible --- bin/sra_ids_to_runinfo.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/bin/sra_ids_to_runinfo.py b/bin/sra_ids_to_runinfo.py index 1aef2cfe..4b4ed2d7 100755 --- a/bin/sra_ids_to_runinfo.py +++ b/bin/sra_ids_to_runinfo.py @@ -117,7 +117,7 @@ def parse_args(args=None): parser = argparse.ArgumentParser(description=Description, epilog=Epilog) parser.add_argument('FILE_IN', help="File containing database identifiers, one per line.") parser.add_argument('FILE_OUT', help="Output file in tab-delimited format.") - parser.add_argument('-ef', '--ena_metadata_fields', type=str, dest="ENA_METADATA_FIELDS", default='', help="Comma-separated list of ENA metadata fields to fetch. (default: {}).".format(','.join(ENA_METADATA_FIELDS))) + parser.add_argument('-ef', '--ena_metadata_fields', type=str, dest="ENA_METADATA_FIELDS", default='', help=f"Comma-separated list of ENA metadata fields to fetch. (default: {','.join(ENA_METADATA_FIELDS)}).") return parser.parse_args(args) def validate_csv_param(param, valid_vals, param_desc): @@ -220,13 +220,15 @@ def fetch_sra_runinfo(file_in, file_out, ena_metadata_fields=ENA_METADATA_FIELDS run_id = row['run_accession'] if run_id not in run_ids: if total_out == 0: - header = row.keys() - fout.write('{}\n'.format('\t'.join(header))) + header = '\t'.join(row.keys()) + fout.write(f"{header}\n") else: if header != row.keys(): logger.error(f"Metadata columns do not match for id {run_id}!\nLine: '{line.strip()}'") sys.exit(1) - fout.write('{}\n'.format('\t'.join([row[x] for x in header]))) + + ordered_row = '\t'.join([row[x] for x in header]) + fout.write(f'{ordered_row}\n') total_out += 1 run_ids.add(run_id) seen_ids.add(db_id) From eaca802ba4ee15883a049c523b5a7c104347cd7e Mon Sep 17 00:00:00 2001 From: "Moritz E. Beber" Date: Wed, 15 Sep 2021 15:52:17 +0200 Subject: [PATCH 048/852] refactor: manage URLs with encoding --- bin/sra_ids_to_runinfo.py | 79 +++++++++++++++++++++++++-------------- 1 file changed, 51 insertions(+), 28 deletions(-) diff --git a/bin/sra_ids_to_runinfo.py b/bin/sra_ids_to_runinfo.py index 4b4ed2d7..87fe51f1 100755 --- a/bin/sra_ids_to_runinfo.py +++ b/bin/sra_ids_to_runinfo.py @@ -1,18 +1,18 @@ #!/usr/bin/env python -import os -import re -import sys +import argparse +import cgi import csv import errno -import argparse -import logging import gzip +import logging +import os +import re +import sys import zlib -import cgi -from urllib.request import urlopen from urllib.error import URLError, HTTPError - +from urllib.parse import urlencode +from urllib.request import urlopen logger = logging.getLogger() @@ -155,34 +155,53 @@ def fetch_url(url): return result def id_to_srx(db_id): - ids = [] - url = 'https://trace.ncbi.nlm.nih.gov/Traces/sra/sra.cgi?save=efetch&db=sra&rettype=runinfo&term={}'.format(db_id) - for row in csv.DictReader(fetch_url(url), delimiter=','): - ids.append(row['Experiment']) - return ids + params = { + "save": "efetch", + "db": "sra", + "rettype": "runinfo", + "term": db_id + } + url = f'https://trace.ncbi.nlm.nih.gov/Traces/sra/sra.cgi?{urlencode(params)}' + return [ + row['Experiment'] for row in csv.DictReader(fetch_url(url), delimiter=',') + ] def id_to_erx(db_id): - ids = [] fields = ['run_accession', 'experiment_accession'] - url = 'https://www.ebi.ac.uk/ena/portal/api/filereport?accession={}&result=read_run&fields={}'.format(db_id,','.join(fields)) - for row in csv.DictReader(fetch_url(url), delimiter='\t'): - ids.append(row['experiment_accession']) - return ids + params = { + "accession": db_id, + "result": "read_run", + "fields": ",".join(fields) + } + url = f'https://www.ebi.ac.uk/ena/portal/api/filereport?{urlencode(params)}' + return [ + row['experiment_accession'] for row in csv.DictReader(fetch_url(url), delimiter='\t') + ] def gse_to_srx(db_id): ids = [] - url = 'https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc={}&targ=gsm&view=data&form=text'.format(db_id) - gsm_ids = [x.split('=')[1].strip() for x in fetch_url(url) if x.find('GSM') != -1] + params = { + "acc": db_id, + "targ": "gsm", + "view": "data", + "form": "text" + } + url = f'https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?{urlencode(params)}' + gsm_ids = [x.split('=')[1].strip() for x in fetch_url(url) if x.startswith('GSM')] for gsm_id in gsm_ids: ids += id_to_srx(gsm_id) return ids def get_ena_fields(): - fields = [] - url = 'https://www.ebi.ac.uk/ena/portal/api/returnFields?dataPortal=ena&format=tsv&result=read_run' - for row in csv.DictReader(fetch_url(url), delimiter='\t'): - fields.append(row['columnId']) - return fields + params = { + "dataPortal": "ena", + "format": "tsv", + "result": "read_run" + } + url = f'https://www.ebi.ac.uk/ena/portal/api/returnFields?{urlencode(params)}' + return [ + row['columnId'] for row in csv.DictReader(fetch_url(url), delimiter='\t') + ] def fetch_sra_runinfo(file_in, file_out, ena_metadata_fields=ENA_METADATA_FIELDS): total_out = 0 @@ -190,6 +209,10 @@ def fetch_sra_runinfo(file_in, file_out, ena_metadata_fields=ENA_METADATA_FIELDS run_ids = set() header = [] make_dir(os.path.dirname(file_out)) + params = { + "result": "read_run", + "fields": ','.join(ena_metadata_fields) + } with open(file_in,"r") as fin, open(file_out,"w") as fout: for line in fin: db_id = line.strip() @@ -214,9 +237,9 @@ def fetch_sra_runinfo(file_in, file_out, ena_metadata_fields=ENA_METADATA_FIELDS ## Resolve/expand to get run identifier from ENA and write to file for id in ids: - url = 'https://www.ebi.ac.uk/ena/portal/api/filereport?accession={}&result=read_run&fields={}'.format(id,','.join(ena_metadata_fields)) - csv_dict = csv.DictReader(fetch_url(url), delimiter='\t') - for row in csv_dict: + params["accession"] = id + url = f'https://www.ebi.ac.uk/ena/portal/api/filereport?{urlencode(params)}' + for row in csv.DictReader(fetch_url(url), delimiter='\t'): run_id = row['run_accession'] if run_id not in run_ids: if total_out == 0: From fa38ddaacd1cc48c6c1d6616a0116885fcc6f0be Mon Sep 17 00:00:00 2001 From: "Moritz E. Beber" Date: Wed, 15 Sep 2021 16:07:31 +0200 Subject: [PATCH 049/852] fix: maintain header list in variable, not string --- bin/sra_ids_to_runinfo.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/bin/sra_ids_to_runinfo.py b/bin/sra_ids_to_runinfo.py index 87fe51f1..11fe5247 100755 --- a/bin/sra_ids_to_runinfo.py +++ b/bin/sra_ids_to_runinfo.py @@ -103,11 +103,11 @@ def body(self): def text(self, encoding=None): """Return the response's body as a decoded string.""" if encoding is not None: - return self._content.decode(encoding) + return self.body.decode(encoding) _, params = cgi.parse_header(self._response.getheader("Content-Type", "")) encoding = params.get("charset", "utf-8") - return self._content.decode(encoding) + return self.body.decode(encoding) def parse_args(args=None): @@ -243,8 +243,9 @@ def fetch_sra_runinfo(file_in, file_out, ena_metadata_fields=ENA_METADATA_FIELDS run_id = row['run_accession'] if run_id not in run_ids: if total_out == 0: - header = '\t'.join(row.keys()) - fout.write(f"{header}\n") + header = row.keys() + header_line = '\t'.join(header) + fout.write(f"{header_line}\n") else: if header != row.keys(): logger.error(f"Metadata columns do not match for id {run_id}!\nLine: '{line.strip()}'") From 1f7ae6a7cb17e681accf2940460483043ff3b69b Mon Sep 17 00:00:00 2001 From: "Moritz E. Beber" Date: Wed, 15 Sep 2021 16:13:53 +0200 Subject: [PATCH 050/852] style: remove space --- bin/sra_ids_to_runinfo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/sra_ids_to_runinfo.py b/bin/sra_ids_to_runinfo.py index 11fe5247..68b1c924 100755 --- a/bin/sra_ids_to_runinfo.py +++ b/bin/sra_ids_to_runinfo.py @@ -35,7 +35,7 @@ 'sample_title', 'experiment_title', 'study_title', 'description', 'sample_description', 'fastq_md5', 'fastq_bytes', 'fastq_ftp', 'fastq_galaxy', 'fastq_aspera' - ) +) class Response: From ce7ed6016ef67377651960b8fb212a80dcdca4ea Mon Sep 17 00:00:00 2001 From: "Moritz E. Beber" Date: Wed, 15 Sep 2021 18:04:27 +0200 Subject: [PATCH 051/852] style: remove last type annotation --- bin/sra_ids_to_runinfo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/sra_ids_to_runinfo.py b/bin/sra_ids_to_runinfo.py index 68b1c924..ae60f545 100755 --- a/bin/sra_ids_to_runinfo.py +++ b/bin/sra_ids_to_runinfo.py @@ -54,7 +54,7 @@ class Response: """ - def __init__(self, *, response, **kwargs) -> None: + def __init__(self, *, response, **kwargs): """ Initialize an HTTP response object. From 413517fb5a6a856a6d9e1b4a8a15ed672e2ba85e Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 15 Sep 2021 17:44:02 +0100 Subject: [PATCH 052/852] Bump pipeline version to 1.4dev --- CHANGELOG.md | 4 ++++ nextflow.config | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eae33fae..2d633f30 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unpublished Version / DEV] + +### Enhancements & fixes + ## [[1.3](https://github.com/nf-core/fetchngs/releases/tag/1.3)] - 2021-09-15 ### Enhancements & fixes diff --git a/nextflow.config b/nextflow.config index 52382140..131151b9 100644 --- a/nextflow.config +++ b/nextflow.config @@ -147,7 +147,7 @@ manifest { description = 'Pipeline to fetch metadata and raw FastQ files from public databases' mainScript = 'main.nf' nextflowVersion = '!>=21.04.0' - version = '1.3' + version = '1.4dev' } // Function to ensure that resource requirements don't go beyond From a8ed0ad40dfb138352f4f62b69d931cbb02b7814 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 28 Sep 2021 22:28:42 +0100 Subject: [PATCH 053/852] Add support for DDBJ ids --- CHANGELOG.md | 12 ++++++++++++ CITATIONS.md | 3 +++ README.md | 2 +- assets/schema_input.json | 2 +- bin/sra_ids_to_runinfo.py | 10 ++++++---- docs/output.md | 6 +++--- docs/usage.md | 22 +++++++++++----------- nextflow_schema.json | 2 +- 8 files changed, 38 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d633f30..e6dcc246 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Enhancements & fixes +* Added support for [DDBJ ids](https://www.ddbj.nig.ac.jp/index-e.html). See examples below: + +! `DDBJ` | +|---------------| +| PRJDB4176 | +| SAMD00114846 | +| DRA008156 | +| DRP004793 | +| DRR171822 | +| DRS090921 | +| DRX162434 | + ## [[1.3](https://github.com/nf-core/fetchngs/releases/tag/1.3)] - 2021-09-15 ### Enhancements & fixes diff --git a/CITATIONS.md b/CITATIONS.md index 00f85a25..4a1f2752 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -22,6 +22,9 @@ * [SRA](https://pubmed.ncbi.nlm.nih.gov/21062823/) > Leinonen R, Sugawara H, Shumway M, International Nucleotide Sequence Database Collaboration. The sequence read archive. Nucleic Acids Res. 2011 Jan;39 (Database issue):D19-21. doi: 10.1093/nar/gkq1019. Epub 2010 Nov 9. PubMed PMID: 21062823; PubMed Central PMCID: PMC3013647. +* [DDBJ](https://pubmed.ncbi.nlm.nih.gov/33156332/) + > Fukuda A, Kodama Y, Mashima J, Fujisawa T, Ogasawara O. DDBJ update: streamlining submission and access of human data. Nucleic Acids Res. 2021 Jan 8;49(D1):D71-D75. doi: 10.1093/nar/gkaa982. PubMed PMID: 33156332; PubMed Central PMCID: PMC7779041. + * [GEO](https://pubmed.ncbi.nlm.nih.gov/23193258/) > Barrett T, Wilhite SE, Ledoux P, Evangelista C, Kim IF, Tomashevsky M, Marshall KA, Phillippy KH, Sherman PM, Holko M, Yefanov A, Lee H, Zhang N, Robertson CL, Serova N, Davis S, Soboleva A. NCBI GEO: archive for functional genomics data sets--update. Nucleic Acids Res. 2013 Jan;41(Database issue):D991-5. doi: 10.1093/nar/gks1193. Epub 2012 Nov 27. PubMed PMID: 23193258; PubMed Central PMCID: PMC3531084. diff --git a/README.md b/README.md index 544862c0..e378eacc 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ ## Introduction -**nf-core/fetchngs** is a bioinformatics pipeline to fetch metadata and raw FastQ files from public databases. At present, the pipeline supports SRA / ENA / GEO ids (see [usage docs](https://nf-co.re/fetchngs/usage#introduction)). +**nf-core/fetchngs** is a bioinformatics pipeline to fetch metadata and raw FastQ files from public databases. At present, the pipeline supports SRA / ENA / DDBJ / GEO ids (see [usage docs](https://nf-co.re/fetchngs/usage#introduction)). The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. diff --git a/assets/schema_input.json b/assets/schema_input.json index b4141272..224e5cf7 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -9,7 +9,7 @@ "items": { "type": "string", "pattern": "^[SEPG][RAS][RXSMPAJXE][EN]?[AB]?\\d{4,9}$", - "errorMessage": "Please provide a valid SRA, GEO or ENA identifier" + "errorMessage": "Please provide a valid SRA, ENA, DDBJ or GEO identifier" } } } diff --git a/bin/sra_ids_to_runinfo.py b/bin/sra_ids_to_runinfo.py index ae60f545..6de6fc28 100755 --- a/bin/sra_ids_to_runinfo.py +++ b/bin/sra_ids_to_runinfo.py @@ -18,10 +18,12 @@ ## Example ids supported by this script SRA_IDS = ('PRJNA63463', 'SAMN00765663', 'SRA023522', 'SRP003255', 'SRR390278', 'SRS282569', 'SRX111814') -ENA_IDS = ('ERA2421642', 'ERP120836', 'ERR674736', 'ERS4399631', 'ERX629702', 'PRJEB7743', 'SAMEA3121481') +ENA_IDS = ('PRJEB7743', 'SAMEA3121481', 'ERA2421642', 'ERP120836', 'ERR674736', 'ERS4399631', 'ERX629702') +DDBJ_IDS = ('PRJDB4176', 'SAMD00114846', 'DRA008156', 'DRP004793', 'DRR171822', 'DRS090921', 'DRX162434') GEO_IDS = ('GSE18729', 'GSM465244') ID_REGEX = re.compile(r'[A-Z]+') -PREFIX_LIST = sorted({ID_REGEX.match(x).group() for x in SRA_IDS + ENA_IDS + GEO_IDS}) +PREFIX_LIST = sorted({ID_REGEX.match(x).group() for x in SRA_IDS + ENA_IDS + DDBJ_IDS + GEO_IDS}) + ## List of meta fields fetched from the ENA API - can be overriden by --ena_metadata_fields ## Full list of accepted fields can be obtained here: https://www.ebi.ac.uk/ena/portal/api/returnFields?dataPortal=ena&format=tsv&result=read_run @@ -111,7 +113,7 @@ def text(self, encoding=None): def parse_args(args=None): - Description = 'Download and create a run information metadata file from SRA/ENA/GEO identifiers.' + Description = 'Download and create a run information metadata file from SRA / ENA / DDBJ / GEO identifiers.' Epilog = 'Example usage: python fetch_sra_runinfo.py ' parser = argparse.ArgumentParser(description=Description, epilog=Epilog) @@ -228,7 +230,7 @@ def fetch_sra_runinfo(file_in, file_out, ena_metadata_fields=ENA_METADATA_FIELDS ids = gse_to_srx(db_id) ## Resolve/expand these ids against SRA URL - elif prefix in ['GSM', 'PRJNA', 'SAMN', 'SRR']: + elif prefix in ['GSM', 'PRJNA', 'SAMN', 'SRR', 'DRA', 'DRP', 'DRR', 'DRS', 'DRX', 'PRJDB', 'SAMD']: ids = id_to_srx(db_id) ## Resolve/expand these ids against ENA URL diff --git a/docs/output.md b/docs/output.md index c0916e6d..4ffc507e 100644 --- a/docs/output.md +++ b/docs/output.md @@ -8,7 +8,7 @@ This document describes the output produced by the pipeline. The directories lis The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using the following steps: -* [FastQ download](#fastq-download) - Download FastQ files via SRA / ENA / GEO ids +* [FastQ download](#fastq-download) - Download FastQ files via SRA / ENA / DDBJ / GEO ids * [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution ### FastQ download @@ -17,9 +17,9 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d Output files * `fastq/` - * `*.fastq.gz`: Paired-end/single-end reads downloaded from the ENA / SRA. + * `*.fastq.gz`: Paired-end/single-end reads downloaded from the SRA / ENA / DDBJ / GEO. * `fastq/md5/` - * `*.md5`: Files containing `md5` sum for FastQ files downloaded from the ENA / SRA. + * `*.md5`: Files containing `md5` sum for FastQ files downloaded from the ENA. * `samplesheet/` * `samplesheet.csv`: Auto-created samplesheet with collated metadata and paths to downloaded FastQ files. * `id_mappings.csv`: File with selected fields that can be used to rename samples to more informative names; see [`--sample_mapping_fields`](https://nf-co.re/fetchngs/parameters#sample_mapping_fields) parameter to customise this behaviour. diff --git a/docs/usage.md b/docs/usage.md index 398c739a..1e6066db 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -8,17 +8,17 @@ The pipeline has been set-up to automatically download and process the raw FastQ files from public repositories. Identifiers can be provided in a file, one-per-line via the `--input` parameter. Currently, the following types of example identifiers are supported: -| `SRA` | `ENA` | `GEO` | -|--------------|--------------|------------| -| SRR11605097 | ERR4007730 | GSM4432381 | -| SRX8171613 | ERX4009132 | GSE147507 | -| SRS6531847 | ERS4399630 | | -| SAMN14689442 | SAMEA6638373 | | -| SRP256957 | ERP120836 | | -| SRA1068758 | ERA2420837 | | -| PRJNA625551 | PRJEB37513 | | - -If `SRR`/`ERR` run ids are provided then these will be resolved back to their appropriate `SRX`/`ERX` ids to be able to merge multiple runs from the same experiment. This is conceptually the same as merging multiple libraries sequenced from the same sample. +| `SRA` | `ENA` | `DDBJ` | `GEO` | +|--------------|--------------|--------------|------------| +| SRR11605097 | ERR4007730 | DRR171822 | GSM4432381 | +| SRX8171613 | ERX4009132 | DRX162434 | GSE147507 | +| SRS6531847 | ERS4399630 | DRS090921 | | +| SAMN14689442 | SAMEA6638373 | SAMD00114846 | | +| SRP256957 | ERP120836 | DRP004793 | | +| SRA1068758 | ERA2420837 | DRA008156 | | +| PRJNA625551 | PRJEB37513 | PRJDB4176 | | + +If `SRR`/`ERR`/`DRR` run ids are provided then these will be resolved back to their appropriate `SRX`/`ERX`/`DRX` ids to be able to merge multiple runs from the same experiment. This is conceptually the same as merging multiple libraries sequenced from the same sample. The final sample information for all identifiers is obtained from the ENA which provides direct download links for FastQ files as well as their associated md5 sums. If download links exist, the files will be downloaded in parallel by FTP otherwise they will NOT be downloaded. This is intentional because tools such as `parallel-fastq-dump`, `fasterq-dump`, `prefetch` etc require pre-existing configuration files in the users home directory which makes automation tricky across different platforms and containerisation. We may add this functionality in later releases. diff --git a/nextflow_schema.json b/nextflow_schema.json index a391f35d..03612ed2 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -21,7 +21,7 @@ "pattern": "^\\S+\\.txt$", "schema": "assets/schema_input.json", "fa_icon": "fas fa-file-excel", - "description": "File containing SRA/ENA/GEO identifiers one per line to download their associated metadata and FastQ files." + "description": "File containing SRA/ENA/DDBJ/GEO identifiers one per line to download their associated metadata and FastQ files." }, "ena_metadata_fields": { "type": "string", From 284f3be60be5bad8df9d1b989e05e84409562249 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 28 Sep 2021 22:35:34 +0100 Subject: [PATCH 054/852] Fix funny pipe --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e6dcc246..94968c8c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * Added support for [DDBJ ids](https://www.ddbj.nig.ac.jp/index-e.html). See examples below: -! `DDBJ` | +| `DDBJ` | |---------------| | PRJDB4176 | | SAMD00114846 | From 7cb6af67567d971ca6b25eb082b10ab43e6f9c49 Mon Sep 17 00:00:00 2001 From: "Moritz E. Beber" Date: Mon, 27 Sep 2021 21:53:26 +0200 Subject: [PATCH 055/852] refactor: simplify decoding method --- bin/sra_ids_to_runinfo.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/bin/sra_ids_to_runinfo.py b/bin/sra_ids_to_runinfo.py index 6de6fc28..714a0196 100755 --- a/bin/sra_ids_to_runinfo.py +++ b/bin/sra_ids_to_runinfo.py @@ -104,11 +104,9 @@ def body(self): def text(self, encoding=None): """Return the response's body as a decoded string.""" - if encoding is not None: - return self.body.decode(encoding) - - _, params = cgi.parse_header(self._response.getheader("Content-Type", "")) - encoding = params.get("charset", "utf-8") + if encoding is None: + _, params = cgi.parse_header(self._response.getheader("Content-Type", "")) + encoding = params.get("charset", "utf-8") return self.body.decode(encoding) From d56a9ee76261edf692d71e21d59ac56a9c2e9216 Mon Sep 17 00:00:00 2001 From: "Moritz E. Beber" Date: Mon, 27 Sep 2021 21:59:34 +0200 Subject: [PATCH 056/852] refactor: simplify makedirs --- bin/sra_ids_to_runinfo.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/bin/sra_ids_to_runinfo.py b/bin/sra_ids_to_runinfo.py index 714a0196..75b944ac 100755 --- a/bin/sra_ids_to_runinfo.py +++ b/bin/sra_ids_to_runinfo.py @@ -134,11 +134,7 @@ def validate_csv_param(param, valid_vals, param_desc): def make_dir(path): if not len(path) == 0: - try: - os.makedirs(path) - except OSError as exception: - if exception.errno != errno.EEXIST: - raise + os.makedirs(path, exist_ok=True) def fetch_url(url): try: From 608908d50af70859cb8a84b6787f35eaf7859c72 Mon Sep 17 00:00:00 2001 From: "Moritz E. Beber" Date: Sat, 2 Oct 2021 15:19:38 +0200 Subject: [PATCH 057/852] refactor: check valid prefix in set --- bin/sra_ids_to_runinfo.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/bin/sra_ids_to_runinfo.py b/bin/sra_ids_to_runinfo.py index 75b944ac..c46abaf9 100755 --- a/bin/sra_ids_to_runinfo.py +++ b/bin/sra_ids_to_runinfo.py @@ -22,7 +22,8 @@ DDBJ_IDS = ('PRJDB4176', 'SAMD00114846', 'DRA008156', 'DRP004793', 'DRR171822', 'DRS090921', 'DRX162434') GEO_IDS = ('GSE18729', 'GSM465244') ID_REGEX = re.compile(r'[A-Z]+') -PREFIX_LIST = sorted({ID_REGEX.match(x).group() for x in SRA_IDS + ENA_IDS + DDBJ_IDS + GEO_IDS}) +PREFIX_LIST = sorted({ID_REGEX.match(id).group() for id in SRA_IDS + ENA_IDS + DDBJ_IDS + GEO_IDS}) +VALID_PREFIX = frozenset(PREFIX_LIST) ## List of meta fields fetched from the ENA API - can be overriden by --ena_metadata_fields @@ -215,7 +216,7 @@ def fetch_sra_runinfo(file_in, file_out, ena_metadata_fields=ENA_METADATA_FIELDS match = ID_REGEX.match(db_id) if match: prefix = match.group() - if prefix in PREFIX_LIST: + if prefix in VALID_PREFIX: if db_id not in seen_ids: ids = [db_id] From 93a2dbcc8ff9e2b940a00cb99e485fcb327410d9 Mon Sep 17 00:00:00 2001 From: "Moritz E. Beber" Date: Sat, 2 Oct 2021 22:10:04 +0200 Subject: [PATCH 058/852] refactor: handle missing content Refactor **all** the code :/ --- bin/sra_ids_to_runinfo.py | 297 +++++++++++++++++++++++++------------- 1 file changed, 195 insertions(+), 102 deletions(-) diff --git a/bin/sra_ids_to_runinfo.py b/bin/sra_ids_to_runinfo.py index c46abaf9..eb4f2ac6 100755 --- a/bin/sra_ids_to_runinfo.py +++ b/bin/sra_ids_to_runinfo.py @@ -3,7 +3,6 @@ import argparse import cgi import csv -import errno import gzip import logging import os @@ -21,9 +20,8 @@ ENA_IDS = ('PRJEB7743', 'SAMEA3121481', 'ERA2421642', 'ERP120836', 'ERR674736', 'ERS4399631', 'ERX629702') DDBJ_IDS = ('PRJDB4176', 'SAMD00114846', 'DRA008156', 'DRP004793', 'DRR171822', 'DRS090921', 'DRX162434') GEO_IDS = ('GSE18729', 'GSM465244') -ID_REGEX = re.compile(r'[A-Z]+') -PREFIX_LIST = sorted({ID_REGEX.match(id).group() for id in SRA_IDS + ENA_IDS + DDBJ_IDS + GEO_IDS}) -VALID_PREFIX = frozenset(PREFIX_LIST) +ID_REGEX = re.compile(r'^([A-Z]+)([0-9]+)$') +PREFIX_LIST = sorted({ID_REGEX.match(id).group(1) for id in SRA_IDS + ENA_IDS + DDBJ_IDS + GEO_IDS}) ## List of meta fields fetched from the ENA API - can be overriden by --ena_metadata_fields @@ -111,6 +109,178 @@ def text(self, encoding=None): return self.body.decode(encoding) +class DatabaseIdentifierChecker: + """Define a service class for validating database identifiers.""" + + _VALID_PREFIX = frozenset(PREFIX_LIST) + + @classmethod + def is_valid(cls, identifier): + """ + Check the validity of the given database identifier. + + Args: + identifier (str): A short identifier presumably belonging to one of the + supported databases. + + Returns: + bool: Whether or not the identifier is valid. + + """ + match = ID_REGEX.match(identifier) + if match is None: + return False + return match.group(1) in cls._VALID_PREFIX + + +class DatabaseResolver: + """Define a service class for resolving various identifiers to experiments.""" + + _GEO_PREFIXES = {'GSE'} + _SRA_PREFIXES = {'GSM', 'PRJNA', 'SAMN', 'SRR', 'DRA', 'DRP', 'DRR', 'DRS', 'DRX', 'PRJDB', 'SAMD'} + _ENA_PREFIXES = {'ERR'} + + @classmethod + def expand_identifier(cls, identifier): + """ + Expand the given identifier to potentially multiple experiment identifiers. + + Args: + identifier (str): A short identifier presumably belonging to one of the + supported databases. + + Returns: + list: A list of one or more SRA/ENA experiment identifiers. + + """ + prefix = ID_REGEX.match(identifier).group(1) + if prefix in cls._GEO_PREFIXES: + return cls._gse_to_srx(identifier) + elif prefix in cls._SRA_PREFIXES: + return cls._id_to_srx(identifier) + elif prefix in cls._ENA_PREFIXES: + return cls._id_to_erx(identifier) + else: + return [identifier] + + @classmethod + def _content_check(cls, response, identifier): + """Check that the response has content or terminate.""" + if response.status == 204: + logger.error(f"There is no content for id {identifier}. Maybe you lack the right permissions?") + sys.exit(1) + + @classmethod + def _id_to_srx(cls, identifier): + """Resolve the identifier to SRA experiments.""" + params = { + "save": "efetch", + "db": "sra", + "rettype": "runinfo", + "term": identifier + } + response = fetch_url( + f'https://trace.ncbi.nlm.nih.gov/Traces/sra/sra.cgi?{urlencode(params)}' + ) + cls._content_check(response, identifier) + return [ + row['Experiment'] for row in open_table(response, delimiter=',') + ] + + @classmethod + def _gse_to_srx(cls, identifier): + """Resolve the identifier to SRA experiments.""" + ids = [] + params = { + "acc": identifier, + "targ": "gsm", + "view": "data", + "form": "text" + } + response = fetch_url(f'https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?{urlencode(params)}') + cls._content_check(response, identifier) + gsm_ids = [line.split('=')[1].strip() for line in response.text().splitlines() if line.startswith('GSM')] + for gsm_id in gsm_ids: + ids += cls._id_to_srx(gsm_id) + return ids + + @classmethod + def _id_to_erx(cls, identifier): + """Resolve the identifier to ENA experiments.""" + fields = ['run_accession', 'experiment_accession'] + params = { + "accession": identifier, + "result": "read_run", + "fields": ",".join(fields) + } + response = fetch_url(f'https://www.ebi.ac.uk/ena/portal/api/filereport?{urlencode(params)}') + cls._content_check(response, identifier) + return [ + row['experiment_accession'] for row in open_table(response, delimiter='\t') + ] + + +class ENAMetadataFetcher: + """Define a service class for fetching metadata from ENA.""" + + def __init__(self, ena_metadata_fields, **kwargs): + """ + Initialize the service with the desired metadata fields. + + Args: + ena_metadata_fields (iterable): An iterable of the desired fields. + **kwargs: Passed to parent constructor. + """ + super().__init__(**kwargs) + self._params = { + "result": "read_run", + "fields": ','.join(ena_metadata_fields) + } + + def open_experiment_table(self, accession): + """ + Open the metadata table belonging to the given experiment accession. + + Args: + accession (str): An ENA experiment accession. + + Returns: + csv.DictReader: A CSV reader instance of the metadata. + + """ + params = { + **self._params, + "accession": accession + } + response = fetch_url( + f'https://www.ebi.ac.uk/ena/portal/api/filereport?{urlencode(params)}' + ) + self._content_check(response, accession) + return open_table(response, delimiter='\t') + + @classmethod + def _content_check(cls, response, identifier): + """Check that the response has content or terminate.""" + if response.status == 204: + logger.error(f"There is no content for id {identifier}. Maybe you lack the right permissions?") + sys.exit(1) + + +def open_table(response, delimiter=","): + """ + Return a CSV reader instance from the given response. + + Args: + response (Response): An instance of the local HTTP response class. + delimiter (str): The delimiter separating the table fields. + + Returns: + csv.DictReader: A CSV reader instance of the response body. + + """ + return csv.DictReader(response.text().splitlines(), delimiter=delimiter) + + def parse_args(args=None): Description = 'Download and create a run information metadata file from SRA / ENA / DDBJ / GEO identifiers.' Epilog = 'Example usage: python fetch_sra_runinfo.py ' @@ -138,9 +308,10 @@ def make_dir(path): os.makedirs(path, exist_ok=True) def fetch_url(url): + """Return a response object for the given URL and handle errors appropriately.""" try: with urlopen(url) as response: - result = Response(response=response).text().splitlines() + return Response(response=response) except HTTPError as e: logger.error("The server couldn't fulfill the request.") logger.error(f"Status: {e.code} {e.reason}") @@ -149,45 +320,6 @@ def fetch_url(url): logger.error('We failed to reach a server.') logger.error(f"Reason: {e.reason}") sys.exit(1) - return result - -def id_to_srx(db_id): - params = { - "save": "efetch", - "db": "sra", - "rettype": "runinfo", - "term": db_id - } - url = f'https://trace.ncbi.nlm.nih.gov/Traces/sra/sra.cgi?{urlencode(params)}' - return [ - row['Experiment'] for row in csv.DictReader(fetch_url(url), delimiter=',') - ] - -def id_to_erx(db_id): - fields = ['run_accession', 'experiment_accession'] - params = { - "accession": db_id, - "result": "read_run", - "fields": ",".join(fields) - } - url = f'https://www.ebi.ac.uk/ena/portal/api/filereport?{urlencode(params)}' - return [ - row['experiment_accession'] for row in csv.DictReader(fetch_url(url), delimiter='\t') - ] - -def gse_to_srx(db_id): - ids = [] - params = { - "acc": db_id, - "targ": "gsm", - "view": "data", - "form": "text" - } - url = f'https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?{urlencode(params)}' - gsm_ids = [x.split('=')[1].strip() for x in fetch_url(url) if x.startswith('GSM')] - for gsm_id in gsm_ids: - ids += id_to_srx(gsm_id) - return ids def get_ena_fields(): params = { @@ -195,77 +327,38 @@ def get_ena_fields(): "format": "tsv", "result": "read_run" } - url = f'https://www.ebi.ac.uk/ena/portal/api/returnFields?{urlencode(params)}' return [ - row['columnId'] for row in csv.DictReader(fetch_url(url), delimiter='\t') + row['columnId'] for row in open_table(fetch_url(f'https://www.ebi.ac.uk/ena/portal/api/returnFields?{urlencode(params)}'), delimiter='\t') ] + def fetch_sra_runinfo(file_in, file_out, ena_metadata_fields=ENA_METADATA_FIELDS): - total_out = 0 seen_ids = set() run_ids = set() - header = [] make_dir(os.path.dirname(file_out)) - params = { - "result": "read_run", - "fields": ','.join(ena_metadata_fields) - } + ena_fetcher = ENAMetadataFetcher(ena_metadata_fields) with open(file_in,"r") as fin, open(file_out,"w") as fout: + writer = csv.DictWriter(fout, fieldnames=ena_metadata_fields, delimiter='\t') + writer.writeheader() for line in fin: db_id = line.strip() - match = ID_REGEX.match(db_id) - if match: - prefix = match.group() - if prefix in VALID_PREFIX: - if db_id not in seen_ids: - - ids = [db_id] - ## Resolve/expand these ids against GEO URL - if prefix in ['GSE']: - ids = gse_to_srx(db_id) - - ## Resolve/expand these ids against SRA URL - elif prefix in ['GSM', 'PRJNA', 'SAMN', 'SRR', 'DRA', 'DRP', 'DRR', 'DRS', 'DRX', 'PRJDB', 'SAMD']: - ids = id_to_srx(db_id) - - ## Resolve/expand these ids against ENA URL - elif prefix in ['ERR']: - ids = id_to_erx(db_id) - - ## Resolve/expand to get run identifier from ENA and write to file - for id in ids: - params["accession"] = id - url = f'https://www.ebi.ac.uk/ena/portal/api/filereport?{urlencode(params)}' - for row in csv.DictReader(fetch_url(url), delimiter='\t'): - run_id = row['run_accession'] - if run_id not in run_ids: - if total_out == 0: - header = row.keys() - header_line = '\t'.join(header) - fout.write(f"{header_line}\n") - else: - if header != row.keys(): - logger.error(f"Metadata columns do not match for id {run_id}!\nLine: '{line.strip()}'") - sys.exit(1) - - ordered_row = '\t'.join([row[x] for x in header]) - fout.write(f'{ordered_row}\n') - total_out += 1 - run_ids.add(run_id) - seen_ids.add(db_id) - - if not ids: - logger.error(f"No matches found for database id {db_id}!\nLine: '{line.strip()}'") - sys.exit(1) - - else: - id_str = ', '.join([x + "*" for x in PREFIX_LIST]) - logger.error(f"Please provide a valid database id starting with {id_str}!\nLine: '{line.strip()}'") - sys.exit(1) - else: + if db_id in seen_ids: + continue + seen_ids.add(db_id) + if not DatabaseIdentifierChecker.is_valid(db_id): id_str = ', '.join([x + "*" for x in PREFIX_LIST]) logger.error(f"Please provide a valid database id starting with {id_str}!\nLine: '{line.strip()}'") sys.exit(1) + ids = DatabaseResolver.expand_identifier(db_id) + if not ids: + logger.error(f"No matches found for database id {db_id}!\nLine: '{line.strip()}'") + sys.exit(1) + for accession in ids: + for row in ena_fetcher.open_experiment_table(accession): + run_accession = row['run_accession'] + if run_accession not in run_ids: + writer.writerow(row) + run_ids.add(run_accession) def main(args=None): args = parse_args(args) From dba08dcb3fee792a79ed049a939df4d08a7268d6 Mon Sep 17 00:00:00 2001 From: "Moritz E. Beber" Date: Sat, 2 Oct 2021 22:18:48 +0200 Subject: [PATCH 059/852] style: apply black --- bin/sra_ids_to_runinfo.py | 259 ++++++++++++++++++++++++++------------ 1 file changed, 180 insertions(+), 79 deletions(-) diff --git a/bin/sra_ids_to_runinfo.py b/bin/sra_ids_to_runinfo.py index eb4f2ac6..5b1b1866 100755 --- a/bin/sra_ids_to_runinfo.py +++ b/bin/sra_ids_to_runinfo.py @@ -1,5 +1,6 @@ #!/usr/bin/env python + import argparse import cgi import csv @@ -9,33 +10,88 @@ import re import sys import zlib -from urllib.error import URLError, HTTPError +from urllib.error import HTTPError, URLError from urllib.parse import urlencode from urllib.request import urlopen + logger = logging.getLogger() -## Example ids supported by this script -SRA_IDS = ('PRJNA63463', 'SAMN00765663', 'SRA023522', 'SRP003255', 'SRR390278', 'SRS282569', 'SRX111814') -ENA_IDS = ('PRJEB7743', 'SAMEA3121481', 'ERA2421642', 'ERP120836', 'ERR674736', 'ERS4399631', 'ERX629702') -DDBJ_IDS = ('PRJDB4176', 'SAMD00114846', 'DRA008156', 'DRP004793', 'DRR171822', 'DRS090921', 'DRX162434') -GEO_IDS = ('GSE18729', 'GSM465244') -ID_REGEX = re.compile(r'^([A-Z]+)([0-9]+)$') -PREFIX_LIST = sorted({ID_REGEX.match(id).group(1) for id in SRA_IDS + ENA_IDS + DDBJ_IDS + GEO_IDS}) + +# Example ids supported by this script +SRA_IDS = ( + "PRJNA63463", + "SAMN00765663", + "SRA023522", + "SRP003255", + "SRR390278", + "SRS282569", + "SRX111814", +) +ENA_IDS = ( + "PRJEB7743", + "SAMEA3121481", + "ERA2421642", + "ERP120836", + "ERR674736", + "ERS4399631", + "ERX629702", +) +DDBJ_IDS = ( + "PRJDB4176", + "SAMD00114846", + "DRA008156", + "DRP004793", + "DRR171822", + "DRS090921", + "DRX162434", +) +GEO_IDS = ("GSE18729", "GSM465244") +ID_REGEX = re.compile(r"^([A-Z]+)([0-9]+)$") +PREFIX_LIST = sorted( + {ID_REGEX.match(id).group(1) for id in SRA_IDS + ENA_IDS + DDBJ_IDS + GEO_IDS} +) -## List of meta fields fetched from the ENA API - can be overriden by --ena_metadata_fields -## Full list of accepted fields can be obtained here: https://www.ebi.ac.uk/ena/portal/api/returnFields?dataPortal=ena&format=tsv&result=read_run +# List of metadata fields fetched from the ENA API - can be overriden by options +# `-ef` or `--ena_metadata_fields`. +# Full list of accepted fields can be obtained here: +# https://www.ebi.ac.uk/ena/portal/api/returnFields?dataPortal=ena&format=tsv&result=read_run ENA_METADATA_FIELDS = ( - 'accession', 'run_accession', 'experiment_accession', 'sample_accession', 'secondary_sample_accession', 'study_accession', 'secondary_study_accession', 'parent_study', 'submission_accession', - 'run_alias', 'experiment_alias', 'sample_alias', 'study_alias', - 'library_layout', 'library_selection', 'library_source', 'library_strategy', 'library_name', - 'instrument_model', 'instrument_platform', - 'base_count', 'read_count', - 'tax_id', 'scientific_name', - 'sample_title', 'experiment_title', 'study_title', - 'description', 'sample_description', - 'fastq_md5', 'fastq_bytes', 'fastq_ftp', 'fastq_galaxy', 'fastq_aspera' + "accession", + "run_accession", + "experiment_accession", + "sample_accession", + "secondary_sample_accession", + "study_accession", + "secondary_study_accession", + "parent_study", + "submission_accession", + "run_alias", + "experiment_alias", + "sample_alias", + "study_alias", + "library_layout", + "library_selection", + "library_source", + "library_strategy", + "library_name", + "instrument_model", + "instrument_platform", + "base_count", + "read_count", + "tax_id", + "scientific_name", + "sample_title", + "experiment_title", + "study_title", + "description", + "sample_description", + "fastq_md5", + "fastq_bytes", + "fastq_ftp", + "fastq_galaxy", + "fastq_aspera", ) @@ -112,7 +168,7 @@ def text(self, encoding=None): class DatabaseIdentifierChecker: """Define a service class for validating database identifiers.""" - _VALID_PREFIX = frozenset(PREFIX_LIST) + _VALID_PREFIXES = frozenset(PREFIX_LIST) @classmethod def is_valid(cls, identifier): @@ -130,15 +186,27 @@ def is_valid(cls, identifier): match = ID_REGEX.match(identifier) if match is None: return False - return match.group(1) in cls._VALID_PREFIX + return match.group(1) in cls._VALID_PREFIXES class DatabaseResolver: """Define a service class for resolving various identifiers to experiments.""" - _GEO_PREFIXES = {'GSE'} - _SRA_PREFIXES = {'GSM', 'PRJNA', 'SAMN', 'SRR', 'DRA', 'DRP', 'DRR', 'DRS', 'DRX', 'PRJDB', 'SAMD'} - _ENA_PREFIXES = {'ERR'} + _GEO_PREFIXES = {"GSE"} + _SRA_PREFIXES = { + "GSM", + "PRJNA", + "SAMN", + "SRR", + "DRA", + "DRP", + "DRR", + "DRS", + "DRX", + "PRJDB", + "SAMD", + } + _ENA_PREFIXES = {"ERR"} @classmethod def expand_identifier(cls, identifier): @@ -167,7 +235,10 @@ def expand_identifier(cls, identifier): def _content_check(cls, response, identifier): """Check that the response has content or terminate.""" if response.status == 204: - logger.error(f"There is no content for id {identifier}. Maybe you lack the right permissions?") + logger.error( + f"There is no content for id {identifier}. Maybe you lack the right " + f"permissions?" + ) sys.exit(1) @classmethod @@ -177,29 +248,28 @@ def _id_to_srx(cls, identifier): "save": "efetch", "db": "sra", "rettype": "runinfo", - "term": identifier + "term": identifier, } response = fetch_url( - f'https://trace.ncbi.nlm.nih.gov/Traces/sra/sra.cgi?{urlencode(params)}' + f"https://trace.ncbi.nlm.nih.gov/Traces/sra/sra.cgi?{urlencode(params)}" ) cls._content_check(response, identifier) - return [ - row['Experiment'] for row in open_table(response, delimiter=',') - ] + return [row["Experiment"] for row in open_table(response, delimiter=",")] @classmethod def _gse_to_srx(cls, identifier): """Resolve the identifier to SRA experiments.""" ids = [] - params = { - "acc": identifier, - "targ": "gsm", - "view": "data", - "form": "text" - } - response = fetch_url(f'https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?{urlencode(params)}') + params = {"acc": identifier, "targ": "gsm", "view": "data", "form": "text"} + response = fetch_url( + f"https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?{urlencode(params)}" + ) cls._content_check(response, identifier) - gsm_ids = [line.split('=')[1].strip() for line in response.text().splitlines() if line.startswith('GSM')] + gsm_ids = [ + line.split("=")[1].strip() + for line in response.text().splitlines() + if line.startswith("GSM") + ] for gsm_id in gsm_ids: ids += cls._id_to_srx(gsm_id) return ids @@ -207,16 +277,18 @@ def _gse_to_srx(cls, identifier): @classmethod def _id_to_erx(cls, identifier): """Resolve the identifier to ENA experiments.""" - fields = ['run_accession', 'experiment_accession'] + fields = ["run_accession", "experiment_accession"] params = { "accession": identifier, "result": "read_run", - "fields": ",".join(fields) + "fields": ",".join(fields), } - response = fetch_url(f'https://www.ebi.ac.uk/ena/portal/api/filereport?{urlencode(params)}') + response = fetch_url( + f"https://www.ebi.ac.uk/ena/portal/api/filereport?{urlencode(params)}" + ) cls._content_check(response, identifier) return [ - row['experiment_accession'] for row in open_table(response, delimiter='\t') + row["experiment_accession"] for row in open_table(response, delimiter="\t") ] @@ -232,10 +304,7 @@ def __init__(self, ena_metadata_fields, **kwargs): **kwargs: Passed to parent constructor. """ super().__init__(**kwargs) - self._params = { - "result": "read_run", - "fields": ','.join(ena_metadata_fields) - } + self._params = {"result": "read_run", "fields": ",".join(ena_metadata_fields)} def open_experiment_table(self, accession): """ @@ -248,21 +317,21 @@ def open_experiment_table(self, accession): csv.DictReader: A CSV reader instance of the metadata. """ - params = { - **self._params, - "accession": accession - } + params = {**self._params, "accession": accession} response = fetch_url( - f'https://www.ebi.ac.uk/ena/portal/api/filereport?{urlencode(params)}' + f"https://www.ebi.ac.uk/ena/portal/api/filereport?{urlencode(params)}" ) self._content_check(response, accession) - return open_table(response, delimiter='\t') + return open_table(response, delimiter="\t") @classmethod def _content_check(cls, response, identifier): """Check that the response has content or terminate.""" if response.status == 204: - logger.error(f"There is no content for id {identifier}. Maybe you lack the right permissions?") + logger.error( + f"There is no content for id {identifier}. Maybe you lack the right " + f"permissions?" + ) sys.exit(1) @@ -282,31 +351,49 @@ def open_table(response, delimiter=","): def parse_args(args=None): - Description = 'Download and create a run information metadata file from SRA / ENA / DDBJ / GEO identifiers.' - Epilog = 'Example usage: python fetch_sra_runinfo.py ' - - parser = argparse.ArgumentParser(description=Description, epilog=Epilog) - parser.add_argument('FILE_IN', help="File containing database identifiers, one per line.") - parser.add_argument('FILE_OUT', help="Output file in tab-delimited format.") - parser.add_argument('-ef', '--ena_metadata_fields', type=str, dest="ENA_METADATA_FIELDS", default='', help=f"Comma-separated list of ENA metadata fields to fetch. (default: {','.join(ENA_METADATA_FIELDS)}).") + parser = argparse.ArgumentParser( + description="Download and create a run information metadata file from SRA / " + "ENA / DDBJ / GEO identifiers.", + epilog="Example usage: python fetch_sra_runinfo.py ", + ) + parser.add_argument( + "FILE_IN", help="File containing database identifiers, one per line." + ) + parser.add_argument("FILE_OUT", help="Output file in tab-delimited format.") + parser.add_argument( + "-ef", + "--ena_metadata_fields", + type=str, + dest="ENA_METADATA_FIELDS", + default="", + help=f"Comma-separated list of ENA metadata fields to fetch. " + f"(default: {','.join(ENA_METADATA_FIELDS)}).", + ) return parser.parse_args(args) + def validate_csv_param(param, valid_vals, param_desc): valid_list = [] if param: - user_vals = param.split(',') + user_vals = param.split(",") intersect = [i for i in user_vals if i in valid_vals] if len(intersect) == len(user_vals): valid_list = intersect else: - logger.error(f"Please provide a valid value for {param_desc}!\nProvided values = {param}\nAccepted values = {','.join(valid_vals)}") + logger.error( + f"Please provide a valid value for {param_desc}!\n" + f"Provided values = {param}\n" + f"Accepted values = {','.join(valid_vals)}" + ) sys.exit(1) return valid_list + def make_dir(path): if not len(path) == 0: os.makedirs(path, exist_ok=True) + def fetch_url(url): """Return a response object for the given URL and handle errors appropriately.""" try: @@ -317,18 +404,21 @@ def fetch_url(url): logger.error(f"Status: {e.code} {e.reason}") sys.exit(1) except URLError as e: - logger.error('We failed to reach a server.') + logger.error("We failed to reach a server.") logger.error(f"Reason: {e.reason}") sys.exit(1) + def get_ena_fields(): - params = { - "dataPortal": "ena", - "format": "tsv", - "result": "read_run" - } + params = {"dataPortal": "ena", "format": "tsv", "result": "read_run"} return [ - row['columnId'] for row in open_table(fetch_url(f'https://www.ebi.ac.uk/ena/portal/api/returnFields?{urlencode(params)}'), delimiter='\t') + row["columnId"] + for row in open_table( + fetch_url( + f"https://www.ebi.ac.uk/ena/portal/api/returnFields?{urlencode(params)}" + ), + delimiter="\t", + ) ] @@ -337,8 +427,8 @@ def fetch_sra_runinfo(file_in, file_out, ena_metadata_fields=ENA_METADATA_FIELDS run_ids = set() make_dir(os.path.dirname(file_out)) ena_fetcher = ENAMetadataFetcher(ena_metadata_fields) - with open(file_in,"r") as fin, open(file_out,"w") as fout: - writer = csv.DictWriter(fout, fieldnames=ena_metadata_fields, delimiter='\t') + with open(file_in, "r") as fin, open(file_out, "w") as fout: + writer = csv.DictWriter(fout, fieldnames=ena_metadata_fields, delimiter="\t") writer.writeheader() for line in fin: db_id = line.strip() @@ -346,28 +436,39 @@ def fetch_sra_runinfo(file_in, file_out, ena_metadata_fields=ENA_METADATA_FIELDS continue seen_ids.add(db_id) if not DatabaseIdentifierChecker.is_valid(db_id): - id_str = ', '.join([x + "*" for x in PREFIX_LIST]) - logger.error(f"Please provide a valid database id starting with {id_str}!\nLine: '{line.strip()}'") + id_str = ", ".join([x + "*" for x in PREFIX_LIST]) + logger.error( + f"Please provide a valid database id starting with {id_str}!\n" + f"Line: '{line.strip()}'" + ) sys.exit(1) ids = DatabaseResolver.expand_identifier(db_id) if not ids: - logger.error(f"No matches found for database id {db_id}!\nLine: '{line.strip()}'") + logger.error( + f"No matches found for database id {db_id}!\nLine: '{line.strip()}'" + ) sys.exit(1) for accession in ids: for row in ena_fetcher.open_experiment_table(accession): - run_accession = row['run_accession'] + run_accession = row["run_accession"] if run_accession not in run_ids: writer.writerow(row) run_ids.add(run_accession) + def main(args=None): args = parse_args(args) ena_metadata_fields = args.ENA_METADATA_FIELDS if not args.ENA_METADATA_FIELDS: - ena_metadata_fields = ','.join(ENA_METADATA_FIELDS) - ena_metadata_fields = validate_csv_param(ena_metadata_fields, valid_vals=get_ena_fields(), param_desc='--ena_metadata_fields') + ena_metadata_fields = ",".join(ENA_METADATA_FIELDS) + ena_metadata_fields = validate_csv_param( + ena_metadata_fields, + valid_vals=get_ena_fields(), + param_desc="--ena_metadata_fields", + ) fetch_sra_runinfo(args.FILE_IN, args.FILE_OUT, ena_metadata_fields) -if __name__ == '__main__': - logging.basicConfig(level='INFO', format='[%(levelname)s] %(message)s') + +if __name__ == "__main__": + logging.basicConfig(level="INFO", format="[%(levelname)s] %(message)s") sys.exit(main()) From f3b87a78b6a1e5bcb791f0a4a90d840bef7809dc Mon Sep 17 00:00:00 2001 From: "Moritz E. Beber" Date: Sat, 2 Oct 2021 22:42:36 +0200 Subject: [PATCH 060/852] refactor: improve arguments parsing --- bin/sra_ids_to_runinfo.py | 71 +++++++++++++++++++++++---------------- 1 file changed, 42 insertions(+), 29 deletions(-) diff --git a/bin/sra_ids_to_runinfo.py b/bin/sra_ids_to_runinfo.py index 5b1b1866..d42081c5 100755 --- a/bin/sra_ids_to_runinfo.py +++ b/bin/sra_ids_to_runinfo.py @@ -10,6 +10,7 @@ import re import sys import zlib +from pathlib import Path from urllib.error import HTTPError, URLError from urllib.parse import urlencode from urllib.request import urlopen @@ -357,36 +358,48 @@ def parse_args(args=None): epilog="Example usage: python fetch_sra_runinfo.py ", ) parser.add_argument( - "FILE_IN", help="File containing database identifiers, one per line." + "file_in", + metavar="FILE_IN", + type=Path, + help="File containing database identifiers, one per line.", + ) + parser.add_argument( + "file_out", + metavar="FILE_OUT", + type=Path, + help="Output file in tab-delimited format.", ) - parser.add_argument("FILE_OUT", help="Output file in tab-delimited format.") parser.add_argument( "-ef", "--ena_metadata_fields", type=str, - dest="ENA_METADATA_FIELDS", - default="", - help=f"Comma-separated list of ENA metadata fields to fetch. " + default=",".join(ENA_METADATA_FIELDS), + help=f"Comma-separated list of ENA metadata fields to fetch " f"(default: {','.join(ENA_METADATA_FIELDS)}).", ) + parser.add_argument( + "-l", + "--log-level", + help="The desired log level (default WARNING).", + choices=("CRITICAL", "ERROR", "WARNING", "INFO", "DEBUG"), + default="WARNING", + ) return parser.parse_args(args) -def validate_csv_param(param, valid_vals, param_desc): - valid_list = [] - if param: - user_vals = param.split(",") - intersect = [i for i in user_vals if i in valid_vals] - if len(intersect) == len(user_vals): - valid_list = intersect - else: - logger.error( - f"Please provide a valid value for {param_desc}!\n" - f"Provided values = {param}\n" - f"Accepted values = {','.join(valid_vals)}" - ) - sys.exit(1) - return valid_list +def validate_fields_parameter(param, valid_vals, param_desc): + if not param: + return [] + user_vals = param.split(",") + if len(set(user_vals) & set(valid_vals)) == len(user_vals): + return user_vals + else: + logger.error( + f"Please provide a valid value for {param_desc}!\n" + f"Provided values = {param}\n" + f"Accepted values = {','.join(valid_vals)}" + ) + sys.exit(1) def make_dir(path): @@ -422,10 +435,9 @@ def get_ena_fields(): ] -def fetch_sra_runinfo(file_in, file_out, ena_metadata_fields=ENA_METADATA_FIELDS): +def fetch_sra_runinfo(file_in, file_out, ena_metadata_fields): seen_ids = set() run_ids = set() - make_dir(os.path.dirname(file_out)) ena_fetcher = ENAMetadataFetcher(ena_metadata_fields) with open(file_in, "r") as fin, open(file_out, "w") as fout: writer = csv.DictWriter(fout, fieldnames=ena_metadata_fields, delimiter="\t") @@ -458,17 +470,18 @@ def fetch_sra_runinfo(file_in, file_out, ena_metadata_fields=ENA_METADATA_FIELDS def main(args=None): args = parse_args(args) - ena_metadata_fields = args.ENA_METADATA_FIELDS - if not args.ENA_METADATA_FIELDS: - ena_metadata_fields = ",".join(ENA_METADATA_FIELDS) - ena_metadata_fields = validate_csv_param( - ena_metadata_fields, + logging.basicConfig(level=args.log_level, format="[%(levelname)s] %(message)s") + if not args.file_in.is_file(): + logger.error(f"The given input file {args.file_in} was not found!") + sys.exit(1) + args.file_out.parent.mkdir(parents=True, exist_ok=True) + ena_metadata_fields = validate_fields_parameter( + args.ena_metadata_fields, valid_vals=get_ena_fields(), param_desc="--ena_metadata_fields", ) - fetch_sra_runinfo(args.FILE_IN, args.FILE_OUT, ena_metadata_fields) + fetch_sra_runinfo(args.file_in, args.file_out, ena_metadata_fields) if __name__ == "__main__": - logging.basicConfig(level="INFO", format="[%(levelname)s] %(message)s") sys.exit(main()) From d5560d391512e903c27821e8282378e953fc37e7 Mon Sep 17 00:00:00 2001 From: "Moritz E. Beber" Date: Sat, 2 Oct 2021 22:49:06 +0200 Subject: [PATCH 061/852] docs: make changelog entry --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 94968c8c..0cc2d511 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Enhancements & fixes +* Handle identifiers that do **not** return metadata, for example, due to being private. + * Added support for [DDBJ ids](https://www.ddbj.nig.ac.jp/index-e.html). See examples below: | `DDBJ` | From 5bba41093791ffd716794677a6aeed56d162f1ff Mon Sep 17 00:00:00 2001 From: "Moritz E. Beber" Date: Sat, 2 Oct 2021 22:56:04 +0200 Subject: [PATCH 062/852] refactor: remove unused function --- bin/sra_ids_to_runinfo.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/bin/sra_ids_to_runinfo.py b/bin/sra_ids_to_runinfo.py index d42081c5..0f81c125 100755 --- a/bin/sra_ids_to_runinfo.py +++ b/bin/sra_ids_to_runinfo.py @@ -402,11 +402,6 @@ def validate_fields_parameter(param, valid_vals, param_desc): sys.exit(1) -def make_dir(path): - if not len(path) == 0: - os.makedirs(path, exist_ok=True) - - def fetch_url(url): """Return a response object for the given URL and handle errors appropriately.""" try: From 2ba307b760f94eff442064caad911ab13a937bf2 Mon Sep 17 00:00:00 2001 From: Daisy Wenyan Han <60151111+daisyhan97@users.noreply.github.com> Date: Tue, 5 Oct 2021 12:45:48 -0700 Subject: [PATCH 063/852] Upload Synapse Modules --- modules/local/synapse_get.nf | 36 +++++++++++++++++++ modules/local/synapse_list.nf | 36 +++++++++++++++++++ modules/local/synapse_merge_samplesheet.nf | 41 ++++++++++++++++++++++ modules/local/synapse_metadata_mapping.nf | 36 +++++++++++++++++++ modules/local/synapse_show.nf | 36 +++++++++++++++++++ modules/local/synapse_to_samplesheet.nf | 39 ++++++++++++++++++++ 6 files changed, 224 insertions(+) create mode 100644 modules/local/synapse_get.nf create mode 100644 modules/local/synapse_list.nf create mode 100644 modules/local/synapse_merge_samplesheet.nf create mode 100644 modules/local/synapse_metadata_mapping.nf create mode 100644 modules/local/synapse_show.nf create mode 100644 modules/local/synapse_to_samplesheet.nf diff --git a/modules/local/synapse_get.nf b/modules/local/synapse_get.nf new file mode 100644 index 00000000..bdea8fd0 --- /dev/null +++ b/modules/local/synapse_get.nf @@ -0,0 +1,36 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +params.options = [:] +options = initOptions(params.options) + +process SYNAPSE_GET { + tag '$synid' + label 'process_high' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } + + conda (params.enable_conda ? "bioconda::synapseclient=2.2.2" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/YOUR-TOOL-HERE" // TODO: Add Singularity + } else { + container "sagebionetworks/synapsepythonclient:v2.4.0" + } + + input: + val synid // synapse ID for individual FastQ files + path synapseconfig // path to synapse.Config file + + output: + path "*.fastq*" , emit: fastq + path "*.version.txt" , emit: version + + script: + def software = getSoftwareName(task.process) + + """ + synapse -c $synapseconfig get $synid + echo \$(synapse --version) > ${software}.version.txt + """ +} \ No newline at end of file diff --git a/modules/local/synapse_list.nf b/modules/local/synapse_list.nf new file mode 100644 index 00000000..2d1cb2f8 --- /dev/null +++ b/modules/local/synapse_list.nf @@ -0,0 +1,36 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +params.options = [:] +options = initOptions(params.options) + +process SYNAPSE_LIST { + tag '$synid' + label 'process_low' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } + + conda (params.enable_conda ? "bioconda::synapseclient=2.2.2" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/YOUR-TOOL-HERE" // TODO: Add Singularity + } else { + container "sagebionetworks/synapsepythonclient:v2.4.0" + } + + input: + val synid // synapse ID for individual FastQ files + path synapseconfig // path to synapse.Config file + + output: + path "*.synlist.csv", emit: synlist_csv + path "*.version.txt", emit: version + + script: + def software = getSoftwareName(task.process) + + """ + synapse -c $synapseconfig list -l $synid | cut -c-11 > ${synid}.synlist.csv + echo \$(synapse --version) > ${software}.version.txt + """ +} diff --git a/modules/local/synapse_merge_samplesheet.nf b/modules/local/synapse_merge_samplesheet.nf new file mode 100644 index 00000000..d31d17ef --- /dev/null +++ b/modules/local/synapse_merge_samplesheet.nf @@ -0,0 +1,41 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +params.options = [:] +options = initOptions(params.options) + +process SYNAPSE_MERGE_SAMPLESHEET { + tag 'merge_samplesheet' + label 'process_low' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } + + conda (params.enable_conda ? "conda-forge::sed=4.7" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img" + } else { + container "biocontainers/biocontainers:v1.2.0_cv1" + } + + input: + path ('samplesheets/*') + path ('metasheet/*') + + output: + path "samplesheet.csv", emit: samplesheet + path "metasheet.csv", emit: metasheet + + script: + """ + head -n 1 `ls ./samplesheets/* | head -n 1` > samplesheet.csv + for fileid in `ls ./samplesheets/*`; do + awk 'NR>1' \$fileid >> samplesheet.csv + done + + head -n 1 `ls ./metasheet/* | head -n 1` > metasheet.csv + for fileid in `ls ./metasheet/*`; do + awk 'NR>1' \$fileid >> metasheet.csv + done + """ +} diff --git a/modules/local/synapse_metadata_mapping.nf b/modules/local/synapse_metadata_mapping.nf new file mode 100644 index 00000000..0981a1d9 --- /dev/null +++ b/modules/local/synapse_metadata_mapping.nf @@ -0,0 +1,36 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +params.options = [:] +options = initOptions(params.options) + +process SYNAPSEMETADATAMAPPING { + tag "${data[3]}" + label 'process_low' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } + + input: + val data + + output: + path("*metasheet.csv"), emit: metasheet + + exec: + meta_map = [ + md5 : "${data[0]}", + fileSize : "${data[1]}", + etag : "${data[2]}", + id : "${data[3]}", + fileName : "${data[4]}", + fileVersion : "${data[5]}" + ] + + // Create Metadata Sheet + metasheet = meta_map.keySet().collect{ '"' + it + '"'}.join(",") + '\n' + metasheet += meta_map.values().collect{ '"' + it + '"'}.join(",") + + def metasheet_file = task.workDir.resolve("${meta_map.id}.metasheet.csv") + metasheet_file.text = metasheet +} diff --git a/modules/local/synapse_show.nf b/modules/local/synapse_show.nf new file mode 100644 index 00000000..50a3405f --- /dev/null +++ b/modules/local/synapse_show.nf @@ -0,0 +1,36 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +params.options = [:] +options = initOptions(params.options) + +process SYNAPSE_SHOW { + tag '$synid' + label 'process_low' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } + + conda (params.enable_conda ? "bioconda::synapseclient=2.2.2" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/YOUR-TOOL-HERE" // TODO: Add Singularity + } else { + container "sagebionetworks/synapsepythonclient:v2.4.0" + } + + input: + val synid // synapse ID for individual FastQ files + path synapseconfig // path to synapse.Config file + + output: + path "*.metadata.txt", emit: metadata + path "*.version.txt", emit: version + + script: + def software = getSoftwareName(task.process) + + """ + synapse -c $synapseconfig show $synid | sed -n '1,3p;15,16p;20p;23p' > ${synid}.metadata.txt + echo \$(synapse --version) > ${software}.version.txt + """ +} diff --git a/modules/local/synapse_to_samplesheet.nf b/modules/local/synapse_to_samplesheet.nf new file mode 100644 index 00000000..1e50a080 --- /dev/null +++ b/modules/local/synapse_to_samplesheet.nf @@ -0,0 +1,39 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +params.options = [:] +options = initOptions(params.options) + +process SYNAPSE_TO_SAMPLESHEET { + tag '$id' + label 'process_low' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } + + input: + tuple val(id), val(files) + val strandedness + + output: + path("*samplesheet.csv"), emit: samplesheet + + exec: + + // Add fields to the beginning of the map + pipeline_map = [ + sample : "${id}", + fastq_1 : "${params.outdir}/${params.results_dir}/${files[0].getBaseName()}", + fastq_2 : "${params.outdir}/${params.results_dir}/${files[1].getBaseName()}" + ] + // Add Strandedness + pipeline_map << [ strandedness: "${strandedness}" ] + + // Create Samplesheet + samplesheet = pipeline_map.keySet().collect{ '"' + it + '"'}.join(",") + '\n' + samplesheet += pipeline_map.values().collect{ '"' + it + '"'}.join(",") + + def samplesheet_file2 = task.workDir.resolve("${pipeline_map.sample}.samplesheet.csv") + samplesheet_file2.text = samplesheet + +} From 9bfaf2ffbed4326e7136941ac16e8712904fe09a Mon Sep 17 00:00:00 2001 From: Daisy Wenyan Han <60151111+daisyhan97@users.noreply.github.com> Date: Tue, 5 Oct 2021 12:51:43 -0700 Subject: [PATCH 064/852] Upload Synapse Workflow --- workflows/synapse.nf | 154 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 workflows/synapse.nf diff --git a/workflows/synapse.nf b/workflows/synapse.nf new file mode 100644 index 00000000..0bf8109e --- /dev/null +++ b/workflows/synapse.nf @@ -0,0 +1,154 @@ +/* +======================================================================================== + VALIDATE INPUTS +======================================================================================== +*/ + +def summary_params = NfcoreSchema.paramsSummaryMap(workflow, params) + +// Validate input parameters +WorkflowFetchngs.initialise(params, log) + +// Check mandatory parameters +if (params.input) { + Channel + .from(file(params.input, checkIfExists: true)) + .splitCsv(header:false, sep:'', strip:true) + .map { it[0] } + .unique() + .set { ch_ids } +} else { + exit 1, 'Input file with Synapse IDs not specified!' +} + +/* +======================================================================================== + IMPORT LOCAL MODULES/SUBWORKFLOWS +======================================================================================== +*/ + +// Don't overwrite global params.modules, create a copy instead and use that within the main script. +def modules = params.modules.clone() + +include { SYNAPSE_LIST } from '../modules/local/synapse_list' addParams( options: modules['synapse_list'] ) +include { SYNAPSE_GET } from '../modules/local/synapse_get' addParams( options: modules['synapse_get'] ) +include { SYNAPSE_SHOW } from '../modules/local/synapse_show' addParams( options: modules['synapse_show'] ) +include { SYNAPSE_TO_SAMPLESHEET } from '../modules/local/synapse_to_samplesheet' addParams( options: modules['synapse_to_samplesheet'] ) +include { SYNAPSE_METADATA_MAPPING } from '../modules/local/synapse_metadata_mapping' addParams( options: modules['synapse_metadata_mapping'] ) +include { SYNAPSE_MERGE_SAMPLESHEET } from '../modules/local/synapse_merge_samplesheet' addParams( options: modules['synapse_merge_samplesheet']) +include { GET_SOFTWARE_VERSIONS } from '../modules/local/get_software_versions' addParams( options: [publish_files : ['tsv':'']] ) + +/* +======================================================================================== + RUN MAIN WORKFLOW +======================================================================================== +*/ + +workflow FETCHNGS_SYNAPSE { + + ch_software_versions = Channel.empty() + + Channel + .fromPath(params.synapseconfig) + .set { ch_synapseConfig } + + // MODULE: Get individual FastQ SynapseIDs from Directory SynapseID(s) + SYNAPSE_LIST ( + ch_ids, + ch_synapseConfig + ) + ch_software_versions = ch_software_versions.mix(SYNAPSE_LIST.out.version.first().ifEmpty(null)) + + // CHANNEL: Create channel for FQ SynapseIDs + SYNAPSE_LIST + .out + .synlist_csv + .splitCsv(header:false, strip:true).flatten() + .set { ch_samples } + + // MODULE: Download FastQ Files by SynapseID + SYNAPSE_GET ( + ch_samples, + ch_synapseConfig + ) + ch_software_versions = ch_software_versions.mix(SYNAPSE_GET.out.version.first().ifEmpty(null)) + + // CHANNEL: Create Read Pairs Channel - Creates format [sampleId, [fastq_1, fastq_2]] + SYNAPSE_GET + .out + .fastq + .collect().flatten() + .toSortedList().flatten() + .map { meta -> + def sampleId = meta.name.toString().tokenize('_').get(0) + [sampleId, meta] + } + .groupTuple() + .set{ ch_read_pairs } + + // MODULE: Download FQ Metadata by SynapseID + SYNAPSE_SHOW ( + ch_samples, + ch_synapseConfig + ) + ch_software_versions = ch_software_versions.mix(SYNAPSE_SHOW.out.version.first().ifEmpty(null)) + + // Clean Metadata + SYNAPSE_SHOW + .out + .metadata + .splitCsv(strip:true, sep:"=", skip:1) + .map { it[1] } + .collate( 6 ) + .set { ch_meta } + + // Compile Metadata + SYNAPSE_METADATA_MAPPING ( + ch_meta + ) + + // MODULE: Create Samplesheet + SYNAPSE_TO_SAMPLESHEET ( + ch_read_pairs, + params.strandedness + ) + + // MODULE: Merge Samplesheets + SYNAPSE_MERGE_SAMPLESHEET ( + READ_PAIRS_TO_SAMPLESHEET.out.samplesheet.collect(), + METADATA_TO_METAMAP.out.metasheet.collect() + ) + + // MODULE: Pipeline reporting + ch_software_versions + .map { it -> if (it) [ it.baseName, it ] } + .groupTuple() + .map { it[1][0] } + .flatten() + .collect() + .set { ch_software_versions } + + GET_SOFTWARE_VERSIONS ( + ch_software_versions.map { it }.collect() + ) +} + +/* +======================================================================================== + COMPLETION EMAIL AND SUMMARY +======================================================================================== +*/ + +workflow.onComplete { + if (params.email || params.email_on_fail) { + NfcoreTemplate.email(workflow, params, summary_params, projectDir, log) + } + NfcoreTemplate.summary(workflow, params, log) + WorkflowFetchngs.curateSamplesheetWarn(log) +} + +/* +======================================================================================== + THE END +======================================================================================== +*/ From 4c2fc9b3516227216f92dc9765d3af61782afeaf Mon Sep 17 00:00:00 2001 From: Daisy Wenyan Han <60151111+daisyhan97@users.noreply.github.com> Date: Tue, 5 Oct 2021 12:54:10 -0700 Subject: [PATCH 065/852] Update Synapse Workflow Labels --- workflows/synapse.nf | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/workflows/synapse.nf b/workflows/synapse.nf index 0bf8109e..3fdd367f 100644 --- a/workflows/synapse.nf +++ b/workflows/synapse.nf @@ -44,10 +44,11 @@ include { GET_SOFTWARE_VERSIONS } from '../modules/local/get_software_versi ======================================================================================== */ -workflow FETCHNGS_SYNAPSE { +workflow SYNAPSE { ch_software_versions = Channel.empty() + // CHANNEL: Stage Synapse Config File Channel .fromPath(params.synapseconfig) .set { ch_synapseConfig } @@ -93,7 +94,7 @@ workflow FETCHNGS_SYNAPSE { ) ch_software_versions = ch_software_versions.mix(SYNAPSE_SHOW.out.version.first().ifEmpty(null)) - // Clean Metadata + // CHANNEL: Clean Metadata SYNAPSE_SHOW .out .metadata @@ -102,7 +103,7 @@ workflow FETCHNGS_SYNAPSE { .collate( 6 ) .set { ch_meta } - // Compile Metadata + // MODULE: Compile Metadata SYNAPSE_METADATA_MAPPING ( ch_meta ) @@ -128,6 +129,7 @@ workflow FETCHNGS_SYNAPSE { .collect() .set { ch_software_versions } + // MODULE: Get Software Versions GET_SOFTWARE_VERSIONS ( ch_software_versions.map { it }.collect() ) From 37cad77f4249ed09e0423a0781977fef76d43523 Mon Sep 17 00:00:00 2001 From: Daisy Wenyan Han <60151111+daisyhan97@users.noreply.github.com> Date: Tue, 5 Oct 2021 14:20:48 -0700 Subject: [PATCH 066/852] Add SynapseID Option to main.nf --- conf/modules.config | 20 ++++++++++++++++++++ main.nf | 18 +++++++++++++++--- nextflow_schema.json | 22 +++++++++++++++++++--- 3 files changed, 54 insertions(+), 6 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 3ae76b68..f3da4f94 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -42,6 +42,26 @@ params { 'sra_merge_samplesheet' { publish_dir = 'samplesheet' } + 'synapse_list' { + publish_dir = 'synapse' + } + 'synapse_get' { + publish_dir = 'fastq' + } + 'synapse_show' { + publish_dir = 'metadata' + } + 'synapse_metadata_mapping' { + publish_dir = 'metadata' + publish_files = false + } + 'synapse_to_samplesheet' { + publish_dir = 'samplesheet' + publish_files = false + } + 'synapse_merge_samplesheet' { + publish_dir = 'samplesheet' + } 'multiqc_mappings_config' { publish_dir = 'samplesheet' } diff --git a/main.nf b/main.nf index 475c87a8..7d4735f8 100644 --- a/main.nf +++ b/main.nf @@ -25,13 +25,25 @@ WorkflowMain.initialise(workflow, params, log) ======================================================================================== */ -include { FETCHNGS } from './workflows/fetchngs' +if (params.input_type == 'Synapse') { + include { SYNAPSE } from './workflows/synapse' +} else { + include { FETCHNGS } from './workflows/fetchngs' +} // -// WORKFLOW: Run main nf-core/fetchngs analysis pipeline +// WORKFLOW: Run main nf-core/fetchngs analysis pipeline, depending on Identifier Type provided // workflow NFCORE_FETCHNGS { - FETCHNGS () + + // Workflow for SynapseIDs + if (params.input_type == 'Synapse') { + SYNAPSE () + } else { + // Workflow for SRA/ENA/GEO IDs + FETCHNGS () + } + } /* diff --git a/nextflow_schema.json b/nextflow_schema.json index a391f35d..1c0dc196 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -11,7 +11,8 @@ "fa_icon": "fas fa-terminal", "description": "Define where the pipeline should find input data and save output data.", "required": [ - "input" + "input", + "synapse_input" ], "properties": { "input": { @@ -23,6 +24,17 @@ "fa_icon": "fas fa-file-excel", "description": "File containing SRA/ENA/GEO identifiers one per line to download their associated metadata and FastQ files." }, + "input_type": { + "type": "string", + "description": "Type of Sample Identifiers Provided (SRA/ENA/GE/Synapse)", + "enum": [ + "SRA", + "ENA", + "GEO", + "Synapse" + ], + "fa_icon": "fas fa-copy" + }, "ena_metadata_fields": { "type": "string", "fa_icon": "fas fa-columns", @@ -111,6 +123,11 @@ "description": "Institutional config URL link.", "hidden": true, "fa_icon": "fas fa-users-cog" + }, + "synapse_config": { + "type": "string", + "description": "Path to Synapse configuration file", + "fa_icon": "fas fa-users-cog" } } }, @@ -249,5 +266,4 @@ "$ref": "#/definitions/generic_options" } ] -} - +} \ No newline at end of file From 1436b795f7f0fd846ce069e26a608598fa099064 Mon Sep 17 00:00:00 2001 From: Daisy Wenyan Han <60151111+daisyhan97@users.noreply.github.com> Date: Tue, 5 Oct 2021 14:49:23 -0700 Subject: [PATCH 067/852] Fix Typos --- modules/local/synapse_metadata_mapping.nf | 2 +- workflows/synapse.nf | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/local/synapse_metadata_mapping.nf b/modules/local/synapse_metadata_mapping.nf index 0981a1d9..5b799326 100644 --- a/modules/local/synapse_metadata_mapping.nf +++ b/modules/local/synapse_metadata_mapping.nf @@ -4,7 +4,7 @@ include { initOptions; saveFiles; getSoftwareName } from './functions' params.options = [:] options = initOptions(params.options) -process SYNAPSEMETADATAMAPPING { +process SYNAPSE_METADATA_MAPPING { tag "${data[3]}" label 'process_low' publishDir "${params.outdir}", diff --git a/workflows/synapse.nf b/workflows/synapse.nf index 3fdd367f..f5355023 100644 --- a/workflows/synapse.nf +++ b/workflows/synapse.nf @@ -116,8 +116,8 @@ workflow SYNAPSE { // MODULE: Merge Samplesheets SYNAPSE_MERGE_SAMPLESHEET ( - READ_PAIRS_TO_SAMPLESHEET.out.samplesheet.collect(), - METADATA_TO_METAMAP.out.metasheet.collect() + SYNAPSE_TO_SAMPLESHEET.out.samplesheet.collect(), + SYNAPSE_METADATA_MAPPING.out.metasheet.collect() ) // MODULE: Pipeline reporting From ca5752edc3f93a81c8bd6d3002ff11982523b76a Mon Sep 17 00:00:00 2001 From: Daisy Wenyan Han <60151111+daisyhan97@users.noreply.github.com> Date: Tue, 5 Oct 2021 20:20:17 -0700 Subject: [PATCH 068/852] Remove trailing whitespace --- modules/local/synapse_get.nf | 6 +++--- modules/local/synapse_list.nf | 2 +- modules/local/synapse_metadata_mapping.nf | 2 +- modules/local/synapse_to_samplesheet.nf | 2 +- workflows/synapse.nf | 6 +++--- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/modules/local/synapse_get.nf b/modules/local/synapse_get.nf index bdea8fd0..9b7990a2 100644 --- a/modules/local/synapse_get.nf +++ b/modules/local/synapse_get.nf @@ -28,9 +28,9 @@ process SYNAPSE_GET { script: def software = getSoftwareName(task.process) - + """ - synapse -c $synapseconfig get $synid + synapse -c $synapseconfig get $synid echo \$(synapse --version) > ${software}.version.txt """ -} \ No newline at end of file +} diff --git a/modules/local/synapse_list.nf b/modules/local/synapse_list.nf index 2d1cb2f8..62a1c16d 100644 --- a/modules/local/synapse_list.nf +++ b/modules/local/synapse_list.nf @@ -30,7 +30,7 @@ process SYNAPSE_LIST { def software = getSoftwareName(task.process) """ - synapse -c $synapseconfig list -l $synid | cut -c-11 > ${synid}.synlist.csv + synapse -c $synapseconfig list -l $synid | cut -c-11 > ${synid}.synlist.csv echo \$(synapse --version) > ${software}.version.txt """ } diff --git a/modules/local/synapse_metadata_mapping.nf b/modules/local/synapse_metadata_mapping.nf index 5b799326..6d3c87ac 100644 --- a/modules/local/synapse_metadata_mapping.nf +++ b/modules/local/synapse_metadata_mapping.nf @@ -11,7 +11,7 @@ process SYNAPSE_METADATA_MAPPING { mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } - input: + input: val data output: diff --git a/modules/local/synapse_to_samplesheet.nf b/modules/local/synapse_to_samplesheet.nf index 1e50a080..374a07ab 100644 --- a/modules/local/synapse_to_samplesheet.nf +++ b/modules/local/synapse_to_samplesheet.nf @@ -28,7 +28,7 @@ process SYNAPSE_TO_SAMPLESHEET { ] // Add Strandedness pipeline_map << [ strandedness: "${strandedness}" ] - + // Create Samplesheet samplesheet = pipeline_map.keySet().collect{ '"' + it + '"'}.join(",") + '\n' samplesheet += pipeline_map.values().collect{ '"' + it + '"'}.join(",") diff --git a/workflows/synapse.nf b/workflows/synapse.nf index f5355023..a00ca5ec 100644 --- a/workflows/synapse.nf +++ b/workflows/synapse.nf @@ -73,14 +73,14 @@ workflow SYNAPSE { ch_synapseConfig ) ch_software_versions = ch_software_versions.mix(SYNAPSE_GET.out.version.first().ifEmpty(null)) - + // CHANNEL: Create Read Pairs Channel - Creates format [sampleId, [fastq_1, fastq_2]] SYNAPSE_GET .out .fastq .collect().flatten() .toSortedList().flatten() - .map { meta -> + .map { meta -> def sampleId = meta.name.toString().tokenize('_').get(0) [sampleId, meta] } @@ -107,7 +107,7 @@ workflow SYNAPSE { SYNAPSE_METADATA_MAPPING ( ch_meta ) - + // MODULE: Create Samplesheet SYNAPSE_TO_SAMPLESHEET ( ch_read_pairs, From a7c3c822e47d898cb8a4d113966bada31551c164 Mon Sep 17 00:00:00 2001 From: Daisy Wenyan Han <60151111+daisyhan97@users.noreply.github.com> Date: Wed, 6 Oct 2021 11:55:04 -0700 Subject: [PATCH 069/852] Add input_type param to configs --- conf/test.config | 1 + conf/test_full.config | 1 + modules/local/synapse_to_samplesheet.nf | 3 +-- nextflow.config | 2 ++ nextflow_schema.json | 9 +++++---- workflows/synapse.nf | 11 +++++++---- 6 files changed, 17 insertions(+), 10 deletions(-) diff --git a/conf/test.config b/conf/test.config index ee909409..75a1ce09 100644 --- a/conf/test.config +++ b/conf/test.config @@ -21,4 +21,5 @@ params { // Input data input = 'https://raw.githubusercontent.com/nf-core/test-datasets/rnaseq/samplesheet/public_database_ids.txt' + input_type = 'SRA' } diff --git a/conf/test_full.config b/conf/test_full.config index a5aea2dc..4fc58a6b 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -16,4 +16,5 @@ params { // Input data for full size test input = 'https://raw.githubusercontent.com/nf-core/test-datasets/rnaseq/samplesheet/public_database_ids.txt' + input_type = 'SRA' } diff --git a/modules/local/synapse_to_samplesheet.nf b/modules/local/synapse_to_samplesheet.nf index 374a07ab..e51d46ca 100644 --- a/modules/local/synapse_to_samplesheet.nf +++ b/modules/local/synapse_to_samplesheet.nf @@ -13,7 +13,6 @@ process SYNAPSE_TO_SAMPLESHEET { input: tuple val(id), val(files) - val strandedness output: path("*samplesheet.csv"), emit: samplesheet @@ -27,7 +26,7 @@ process SYNAPSE_TO_SAMPLESHEET { fastq_2 : "${params.outdir}/${params.results_dir}/${files[1].getBaseName()}" ] // Add Strandedness - pipeline_map << [ strandedness: "${strandedness}" ] + pipeline_map << [ strandedness: "unstranded" ] // Create Samplesheet samplesheet = pipeline_map.keySet().collect{ '"' + it + '"'}.join(",") + '\n' diff --git a/nextflow.config b/nextflow.config index 52382140..4bdacfba 100644 --- a/nextflow.config +++ b/nextflow.config @@ -11,6 +11,7 @@ params { // Input options input = null + input_type = 'SRA' nf_core_pipeline = null ena_metadata_fields = null sample_mapping_fields = 'run_accession,sample_accession,experiment_alias,run_alias,sample_alias,experiment_title,sample_title,sample_description,description' @@ -39,6 +40,7 @@ params { config_profile_contact = null config_profile_url = null config_profile_name = null + synapse_config = null // Max resource options // Defaults only, expecting to be overwritten diff --git a/nextflow_schema.json b/nextflow_schema.json index 1c0dc196..2f0df31f 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -11,8 +11,7 @@ "fa_icon": "fas fa-terminal", "description": "Define where the pipeline should find input data and save output data.", "required": [ - "input", - "synapse_input" + "input" ], "properties": { "input": { @@ -33,7 +32,8 @@ "GEO", "Synapse" ], - "fa_icon": "fas fa-copy" + "fa_icon": "fas fa-copy", + "default": "SRA" }, "ena_metadata_fields": { "type": "string", @@ -127,7 +127,8 @@ "synapse_config": { "type": "string", "description": "Path to Synapse configuration file", - "fa_icon": "fas fa-users-cog" + "fa_icon": "fas fa-users-cog", + "hidden": true } } }, diff --git a/workflows/synapse.nf b/workflows/synapse.nf index a00ca5ec..24dcd9dd 100644 --- a/workflows/synapse.nf +++ b/workflows/synapse.nf @@ -4,10 +4,14 @@ ======================================================================================== */ +def valid_params = [ + ena_metadata_fields : ['run_accession', 'experiment_accession', 'library_layout', 'fastq_ftp', 'fastq_md5'] +] + def summary_params = NfcoreSchema.paramsSummaryMap(workflow, params) // Validate input parameters -WorkflowFetchngs.initialise(params, log) +WorkflowFetchngs.initialise(params, log, valid_params) // Check mandatory parameters if (params.input) { @@ -50,7 +54,7 @@ workflow SYNAPSE { // CHANNEL: Stage Synapse Config File Channel - .fromPath(params.synapseconfig) + .fromPath(params.synapse_config) .set { ch_synapseConfig } // MODULE: Get individual FastQ SynapseIDs from Directory SynapseID(s) @@ -80,7 +84,7 @@ workflow SYNAPSE { .fastq .collect().flatten() .toSortedList().flatten() - .map { meta -> + .map { meta -> def sampleId = meta.name.toString().tokenize('_').get(0) [sampleId, meta] } @@ -111,7 +115,6 @@ workflow SYNAPSE { // MODULE: Create Samplesheet SYNAPSE_TO_SAMPLESHEET ( ch_read_pairs, - params.strandedness ) // MODULE: Merge Samplesheets From 2a00191fa8b97b113a7d46feb1befaf69aa80c08 Mon Sep 17 00:00:00 2001 From: Daisy Wenyan Han <60151111+daisyhan97@users.noreply.github.com> Date: Wed, 6 Oct 2021 14:56:28 -0700 Subject: [PATCH 070/852] Remove SynapseConfig flag --- modules/local/synapse_get.nf | 11 ++++------- modules/local/synapse_list.nf | 2 +- modules/local/synapse_show.nf | 7 ++----- modules/local/synapse_to_samplesheet.nf | 6 +++--- workflows/synapse.nf | 6 +----- 5 files changed, 11 insertions(+), 21 deletions(-) diff --git a/modules/local/synapse_get.nf b/modules/local/synapse_get.nf index 9b7990a2..0f083141 100644 --- a/modules/local/synapse_get.nf +++ b/modules/local/synapse_get.nf @@ -5,8 +5,8 @@ params.options = [:] options = initOptions(params.options) process SYNAPSE_GET { - tag '$synid' - label 'process_high' + tag "$synid" + label 'process_low' publishDir "${params.outdir}", mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } @@ -20,17 +20,14 @@ process SYNAPSE_GET { input: val synid // synapse ID for individual FastQ files - path synapseconfig // path to synapse.Config file output: - path "*.fastq*" , emit: fastq - path "*.version.txt" , emit: version + path "*" , emit: fastq script: def software = getSoftwareName(task.process) """ - synapse -c $synapseconfig get $synid - echo \$(synapse --version) > ${software}.version.txt + synapse get $synid """ } diff --git a/modules/local/synapse_list.nf b/modules/local/synapse_list.nf index 62a1c16d..5e94f06d 100644 --- a/modules/local/synapse_list.nf +++ b/modules/local/synapse_list.nf @@ -5,7 +5,7 @@ params.options = [:] options = initOptions(params.options) process SYNAPSE_LIST { - tag '$synid' + tag "$synid" label 'process_low' publishDir "${params.outdir}", mode: params.publish_dir_mode, diff --git a/modules/local/synapse_show.nf b/modules/local/synapse_show.nf index 50a3405f..bd93e621 100644 --- a/modules/local/synapse_show.nf +++ b/modules/local/synapse_show.nf @@ -5,7 +5,7 @@ params.options = [:] options = initOptions(params.options) process SYNAPSE_SHOW { - tag '$synid' + tag "$synid" label 'process_low' publishDir "${params.outdir}", mode: params.publish_dir_mode, @@ -20,17 +20,14 @@ process SYNAPSE_SHOW { input: val synid // synapse ID for individual FastQ files - path synapseconfig // path to synapse.Config file output: path "*.metadata.txt", emit: metadata - path "*.version.txt", emit: version script: def software = getSoftwareName(task.process) """ - synapse -c $synapseconfig show $synid | sed -n '1,3p;15,16p;20p;23p' > ${synid}.metadata.txt - echo \$(synapse --version) > ${software}.version.txt + synapse show $synid | sed -n '1,3p;15,16p;20p;23p' > ${synid}.metadata.txt """ } diff --git a/modules/local/synapse_to_samplesheet.nf b/modules/local/synapse_to_samplesheet.nf index e51d46ca..20bae1c1 100644 --- a/modules/local/synapse_to_samplesheet.nf +++ b/modules/local/synapse_to_samplesheet.nf @@ -5,7 +5,7 @@ params.options = [:] options = initOptions(params.options) process SYNAPSE_TO_SAMPLESHEET { - tag '$id' + tag "$id" label 'process_low' publishDir "${params.outdir}", mode: params.publish_dir_mode, @@ -22,8 +22,8 @@ process SYNAPSE_TO_SAMPLESHEET { // Add fields to the beginning of the map pipeline_map = [ sample : "${id}", - fastq_1 : "${params.outdir}/${params.results_dir}/${files[0].getBaseName()}", - fastq_2 : "${params.outdir}/${params.results_dir}/${files[1].getBaseName()}" + fastq_1 : "${params.outdir}/fastq/${files[0]}", + fastq_2 : "${params.outdir}/fastq/${files[1]}" ] // Add Strandedness pipeline_map << [ strandedness: "unstranded" ] diff --git a/workflows/synapse.nf b/workflows/synapse.nf index 24dcd9dd..9820ce09 100644 --- a/workflows/synapse.nf +++ b/workflows/synapse.nf @@ -68,15 +68,13 @@ workflow SYNAPSE { SYNAPSE_LIST .out .synlist_csv - .splitCsv(header:false, strip:true).flatten() + .splitCsv(header:false).flatten() .set { ch_samples } // MODULE: Download FastQ Files by SynapseID SYNAPSE_GET ( ch_samples, - ch_synapseConfig ) - ch_software_versions = ch_software_versions.mix(SYNAPSE_GET.out.version.first().ifEmpty(null)) // CHANNEL: Create Read Pairs Channel - Creates format [sampleId, [fastq_1, fastq_2]] SYNAPSE_GET @@ -94,9 +92,7 @@ workflow SYNAPSE { // MODULE: Download FQ Metadata by SynapseID SYNAPSE_SHOW ( ch_samples, - ch_synapseConfig ) - ch_software_versions = ch_software_versions.mix(SYNAPSE_SHOW.out.version.first().ifEmpty(null)) // CHANNEL: Clean Metadata SYNAPSE_SHOW From c749172925f8cd29602f2674c5e0eaffb89a3e26 Mon Sep 17 00:00:00 2001 From: Daisy Wenyan Han <60151111+daisyhan97@users.noreply.github.com> Date: Thu, 7 Oct 2021 14:04:09 -0700 Subject: [PATCH 071/852] Fix SynapseConfig Bug --- modules/local/synapse_get.nf | 3 ++- modules/local/synapse_show.nf | 3 ++- workflows/synapse.nf | 6 +++--- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/modules/local/synapse_get.nf b/modules/local/synapse_get.nf index 0f083141..47f39def 100644 --- a/modules/local/synapse_get.nf +++ b/modules/local/synapse_get.nf @@ -20,6 +20,7 @@ process SYNAPSE_GET { input: val synid // synapse ID for individual FastQ files + path synapseconfig // path to synapse.Config file output: path "*" , emit: fastq @@ -28,6 +29,6 @@ process SYNAPSE_GET { def software = getSoftwareName(task.process) """ - synapse get $synid + synapse -c $synapseconfig get $synid """ } diff --git a/modules/local/synapse_show.nf b/modules/local/synapse_show.nf index bd93e621..dd78d1a8 100644 --- a/modules/local/synapse_show.nf +++ b/modules/local/synapse_show.nf @@ -20,6 +20,7 @@ process SYNAPSE_SHOW { input: val synid // synapse ID for individual FastQ files + path synapseconfig // path to synapse.Config file output: path "*.metadata.txt", emit: metadata @@ -28,6 +29,6 @@ process SYNAPSE_SHOW { def software = getSoftwareName(task.process) """ - synapse show $synid | sed -n '1,3p;15,16p;20p;23p' > ${synid}.metadata.txt + synapse -c $synapseconfig show $synid | sed -n '1,3p;15,16p;20p;23p' > ${synid}.metadata.txt """ } diff --git a/workflows/synapse.nf b/workflows/synapse.nf index 9820ce09..fd024af8 100644 --- a/workflows/synapse.nf +++ b/workflows/synapse.nf @@ -53,9 +53,7 @@ workflow SYNAPSE { ch_software_versions = Channel.empty() // CHANNEL: Stage Synapse Config File - Channel - .fromPath(params.synapse_config) - .set { ch_synapseConfig } + ch_synapseConfig = file( params.synapse_config ) // MODULE: Get individual FastQ SynapseIDs from Directory SynapseID(s) SYNAPSE_LIST ( @@ -74,6 +72,7 @@ workflow SYNAPSE { // MODULE: Download FastQ Files by SynapseID SYNAPSE_GET ( ch_samples, + ch_synapseConfig ) // CHANNEL: Create Read Pairs Channel - Creates format [sampleId, [fastq_1, fastq_2]] @@ -92,6 +91,7 @@ workflow SYNAPSE { // MODULE: Download FQ Metadata by SynapseID SYNAPSE_SHOW ( ch_samples, + ch_synapseConfig ) // CHANNEL: Clean Metadata From 94c8963ae7379fff8c4ce989ee0ef8dbe879db2d Mon Sep 17 00:00:00 2001 From: Daisy Wenyan Han <60151111+daisyhan97@users.noreply.github.com> Date: Thu, 7 Oct 2021 14:40:06 -0700 Subject: [PATCH 072/852] Remove input_type parameter --- lib/WorkflowMain.groovy | 12 ++++++++++++ main.nf | 5 +++-- nextflow.config | 1 - nextflow_schema.json | 12 ------------ 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index a7fb8c70..59c3e8a4 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -77,4 +77,16 @@ class WorkflowMain { System.exit(1) } } + + // Check input type + public static String getIdentifierType(workflow, params, log) { + def input_type = "" + params.input.eachLine { line -> + if (line.contains("syn")) { + input_type = "Synapse" + } else { + input_type = "SRA" + }} + return input_type + } } diff --git a/main.nf b/main.nf index 7d4735f8..96e38f15 100644 --- a/main.nf +++ b/main.nf @@ -18,6 +18,7 @@ nextflow.enable.dsl = 2 */ WorkflowMain.initialise(workflow, params, log) +input_type = WorkflowMain.getIdentifierType(workflow, params, log) /* ======================================================================================== @@ -25,7 +26,7 @@ WorkflowMain.initialise(workflow, params, log) ======================================================================================== */ -if (params.input_type == 'Synapse') { +if (input_type == 'Synapse') { include { SYNAPSE } from './workflows/synapse' } else { include { FETCHNGS } from './workflows/fetchngs' @@ -37,7 +38,7 @@ if (params.input_type == 'Synapse') { workflow NFCORE_FETCHNGS { // Workflow for SynapseIDs - if (params.input_type == 'Synapse') { + if (input_type == 'Synapse') { SYNAPSE () } else { // Workflow for SRA/ENA/GEO IDs diff --git a/nextflow.config b/nextflow.config index 4bdacfba..5e3c7fd2 100644 --- a/nextflow.config +++ b/nextflow.config @@ -11,7 +11,6 @@ params { // Input options input = null - input_type = 'SRA' nf_core_pipeline = null ena_metadata_fields = null sample_mapping_fields = 'run_accession,sample_accession,experiment_alias,run_alias,sample_alias,experiment_title,sample_title,sample_description,description' diff --git a/nextflow_schema.json b/nextflow_schema.json index 2f0df31f..836d00e9 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -23,18 +23,6 @@ "fa_icon": "fas fa-file-excel", "description": "File containing SRA/ENA/GEO identifiers one per line to download their associated metadata and FastQ files." }, - "input_type": { - "type": "string", - "description": "Type of Sample Identifiers Provided (SRA/ENA/GE/Synapse)", - "enum": [ - "SRA", - "ENA", - "GEO", - "Synapse" - ], - "fa_icon": "fas fa-copy", - "default": "SRA" - }, "ena_metadata_fields": { "type": "string", "fa_icon": "fas fa-columns", From a1d055de571c634fb726ccb71be24ec59d9884bd Mon Sep 17 00:00:00 2001 From: Daisy Wenyan Han <60151111+daisyhan97@users.noreply.github.com> Date: Thu, 7 Oct 2021 14:45:57 -0700 Subject: [PATCH 073/852] Remove trailing whitespace --- lib/WorkflowMain.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index 59c3e8a4..52cfdaea 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -77,7 +77,7 @@ class WorkflowMain { System.exit(1) } } - + // Check input type public static String getIdentifierType(workflow, params, log) { def input_type = "" From 1aa1a1ecdfc00cfb5b68b64b369bc5e8631d08b8 Mon Sep 17 00:00:00 2001 From: Daisy Wenyan Han <60151111+daisyhan97@users.noreply.github.com> Date: Thu, 7 Oct 2021 15:04:03 -0700 Subject: [PATCH 074/852] Remove remaining input_type parameters --- conf/test.config | 1 - conf/test_full.config | 1 - 2 files changed, 2 deletions(-) diff --git a/conf/test.config b/conf/test.config index 75a1ce09..ee909409 100644 --- a/conf/test.config +++ b/conf/test.config @@ -21,5 +21,4 @@ params { // Input data input = 'https://raw.githubusercontent.com/nf-core/test-datasets/rnaseq/samplesheet/public_database_ids.txt' - input_type = 'SRA' } diff --git a/conf/test_full.config b/conf/test_full.config index 4fc58a6b..a5aea2dc 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -16,5 +16,4 @@ params { // Input data for full size test input = 'https://raw.githubusercontent.com/nf-core/test-datasets/rnaseq/samplesheet/public_database_ids.txt' - input_type = 'SRA' } From 8b636823da5e598ec5b0d27ceabe33d62cb0ebc7 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 8 Oct 2021 15:57:31 +0100 Subject: [PATCH 075/852] Quick fire re-factor of modules, CI and test configs --- .github/workflows/ci.yml | 24 +++- conf/test.config | 2 +- conf/test_synapse.config | 24 ++++ modules.json | 11 ++ modules/local/functions.nf | 54 +++++---- modules/local/get_software_versions.nf | 33 ------ modules/local/multiqc_mappings_config.nf | 11 +- modules/local/sra_fastq_ftp.nf | 13 ++- modules/local/sra_ids_to_runinfo.nf | 10 +- modules/local/sra_merge_samplesheet.nf | 10 +- modules/local/sra_runinfo_to_ftp.nf | 11 +- modules/local/synapse_get.nf | 29 +++-- modules/local/synapse_list.nf | 32 +++--- modules/local/synapse_merge_samplesheet.nf | 10 +- modules/local/synapse_metadata_mapping.nf | 2 +- modules/local/synapse_show.nf | 30 +++-- modules/local/synapse_to_samplesheet.nf | 2 +- .../custom/dumpsoftwareversions/functions.nf | 78 +++++++++++++ .../custom/dumpsoftwareversions/main.nf | 106 ++++++++++++++++++ .../custom/dumpsoftwareversions/meta.yml | 33 ++++++ nextflow.config | 7 +- nextflow_schema.json | 12 +- 22 files changed, 426 insertions(+), 118 deletions(-) create mode 100644 conf/test_synapse.config create mode 100644 modules.json delete mode 100644 modules/local/get_software_versions.nf create mode 100644 modules/nf-core/modules/custom/dumpsoftwareversions/functions.nf create mode 100644 modules/nf-core/modules/custom/dumpsoftwareversions/main.nf create mode 100644 modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 26785ea1..7788b5de 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -35,10 +35,32 @@ jobs: wget -qO- get.nextflow.io | bash sudo mv nextflow /usr/local/bin/ - - name: Run pipeline with test data + - name: Run pipeline with SRA test data run: | nextflow run ${GITHUB_WORKSPACE} -profile test,docker + test_synapse: + name: Test Synapse workflow + if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/fetchngs') }} + runs-on: ubuntu-latest + env: + NXF_VER: ${{ matrix.nxf_ver }} + NXF_ANSI_LOG: false + steps: + - name: Check out pipeline code + uses: actions/checkout@v2 + + - name: Install Nextflow + env: + CAPSULE_LOG: none + run: | + wget -qO- get.nextflow.io | bash + sudo mv nextflow /usr/local/bin/ + + - name: Run pipeline with synapse test data + run: | + nextflow run ${GITHUB_WORKSPACE} -profile test_synapse,docker + parameters: name: Test workflow parameters if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/fetchngs') }} diff --git a/conf/test.config b/conf/test.config index ee909409..d0d7eb53 100644 --- a/conf/test.config +++ b/conf/test.config @@ -20,5 +20,5 @@ params { max_time = 6.h // Input data - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/rnaseq/samplesheet/public_database_ids.txt' + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/fetchngs/sra_ids_test.txt' } diff --git a/conf/test_synapse.config b/conf/test_synapse.config new file mode 100644 index 00000000..d68d4098 --- /dev/null +++ b/conf/test_synapse.config @@ -0,0 +1,24 @@ +/* +======================================================================================== + Nextflow config file for running minimal tests +======================================================================================== + Defines input files and everything required to run a fast and simple pipeline test. + + Use as follows: + nextflow run nf-core/fetchngs -profile test_synapse, + +---------------------------------------------------------------------------------------- +*/ + +params { + config_profile_name = 'Test profile using Synapse ids' + config_profile_description = 'Minimal test dataset to check pipeline function' + + // Limit resources so that this can run on GitHub Actions + max_cpus = 2 + max_memory = 6.GB + max_time = 6.h + + // Input data + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/fetchngs/synapse_ids_test.txt' +} diff --git a/modules.json b/modules.json new file mode 100644 index 00000000..ff841d00 --- /dev/null +++ b/modules.json @@ -0,0 +1,11 @@ +{ + "name": "nf-core/fetchngs", + "homePage": "https://github.com/nf-core/fetchngs", + "repos": { + "nf-core/modules": { + "custom/dumpsoftwareversions": { + "git_sha": "84f2302920078b0cf7716b2a2e5fcc0be5c4531d" + } + } + } +} \ No newline at end of file diff --git a/modules/local/functions.nf b/modules/local/functions.nf index da9da093..85628ee0 100644 --- a/modules/local/functions.nf +++ b/modules/local/functions.nf @@ -9,6 +9,13 @@ def getSoftwareName(task_process) { return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() } +// +// Extract name of module from process name using $task.process +// +def getProcessName(task_process) { + return task_process.tokenize(':')[-1] +} + // // Function to initialise default values and to generate a Groovy Map of available options for nf-core modules // @@ -37,32 +44,35 @@ def getPathFromList(path_list) { // Function to save/publish module results // def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + + // Do not publish versions.yml unless running from pytest workflow + if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { + return null + } + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] } + path = path instanceof String ? path : '' + path_list.add(path) } } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" } } diff --git a/modules/local/get_software_versions.nf b/modules/local/get_software_versions.nf deleted file mode 100644 index 65b7f340..00000000 --- a/modules/local/get_software_versions.nf +++ /dev/null @@ -1,33 +0,0 @@ -// Import generic module functions -include { saveFiles } from './functions' - -params.options = [:] - -process GET_SOFTWARE_VERSIONS { - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'pipeline_info', meta:[:], publish_by_meta:[]) } - - conda (params.enable_conda ? "conda-forge::python=3.9.5" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/python:3.9--1" - } else { - container "quay.io/biocontainers/python:3.9--1" - } - - cache false - - input: - path versions - - output: - path "software_versions.tsv" , emit: tsv - path 'software_versions_mqc.yaml', emit: yaml - - script: // This script is bundled with the pipeline, in nf-core/fetchngs/bin/ - """ - echo $workflow.manifest.version > pipeline.version.txt - echo $workflow.nextflow.version > nextflow.version.txt - scrape_software_versions.py &> software_versions_mqc.yaml - """ -} diff --git a/modules/local/multiqc_mappings_config.nf b/modules/local/multiqc_mappings_config.nf index 8360cd34..857c859c 100644 --- a/modules/local/multiqc_mappings_config.nf +++ b/modules/local/multiqc_mappings_config.nf @@ -1,5 +1,5 @@ // Import generic module functions -include { saveFiles; getSoftwareName } from './functions' +include { saveFiles; getSoftwareName; getProcessName } from './functions' params.options = [:] @@ -19,8 +19,8 @@ process MULTIQC_MAPPINGS_CONFIG { path csv output: - path "*yml" , emit: yml - path "*.version.txt", emit: version + path "*yml" , emit: yml + path "versions.yml", emit: versions script: """ @@ -28,6 +28,9 @@ process MULTIQC_MAPPINGS_CONFIG { $csv \\ multiqc_config.yml - python --version | sed -e "s/Python //g" > python.version.txt + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + python: \$(python --version | sed 's/Python //g') + END_VERSIONS """ } diff --git a/modules/local/sra_fastq_ftp.nf b/modules/local/sra_fastq_ftp.nf index 126c0647..39d3659d 100644 --- a/modules/local/sra_fastq_ftp.nf +++ b/modules/local/sra_fastq_ftp.nf @@ -1,5 +1,5 @@ // Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' +include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' params.options = [:] options = initOptions(params.options) @@ -25,6 +25,7 @@ process SRA_FASTQ_FTP { output: tuple val(meta), path("*fastq.gz"), emit: fastq tuple val(meta), path("*md5") , emit: md5 + path "versions.yml" , emit: versions script: if (meta.single_end) { @@ -33,6 +34,11 @@ process SRA_FASTQ_FTP { echo "${meta.md5_1} ${meta.id}.fastq.gz" > ${meta.id}.fastq.gz.md5 md5sum -c ${meta.id}.fastq.gz.md5 + + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + sed: \$(echo \$(sed --version 2>&1) | sed 's/^.*GNU sed) //; s/ .*\$//') + END_VERSIONS """ } else { """ @@ -45,6 +51,11 @@ process SRA_FASTQ_FTP { echo "${meta.md5_2} ${meta.id}_2.fastq.gz" > ${meta.id}_2.fastq.gz.md5 md5sum -c ${meta.id}_2.fastq.gz.md5 + + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + sed: \$(echo \$(sed --version 2>&1) | sed 's/^.*GNU sed) //; s/ .*\$//') + END_VERSIONS """ } } diff --git a/modules/local/sra_ids_to_runinfo.nf b/modules/local/sra_ids_to_runinfo.nf index 3d3fc063..8200271e 100644 --- a/modules/local/sra_ids_to_runinfo.nf +++ b/modules/local/sra_ids_to_runinfo.nf @@ -1,5 +1,5 @@ // Import generic module functions -include { saveFiles; getSoftwareName } from './functions' +include { saveFiles; getSoftwareName; getProcessName } from './functions' params.options = [:] @@ -22,7 +22,8 @@ process SRA_IDS_TO_RUNINFO { val fields output: - path "*.tsv", emit: tsv + path "*.tsv" , emit: tsv + path "versions.yml", emit: versions script: def metadata_fields = fields ? "--ena_metadata_fields ${fields}" : '' @@ -32,5 +33,10 @@ process SRA_IDS_TO_RUNINFO { id.txt \\ ${id}.runinfo.tsv \\ $metadata_fields + + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + python: \$(python --version | sed 's/Python //g') + END_VERSIONS """ } diff --git a/modules/local/sra_merge_samplesheet.nf b/modules/local/sra_merge_samplesheet.nf index e3c1314a..914bac00 100644 --- a/modules/local/sra_merge_samplesheet.nf +++ b/modules/local/sra_merge_samplesheet.nf @@ -1,5 +1,5 @@ // Import generic module functions -include { saveFiles; getSoftwareName } from './functions' +include { saveFiles; getSoftwareName; getProcessName } from './functions' params.options = [:] @@ -21,7 +21,8 @@ process SRA_MERGE_SAMPLESHEET { output: path "samplesheet.csv", emit: samplesheet - path "id_mappings.csv" , emit: mappings + path "id_mappings.csv", emit: mappings + path "versions.yml" , emit: versions script: """ @@ -34,5 +35,10 @@ process SRA_MERGE_SAMPLESHEET { for fileid in `ls ./mappings/*`; do awk 'NR>1' \$fileid >> id_mappings.csv done + + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + sed: \$(echo \$(sed --version 2>&1) | sed 's/^.*GNU sed) //; s/ .*\$//') + END_VERSIONS """ } diff --git a/modules/local/sra_runinfo_to_ftp.nf b/modules/local/sra_runinfo_to_ftp.nf index f426f4ab..80028705 100644 --- a/modules/local/sra_runinfo_to_ftp.nf +++ b/modules/local/sra_runinfo_to_ftp.nf @@ -1,5 +1,5 @@ // Import generic module functions -include { saveFiles; getSoftwareName } from './functions' +include { saveFiles; getSoftwareName; getProcessName } from './functions' params.options = [:] @@ -19,8 +19,8 @@ process SRA_RUNINFO_TO_FTP { path runinfo output: - path "*.tsv" , emit: tsv - path "*.version.txt", emit: version + path "*.tsv" , emit: tsv + path "versions.yml", emit: versions script: """ @@ -28,6 +28,9 @@ process SRA_RUNINFO_TO_FTP { ${runinfo.join(',')} \\ ${runinfo.toString().tokenize(".")[0]}.runinfo_ftp.tsv - python --version | sed -e "s/Python //g" > python.version.txt + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + python: \$(python --version | sed 's/Python //g') + END_VERSIONS """ } diff --git a/modules/local/synapse_get.nf b/modules/local/synapse_get.nf index 47f39def..5061e4d8 100644 --- a/modules/local/synapse_get.nf +++ b/modules/local/synapse_get.nf @@ -1,34 +1,41 @@ // Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' +include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' params.options = [:] options = initOptions(params.options) process SYNAPSE_GET { - tag "$synid" + tag "$id" label 'process_low' publishDir "${params.outdir}", mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } - conda (params.enable_conda ? "bioconda::synapseclient=2.2.2" : null) + conda (params.enable_conda ? "bioconda::synapseclient=2.4.0" : null) if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/YOUR-TOOL-HERE" // TODO: Add Singularity + container "https://depot.galaxyproject.org/singularity/synapseclient:2.4.0--pyh5e36f6f_0" } else { - container "sagebionetworks/synapsepythonclient:v2.4.0" + container "quay.io/biocontainers/synapseclient:2.4.0--pyh5e36f6f_0" } input: - val synid // synapse ID for individual FastQ files - path synapseconfig // path to synapse.Config file + val id + path config output: - path "*" , emit: fastq + path "*.fastq.gz" , emit: fastq + path "versions.yml", emit: versions script: - def software = getSoftwareName(task.process) - """ - synapse -c $synapseconfig get $synid + synapse \\ + -c $config \\ + get \\ + $synid + + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + ${getSoftwareName(task.process)}: \$( echo \$(synapse --version) ) + END_VERSIONS """ } diff --git a/modules/local/synapse_list.nf b/modules/local/synapse_list.nf index 5e94f06d..de8ee867 100644 --- a/modules/local/synapse_list.nf +++ b/modules/local/synapse_list.nf @@ -1,36 +1,42 @@ // Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' +include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' params.options = [:] options = initOptions(params.options) process SYNAPSE_LIST { - tag "$synid" + tag "$id" label 'process_low' publishDir "${params.outdir}", mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } - conda (params.enable_conda ? "bioconda::synapseclient=2.2.2" : null) + conda (params.enable_conda ? "bioconda::synapseclient=2.4.0" : null) if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/YOUR-TOOL-HERE" // TODO: Add Singularity + container "https://depot.galaxyproject.org/singularity/synapseclient:2.4.0--pyh5e36f6f_0" } else { - container "sagebionetworks/synapsepythonclient:v2.4.0" + container "quay.io/biocontainers/synapseclient:2.4.0--pyh5e36f6f_0" } input: - val synid // synapse ID for individual FastQ files - path synapseconfig // path to synapse.Config file + val id + path config output: - path "*.synlist.csv", emit: synlist_csv - path "*.version.txt", emit: version + path "*.csv" , emit: csv + path "versions.yml", emit: versions script: - def software = getSoftwareName(task.process) - """ - synapse -c $synapseconfig list -l $synid | cut -c-11 > ${synid}.synlist.csv - echo \$(synapse --version) > ${software}.version.txt + synapse \\ + -c $config \\ + list \\ + -l $id \\ + | cut -c-11 > ${id}.synlist.csv + + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + ${getSoftwareName(task.process)}: \$( echo \$(synapse --version) ) + END_VERSIONS """ } diff --git a/modules/local/synapse_merge_samplesheet.nf b/modules/local/synapse_merge_samplesheet.nf index d31d17ef..f634118b 100644 --- a/modules/local/synapse_merge_samplesheet.nf +++ b/modules/local/synapse_merge_samplesheet.nf @@ -1,5 +1,5 @@ // Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' +include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' params.options = [:] options = initOptions(params.options) @@ -24,7 +24,8 @@ process SYNAPSE_MERGE_SAMPLESHEET { output: path "samplesheet.csv", emit: samplesheet - path "metasheet.csv", emit: metasheet + path "metasheet.csv" , emit: metasheet + path "versions.yml" , emit: versions script: """ @@ -37,5 +38,10 @@ process SYNAPSE_MERGE_SAMPLESHEET { for fileid in `ls ./metasheet/*`; do awk 'NR>1' \$fileid >> metasheet.csv done + + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + sed: \$(echo \$(sed --version 2>&1) | sed 's/^.*GNU sed) //; s/ .*\$//') + END_VERSIONS """ } diff --git a/modules/local/synapse_metadata_mapping.nf b/modules/local/synapse_metadata_mapping.nf index 6d3c87ac..a513da09 100644 --- a/modules/local/synapse_metadata_mapping.nf +++ b/modules/local/synapse_metadata_mapping.nf @@ -15,7 +15,7 @@ process SYNAPSE_METADATA_MAPPING { val data output: - path("*metasheet.csv"), emit: metasheet + path "*.csv", emit: metasheet exec: meta_map = [ diff --git a/modules/local/synapse_show.nf b/modules/local/synapse_show.nf index dd78d1a8..6f0f0b1c 100644 --- a/modules/local/synapse_show.nf +++ b/modules/local/synapse_show.nf @@ -1,34 +1,42 @@ // Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' +include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' params.options = [:] options = initOptions(params.options) process SYNAPSE_SHOW { - tag "$synid" + tag "$id" label 'process_low' publishDir "${params.outdir}", mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } - conda (params.enable_conda ? "bioconda::synapseclient=2.2.2" : null) + conda (params.enable_conda ? "bioconda::synapseclient=2.4.0" : null) if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/YOUR-TOOL-HERE" // TODO: Add Singularity + container "https://depot.galaxyproject.org/singularity/synapseclient:2.4.0--pyh5e36f6f_0" } else { - container "sagebionetworks/synapsepythonclient:v2.4.0" + container "quay.io/biocontainers/synapseclient:2.4.0--pyh5e36f6f_0" } input: - val synid // synapse ID for individual FastQ files - path synapseconfig // path to synapse.Config file + val id + path config output: - path "*.metadata.txt", emit: metadata + path "*.txt" , emit: metadata + path "versions.yml", emit: versions script: - def software = getSoftwareName(task.process) - """ - synapse -c $synapseconfig show $synid | sed -n '1,3p;15,16p;20p;23p' > ${synid}.metadata.txt + synapse \\ + -c $config \\ + show \\ + $id \\ + | sed -n '1,3p;15,16p;20p;23p' > ${id}.metadata.txt + + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + ${getSoftwareName(task.process)}: \$( echo \$(synapse --version) ) + END_VERSIONS """ } diff --git a/modules/local/synapse_to_samplesheet.nf b/modules/local/synapse_to_samplesheet.nf index 20bae1c1..7b301ddf 100644 --- a/modules/local/synapse_to_samplesheet.nf +++ b/modules/local/synapse_to_samplesheet.nf @@ -15,7 +15,7 @@ process SYNAPSE_TO_SAMPLESHEET { tuple val(id), val(files) output: - path("*samplesheet.csv"), emit: samplesheet + path "*.csv", emit: samplesheet exec: diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/functions.nf b/modules/nf-core/modules/custom/dumpsoftwareversions/functions.nf new file mode 100644 index 00000000..85628ee0 --- /dev/null +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/functions.nf @@ -0,0 +1,78 @@ +// +// Utility functions used in nf-core DSL2 module files +// + +// +// Extract name of software tool from process name using $task.process +// +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +// +// Extract name of module from process name using $task.process +// +def getProcessName(task_process) { + return task_process.tokenize(':')[-1] +} + +// +// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules +// +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.args3 = args.args3 ?: '' + options.publish_by_meta = args.publish_by_meta ?: [] + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files + options.suffix = args.suffix ?: '' + return options +} + +// +// Tidy up and join elements of a list to return a path string +// +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +// +// Function to save/publish module results +// +def saveFiles(Map args) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + + // Do not publish versions.yml unless running from pytest workflow + if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { + return null + } + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] + } + path = path instanceof String ? path : '' + path_list.add(path) + } + } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" + } +} diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf b/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf new file mode 100644 index 00000000..faf2073f --- /dev/null +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf @@ -0,0 +1,106 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' + +params.options = [:] +options = initOptions(params.options) + +process CUSTOM_DUMPSOFTWAREVERSIONS { + label 'process_low' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'pipeline_info', meta:[:], publish_by_meta:[]) } + + // Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container + conda (params.enable_conda ? "bioconda::multiqc=1.11" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/multiqc:1.11--pyhdfd78af_0" + } else { + container "quay.io/biocontainers/multiqc:1.11--pyhdfd78af_0" + } + + input: + path versions + + output: + path "software_versions.yml" , emit: yml + path "software_versions_mqc.yml", emit: mqc_yml + path "versions.yml" , emit: versions + + script: + """ + #!/usr/bin/env python + + import yaml + import platform + from textwrap import dedent + + def _make_versions_html(versions): + html = [ + dedent( + '''\\ + + + + + + + + + + ''' + ) + ] + for process, tmp_versions in sorted(versions.items()): + html.append("") + for i, (tool, version) in enumerate(sorted(tmp_versions.items())): + html.append( + dedent( + f'''\\ + + + + + + ''' + ) + ) + html.append("") + html.append("
Process Name Software Version
{process if (i == 0) else ''}{tool}{version}
") + return "\\n".join(html) + + module_versions = {} + module_versions["${getProcessName(task.process)}"] = { + 'python': platform.python_version(), + 'yaml': yaml.__version__ + } + + with open("$versions") as f: + workflow_versions = yaml.load(f, Loader=yaml.BaseLoader) | module_versions + + workflow_versions["Workflow"] = { + "Nextflow": "$workflow.nextflow.version", + "$workflow.manifest.name": "$workflow.manifest.version" + } + + versions_mqc = { + 'id': 'software_versions', + 'section_name': '${workflow.manifest.name} Software Versions', + 'section_href': 'https://github.com/${workflow.manifest.name}', + 'plot_type': 'html', + 'description': 'are collected at run time from the software output.', + 'data': _make_versions_html(workflow_versions) + } + + with open("software_versions.yml", 'w') as f: + yaml.dump(workflow_versions, f, default_flow_style=False) + with open("software_versions_mqc.yml", 'w') as f: + yaml.dump(versions_mqc, f, default_flow_style=False) + + with open('versions.yml', 'w') as f: + yaml.dump(module_versions, f, default_flow_style=False) + """ +} diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml new file mode 100644 index 00000000..8d4a6ed4 --- /dev/null +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml @@ -0,0 +1,33 @@ +name: custom_dumpsoftwareversions +description: Custom module used to dump software versions within the nf-core pipeline template +keywords: + - custom + - version +tools: + - custom: + description: Custom module used to dump software versions within the nf-core pipeline template + homepage: https://github.com/nf-core/tools + documentation: https://github.com/nf-core/tools + +input: + - versions: + type: file + description: YML file containing software versions + pattern: "*.yml" + +output: + - yml: + type: file + description: Standard YML file containing software versions + pattern: "software_versions.yml" + - mqc_yml: + type: file + description: MultiQC custom content YML file containing software versions + pattern: "software_versions_mqc.yml" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@drpatelh" diff --git a/nextflow.config b/nextflow.config index b4e5dde7..45dfb946 100644 --- a/nextflow.config +++ b/nextflow.config @@ -14,6 +14,7 @@ params { nf_core_pipeline = null ena_metadata_fields = null sample_mapping_fields = 'run_accession,sample_accession,experiment_alias,run_alias,sample_alias,experiment_title,sample_title,sample_description,description' + synapse_config = null skip_fastq_download = false // Boilerplate options @@ -39,7 +40,6 @@ params { config_profile_contact = null config_profile_url = null config_profile_name = null - synapse_config = null // Max resource options // Defaults only, expecting to be overwritten @@ -109,8 +109,9 @@ profiles { podman.enabled = false shifter.enabled = false } - test { includeConfig 'conf/test.config' } - test_full { includeConfig 'conf/test_full.config' } + test { includeConfig 'conf/test.config' } + test_synapse { includeConfig 'conf/test_synapse.config' } + test_full { includeConfig 'conf/test_full.config' } } // Export these variables to prevent local Python/R libraries from conflicting with those in the container diff --git a/nextflow_schema.json b/nextflow_schema.json index db607cc4..b2f26972 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -57,6 +57,12 @@ "fa_icon": "fas fa-envelope", "help_text": "Set this parameter to your e-mail address to get a summary e-mail with details of the run sent to you when the workflow exits. If set in your user config file (`~/.nextflow/config`) then you don't need to specify this on the command line for every run.", "pattern": "^([a-zA-Z0-9_\\-\\.]+)@([a-zA-Z0-9_\\-\\.]+)\\.([a-zA-Z]{2,5})$" + }, + "synapse_config": { + "type": "string", + "description": "Path to Synapse configuration file", + "fa_icon": "fas fa-users-cog", + "hidden": true } } }, @@ -111,12 +117,6 @@ "description": "Institutional config URL link.", "hidden": true, "fa_icon": "fas fa-users-cog" - }, - "synapse_config": { - "type": "string", - "description": "Path to Synapse configuration file", - "fa_icon": "fas fa-users-cog", - "hidden": true } } }, From b9d5e86184f123313c8bd14957b5e277aac93949 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sat, 9 Oct 2021 09:24:59 +0100 Subject: [PATCH 076/852] Fix tests for SRA workflow --- ...flowFetchngs.groovy => WorkflowSra.groovy} | 4 +-- main.nf | 6 ++-- workflows/{fetchngs.nf => sra.nf} | 36 ++++++++++--------- 3 files changed, 25 insertions(+), 21 deletions(-) rename lib/{WorkflowFetchngs.groovy => WorkflowSra.groovy} (91%) rename workflows/{fetchngs.nf => sra.nf} (82%) diff --git a/lib/WorkflowFetchngs.groovy b/lib/WorkflowSra.groovy similarity index 91% rename from lib/WorkflowFetchngs.groovy rename to lib/WorkflowSra.groovy index ccff938b..a2c16219 100755 --- a/lib/WorkflowFetchngs.groovy +++ b/lib/WorkflowSra.groovy @@ -1,8 +1,8 @@ // -// This file holds several functions specific to the workflow/fetchngs.nf in the nf-core/fetchngs pipeline +// This file holds several functions specific to the workflow/sra.nf in the nf-core/fetchngs pipeline // -class WorkflowFetchngs { +class WorkflowSra { // // Check and validate parameters diff --git a/main.nf b/main.nf index 96e38f15..0b76d9da 100644 --- a/main.nf +++ b/main.nf @@ -29,11 +29,11 @@ input_type = WorkflowMain.getIdentifierType(workflow, params, log) if (input_type == 'Synapse') { include { SYNAPSE } from './workflows/synapse' } else { - include { FETCHNGS } from './workflows/fetchngs' + include { SRA } from './workflows/sra' } // -// WORKFLOW: Run main nf-core/fetchngs analysis pipeline, depending on Identifier Type provided +// WORKFLOW: Run main nf-core/fetchngs analysis pipeline, depending on type of dentifier provided // workflow NFCORE_FETCHNGS { @@ -42,7 +42,7 @@ workflow NFCORE_FETCHNGS { SYNAPSE () } else { // Workflow for SRA/ENA/GEO IDs - FETCHNGS () + SRA () } } diff --git a/workflows/fetchngs.nf b/workflows/sra.nf similarity index 82% rename from workflows/fetchngs.nf rename to workflows/sra.nf index 12733f07..25e214df 100644 --- a/workflows/fetchngs.nf +++ b/workflows/sra.nf @@ -11,7 +11,7 @@ def valid_params = [ def summary_params = NfcoreSchema.paramsSummaryMap(workflow, params) // Validate input parameters -WorkflowFetchngs.initialise(params, log, valid_params) +WorkflowSra.initialise(params, log, valid_params) // Check mandatory parameters if (params.input) { @@ -40,7 +40,14 @@ include { SRA_FASTQ_FTP } from '../modules/local/sra_fastq_ftp' include { SRA_TO_SAMPLESHEET } from '../modules/local/sra_to_samplesheet' addParams( options: modules['sra_to_samplesheet'], results_dir: modules['sra_fastq_ftp'].publish_dir ) include { SRA_MERGE_SAMPLESHEET } from '../modules/local/sra_merge_samplesheet' addParams( options: modules['sra_merge_samplesheet'] ) include { MULTIQC_MAPPINGS_CONFIG } from '../modules/local/multiqc_mappings_config' addParams( options: modules['multiqc_mappings_config'] ) -include { GET_SOFTWARE_VERSIONS } from '../modules/local/get_software_versions' addParams( options: [publish_files : ['tsv':'']] ) + +/* +======================================================================================== + IMPORT NF-CORE MODULES/SUBWORKFLOWS +======================================================================================== +*/ + +include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' addParams( options: [publish_files : ['_versions.yml':'']] ) /* ======================================================================================== @@ -48,9 +55,9 @@ include { GET_SOFTWARE_VERSIONS } from '../modules/local/get_software_versions ======================================================================================== */ -workflow FETCHNGS { +workflow SRA { - ch_software_versions = Channel.empty() + ch_versions = Channel.empty() // // MODULE: Get SRA run information for public database ids @@ -59,6 +66,7 @@ workflow FETCHNGS { ch_ids, params.ena_metadata_fields ?: '' ) + ch_versions = ch_versions.mix(SRA_IDS_TO_RUNINFO.out.versions.first()) // // MODULE: Parse SRA run information, create file containing FTP links and read into workflow as [ meta, [reads] ] @@ -66,6 +74,7 @@ workflow FETCHNGS { SRA_RUNINFO_TO_FTP ( SRA_IDS_TO_RUNINFO.out.tsv ) + ch_versions = ch_versions.mix(SRA_RUNINFO_TO_FTP.out.versions.first()) SRA_RUNINFO_TO_FTP .out @@ -78,7 +87,7 @@ workflow FETCHNGS { } .unique() .set { ch_sra_reads } - ch_software_versions = ch_software_versions.mix(SRA_RUNINFO_TO_FTP.out.version.first().ifEmpty(null)) + ch_versions = ch_versions.mix(SRA_RUNINFO_TO_FTP.out.versions.first()) if (!params.skip_fastq_download) { // @@ -87,6 +96,7 @@ workflow FETCHNGS { SRA_FASTQ_FTP ( ch_sra_reads.map { meta, reads -> if (meta.fastq_1) [ meta, reads ] } ) + ch_versions = ch_versions.mix(SRA_FASTQ_FTP.out.versions.first()) // // MODULE: Stage FastQ files downloaded by SRA together and auto-create a samplesheet @@ -104,6 +114,7 @@ workflow FETCHNGS { SRA_TO_SAMPLESHEET.out.samplesheet.collect{it[1]}, SRA_TO_SAMPLESHEET.out.mappings.collect{it[1]} ) + ch_versions = ch_versions.mix(SRA_MERGE_SAMPLESHEET.out.versions) // // MODULE: Create a MutiQC config file with sample name mappings @@ -112,6 +123,7 @@ workflow FETCHNGS { MULTIQC_MAPPINGS_CONFIG ( SRA_MERGE_SAMPLESHEET.out.mappings ) + ch_versions = ch_versions.mix(MULTIQC_MAPPINGS_CONFIG.out.versions) } // @@ -127,16 +139,8 @@ workflow FETCHNGS { // // MODULE: Pipeline reporting // - ch_software_versions - .map { it -> if (it) [ it.baseName, it ] } - .groupTuple() - .map { it[1][0] } - .flatten() - .collect() - .set { ch_software_versions } - - GET_SOFTWARE_VERSIONS ( - ch_software_versions.map { it }.collect() + CUSTOM_DUMPSOFTWAREVERSIONS ( + ch_versions.unique().collectFile(name: 'collated_versions.yml') ) } @@ -151,7 +155,7 @@ workflow.onComplete { NfcoreTemplate.email(workflow, params, summary_params, projectDir, log) } NfcoreTemplate.summary(workflow, params, log) - WorkflowFetchngs.curateSamplesheetWarn(log) + WorkflowSra.curateSamplesheetWarn(log) } /* From 5f2179847e90703cd2b6d25bbced90b2924076f7 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sat, 9 Oct 2021 09:28:48 +0100 Subject: [PATCH 077/852] Fix nf-core lint --- .nf-core.yml | 3 +++ bin/scrape_software_versions.py | 36 -------------------------- subworkflows/local/input_check.nf | 42 ------------------------------- 3 files changed, 3 insertions(+), 78 deletions(-) delete mode 100755 bin/scrape_software_versions.py delete mode 100644 subworkflows/local/input_check.nf diff --git a/.nf-core.yml b/.nf-core.yml index 12fe7aa8..92e07317 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -3,3 +3,6 @@ lint: - .github/CONTRIBUTING.md - assets/sendmail_template.txt - lib/NfcoreTemplate.groovy + files_exist: + - bin/scrape_software_versions.py + - modules/local/get_software_versions.nf diff --git a/bin/scrape_software_versions.py b/bin/scrape_software_versions.py deleted file mode 100755 index a4e45493..00000000 --- a/bin/scrape_software_versions.py +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env python -from __future__ import print_function -import os - -results = {} -version_files = [x for x in os.listdir(".") if x.endswith(".version.txt")] -for version_file in version_files: - - software = version_file.replace(".version.txt", "") - if software == "pipeline": - software = "nf-core/fetchngs" - - with open(version_file) as fin: - version = fin.read().strip() - results[software] = version - -# Dump to YAML -print( - """ -id: 'software_versions' -section_name: 'nf-core/fetchngs Software Versions' -section_href: 'https://github.com/nf-core/fetchngs' -plot_type: 'html' -description: 'are collected at run time from the software output.' -data: | -
-""" -) -for k, v in sorted(results.items()): - print("
{}
{}
".format(k, v)) -print("
") - -# Write out as tsv file: -with open("software_versions.tsv", "w") as f: - for k, v in sorted(results.items()): - f.write("{}\t{}\n".format(k, v)) diff --git a/subworkflows/local/input_check.nf b/subworkflows/local/input_check.nf deleted file mode 100644 index b664bc8c..00000000 --- a/subworkflows/local/input_check.nf +++ /dev/null @@ -1,42 +0,0 @@ -// -// Check input samplesheet and get read channels -// - -params.options = [:] - -include { SAMPLESHEET_CHECK } from '../../modules/local/samplesheet_check' addParams( options: params.options ) - -workflow INPUT_CHECK { - take: - samplesheet // file: /path/to/samplesheet.csv - - main: - SAMPLESHEET_CHECK ( samplesheet ) - .splitCsv ( header:true, sep:',' ) - .map { create_fastq_channels(it) } - .set { reads } - - emit: - reads // channel: [ val(meta), [ reads ] ] -} - -// Function to get list of [ meta, [ fastq_1, fastq_2 ] ] -def create_fastq_channels(LinkedHashMap row) { - def meta = [:] - meta.id = row.sample - meta.single_end = row.single_end.toBoolean() - - def array = [] - if (!file(row.fastq_1).exists()) { - exit 1, "ERROR: Please check input samplesheet -> Read 1 FastQ file does not exist!\n${row.fastq_1}" - } - if (meta.single_end) { - array = [ meta, [ file(row.fastq_1) ] ] - } else { - if (!file(row.fastq_2).exists()) { - exit 1, "ERROR: Please check input samplesheet -> Read 2 FastQ file does not exist!\n${row.fastq_2}" - } - array = [ meta, [ file(row.fastq_1), file(row.fastq_2) ] ] - } - return array -} From 335481c640aa088e035a0ad410f32ae82262244d Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sat, 9 Oct 2021 16:02:00 +0100 Subject: [PATCH 078/852] Get Synapse workflow running - tests still failing --- lib/WorkflowMain.groovy | 2 +- modules/local/synapse_get.nf | 5 +- modules/local/synapse_list.nf | 3 +- modules/local/synapse_show.nf | 3 +- workflows/sra.nf | 20 +++--- workflows/synapse.nf | 130 ++++++++++++++++++---------------- 6 files changed, 86 insertions(+), 77 deletions(-) diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index 52cfdaea..f1804f51 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -73,7 +73,7 @@ class WorkflowMain { // Check input has been provided if (!params.input) { - log.error "Please provide an input samplesheet to the pipeline e.g. '--input ids.txt'" + log.error "Please provide an input file containing ids to the pipeline - one per line e.g. '--input ids.txt'" System.exit(1) } } diff --git a/modules/local/synapse_get.nf b/modules/local/synapse_get.nf index 5061e4d8..1581d41a 100644 --- a/modules/local/synapse_get.nf +++ b/modules/local/synapse_get.nf @@ -31,11 +31,12 @@ process SYNAPSE_GET { synapse \\ -c $config \\ get \\ - $synid + $options.args \\ + $id \\ cat <<-END_VERSIONS > versions.yml ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$( echo \$(synapse --version) ) + ${getSoftwareName(task.process)}: \$(synapse --version | sed -e "s/Synapse Client //g") END_VERSIONS """ } diff --git a/modules/local/synapse_list.nf b/modules/local/synapse_list.nf index de8ee867..367d1e16 100644 --- a/modules/local/synapse_list.nf +++ b/modules/local/synapse_list.nf @@ -31,12 +31,13 @@ process SYNAPSE_LIST { synapse \\ -c $config \\ list \\ + $options.args \\ -l $id \\ | cut -c-11 > ${id}.synlist.csv cat <<-END_VERSIONS > versions.yml ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$( echo \$(synapse --version) ) + ${getSoftwareName(task.process)}: \$(synapse --version | sed -e "s/Synapse Client //g") END_VERSIONS """ } diff --git a/modules/local/synapse_show.nf b/modules/local/synapse_show.nf index 6f0f0b1c..51bb5420 100644 --- a/modules/local/synapse_show.nf +++ b/modules/local/synapse_show.nf @@ -31,12 +31,13 @@ process SYNAPSE_SHOW { synapse \\ -c $config \\ show \\ + $options.args \\ $id \\ | sed -n '1,3p;15,16p;20p;23p' > ${id}.metadata.txt cat <<-END_VERSIONS > versions.yml ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$( echo \$(synapse --version) ) + ${getSoftwareName(task.process)}: \$(synapse --version | sed -e "s/Synapse Client //g") END_VERSIONS """ } diff --git a/workflows/sra.nf b/workflows/sra.nf index 25e214df..835bd874 100644 --- a/workflows/sra.nf +++ b/workflows/sra.nf @@ -13,17 +13,13 @@ def summary_params = NfcoreSchema.paramsSummaryMap(workflow, params) // Validate input parameters WorkflowSra.initialise(params, log, valid_params) -// Check mandatory parameters -if (params.input) { - Channel - .from(file(params.input, checkIfExists: true)) - .splitCsv(header:false, sep:'', strip:true) - .map { it[0] } - .unique() - .set { ch_ids } -} else { - exit 1, 'Input file with public database ids not specified!' -} +// Read in ids from --input file +Channel + .from(file(params.input, checkIfExists: true)) + .splitCsv(header:false, sep:'', strip:true) + .map { it[0] } + .unique() + .set { ch_ids } /* ======================================================================================== @@ -137,7 +133,7 @@ workflow SRA { } // - // MODULE: Pipeline reporting + // MODULE: Dump software versions for all tools used in the workflow // CUSTOM_DUMPSOFTWAREVERSIONS ( ch_versions.unique().collectFile(name: 'collated_versions.yml') diff --git a/workflows/synapse.nf b/workflows/synapse.nf index fd024af8..93f281e7 100644 --- a/workflows/synapse.nf +++ b/workflows/synapse.nf @@ -4,25 +4,21 @@ ======================================================================================== */ -def valid_params = [ - ena_metadata_fields : ['run_accession', 'experiment_accession', 'library_layout', 'fastq_ftp', 'fastq_md5'] -] - def summary_params = NfcoreSchema.paramsSummaryMap(workflow, params) -// Validate input parameters -WorkflowFetchngs.initialise(params, log, valid_params) - -// Check mandatory parameters -if (params.input) { - Channel - .from(file(params.input, checkIfExists: true)) - .splitCsv(header:false, sep:'', strip:true) - .map { it[0] } - .unique() - .set { ch_ids } +// Read in ids from --input file +Channel + .from(file(params.input, checkIfExists: true)) + .splitCsv(header:false, sep:'', strip:true) + .map { it[0] } + .unique() + .set { ch_ids } + +// Create channel for synapse config +if (params.synapse_config) { + ch_synapse_config = file(params.synapse_config, checkIfExists: true) } else { - exit 1, 'Input file with Synapse IDs not specified!' + exit 1, 'Please provide a Synapse config file for download authentication!' } /* @@ -34,13 +30,20 @@ if (params.input) { // Don't overwrite global params.modules, create a copy instead and use that within the main script. def modules = params.modules.clone() -include { SYNAPSE_LIST } from '../modules/local/synapse_list' addParams( options: modules['synapse_list'] ) -include { SYNAPSE_GET } from '../modules/local/synapse_get' addParams( options: modules['synapse_get'] ) -include { SYNAPSE_SHOW } from '../modules/local/synapse_show' addParams( options: modules['synapse_show'] ) -include { SYNAPSE_TO_SAMPLESHEET } from '../modules/local/synapse_to_samplesheet' addParams( options: modules['synapse_to_samplesheet'] ) -include { SYNAPSE_METADATA_MAPPING } from '../modules/local/synapse_metadata_mapping' addParams( options: modules['synapse_metadata_mapping'] ) -include { SYNAPSE_MERGE_SAMPLESHEET } from '../modules/local/synapse_merge_samplesheet' addParams( options: modules['synapse_merge_samplesheet']) -include { GET_SOFTWARE_VERSIONS } from '../modules/local/get_software_versions' addParams( options: [publish_files : ['tsv':'']] ) +include { SYNAPSE_LIST } from '../modules/local/synapse_list' addParams( options: modules['synapse_list'] ) +include { SYNAPSE_GET } from '../modules/local/synapse_get' addParams( options: modules['synapse_get'] ) +include { SYNAPSE_SHOW } from '../modules/local/synapse_show' addParams( options: modules['synapse_show'] ) +include { SYNAPSE_TO_SAMPLESHEET } from '../modules/local/synapse_to_samplesheet' addParams( options: modules['synapse_to_samplesheet'] ) +include { SYNAPSE_METADATA_MAPPING } from '../modules/local/synapse_metadata_mapping' addParams( options: modules['synapse_metadata_mapping'] ) +include { SYNAPSE_MERGE_SAMPLESHEET } from '../modules/local/synapse_merge_samplesheet' addParams( options: modules['synapse_merge_samplesheet'] ) + +/* +======================================================================================== + IMPORT NF-CORE MODULES/SUBWORKFLOWS +======================================================================================== +*/ + +include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' addParams( options: [publish_files : ['_versions.yml':'']] ) /* ======================================================================================== @@ -50,51 +53,58 @@ include { GET_SOFTWARE_VERSIONS } from '../modules/local/get_software_versi workflow SYNAPSE { - ch_software_versions = Channel.empty() - - // CHANNEL: Stage Synapse Config File - ch_synapseConfig = file( params.synapse_config ) + ch_versions = Channel.empty() - // MODULE: Get individual FastQ SynapseIDs from Directory SynapseID(s) + // + // MODULE: Get individual FastQ synapse ids from directory based synapse ids + // SYNAPSE_LIST ( ch_ids, - ch_synapseConfig + ch_synapse_config ) - ch_software_versions = ch_software_versions.mix(SYNAPSE_LIST.out.version.first().ifEmpty(null)) + ch_versions = ch_versions.mix(SYNAPSE_LIST.out.versions.first()) - // CHANNEL: Create channel for FQ SynapseIDs + // Create channel for FastQ synapse ids SYNAPSE_LIST .out - .synlist_csv + .csv .splitCsv(header:false).flatten() .set { ch_samples } - // MODULE: Download FastQ Files by SynapseID + // + // MODULE: Download FastQs by synapse id + // SYNAPSE_GET ( ch_samples, - ch_synapseConfig + ch_synapse_config ) + ch_versions = ch_versions.mix(SYNAPSE_LIST.out.versions.first()) - // CHANNEL: Create Read Pairs Channel - Creates format [sampleId, [fastq_1, fastq_2]] + // Create read pair channel: [ sampleId, [ fastq_1, fastq_2 ] ] SYNAPSE_GET .out .fastq - .collect().flatten() - .toSortedList().flatten() + .collect() + .flatten() + .toSortedList() + .flatten() .map { meta -> - def sampleId = meta.name.toString().tokenize('_').get(0) - [sampleId, meta] + def id = meta.name.toString().tokenize('_').get(0) + [ id, meta ] } .groupTuple() - .set{ ch_read_pairs } + .set { ch_read_pairs } - // MODULE: Download FQ Metadata by SynapseID + // + // MODULE: Download FastQ metadata by synapse id + // SYNAPSE_SHOW ( ch_samples, - ch_synapseConfig + ch_synapse_config ) + ch_versions = ch_versions.mix(SYNAPSE_LIST.out.versions.first()) - // CHANNEL: Clean Metadata + // Clean metadata in channels SYNAPSE_SHOW .out .metadata @@ -103,34 +113,34 @@ workflow SYNAPSE { .collate( 6 ) .set { ch_meta } - // MODULE: Compile Metadata + // + // MODULE: Compile metadata + // SYNAPSE_METADATA_MAPPING ( ch_meta ) - // MODULE: Create Samplesheet + // + // MODULE: Create samplesheet + // SYNAPSE_TO_SAMPLESHEET ( - ch_read_pairs, + ch_read_pairs ) - // MODULE: Merge Samplesheets + // + // MODULE: Merge samplesheets + // SYNAPSE_MERGE_SAMPLESHEET ( SYNAPSE_TO_SAMPLESHEET.out.samplesheet.collect(), SYNAPSE_METADATA_MAPPING.out.metasheet.collect() ) + ch_versions = ch_versions.mix(SYNAPSE_LIST.out.versions.first()) - // MODULE: Pipeline reporting - ch_software_versions - .map { it -> if (it) [ it.baseName, it ] } - .groupTuple() - .map { it[1][0] } - .flatten() - .collect() - .set { ch_software_versions } - - // MODULE: Get Software Versions - GET_SOFTWARE_VERSIONS ( - ch_software_versions.map { it }.collect() + // + // MODULE: Dump software versions for all tools used in the workflow + // + CUSTOM_DUMPSOFTWAREVERSIONS ( + ch_versions.unique().collectFile(name: 'collated_versions.yml') ) } @@ -145,7 +155,7 @@ workflow.onComplete { NfcoreTemplate.email(workflow, params, summary_params, projectDir, log) } NfcoreTemplate.summary(workflow, params, log) - WorkflowFetchngs.curateSamplesheetWarn(log) + //WorkflowSynapse.curateSamplesheetWarn(log) } /* From b2dacad49396b4de6dbc4c836f132b4e86f55255 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 14 Oct 2021 22:28:28 +0100 Subject: [PATCH 079/852] Fix all the thingsgs --- .github/workflows/ci.yml | 38 +++++----- conf/modules.config | 8 +- lib/WorkflowSynapse.groovy | 38 ++++++++++ modules/local/synapse_get.nf | 15 ++-- modules/local/synapse_list.nf | 7 +- modules/local/synapse_merge_samplesheet.nf | 12 +-- modules/local/synapse_metadata_mapping.nf | 36 --------- modules/local/synapse_show.nf | 3 +- modules/local/synapse_to_samplesheet.nf | 55 +++++++++----- workflows/synapse.nf | 87 +++++++++++----------- 10 files changed, 156 insertions(+), 143 deletions(-) create mode 100755 lib/WorkflowSynapse.groovy delete mode 100644 modules/local/synapse_metadata_mapping.nf diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7788b5de..a9c0d4c9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -39,27 +39,27 @@ jobs: run: | nextflow run ${GITHUB_WORKSPACE} -profile test,docker - test_synapse: - name: Test Synapse workflow - if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/fetchngs') }} - runs-on: ubuntu-latest - env: - NXF_VER: ${{ matrix.nxf_ver }} - NXF_ANSI_LOG: false - steps: - - name: Check out pipeline code - uses: actions/checkout@v2 + # test_synapse: + # name: Test Synapse workflow + # if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/fetchngs') }} + # runs-on: ubuntu-latest + # env: + # NXF_VER: ${{ matrix.nxf_ver }} + # NXF_ANSI_LOG: false + # steps: + # - name: Check out pipeline code + # uses: actions/checkout@v2 - - name: Install Nextflow - env: - CAPSULE_LOG: none - run: | - wget -qO- get.nextflow.io | bash - sudo mv nextflow /usr/local/bin/ + # - name: Install Nextflow + # env: + # CAPSULE_LOG: none + # run: | + # wget -qO- get.nextflow.io | bash + # sudo mv nextflow /usr/local/bin/ - - name: Run pipeline with synapse test data - run: | - nextflow run ${GITHUB_WORKSPACE} -profile test_synapse,docker + # - name: Run pipeline with synapse test data + # run: | + # nextflow run ${GITHUB_WORKSPACE} -profile test_synapse,docker parameters: name: Test workflow parameters diff --git a/conf/modules.config b/conf/modules.config index f3da4f94..0d44e9ee 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -43,18 +43,16 @@ params { publish_dir = 'samplesheet' } 'synapse_list' { - publish_dir = 'synapse' + args = '--long' + publish_dir = 'metadata' } 'synapse_get' { publish_dir = 'fastq' + publish_files = ['fastq.gz':'', 'md5':'md5'] } 'synapse_show' { publish_dir = 'metadata' } - 'synapse_metadata_mapping' { - publish_dir = 'metadata' - publish_files = false - } 'synapse_to_samplesheet' { publish_dir = 'samplesheet' publish_files = false diff --git a/lib/WorkflowSynapse.groovy b/lib/WorkflowSynapse.groovy new file mode 100755 index 00000000..1ac249a1 --- /dev/null +++ b/lib/WorkflowSynapse.groovy @@ -0,0 +1,38 @@ +// +// This file holds several functions specific to the workflow/synapse.nf in the nf-core/fetchngs pipeline +// + +class WorkflowSynapse { + + // + // Convert metadata obtained from the 'synapse show' command to a Groovy map + // + public static Map synapseShowToMap(synapse_file) { + def meta = [:] + def category = '' + synapse_file.eachLine { line -> + def entries = [null, null] + if (!line.startsWith(' ') && !line.trim().isEmpty()) { + category = line.tokenize(':')[0] + } else { + entries = line.trim().tokenize('=') + } + meta["${category}|${entries[0]}"] = entries[1] + } + meta.id = meta['properties|id'] + meta.md5 = meta['File|md5'] + return meta.findAll{ it.value != null } + } + + // + // Print a warning after pipeline has completed + // + public static void curateSamplesheetWarn(log) { + log.warn "=============================================================================\n" + + " Please double-check the samplesheet that has been auto-created by the pipeline.\n\n" + + " Where applicable, default values will be used for sample-specific metadata\n" + + " such as strandedness, controls etc as this information is not provided\n" + + " in a standardised manner when uploading data to Synapse.\n" + + "===================================================================================" + } +} diff --git a/modules/local/synapse_get.nf b/modules/local/synapse_get.nf index 1581d41a..3f4d0655 100644 --- a/modules/local/synapse_get.nf +++ b/modules/local/synapse_get.nf @@ -5,8 +5,9 @@ params.options = [:] options = initOptions(params.options) process SYNAPSE_GET { - tag "$id" + tag "$meta.id" label 'process_low' + label 'error_retry' publishDir "${params.outdir}", mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } @@ -19,12 +20,13 @@ process SYNAPSE_GET { } input: - val id + val meta path config output: - path "*.fastq.gz" , emit: fastq - path "versions.yml", emit: versions + tuple val(meta), path("*.fastq.gz"), emit: fastq + tuple val(meta), path("*md5") , emit: md5 + path "versions.yml" , emit: versions script: """ @@ -32,7 +34,10 @@ process SYNAPSE_GET { -c $config \\ get \\ $options.args \\ - $id \\ + $meta.id + + find ./ -type f -name "*.fastq.gz" -exec echo "${meta.md5} " {} \\; > ${meta.id}.md5 + md5sum -c ${meta.id}.md5 cat <<-END_VERSIONS > versions.yml ${getProcessName(task.process)}: diff --git a/modules/local/synapse_list.nf b/modules/local/synapse_list.nf index 367d1e16..20275de2 100644 --- a/modules/local/synapse_list.nf +++ b/modules/local/synapse_list.nf @@ -23,7 +23,7 @@ process SYNAPSE_LIST { path config output: - path "*.csv" , emit: csv + path "*.txt" , emit: txt path "versions.yml", emit: versions script: @@ -32,8 +32,9 @@ process SYNAPSE_LIST { -c $config \\ list \\ $options.args \\ - -l $id \\ - | cut -c-11 > ${id}.synlist.csv + $id \\ + $options.args2 \\ + > ${id}.list.txt cat <<-END_VERSIONS > versions.yml ${getProcessName(task.process)}: diff --git a/modules/local/synapse_merge_samplesheet.nf b/modules/local/synapse_merge_samplesheet.nf index f634118b..8027818c 100644 --- a/modules/local/synapse_merge_samplesheet.nf +++ b/modules/local/synapse_merge_samplesheet.nf @@ -1,12 +1,9 @@ // Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' +include { saveFiles; getSoftwareName; getProcessName } from './functions' params.options = [:] -options = initOptions(params.options) process SYNAPSE_MERGE_SAMPLESHEET { - tag 'merge_samplesheet' - label 'process_low' publishDir "${params.outdir}", mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } @@ -20,11 +17,9 @@ process SYNAPSE_MERGE_SAMPLESHEET { input: path ('samplesheets/*') - path ('metasheet/*') output: path "samplesheet.csv", emit: samplesheet - path "metasheet.csv" , emit: metasheet path "versions.yml" , emit: versions script: @@ -34,11 +29,6 @@ process SYNAPSE_MERGE_SAMPLESHEET { awk 'NR>1' \$fileid >> samplesheet.csv done - head -n 1 `ls ./metasheet/* | head -n 1` > metasheet.csv - for fileid in `ls ./metasheet/*`; do - awk 'NR>1' \$fileid >> metasheet.csv - done - cat <<-END_VERSIONS > versions.yml ${getProcessName(task.process)}: sed: \$(echo \$(sed --version 2>&1) | sed 's/^.*GNU sed) //; s/ .*\$//') diff --git a/modules/local/synapse_metadata_mapping.nf b/modules/local/synapse_metadata_mapping.nf deleted file mode 100644 index a513da09..00000000 --- a/modules/local/synapse_metadata_mapping.nf +++ /dev/null @@ -1,36 +0,0 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -params.options = [:] -options = initOptions(params.options) - -process SYNAPSE_METADATA_MAPPING { - tag "${data[3]}" - label 'process_low' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } - - input: - val data - - output: - path "*.csv", emit: metasheet - - exec: - meta_map = [ - md5 : "${data[0]}", - fileSize : "${data[1]}", - etag : "${data[2]}", - id : "${data[3]}", - fileName : "${data[4]}", - fileVersion : "${data[5]}" - ] - - // Create Metadata Sheet - metasheet = meta_map.keySet().collect{ '"' + it + '"'}.join(",") + '\n' - metasheet += meta_map.values().collect{ '"' + it + '"'}.join(",") - - def metasheet_file = task.workDir.resolve("${meta_map.id}.metasheet.csv") - metasheet_file.text = metasheet -} diff --git a/modules/local/synapse_show.nf b/modules/local/synapse_show.nf index 51bb5420..4edc4207 100644 --- a/modules/local/synapse_show.nf +++ b/modules/local/synapse_show.nf @@ -33,7 +33,8 @@ process SYNAPSE_SHOW { show \\ $options.args \\ $id \\ - | sed -n '1,3p;15,16p;20p;23p' > ${id}.metadata.txt + $options.args2 \\ + > ${id}.metadata.txt cat <<-END_VERSIONS > versions.yml ${getProcessName(task.process)}: diff --git a/modules/local/synapse_to_samplesheet.nf b/modules/local/synapse_to_samplesheet.nf index 7b301ddf..28571005 100644 --- a/modules/local/synapse_to_samplesheet.nf +++ b/modules/local/synapse_to_samplesheet.nf @@ -1,38 +1,57 @@ // Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' +include { saveFiles; getSoftwareName } from './functions' -params.options = [:] -options = initOptions(params.options) +params.options = [:] +params.results_dir = '' process SYNAPSE_TO_SAMPLESHEET { - tag "$id" - label 'process_low' + tag "$meta.id" publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } + + memory 100.MB input: - tuple val(id), val(files) + tuple val(meta), path(fastq) + val pipeline output: - path "*.csv", emit: samplesheet + tuple val(meta), path("*.csv"), emit: samplesheet exec: - // Add fields to the beginning of the map + // Remove custom keys + def meta_map = meta.clone() + meta_map.remove("id") + + def fastq_1 = "${params.outdir}/${params.results_dir}/${fastq}" + def fastq_2 = '' + if (fastq instanceof List && fastq.size() == 2) { + fastq_1 = "${params.outdir}/${params.results_dir}/${fastq[0]}" + fastq_2 = "${params.outdir}/${params.results_dir}/${fastq[1]}" + } + + // Add relevant fields to the beginning of the map pipeline_map = [ - sample : "${id}", - fastq_1 : "${params.outdir}/fastq/${files[0]}", - fastq_2 : "${params.outdir}/fastq/${files[1]}" + sample : "${meta.id}", + fastq_1 : fastq_1, + fastq_2 : fastq_2 ] - // Add Strandedness - pipeline_map << [ strandedness: "unstranded" ] - // Create Samplesheet + // Add nf-core pipeline specific entries + if (pipeline) { + if (pipeline == 'rnaseq') { + pipeline_map << [ strandedness: 'unstranded' ] + } + } + pipeline_map << meta_map + + // Create a samplesheet samplesheet = pipeline_map.keySet().collect{ '"' + it + '"'}.join(",") + '\n' samplesheet += pipeline_map.values().collect{ '"' + it + '"'}.join(",") - def samplesheet_file2 = task.workDir.resolve("${pipeline_map.sample}.samplesheet.csv") - samplesheet_file2.text = samplesheet - + // Write samplesheet to file + def samplesheet_file = task.workDir.resolve("${meta.id}.samplesheet.csv") + samplesheet_file.text = samplesheet } diff --git a/workflows/synapse.nf b/workflows/synapse.nf index 93f281e7..3d993789 100644 --- a/workflows/synapse.nf +++ b/workflows/synapse.nf @@ -31,10 +31,9 @@ if (params.synapse_config) { def modules = params.modules.clone() include { SYNAPSE_LIST } from '../modules/local/synapse_list' addParams( options: modules['synapse_list'] ) -include { SYNAPSE_GET } from '../modules/local/synapse_get' addParams( options: modules['synapse_get'] ) include { SYNAPSE_SHOW } from '../modules/local/synapse_show' addParams( options: modules['synapse_show'] ) -include { SYNAPSE_TO_SAMPLESHEET } from '../modules/local/synapse_to_samplesheet' addParams( options: modules['synapse_to_samplesheet'] ) -include { SYNAPSE_METADATA_MAPPING } from '../modules/local/synapse_metadata_mapping' addParams( options: modules['synapse_metadata_mapping'] ) +include { SYNAPSE_GET } from '../modules/local/synapse_get' addParams( options: modules['synapse_get'] ) +include { SYNAPSE_TO_SAMPLESHEET } from '../modules/local/synapse_to_samplesheet' addParams( options: modules['synapse_to_samplesheet'], results_dir: modules['synapse_get'].publish_dir ) include { SYNAPSE_MERGE_SAMPLESHEET } from '../modules/local/synapse_merge_samplesheet' addParams( options: modules['synapse_merge_samplesheet'] ) /* @@ -56,7 +55,7 @@ workflow SYNAPSE { ch_versions = Channel.empty() // - // MODULE: Get individual FastQ synapse ids from directory based synapse ids + // MODULE: Expand synapse ids for individual FastQ files // SYNAPSE_LIST ( ch_ids, @@ -67,74 +66,72 @@ workflow SYNAPSE { // Create channel for FastQ synapse ids SYNAPSE_LIST .out - .csv - .splitCsv(header:false).flatten() + .txt + .splitCsv(header:false, sep:' ') + .map { it[0] } + .unique() .set { ch_samples } // - // MODULE: Download FastQs by synapse id + // MODULE: Download metadata for each synapse id // - SYNAPSE_GET ( + SYNAPSE_SHOW ( ch_samples, ch_synapse_config ) - ch_versions = ch_versions.mix(SYNAPSE_LIST.out.versions.first()) + ch_versions = ch_versions.mix(SYNAPSE_SHOW.out.versions.first()) - // Create read pair channel: [ sampleId, [ fastq_1, fastq_2 ] ] - SYNAPSE_GET + // Get metadata into channels + SYNAPSE_SHOW .out - .fastq - .collect() - .flatten() - .toSortedList() - .flatten() - .map { meta -> - def id = meta.name.toString().tokenize('_').get(0) - [ id, meta ] - } - .groupTuple() - .set { ch_read_pairs } + .metadata + .map { it -> WorkflowSynapse.synapseShowToMap(it) } + .set { ch_samples_meta } // - // MODULE: Download FastQ metadata by synapse id + // MODULE: Download FastQs by synapse id // - SYNAPSE_SHOW ( - ch_samples, + SYNAPSE_GET ( + ch_samples_meta, ch_synapse_config ) - ch_versions = ch_versions.mix(SYNAPSE_LIST.out.versions.first()) + ch_versions = ch_versions.mix(SYNAPSE_GET.out.versions.first()) - // Clean metadata in channels - SYNAPSE_SHOW + // Combine channels for PE/SE FastQs: [ [ id:SRR6357070, synapse_ids:syn26240474;syn26240477 ], [ fastq_1, fastq_2 ] ] + SYNAPSE_GET .out - .metadata - .splitCsv(strip:true, sep:"=", skip:1) - .map { it[1] } - .collate( 6 ) - .set { ch_meta } + .fastq + .map { meta, fastq -> [ fastq.baseName.tokenize('_')[0], fastq ] } + .groupTuple(sort: { it -> it.baseName }) + .set { ch_fastq } - // - // MODULE: Compile metadata - // - SYNAPSE_METADATA_MAPPING ( - ch_meta - ) + SYNAPSE_GET + .out + .fastq + .map { meta, fastq -> [ fastq.baseName.tokenize('_')[0], meta.id ] } + .groupTuple() + .join(ch_fastq) + .map { id, synids, fastq -> + def meta = [ id:id, synapse_ids:synids.join(';') ] + [ meta, fastq ] + } + .set { ch_fastq } // - // MODULE: Create samplesheet + // MODULE: Create samplesheet per sample // SYNAPSE_TO_SAMPLESHEET ( - ch_read_pairs + ch_fastq, + params.nf_core_pipeline ?: '' ) // // MODULE: Merge samplesheets // SYNAPSE_MERGE_SAMPLESHEET ( - SYNAPSE_TO_SAMPLESHEET.out.samplesheet.collect(), - SYNAPSE_METADATA_MAPPING.out.metasheet.collect() + SYNAPSE_TO_SAMPLESHEET.out.samplesheet.collect{ it[1] } ) - ch_versions = ch_versions.mix(SYNAPSE_LIST.out.versions.first()) + ch_versions = ch_versions.mix(SYNAPSE_MERGE_SAMPLESHEET.out.versions) // // MODULE: Dump software versions for all tools used in the workflow @@ -155,7 +152,7 @@ workflow.onComplete { NfcoreTemplate.email(workflow, params, summary_params, projectDir, log) } NfcoreTemplate.summary(workflow, params, log) - //WorkflowSynapse.curateSamplesheetWarn(log) + WorkflowSynapse.curateSamplesheetWarn(log) } /* From 82b68e1e95faf8961616d4933f900a1ec1ef8a28 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 14 Oct 2021 22:31:38 +0100 Subject: [PATCH 080/852] Add meta entries to saveAs --- modules/local/synapse_get.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/synapse_get.nf b/modules/local/synapse_get.nf index 3f4d0655..1e959296 100644 --- a/modules/local/synapse_get.nf +++ b/modules/local/synapse_get.nf @@ -10,7 +10,7 @@ process SYNAPSE_GET { label 'error_retry' publishDir "${params.outdir}", mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? "bioconda::synapseclient=2.4.0" : null) if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { From 968f2fc9380153c87e8b5263c5cf5912267194d3 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 14 Oct 2021 22:35:39 +0100 Subject: [PATCH 081/852] Update CHANGELOG --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0cc2d511..9e9a0cb2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,8 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Enhancements & fixes -* Handle identifiers that do **not** return metadata, for example, due to being private. - +* Added a workflow to download FastQ files and to create samplesheets for ids from the [Synapse platform](https://www.synapse.org/) hosted by [Sage Bionetworks](https://sagebionetworks.org/). +* Handle SRA identifiers that do **not** return metadata, for example, due to being private. * Added support for [DDBJ ids](https://www.ddbj.nig.ac.jp/index-e.html). See examples below: | `DDBJ` | From 87fa87e1496ee28a53ac751f65272cd3d89d4de0 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 14 Oct 2021 22:37:41 +0100 Subject: [PATCH 082/852] Remove Synapse CI --- .github/workflows/ci.yml | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a9c0d4c9..08ac1cfb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -39,28 +39,6 @@ jobs: run: | nextflow run ${GITHUB_WORKSPACE} -profile test,docker - # test_synapse: - # name: Test Synapse workflow - # if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/fetchngs') }} - # runs-on: ubuntu-latest - # env: - # NXF_VER: ${{ matrix.nxf_ver }} - # NXF_ANSI_LOG: false - # steps: - # - name: Check out pipeline code - # uses: actions/checkout@v2 - - # - name: Install Nextflow - # env: - # CAPSULE_LOG: none - # run: | - # wget -qO- get.nextflow.io | bash - # sudo mv nextflow /usr/local/bin/ - - # - name: Run pipeline with synapse test data - # run: | - # nextflow run ${GITHUB_WORKSPACE} -profile test_synapse,docker - parameters: name: Test workflow parameters if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/fetchngs') }} From 4093bba59aa7ab00696fa799037f1563f3a76a2b Mon Sep 17 00:00:00 2001 From: Daisy Wenyan Han <60151111+daisyhan97@users.noreply.github.com> Date: Fri, 15 Oct 2021 12:47:29 -0700 Subject: [PATCH 083/852] Update Docs --- CITATIONS.md | 3 +++ README.md | 8 ++++---- docs/output.md | 10 +++++----- docs/usage.md | 20 +++++++++++--------- 4 files changed, 23 insertions(+), 18 deletions(-) diff --git a/CITATIONS.md b/CITATIONS.md index 4a1f2752..01819d3e 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -28,6 +28,9 @@ * [GEO](https://pubmed.ncbi.nlm.nih.gov/23193258/) > Barrett T, Wilhite SE, Ledoux P, Evangelista C, Kim IF, Tomashevsky M, Marshall KA, Phillippy KH, Sherman PM, Holko M, Yefanov A, Lee H, Zhang N, Robertson CL, Serova N, Davis S, Soboleva A. NCBI GEO: archive for functional genomics data sets--update. Nucleic Acids Res. 2013 Jan;41(Database issue):D991-5. doi: 10.1093/nar/gks1193. Epub 2012 Nov 27. PubMed PMID: 23193258; PubMed Central PMCID: PMC3531084. +* [Synapse](https://pubmed.ncbi.nlm.nih.gov/24071850/) + > Omberg L, Ellrott K, Yuan Y, Kandoth C, Wong C, Kellen MR, Friend SH, Stuart J, Liang H, Margolin AA. Enabling transparent and collaborative computational analysis of 12 tumor types within The Cancer Genome Atlas. Nat Genet. 2013 Oct;45(10):1121-6. doi: 10.1038/ng.2761. PMID: 24071850; PMCID: PMC3950337. + ## Software packaging/containerisation tools * [Anaconda](https://anaconda.com) diff --git a/README.md b/README.md index e378eacc..cb60455e 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ ## Introduction -**nf-core/fetchngs** is a bioinformatics pipeline to fetch metadata and raw FastQ files from public databases. At present, the pipeline supports SRA / ENA / DDBJ / GEO ids (see [usage docs](https://nf-co.re/fetchngs/usage#introduction)). +**nf-core/fetchngs** is a bioinformatics pipeline to fetch metadata and raw FastQ files from public databases. At present, the pipeline supports [SRA](https://www.ncbi.nlm.nih.gov/sra) / [ENA](https://www.ebi.ac.uk/ena/browser/home) / [DDBJ](https://www.ddbj.nig.ac.jp/index-e.html) / [GEO](https://www.ncbi.nlm.nih.gov/geo/) / [Synapse](https://www.synapse.org/#) ids (see [usage docs](https://nf-co.re/fetchngs/usage#introduction)). The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. @@ -26,9 +26,9 @@ On release, automated continuous integration tests run the pipeline on a full-si Via a single file of ids, provided one-per-line (see [example input file](https://raw.githubusercontent.com/nf-core/test-datasets/rnaseq/samplesheet/public_database_ids.txt)) the pipeline performs the following steps: -1. Resolve database ids back to appropriate experiment-level ids and to be compatible with the [ENA API](https://ena-docs.readthedocs.io/en/latest/retrieval/programmatic-access.html) -2. Fetch extensive id metadata including direct download links to FastQ files via ENA API -3. Download FastQ files in parallel via `curl` and perform `md5sum` check +1. Resolve database ids back to appropriate experiment-level ids and to be compatible with the [ENA API](https://ena-docs.readthedocs.io/en/latest/retrieval/programmatic-access.html), or appropriate database +2. Fetch extensive id metadata including direct download links to FastQ files via ENA API or appropriate database +3. Download FastQ files in parallel and perform `md5sum` check 4. Collate id metadata and paths to FastQ files in a single samplesheet The columns in the auto-created samplesheet can be tailored to be accepted out-of-the-box by selected nf-core pipelines, these currently include [nf-core/rnaseq](https://nf-co.re/rnaseq/usage#samplesheet-input) and the Illumina processing mode of [nf-core/viralrecon](https://nf-co.re/viralrecon/usage#illumina-samplesheet-format). You can use the `--nf_core_pipeline` parameter to customise this behaviour e.g. `--nf_core_pipeline rnaseq`. More pipelines will be supported in due course as we adopt and standardise samplesheet input across nf-core. diff --git a/docs/output.md b/docs/output.md index 4ffc507e..167c1f69 100644 --- a/docs/output.md +++ b/docs/output.md @@ -8,7 +8,7 @@ This document describes the output produced by the pipeline. The directories lis The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using the following steps: -* [FastQ download](#fastq-download) - Download FastQ files via SRA / ENA / DDBJ / GEO ids +* [FastQ download](#fastq-download) - Download FastQ files via SRA / ENA / DDBJ / GEO / Synapse ids * [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution ### FastQ download @@ -19,18 +19,18 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d * `fastq/` * `*.fastq.gz`: Paired-end/single-end reads downloaded from the SRA / ENA / DDBJ / GEO. * `fastq/md5/` - * `*.md5`: Files containing `md5` sum for FastQ files downloaded from the ENA. + * `*.md5`: Files containing `md5` sum for FastQ files downloaded from the ENA or appropriate database. * `samplesheet/` * `samplesheet.csv`: Auto-created samplesheet with collated metadata and paths to downloaded FastQ files. * `id_mappings.csv`: File with selected fields that can be used to rename samples to more informative names; see [`--sample_mapping_fields`](https://nf-co.re/fetchngs/parameters#sample_mapping_fields) parameter to customise this behaviour. * `multiqc_config.yml`: [MultiQC](https://multiqc.info/docs/#bulk-sample-renaming) config file that can be passed to most nf-core pipelines via the `--multiqc_config` parameter for bulk renaming of sample names from database ids; [`--sample_mapping_fields`](https://nf-co.re/fetchngs/parameters#sample_mapping_fields) parameter to customise this behaviour. * `metadata/` - * `*.runinfo_ftp.tsv`: Re-formatted metadata file downloaded from the ENA. - * `*.runinfo.tsv`: Original metadata file downloaded from the ENA. + * `*.runinfo_ftp.tsv`: Re-formatted metadata file downloaded from the ENA or appropriate database. + * `*.runinfo.tsv`: Original metadata file downloaded from the ENA or appropriate database. -Please see the [usage documentation](https://nf-co.re/fetchngs/usage#introduction) for a list of supported public repository identifiers and how to provide them to the pipeline. The final sample information for all identifiers is obtained from the ENA which provides direct download links for FastQ files as well as their associated md5sums. If download links exist, the files will be downloaded in parallel by FTP otherwise they will NOT be downloaded. This is intentional because the tools such as `parallel-fastq-dump`, `fasterq-dump`, `prefetch` etc require pre-existing configuration files in the users home directory which makes automation tricky across different platforms and containerisation. +Please see the [usage documentation](https://nf-co.re/fetchngs/usage#introduction) for a list of supported public repository identifiers and how to provide them to the pipeline. The final sample information for `SRA`, `GEO`, `DDBJ`, and `ENA` identifiers is obtained from the ENA which provides direct download links for FastQ files as well as their associated md5sums. If download links exist, the files will be downloaded in parallel by FTP otherwise they will NOT be downloaded. This is intentional because the tools such as `parallel-fastq-dump`, `fasterq-dump`, `prefetch` etc require pre-existing configuration files in the users home directory which makes automation tricky across different platforms and containerisation. Sample information for `Synapse` identifiers are downloaded in parallel directly from the [Synapse](https://www.synapse.org/#) platform. A [configuration file](http://python-docs.synapse.org/build/html/Credentials.html#use-synapseconfig) containing valid login credentials is required for Synapse downloads. ### Pipeline information diff --git a/docs/usage.md b/docs/usage.md index 1e6066db..e1a096f4 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -8,20 +8,22 @@ The pipeline has been set-up to automatically download and process the raw FastQ files from public repositories. Identifiers can be provided in a file, one-per-line via the `--input` parameter. Currently, the following types of example identifiers are supported: -| `SRA` | `ENA` | `DDBJ` | `GEO` | -|--------------|--------------|--------------|------------| -| SRR11605097 | ERR4007730 | DRR171822 | GSM4432381 | -| SRX8171613 | ERX4009132 | DRX162434 | GSE147507 | -| SRS6531847 | ERS4399630 | DRS090921 | | -| SAMN14689442 | SAMEA6638373 | SAMD00114846 | | -| SRP256957 | ERP120836 | DRP004793 | | -| SRA1068758 | ERA2420837 | DRA008156 | | -| PRJNA625551 | PRJEB37513 | PRJDB4176 | | +| `SRA` | `ENA` | `DDBJ` | `GEO` | `Synapse` | +|--------------|--------------|--------------|------------|-------------| +| SRR11605097 | ERR4007730 | DRR171822 | GSM4432381 | syn26240435 | +| SRX8171613 | ERX4009132 | DRX162434 | GSE147507 | | +| SRS6531847 | ERS4399630 | DRS090921 | | | +| SAMN14689442 | SAMEA6638373 | SAMD00114846 | | | +| SRP256957 | ERP120836 | DRP004793 | | | +| SRA1068758 | ERA2420837 | DRA008156 | | | +| PRJNA625551 | PRJEB37513 | PRJDB4176 | | | If `SRR`/`ERR`/`DRR` run ids are provided then these will be resolved back to their appropriate `SRX`/`ERX`/`DRX` ids to be able to merge multiple runs from the same experiment. This is conceptually the same as merging multiple libraries sequenced from the same sample. The final sample information for all identifiers is obtained from the ENA which provides direct download links for FastQ files as well as their associated md5 sums. If download links exist, the files will be downloaded in parallel by FTP otherwise they will NOT be downloaded. This is intentional because tools such as `parallel-fastq-dump`, `fasterq-dump`, `prefetch` etc require pre-existing configuration files in the users home directory which makes automation tricky across different platforms and containerisation. We may add this functionality in later releases. +To download data from `Synapse`, the SynapseID of the directory containing all files to be downloaded should be provided. The directory ID will then be resolved to the SynapseIDs of the corresponding FastQ files, which are then downloaded in parellel using the `synapse get` command. In order to download data from Synapse, an account must be created and a user configuration file provided via the parameter `--synapse_config`. All Synapse metadata, annotations and provenance are also downloaded using the `synapse show` command, and are outputted to a separate metadata file. By default, only the md5sums, file sizes, etags, Synapse IDs, file names, and file versions are shown. + As a bonus, the columns in the auto-created samplesheet can be tailored to be accepted out-of-the-box by selected nf-core pipelines, these currently include [nf-core/rnaseq](https://nf-co.re/rnaseq/usage#samplesheet-input) and the Illumina processing mode of [nf-core/viralrecon](https://nf-co.re/viralrecon/usage#illumina-samplesheet-format). You can use the `--nf_core_pipeline` parameter to customise this behaviour e.g. `--nf_core_pipeline rnaseq`. More pipelines will be supported in due course as we adopt and standardise samplesheet input across nf-core. It is highly recommended that you double-check that all of the identifiers you defined using `--input` are represented in the samplesheet. Also, public databases don't reliably hold information such as strandedness information so you may need to amend these entries too if for example your samplesheet was created by providing `--nf_core_pipeline rnaseq`. All of the sample metadata obtained from the ENA will be appended as additional columns to help you manually curate the samplesheet before you run the pipeline. You can customise the metadata fields that are appended to the samplesheet via the `--ena_metadata_fields` parameter. The default list of fields used by the pipeline can be found at the top of the [`bin/sra_ids_to_runinfo.py`](https://github.com/nf-core/fetchngs/blob/master/bin/sra_ids_to_runinfo.py) script within the pipeline repo. However, this pipeline requires a minimal set of fields to download FastQ files i.e. `'run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5'`. A comprehensive list of accepted metadata fields can be obtained from the [ENA API](https://www.ebi.ac.uk/ena/portal/api/returnFields?dataPortal=ena&format=tsv&result=read_run]). From c2029b3f8a704175a0d4b1ef4b41fcf43bd483cf Mon Sep 17 00:00:00 2001 From: Daisy Wenyan Han <60151111+daisyhan97@users.noreply.github.com> Date: Fri, 15 Oct 2021 12:48:24 -0700 Subject: [PATCH 084/852] Add RegEx for SampleIDs --- lib/WorkflowSynapse.groovy | 53 ++++++++++++++++++++++++++++++++++++++ workflows/synapse.nf | 4 +-- 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/lib/WorkflowSynapse.groovy b/lib/WorkflowSynapse.groovy index 1ac249a1..d36d1e55 100755 --- a/lib/WorkflowSynapse.groovy +++ b/lib/WorkflowSynapse.groovy @@ -35,4 +35,57 @@ class WorkflowSynapse { " in a standardised manner when uploading data to Synapse.\n" + "===================================================================================" } + + // + // Obtain Sample ID from File Name + // + public static String getSampleID(input_file, pattern) { + + def sampleids = "" + + def filePattern = pattern.toString() + int p = filePattern.lastIndexOf('/') + if( p != -1 ) + filePattern = filePattern.substring(p+1) + + input_file.each { + String fileName = input_file.getFileName().toString() + + String indexOfWildcards = filePattern.findIndexOf { it=='*' || it=='?' } + String indexOfBrackets = filePattern.findIndexOf { it=='{' || it=='[' } + if( indexOfWildcards==-1 && indexOfBrackets==-1 ) { + if( fileName == filePattern ) + return actual.getSimpleName() + throw new IllegalArgumentException("Not a valid file pair globbing pattern: pattern=$filePattern file=$fileName") + } + + int groupCount = 0 + for( int i=0; i [ fastq.baseName.tokenize('_')[0], fastq ] } + .map { meta, fastq -> [ WorkflowSynapse.getSampleID( fastq , "*{1,2}*"), fastq ] } .groupTuple(sort: { it -> it.baseName }) .set { ch_fastq } SYNAPSE_GET .out .fastq - .map { meta, fastq -> [ fastq.baseName.tokenize('_')[0], meta.id ] } + .map { meta, fastq -> [ WorkflowSynapse.getSampleID( fastq , "*{1,2}*"), meta.id ] } .groupTuple() .join(ch_fastq) .map { id, synids, fastq -> From 6a4ae0aca6f266cb013140a789eefe831a4ffc2f Mon Sep 17 00:00:00 2001 From: Daisy Wenyan Han <60151111+daisyhan97@users.noreply.github.com> Date: Mon, 18 Oct 2021 16:06:28 -0700 Subject: [PATCH 085/852] Separate SRA/Synapse Docs --- README.md | 16 ++++++++++++---- docs/output.md | 51 ++++++++++++++++++++++++++++++++++++++++++++------ docs/usage.md | 33 ++++++++++++++++++++++++++------ 3 files changed, 84 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index cb60455e..889d4a87 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ ## Introduction -**nf-core/fetchngs** is a bioinformatics pipeline to fetch metadata and raw FastQ files from public databases. At present, the pipeline supports [SRA](https://www.ncbi.nlm.nih.gov/sra) / [ENA](https://www.ebi.ac.uk/ena/browser/home) / [DDBJ](https://www.ddbj.nig.ac.jp/index-e.html) / [GEO](https://www.ncbi.nlm.nih.gov/geo/) / [Synapse](https://www.synapse.org/#) ids (see [usage docs](https://nf-co.re/fetchngs/usage#introduction)). +**nf-core/fetchngs** is a bioinformatics pipeline to fetch metadata and raw FastQ files from both public and private databases. At present, the pipeline supports SRA / ENA / DDBJ / GEO / Synapse ids (see [usage docs](https://nf-co.re/fetchngs/usage#introduction)). The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. @@ -26,11 +26,19 @@ On release, automated continuous integration tests run the pipeline on a full-si Via a single file of ids, provided one-per-line (see [example input file](https://raw.githubusercontent.com/nf-core/test-datasets/rnaseq/samplesheet/public_database_ids.txt)) the pipeline performs the following steps: -1. Resolve database ids back to appropriate experiment-level ids and to be compatible with the [ENA API](https://ena-docs.readthedocs.io/en/latest/retrieval/programmatic-access.html), or appropriate database -2. Fetch extensive id metadata including direct download links to FastQ files via ENA API or appropriate database -3. Download FastQ files in parallel and perform `md5sum` check +**SRA / ENA / DDBJ / GEO Identifiers** +1. Resolve database ids back to appropriate experiment-level ids and to be compatible with the [ENA API](https://ena-docs.readthedocs.io/en/latest/retrieval/programmatic-access.html) +2. Fetch extensive id metadata including direct download links to FastQ files via ENA API +3. Download FastQ files in parallel via `curl` and perform `md5sum` check 4. Collate id metadata and paths to FastQ files in a single samplesheet +**Synapse Identifiers** +1. Resolve Synapse directory SynapseIDs to the SynapseIDs of the FastQ files contained, using the `synapse list` command. +2. Retrieve FastQ file metadata including FastQ file names, md5sums, etags, annotations, and data provenance via the `synapse show` command. +3. Download FastQ files in parallel via `synapse get` and perform `md5sum` check +4. Collate paths to FastQ files in a single samplesheet + +**Samplesheet Generation** The columns in the auto-created samplesheet can be tailored to be accepted out-of-the-box by selected nf-core pipelines, these currently include [nf-core/rnaseq](https://nf-co.re/rnaseq/usage#samplesheet-input) and the Illumina processing mode of [nf-core/viralrecon](https://nf-co.re/viralrecon/usage#illumina-samplesheet-format). You can use the `--nf_core_pipeline` parameter to customise this behaviour e.g. `--nf_core_pipeline rnaseq`. More pipelines will be supported in due course as we adopt and standardise samplesheet input across nf-core. ## Quick Start diff --git a/docs/output.md b/docs/output.md index 167c1f69..acc1d956 100644 --- a/docs/output.md +++ b/docs/output.md @@ -4,11 +4,11 @@ This document describes the output produced by the pipeline. The directories listed below will be created in the results directory after the pipeline has finished. All paths are relative to the top-level results directory. -## Pipeline overview +## SRA / ENA / DDBJ / GEO - Pipeline Overview The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using the following steps: -* [FastQ download](#fastq-download) - Download FastQ files via SRA / ENA / DDBJ / GEO / Synapse ids +* [FastQ download](#fastq-download) - Download FastQ files via SRA / ENA / DDBJ / GEO ids * [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution ### FastQ download @@ -19,18 +19,18 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d * `fastq/` * `*.fastq.gz`: Paired-end/single-end reads downloaded from the SRA / ENA / DDBJ / GEO. * `fastq/md5/` - * `*.md5`: Files containing `md5` sum for FastQ files downloaded from the ENA or appropriate database. + * `*.md5`: Files containing `md5` sum for FastQ files downloaded from the ENA. * `samplesheet/` * `samplesheet.csv`: Auto-created samplesheet with collated metadata and paths to downloaded FastQ files. * `id_mappings.csv`: File with selected fields that can be used to rename samples to more informative names; see [`--sample_mapping_fields`](https://nf-co.re/fetchngs/parameters#sample_mapping_fields) parameter to customise this behaviour. * `multiqc_config.yml`: [MultiQC](https://multiqc.info/docs/#bulk-sample-renaming) config file that can be passed to most nf-core pipelines via the `--multiqc_config` parameter for bulk renaming of sample names from database ids; [`--sample_mapping_fields`](https://nf-co.re/fetchngs/parameters#sample_mapping_fields) parameter to customise this behaviour. * `metadata/` - * `*.runinfo_ftp.tsv`: Re-formatted metadata file downloaded from the ENA or appropriate database. - * `*.runinfo.tsv`: Original metadata file downloaded from the ENA or appropriate database. + * `*.runinfo_ftp.tsv`: Re-formatted metadata file downloaded from the ENA. + * `*.runinfo.tsv`: Original metadata file downloaded from the ENA. -Please see the [usage documentation](https://nf-co.re/fetchngs/usage#introduction) for a list of supported public repository identifiers and how to provide them to the pipeline. The final sample information for `SRA`, `GEO`, `DDBJ`, and `ENA` identifiers is obtained from the ENA which provides direct download links for FastQ files as well as their associated md5sums. If download links exist, the files will be downloaded in parallel by FTP otherwise they will NOT be downloaded. This is intentional because the tools such as `parallel-fastq-dump`, `fasterq-dump`, `prefetch` etc require pre-existing configuration files in the users home directory which makes automation tricky across different platforms and containerisation. Sample information for `Synapse` identifiers are downloaded in parallel directly from the [Synapse](https://www.synapse.org/#) platform. A [configuration file](http://python-docs.synapse.org/build/html/Credentials.html#use-synapseconfig) containing valid login credentials is required for Synapse downloads. +Please see the [usage documentation](https://nf-co.re/fetchngs/usage#introduction) for a list of supported public repository identifiers and how to provide them to the pipeline. The final sample information for all identifiers is obtained from the ENA which provides direct download links for FastQ files as well as their associated md5sums. If download links exist, the files will be downloaded in parallel by FTP otherwise they will NOT be downloaded. This is intentional because the tools such as `parallel-fastq-dump`, `fasterq-dump`, `prefetch` etc require pre-existing configuration files in the users home directory which makes automation tricky across different platforms and containerisation. ### Pipeline information @@ -43,4 +43,43 @@ Please see the [usage documentation](https://nf-co.re/fetchngs/usage#introductio +## Synapse - Pipeline Overview + +The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using the following steps: + +* [FastQ download](#fastq-Download) - Download FastQ files via Synapse ids +* [Pipeline information](#pipeline-Information) - Report metrics generated during the workflow execution + +### FastQ Download + +
+Output files + +* `fastq/` + * `*.fastq.gz`: Paired-end/single-end reads downloaded from Synapse. +* `fastq/md5/` + * `*.md5`: Files containing `md5` sum for FastQ files downloaded from the Synapse platform. +* `samplesheet/` + * `samplesheet.csv`: Auto-created samplesheet with collated metadata and paths to downloaded FastQ files. +* `metadata/` + * `*.metadata.txt`: Original metadata file, generated using the `synapse show` command. + * `*.list.txt`: Original output of the `synapse list` command, containing the SynapseIDs, file version numbers, file names, and other file-specific data of the Synapse directory ID provided. + +
+ +Please see the [usage documentation](https://nf-co.re/fetchngs/usage#introduction) for detailed instructions on how to correctly provide Synapse IDs to the pipeline. FastQ files and corresponding sample information for `Synapse` identifiers are downloaded in parallel directly from the [Synapse](https://www.synapse.org/#) platform. A [configuration file](http://python-docs.synapse.org/build/html/Credentials.html#use-synapseconfig) containing valid login credentials is required for Synapse downloads. + +The final sample information for the FastQ files downloaded from `Synapse` is obtained from the file name itself. The file names are parsed according to the glob pattern `*{1,2}*`. This returns the sample name, presumed to be the longest possible string matching the glob pattern, with the fewest number of wildcard insertions. Further information on sample name parsing can be found in the [usage documentation](https://nf-co.re/fetchngs/usage#introduction). + +### Pipeline Information + +
+Output files + +* `pipeline_info/` + * Reports generated by Nextflow: `execution_report.html`, `execution_timeline.html`, `execution_trace.txt` and `pipeline_dag.dot`/`pipeline_dag.svg`. + * Reports generated by the pipeline: `pipeline_report.html`, `pipeline_report.txt` and `software_versions.tsv`. + +
+ [Nextflow](https://www.nextflow.io/docs/latest/tracing.html) provides excellent functionality for generating various reports relevant to the running and execution of the pipeline. This will allow you to troubleshoot errors with the running of the pipeline, and also provide you with other information such as launch commands, run times and resource usage. diff --git a/docs/usage.md b/docs/usage.md index e1a096f4..6e9787ad 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -6,7 +6,7 @@ ## Introduction -The pipeline has been set-up to automatically download and process the raw FastQ files from public repositories. Identifiers can be provided in a file, one-per-line via the `--input` parameter. Currently, the following types of example identifiers are supported: +The pipeline has been set-up to automatically download and process the raw FastQ files from both public and private repositories. Identifiers can be provided in a file, one-per-line via the `--input` parameter. Currently, the following types of example identifiers are supported: | `SRA` | `ENA` | `DDBJ` | `GEO` | `Synapse` | |--------------|--------------|--------------|------------|-------------| @@ -18,15 +18,13 @@ The pipeline has been set-up to automatically download and process the raw FastQ | SRA1068758 | ERA2420837 | DRA008156 | | | | PRJNA625551 | PRJEB37513 | PRJDB4176 | | | +**SRR / ERR / DRR Sample Identifiers** + If `SRR`/`ERR`/`DRR` run ids are provided then these will be resolved back to their appropriate `SRX`/`ERX`/`DRX` ids to be able to merge multiple runs from the same experiment. This is conceptually the same as merging multiple libraries sequenced from the same sample. The final sample information for all identifiers is obtained from the ENA which provides direct download links for FastQ files as well as their associated md5 sums. If download links exist, the files will be downloaded in parallel by FTP otherwise they will NOT be downloaded. This is intentional because tools such as `parallel-fastq-dump`, `fasterq-dump`, `prefetch` etc require pre-existing configuration files in the users home directory which makes automation tricky across different platforms and containerisation. We may add this functionality in later releases. -To download data from `Synapse`, the SynapseID of the directory containing all files to be downloaded should be provided. The directory ID will then be resolved to the SynapseIDs of the corresponding FastQ files, which are then downloaded in parellel using the `synapse get` command. In order to download data from Synapse, an account must be created and a user configuration file provided via the parameter `--synapse_config`. All Synapse metadata, annotations and provenance are also downloaded using the `synapse show` command, and are outputted to a separate metadata file. By default, only the md5sums, file sizes, etags, Synapse IDs, file names, and file versions are shown. - -As a bonus, the columns in the auto-created samplesheet can be tailored to be accepted out-of-the-box by selected nf-core pipelines, these currently include [nf-core/rnaseq](https://nf-co.re/rnaseq/usage#samplesheet-input) and the Illumina processing mode of [nf-core/viralrecon](https://nf-co.re/viralrecon/usage#illumina-samplesheet-format). You can use the `--nf_core_pipeline` parameter to customise this behaviour e.g. `--nf_core_pipeline rnaseq`. More pipelines will be supported in due course as we adopt and standardise samplesheet input across nf-core. It is highly recommended that you double-check that all of the identifiers you defined using `--input` are represented in the samplesheet. Also, public databases don't reliably hold information such as strandedness information so you may need to amend these entries too if for example your samplesheet was created by providing `--nf_core_pipeline rnaseq`. - -All of the sample metadata obtained from the ENA will be appended as additional columns to help you manually curate the samplesheet before you run the pipeline. You can customise the metadata fields that are appended to the samplesheet via the `--ena_metadata_fields` parameter. The default list of fields used by the pipeline can be found at the top of the [`bin/sra_ids_to_runinfo.py`](https://github.com/nf-core/fetchngs/blob/master/bin/sra_ids_to_runinfo.py) script within the pipeline repo. However, this pipeline requires a minimal set of fields to download FastQ files i.e. `'run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5'`. A comprehensive list of accepted metadata fields can be obtained from the [ENA API](https://www.ebi.ac.uk/ena/portal/api/returnFields?dataPortal=ena&format=tsv&result=read_run]). +All of the sample metadata obtained from the ENA will be appended as additional columns to help you manually curate the generated samplesheet before you run the pipeline. You can customise the metadata fields that are appended to the samplesheet via the `--ena_metadata_fields` parameter. The default list of fields used by the pipeline can be found at the top of the [`bin/sra_ids_to_runinfo.py`](https://github.com/nf-core/fetchngs/blob/master/bin/sra_ids_to_runinfo.py) script within the pipeline repo. However, this pipeline requires a minimal set of fields to download FastQ files i.e. `'run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5'`. A comprehensive list of accepted metadata fields can be obtained from the [ENA API](https://www.ebi.ac.uk/ena/portal/api/returnFields?dataPortal=ena&format=tsv&result=read_run]). If you have a GEO accession (found in the data availability section of published papers) you can directly download a text file containing the appropriate SRA ids to pass to the pipeline: @@ -36,6 +34,29 @@ If you have a GEO accession (found in the data availability section of published This downloads a text file called `SRR_Acc_List.txt` that can be directly provided to the pipeline e.g. `--input SRR_Acc_List.txt`. +**Synapse Sample Identifiers** + +[Synapse](https://www.synapse.org/#) is a collaborative research platform created by [Sage Bionetworks](https://sagebionetworks.org/). Its aim is to promote reproducible research and responsible data sharing throughout the biomedical community. To download data from `Synapse`, the SynapseID of the _directory_ containing all files to be downloaded should be provided. The SynapseID should be an eleven-character identifier, beginning with `syn`. + +This SynapseID will then be resolved to the SynapseIDs of the corresponding FastQ files contained within the directory. The individual FastQ files are then downloaded in parellel using the `synapse get` command. All Synapse metadata, annotations and provenance are also downloaded using the `synapse show` command, and are outputted to a separate metadata file. By default, only the md5sums, file sizes, etags, Synapse IDs, file names, and file versions are shown. + +In order to download data from Synapse, an account must be created and a user configuration file provided via the parameter `--synapse_config`. For more information about Synapse configuration, please see the [Synapse client configuration](https://help.synapse.org/docs/Client-Configuration.1985446156.html) documentation. + +The final sample information for the FastQ files used for samplesheet generation is obtained from the file name itself. The file names are parsed according to the glob pattern `*{1,2}*`, which returns the sample name, presumed to be the longest possible string matching the glob pattern, with the fewest number of wildcard insertions. + +
+Supported File Names + +* Files named `SRR493366_1.fastq` and `SRR493366_2.fastq` will have a sample name of `SRR493366` +* Files named `SRR_493_367_1.fastq` and `SRR_493_367_2.fastq` will have a sample name of `SRR_493_367` +* Files named `filename12_1.fastq` and `filename12_2.fastq` will have a sample name of `filename12` + +
+ +**Samplesheet Generation** + +As a bonus, the columns in the auto-created samplesheet can be tailored to be accepted out-of-the-box by selected nf-core pipelines, these currently include [nf-core/rnaseq](https://nf-co.re/rnaseq/usage#samplesheet-input) and the Illumina processing mode of [nf-core/viralrecon](https://nf-co.re/viralrecon/usage#illumina-samplesheet-format). You can use the `--nf_core_pipeline` parameter to customise this behaviour e.g. `--nf_core_pipeline rnaseq`. More pipelines will be supported in due course as we adopt and standardise samplesheet input across nf-core. It is highly recommended that you double-check that all of the identifiers you defined using `--input` are represented in the samplesheet. Also, public databases don't reliably hold information such as strandedness information so you may need to amend these entries too if for example your samplesheet was created by providing `--nf_core_pipeline rnaseq`. + ## Running the pipeline The typical command for running the pipeline is as follows: From 884dafa7b455fe29aa38f44fc5058c7c8a2ddc10 Mon Sep 17 00:00:00 2001 From: Daisy Wenyan Han <60151111+daisyhan97@users.noreply.github.com> Date: Mon, 18 Oct 2021 16:06:46 -0700 Subject: [PATCH 086/852] Change SampleName function name --- lib/WorkflowSynapse.groovy | 2 +- workflows/synapse.nf | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/WorkflowSynapse.groovy b/lib/WorkflowSynapse.groovy index d36d1e55..557d58bf 100755 --- a/lib/WorkflowSynapse.groovy +++ b/lib/WorkflowSynapse.groovy @@ -39,7 +39,7 @@ class WorkflowSynapse { // // Obtain Sample ID from File Name // - public static String getSampleID(input_file, pattern) { + public static String sampleNameFromFastQ(input_file, pattern) { def sampleids = "" diff --git a/workflows/synapse.nf b/workflows/synapse.nf index 1f535f60..82125050 100644 --- a/workflows/synapse.nf +++ b/workflows/synapse.nf @@ -101,14 +101,14 @@ workflow SYNAPSE { SYNAPSE_GET .out .fastq - .map { meta, fastq -> [ WorkflowSynapse.getSampleID( fastq , "*{1,2}*"), fastq ] } + .map { meta, fastq -> [ WorkflowSynapse.sampleNameFromFastQ( fastq , "*{1,2}*"), fastq ] } .groupTuple(sort: { it -> it.baseName }) .set { ch_fastq } SYNAPSE_GET .out .fastq - .map { meta, fastq -> [ WorkflowSynapse.getSampleID( fastq , "*{1,2}*"), meta.id ] } + .map { meta, fastq -> [ WorkflowSynapse.sampleNameFromFastQ( fastq , "*{1,2}*"), meta.id ] } .groupTuple() .join(ch_fastq) .map { id, synids, fastq -> From fc071ecc4306c87f0b2943b5c1c652002db00d67 Mon Sep 17 00:00:00 2001 From: Daisy Wenyan Han <60151111+daisyhan97@users.noreply.github.com> Date: Mon, 18 Oct 2021 16:25:26 -0700 Subject: [PATCH 087/852] Fix md --- README.md | 10 ++++++---- docs/usage.md | 6 +++--- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 889d4a87..312db468 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ ## Introduction -**nf-core/fetchngs** is a bioinformatics pipeline to fetch metadata and raw FastQ files from both public and private databases. At present, the pipeline supports SRA / ENA / DDBJ / GEO / Synapse ids (see [usage docs](https://nf-co.re/fetchngs/usage#introduction)). +**nf-core/fetchngs** is a bioinformatics pipeline to fetch metadata and raw FastQ files from both public and private databases. At present, the pipeline supports SRA / ENA / DDBJ / GEO / Synapse ids (see [usage docs](https://nf-co.re/fetchngs/usage#introduction)). The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. @@ -26,19 +26,21 @@ On release, automated continuous integration tests run the pipeline on a full-si Via a single file of ids, provided one-per-line (see [example input file](https://raw.githubusercontent.com/nf-core/test-datasets/rnaseq/samplesheet/public_database_ids.txt)) the pipeline performs the following steps: -**SRA / ENA / DDBJ / GEO Identifiers** +### SRA / ENA / DDBJ / GEO Identifiers + 1. Resolve database ids back to appropriate experiment-level ids and to be compatible with the [ENA API](https://ena-docs.readthedocs.io/en/latest/retrieval/programmatic-access.html) 2. Fetch extensive id metadata including direct download links to FastQ files via ENA API 3. Download FastQ files in parallel via `curl` and perform `md5sum` check 4. Collate id metadata and paths to FastQ files in a single samplesheet -**Synapse Identifiers** +### Synapse Identifiers + 1. Resolve Synapse directory SynapseIDs to the SynapseIDs of the FastQ files contained, using the `synapse list` command. 2. Retrieve FastQ file metadata including FastQ file names, md5sums, etags, annotations, and data provenance via the `synapse show` command. 3. Download FastQ files in parallel via `synapse get` and perform `md5sum` check 4. Collate paths to FastQ files in a single samplesheet -**Samplesheet Generation** +### Samplesheet Generation The columns in the auto-created samplesheet can be tailored to be accepted out-of-the-box by selected nf-core pipelines, these currently include [nf-core/rnaseq](https://nf-co.re/rnaseq/usage#samplesheet-input) and the Illumina processing mode of [nf-core/viralrecon](https://nf-co.re/viralrecon/usage#illumina-samplesheet-format). You can use the `--nf_core_pipeline` parameter to customise this behaviour e.g. `--nf_core_pipeline rnaseq`. More pipelines will be supported in due course as we adopt and standardise samplesheet input across nf-core. ## Quick Start diff --git a/docs/usage.md b/docs/usage.md index 6e9787ad..0b2bfa44 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -18,7 +18,7 @@ The pipeline has been set-up to automatically download and process the raw FastQ | SRA1068758 | ERA2420837 | DRA008156 | | | | PRJNA625551 | PRJEB37513 | PRJDB4176 | | | -**SRR / ERR / DRR Sample Identifiers** +### SRR / ERR / DRR Sample Identifiers If `SRR`/`ERR`/`DRR` run ids are provided then these will be resolved back to their appropriate `SRX`/`ERX`/`DRX` ids to be able to merge multiple runs from the same experiment. This is conceptually the same as merging multiple libraries sequenced from the same sample. @@ -34,7 +34,7 @@ If you have a GEO accession (found in the data availability section of published This downloads a text file called `SRR_Acc_List.txt` that can be directly provided to the pipeline e.g. `--input SRR_Acc_List.txt`. -**Synapse Sample Identifiers** +### Synapse Sample Identifiers [Synapse](https://www.synapse.org/#) is a collaborative research platform created by [Sage Bionetworks](https://sagebionetworks.org/). Its aim is to promote reproducible research and responsible data sharing throughout the biomedical community. To download data from `Synapse`, the SynapseID of the _directory_ containing all files to be downloaded should be provided. The SynapseID should be an eleven-character identifier, beginning with `syn`. @@ -53,7 +53,7 @@ The final sample information for the FastQ files used for samplesheet generation -**Samplesheet Generation** +### Samplesheet Generation As a bonus, the columns in the auto-created samplesheet can be tailored to be accepted out-of-the-box by selected nf-core pipelines, these currently include [nf-core/rnaseq](https://nf-co.re/rnaseq/usage#samplesheet-input) and the Illumina processing mode of [nf-core/viralrecon](https://nf-co.re/viralrecon/usage#illumina-samplesheet-format). You can use the `--nf_core_pipeline` parameter to customise this behaviour e.g. `--nf_core_pipeline rnaseq`. More pipelines will be supported in due course as we adopt and standardise samplesheet input across nf-core. It is highly recommended that you double-check that all of the identifiers you defined using `--input` are represented in the samplesheet. Also, public databases don't reliably hold information such as strandedness information so you may need to amend these entries too if for example your samplesheet was created by providing `--nf_core_pipeline rnaseq`. From 89ae0b7600cd46c53a29af0248867793ba46f09a Mon Sep 17 00:00:00 2001 From: Daisy Wenyan Han <60151111+daisyhan97@users.noreply.github.com> Date: Mon, 18 Oct 2021 16:27:11 -0700 Subject: [PATCH 088/852] Whitespace whitespace --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 312db468..209a239b 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,7 @@ Via a single file of ids, provided one-per-line (see [example input file](https: 4. Collate paths to FastQ files in a single samplesheet ### Samplesheet Generation + The columns in the auto-created samplesheet can be tailored to be accepted out-of-the-box by selected nf-core pipelines, these currently include [nf-core/rnaseq](https://nf-co.re/rnaseq/usage#samplesheet-input) and the Illumina processing mode of [nf-core/viralrecon](https://nf-co.re/viralrecon/usage#illumina-samplesheet-format). You can use the `--nf_core_pipeline` parameter to customise this behaviour e.g. `--nf_core_pipeline rnaseq`. More pipelines will be supported in due course as we adopt and standardise samplesheet input across nf-core. ## Quick Start From 3909540c682a1170d88d8e7777130e5a769f50b5 Mon Sep 17 00:00:00 2001 From: Daisy Wenyan Han <60151111+daisyhan97@users.noreply.github.com> Date: Tue, 19 Oct 2021 08:44:08 -0700 Subject: [PATCH 089/852] Remove md5sum check --- lib/WorkflowSynapse.groovy | 1 + modules/local/synapse_get.nf | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/WorkflowSynapse.groovy b/lib/WorkflowSynapse.groovy index 557d58bf..8a79c6a6 100755 --- a/lib/WorkflowSynapse.groovy +++ b/lib/WorkflowSynapse.groovy @@ -20,6 +20,7 @@ class WorkflowSynapse { meta["${category}|${entries[0]}"] = entries[1] } meta.id = meta['properties|id'] + meta.name = meta['properties|name'] meta.md5 = meta['File|md5'] return meta.findAll{ it.value != null } } diff --git a/modules/local/synapse_get.nf b/modules/local/synapse_get.nf index 1e959296..99985f48 100644 --- a/modules/local/synapse_get.nf +++ b/modules/local/synapse_get.nf @@ -36,8 +36,7 @@ process SYNAPSE_GET { $options.args \\ $meta.id - find ./ -type f -name "*.fastq.gz" -exec echo "${meta.md5} " {} \\; > ${meta.id}.md5 - md5sum -c ${meta.id}.md5 + echo "${meta.md5} \t ${meta.name}" > ${meta.id}.md5 cat <<-END_VERSIONS > versions.yml ${getProcessName(task.process)}: From fad83a8ba5d3ed75c334a6d09277fbc23020609e Mon Sep 17 00:00:00 2001 From: Daisy Wenyan Han <60151111+daisyhan97@users.noreply.github.com> Date: Tue, 19 Oct 2021 11:09:21 -0500 Subject: [PATCH 090/852] Syntax Edits Co-authored-by: Harshil Patel --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 209a239b..9bf7db8f 100644 --- a/README.md +++ b/README.md @@ -26,21 +26,21 @@ On release, automated continuous integration tests run the pipeline on a full-si Via a single file of ids, provided one-per-line (see [example input file](https://raw.githubusercontent.com/nf-core/test-datasets/rnaseq/samplesheet/public_database_ids.txt)) the pipeline performs the following steps: -### SRA / ENA / DDBJ / GEO Identifiers +### SRA / ENA / DDBJ / GEO ids 1. Resolve database ids back to appropriate experiment-level ids and to be compatible with the [ENA API](https://ena-docs.readthedocs.io/en/latest/retrieval/programmatic-access.html) 2. Fetch extensive id metadata including direct download links to FastQ files via ENA API 3. Download FastQ files in parallel via `curl` and perform `md5sum` check 4. Collate id metadata and paths to FastQ files in a single samplesheet -### Synapse Identifiers +### Synapse ids -1. Resolve Synapse directory SynapseIDs to the SynapseIDs of the FastQ files contained, using the `synapse list` command. -2. Retrieve FastQ file metadata including FastQ file names, md5sums, etags, annotations, and data provenance via the `synapse show` command. -3. Download FastQ files in parallel via `synapse get` and perform `md5sum` check +1. Resolve Synapse directory ids to their corresponding FastQ files ids via the `synapse list` command. +2. Retrieve FastQ file metadata including FastQ file names, md5sums, etags, annotations and other data provenance via the `synapse show` command. +3. Download FastQ files in parallel via `synapse get` 4. Collate paths to FastQ files in a single samplesheet -### Samplesheet Generation +### Samplesheet format The columns in the auto-created samplesheet can be tailored to be accepted out-of-the-box by selected nf-core pipelines, these currently include [nf-core/rnaseq](https://nf-co.re/rnaseq/usage#samplesheet-input) and the Illumina processing mode of [nf-core/viralrecon](https://nf-co.re/viralrecon/usage#illumina-samplesheet-format). You can use the `--nf_core_pipeline` parameter to customise this behaviour e.g. `--nf_core_pipeline rnaseq`. More pipelines will be supported in due course as we adopt and standardise samplesheet input across nf-core. From bf020ac1fc4528267e13b9de2f29b7e38893a281 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 19 Oct 2021 17:21:20 +0100 Subject: [PATCH 091/852] Update output.md --- docs/output.md | 34 +++++++++------------------------- 1 file changed, 9 insertions(+), 25 deletions(-) diff --git a/docs/output.md b/docs/output.md index acc1d956..575bd84f 100644 --- a/docs/output.md +++ b/docs/output.md @@ -4,14 +4,16 @@ This document describes the output produced by the pipeline. The directories listed below will be created in the results directory after the pipeline has finished. All paths are relative to the top-level results directory. -## SRA / ENA / DDBJ / GEO - Pipeline Overview +## Pipeline Overview -The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using the following steps: +The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using one of the following workflows: -* [FastQ download](#fastq-download) - Download FastQ files via SRA / ENA / DDBJ / GEO ids +* Download FastQ files and create samplesheet from: + 1. [SRA / ENA / DDBJ / GEO ids](#sra-ena-ddbj-geo-ids) + 2. [Synapse ids](#synapse-ids) * [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution -### FastQ download +### SRA / ENA / DDBJ / GEO ids
Output files @@ -32,25 +34,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d Please see the [usage documentation](https://nf-co.re/fetchngs/usage#introduction) for a list of supported public repository identifiers and how to provide them to the pipeline. The final sample information for all identifiers is obtained from the ENA which provides direct download links for FastQ files as well as their associated md5sums. If download links exist, the files will be downloaded in parallel by FTP otherwise they will NOT be downloaded. This is intentional because the tools such as `parallel-fastq-dump`, `fasterq-dump`, `prefetch` etc require pre-existing configuration files in the users home directory which makes automation tricky across different platforms and containerisation. -### Pipeline information - -
-Output files - -* `pipeline_info/` - * Reports generated by Nextflow: `execution_report.html`, `execution_timeline.html`, `execution_trace.txt` and `pipeline_dag.dot`/`pipeline_dag.svg`. - * Reports generated by the pipeline: `pipeline_report.html`, `pipeline_report.txt` and `software_versions.tsv`. - -
- -## Synapse - Pipeline Overview - -The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using the following steps: - -* [FastQ download](#fastq-Download) - Download FastQ files via Synapse ids -* [Pipeline information](#pipeline-Information) - Report metrics generated during the workflow execution - -### FastQ Download +### Synapse ids
Output files @@ -62,8 +46,8 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d * `samplesheet/` * `samplesheet.csv`: Auto-created samplesheet with collated metadata and paths to downloaded FastQ files. * `metadata/` - * `*.metadata.txt`: Original metadata file, generated using the `synapse show` command. - * `*.list.txt`: Original output of the `synapse list` command, containing the SynapseIDs, file version numbers, file names, and other file-specific data of the Synapse directory ID provided. + * `*.metadata.txt`: Original metadata file generated using the `synapse show` command. + * `*.list.txt`: Original output of the `synapse list` command, containing the Synapse ids, file version numbers, file names, and other file-specific data for the Synapse directory ID provided.
From 522cab37d805fa7afc08ae75071a6b9cf0277e89 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 19 Oct 2021 17:25:36 +0100 Subject: [PATCH 092/852] Update output.md --- docs/output.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/output.md b/docs/output.md index 575bd84f..510edaf0 100644 --- a/docs/output.md +++ b/docs/output.md @@ -4,15 +4,17 @@ This document describes the output produced by the pipeline. The directories listed below will be created in the results directory after the pipeline has finished. All paths are relative to the top-level results directory. -## Pipeline Overview +## Pipeline overview -The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using one of the following workflows: +The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data depending on the type of ids provided: * Download FastQ files and create samplesheet from: - 1. [SRA / ENA / DDBJ / GEO ids](#sra-ena-ddbj-geo-ids) + 1. [SRA / ENA / DDBJ / GEO ids](#sra--ena--ddbj--geo-ids) 2. [Synapse ids](#synapse-ids) * [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution +Please see the [usage documentation](https://nf-co.re/fetchngs/usage#introduction) for a list of supported public repository identifiers and how to provide them to the pipeline. + ### SRA / ENA / DDBJ / GEO ids
@@ -32,7 +34,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d
-Please see the [usage documentation](https://nf-co.re/fetchngs/usage#introduction) for a list of supported public repository identifiers and how to provide them to the pipeline. The final sample information for all identifiers is obtained from the ENA which provides direct download links for FastQ files as well as their associated md5sums. If download links exist, the files will be downloaded in parallel by FTP otherwise they will NOT be downloaded. This is intentional because the tools such as `parallel-fastq-dump`, `fasterq-dump`, `prefetch` etc require pre-existing configuration files in the users home directory which makes automation tricky across different platforms and containerisation. +The final sample information for all identifiers is obtained from the ENA which provides direct download links for FastQ files as well as their associated md5sums. If download links exist, the files will be downloaded in parallel by FTP otherwise they will NOT be downloaded. This is intentional because the tools such as `parallel-fastq-dump`, `fasterq-dump`, `prefetch` etc require pre-existing configuration files in the users home directory which makes automation tricky across different platforms and containerisation. ### Synapse ids @@ -51,7 +53,7 @@ Please see the [usage documentation](https://nf-co.re/fetchngs/usage#introductio
-Please see the [usage documentation](https://nf-co.re/fetchngs/usage#introduction) for detailed instructions on how to correctly provide Synapse IDs to the pipeline. FastQ files and corresponding sample information for `Synapse` identifiers are downloaded in parallel directly from the [Synapse](https://www.synapse.org/#) platform. A [configuration file](http://python-docs.synapse.org/build/html/Credentials.html#use-synapseconfig) containing valid login credentials is required for Synapse downloads. +FastQ files and corresponding sample information for `Synapse` identifiers are downloaded in parallel directly from the [Synapse](https://www.synapse.org/#) platform. A [configuration file](http://python-docs.synapse.org/build/html/Credentials.html#use-synapseconfig) containing valid login credentials is required for Synapse downloads. The final sample information for the FastQ files downloaded from `Synapse` is obtained from the file name itself. The file names are parsed according to the glob pattern `*{1,2}*`. This returns the sample name, presumed to be the longest possible string matching the glob pattern, with the fewest number of wildcard insertions. Further information on sample name parsing can be found in the [usage documentation](https://nf-co.re/fetchngs/usage#introduction). From 3b52a76f4bf343582c22d833f6017be1cf21614a Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 19 Oct 2021 17:32:29 +0100 Subject: [PATCH 093/852] Update usage.md --- docs/usage.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 0b2bfa44..2301a040 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -18,7 +18,7 @@ The pipeline has been set-up to automatically download and process the raw FastQ | SRA1068758 | ERA2420837 | DRA008156 | | | | PRJNA625551 | PRJEB37513 | PRJDB4176 | | | -### SRR / ERR / DRR Sample Identifiers +### SRR / ERR / DRR Sample ids If `SRR`/`ERR`/`DRR` run ids are provided then these will be resolved back to their appropriate `SRX`/`ERX`/`DRX` ids to be able to merge multiple runs from the same experiment. This is conceptually the same as merging multiple libraries sequenced from the same sample. @@ -34,11 +34,11 @@ If you have a GEO accession (found in the data availability section of published This downloads a text file called `SRR_Acc_List.txt` that can be directly provided to the pipeline e.g. `--input SRR_Acc_List.txt`. -### Synapse Sample Identifiers +### Synapse ids -[Synapse](https://www.synapse.org/#) is a collaborative research platform created by [Sage Bionetworks](https://sagebionetworks.org/). Its aim is to promote reproducible research and responsible data sharing throughout the biomedical community. To download data from `Synapse`, the SynapseID of the _directory_ containing all files to be downloaded should be provided. The SynapseID should be an eleven-character identifier, beginning with `syn`. +[Synapse](https://www.synapse.org/#) is a collaborative research platform created by [Sage Bionetworks](https://sagebionetworks.org/). Its aim is to promote reproducible research and responsible data sharing throughout the biomedical community. To download data from `Synapse`, the Synapse id of the _directory_ containing all files to be downloaded should be provided. The Synapse id should be an eleven-characters beginning with `syn`. -This SynapseID will then be resolved to the SynapseIDs of the corresponding FastQ files contained within the directory. The individual FastQ files are then downloaded in parellel using the `synapse get` command. All Synapse metadata, annotations and provenance are also downloaded using the `synapse show` command, and are outputted to a separate metadata file. By default, only the md5sums, file sizes, etags, Synapse IDs, file names, and file versions are shown. +This Synapse id will then be resolved to the Synapse id of the corresponding FastQ files contained within the directory. The individual FastQ files are then downloaded in parellel using the `synapse get` command. All Synapse metadata, annotations and data provenance are also downloaded using the `synapse show` command, and are outputted to a separate metadata file. By default, only the md5sums, file sizes, etags, Synapse ids, file names, and file versions are shown. In order to download data from Synapse, an account must be created and a user configuration file provided via the parameter `--synapse_config`. For more information about Synapse configuration, please see the [Synapse client configuration](https://help.synapse.org/docs/Client-Configuration.1985446156.html) documentation. @@ -53,7 +53,7 @@ The final sample information for the FastQ files used for samplesheet generation -### Samplesheet Generation +### Samplesheet format As a bonus, the columns in the auto-created samplesheet can be tailored to be accepted out-of-the-box by selected nf-core pipelines, these currently include [nf-core/rnaseq](https://nf-co.re/rnaseq/usage#samplesheet-input) and the Illumina processing mode of [nf-core/viralrecon](https://nf-co.re/viralrecon/usage#illumina-samplesheet-format). You can use the `--nf_core_pipeline` parameter to customise this behaviour e.g. `--nf_core_pipeline rnaseq`. More pipelines will be supported in due course as we adopt and standardise samplesheet input across nf-core. It is highly recommended that you double-check that all of the identifiers you defined using `--input` are represented in the samplesheet. Also, public databases don't reliably hold information such as strandedness information so you may need to amend these entries too if for example your samplesheet was created by providing `--nf_core_pipeline rnaseq`. From 8d4f321ffccce6593c4628a8f383f8bbafced0d3 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 19 Oct 2021 17:32:53 +0100 Subject: [PATCH 094/852] Update docs/output.md --- docs/output.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/output.md b/docs/output.md index 510edaf0..c292f563 100644 --- a/docs/output.md +++ b/docs/output.md @@ -57,7 +57,7 @@ FastQ files and corresponding sample information for `Synapse` identifiers are d The final sample information for the FastQ files downloaded from `Synapse` is obtained from the file name itself. The file names are parsed according to the glob pattern `*{1,2}*`. This returns the sample name, presumed to be the longest possible string matching the glob pattern, with the fewest number of wildcard insertions. Further information on sample name parsing can be found in the [usage documentation](https://nf-co.re/fetchngs/usage#introduction). -### Pipeline Information +### Pipeline information
Output files From aa54f0917f49971a44e99a7d057a795bc661ff82 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 19 Oct 2021 17:36:07 +0100 Subject: [PATCH 095/852] Update docs/usage.md --- docs/usage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/usage.md b/docs/usage.md index 2301a040..5040552b 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -18,7 +18,7 @@ The pipeline has been set-up to automatically download and process the raw FastQ | SRA1068758 | ERA2420837 | DRA008156 | | | | PRJNA625551 | PRJEB37513 | PRJDB4176 | | | -### SRR / ERR / DRR Sample ids +### SRR / ERR / DRR ids If `SRR`/`ERR`/`DRR` run ids are provided then these will be resolved back to their appropriate `SRX`/`ERX`/`DRX` ids to be able to merge multiple runs from the same experiment. This is conceptually the same as merging multiple libraries sequenced from the same sample. From e9303e6d4c6bdf3ff5a1b48a6bb73cec76feb61e Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 19 Oct 2021 17:37:10 +0100 Subject: [PATCH 096/852] Update output.md --- docs/output.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/output.md b/docs/output.md index c292f563..df7fec02 100644 --- a/docs/output.md +++ b/docs/output.md @@ -9,8 +9,8 @@ This document describes the output produced by the pipeline. The directories lis The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data depending on the type of ids provided: * Download FastQ files and create samplesheet from: - 1. [SRA / ENA / DDBJ / GEO ids](#sra--ena--ddbj--geo-ids) - 2. [Synapse ids](#synapse-ids) + 1. [SRA / ENA / DDBJ / GEO ids](#sra--ena--ddbj--geo-ids) + 2. [Synapse ids](#synapse-ids) * [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution Please see the [usage documentation](https://nf-co.re/fetchngs/usage#introduction) for a list of supported public repository identifiers and how to provide them to the pipeline. From 349224fb3fe2ac6fa7b264cf5f51044d69bf7321 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 20 Oct 2021 09:38:52 +0100 Subject: [PATCH 097/852] Update regex for DDBJ and synapse ids --- assets/schema_input.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/schema_input.json b/assets/schema_input.json index 224e5cf7..00c0d47f 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -8,7 +8,7 @@ "type": "array", "items": { "type": "string", - "pattern": "^[SEPG][RAS][RXSMPAJXE][EN]?[AB]?\\d{4,9}$", + "pattern": "^[SEPGDs][RASy][RXSMPAJXEn][END]?[AB]?\\d{4,9}$", "errorMessage": "Please provide a valid SRA, ENA, DDBJ or GEO identifier" } } From 756b598cd9800bc6c87f52cea06aaa50974420ad Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 20 Oct 2021 09:39:12 +0100 Subject: [PATCH 098/852] Add functions to check if SRA or Synapse ids have been provided --- lib/WorkflowMain.groovy | 60 ++++++++++++++++++++++++++++++++++------- 1 file changed, 50 insertions(+), 10 deletions(-) diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index f1804f51..6f1fcb2d 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -78,15 +78,55 @@ class WorkflowMain { } } - // Check input type - public static String getIdentifierType(workflow, params, log) { - def input_type = "" - params.input.eachLine { line -> - if (line.contains("syn")) { - input_type = "Synapse" - } else { - input_type = "SRA" - }} - return input_type + // Check if input ids are from the SRA + public static Boolean isSraId(input, log) { + def is_sra = false + def total_ids = 0 + def no_match_ids = [] + def pattern = /^[SEPGD][RAS][RXSMPAJXE][END]?[AB]?\d{4,9}$/ + input.eachLine { line -> + total_ids += 1 + def matcher = line =~ pattern + if (!matcher) { + no_match_ids << line + } + } + + def num_match = total_ids - no_match_ids.size() + if (num_match > 0) { + if (num_match == total_ids) { + is_sra = true + } else { + log.error "Mixture of ids provided via --input: ${no_match_ids.join(', ')}\nPlease provide either SRA / ENA / DDBJ / GEO or Synapse ids!" + System.exit(1) + } + } + return is_sra + } + + // Check if input ids are from the Synapse platform + public static Boolean isSynapseId(input, log) { + def is_synapse = false + def total_ids = 0 + def no_match_ids = [] + def pattern = /^syn\d{8}$/ + input.eachLine { line -> + total_ids += 1 + def matcher = line =~ pattern + if (!matcher) { + no_match_ids << line + } + } + + def num_match = total_ids - no_match_ids.size() + if (num_match > 0) { + if (num_match == total_ids) { + is_synapse = true + } else { + log.error "Mixture of ids provided via --input: ${no_match_ids.join(', ')}\nPlease provide either SRA / ENA / DDBJ / GEO or Synapse ids!" + System.exit(1) + } + } + return is_synapse } } From 68385ddcf173b22b2479c4e8948c87c9b4af65ae Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 20 Oct 2021 09:39:29 +0100 Subject: [PATCH 099/852] Auto-detect id type and invoke relevant workflow --- main.nf | 40 ++++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/main.nf b/main.nf index 0b76d9da..abb0d5fb 100644 --- a/main.nf +++ b/main.nf @@ -18,7 +18,18 @@ nextflow.enable.dsl = 2 */ WorkflowMain.initialise(workflow, params, log) -input_type = WorkflowMain.getIdentifierType(workflow, params, log) + +// Check if --input file is empty +ch_input = file(params.input, checkIfExists: true) +if (ch_input.isEmpty()) {exit 1, "File provided with --input is empty: ${ch_input.getName()}!"} + +// Read in ids from --input file +Channel + .from(file(params.input, checkIfExists: true)) + .splitCsv(header:false, sep:'', strip:true) + .map { it[0] } + .unique() + .set { ch_ids } /* ======================================================================================== @@ -26,10 +37,15 @@ input_type = WorkflowMain.getIdentifierType(workflow, params, log) ======================================================================================== */ -if (input_type == 'Synapse') { +def id_type = '' +if (WorkflowMain.isSraId(ch_input, log)) { + id_type = 'sra' + include { SRA } from './workflows/sra' +} else if (WorkflowMain.isSynapseId(ch_input, log)) { + id_type = 'synapse' include { SYNAPSE } from './workflows/synapse' } else { - include { SRA } from './workflows/sra' + exit 1, 'Ids provided via --input not recognised please make sure they are either SRA / ENA / DDBJ / GEO or Synapse ids!' } // @@ -37,14 +53,18 @@ if (input_type == 'Synapse') { // workflow NFCORE_FETCHNGS { - // Workflow for SynapseIDs - if (input_type == 'Synapse') { - SYNAPSE () - } else { - // Workflow for SRA/ENA/GEO IDs - SRA () - } + // + // WORKFLOW: Download FastQ files for SRA / ENA / DDBJ / GEO ids + // + if (id_type == 'sra') { + SRA ( ch_ids ) + // + // WORKFLOW: Download FastQ files for Synapse ids + // + } else if (id_type == 'synapse') { + SYNAPSE ( ch_ids ) + } } /* From fe3c09742de5758fbf645d88ec096810c83f9798 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 20 Oct 2021 09:39:54 +0100 Subject: [PATCH 100/852] Pass input ids as a channel directly to workflows --- workflows/sra.nf | 14 +++++--------- workflows/synapse.nf | 14 +++++--------- 2 files changed, 10 insertions(+), 18 deletions(-) diff --git a/workflows/sra.nf b/workflows/sra.nf index 835bd874..dd8e13df 100644 --- a/workflows/sra.nf +++ b/workflows/sra.nf @@ -13,14 +13,6 @@ def summary_params = NfcoreSchema.paramsSummaryMap(workflow, params) // Validate input parameters WorkflowSra.initialise(params, log, valid_params) -// Read in ids from --input file -Channel - .from(file(params.input, checkIfExists: true)) - .splitCsv(header:false, sep:'', strip:true) - .map { it[0] } - .unique() - .set { ch_ids } - /* ======================================================================================== IMPORT LOCAL MODULES/SUBWORKFLOWS @@ -53,13 +45,17 @@ include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/ workflow SRA { + take: + ids // channel: [ ids ] + + main: ch_versions = Channel.empty() // // MODULE: Get SRA run information for public database ids // SRA_IDS_TO_RUNINFO ( - ch_ids, + ids, params.ena_metadata_fields ?: '' ) ch_versions = ch_versions.mix(SRA_IDS_TO_RUNINFO.out.versions.first()) diff --git a/workflows/synapse.nf b/workflows/synapse.nf index 3d993789..b308372e 100644 --- a/workflows/synapse.nf +++ b/workflows/synapse.nf @@ -6,14 +6,6 @@ def summary_params = NfcoreSchema.paramsSummaryMap(workflow, params) -// Read in ids from --input file -Channel - .from(file(params.input, checkIfExists: true)) - .splitCsv(header:false, sep:'', strip:true) - .map { it[0] } - .unique() - .set { ch_ids } - // Create channel for synapse config if (params.synapse_config) { ch_synapse_config = file(params.synapse_config, checkIfExists: true) @@ -52,13 +44,17 @@ include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/ workflow SYNAPSE { + take: + ids // channel: [ ids ] + + main: ch_versions = Channel.empty() // // MODULE: Expand synapse ids for individual FastQ files // SYNAPSE_LIST ( - ch_ids, + ids, ch_synapse_config ) ch_versions = ch_versions.mix(SYNAPSE_LIST.out.versions.first()) From 153d1ab92e342c75501ae04c5719af4e889c5b76 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 20 Oct 2021 09:41:33 +0100 Subject: [PATCH 101/852] Tweak comments --- main.nf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/main.nf b/main.nf index abb0d5fb..98b25cb1 100644 --- a/main.nf +++ b/main.nf @@ -37,6 +37,7 @@ Channel ======================================================================================== */ +// Auto-detect id type def id_type = '' if (WorkflowMain.isSraId(ch_input, log)) { id_type = 'sra' @@ -49,7 +50,7 @@ if (WorkflowMain.isSraId(ch_input, log)) { } // -// WORKFLOW: Run main nf-core/fetchngs analysis pipeline, depending on type of dentifier provided +// WORKFLOW: Run main nf-core/fetchngs analysis pipeline depending on type of identifier provided // workflow NFCORE_FETCHNGS { From b7a86fd8b066ecd2313a95e2fe76c44e3c014b14 Mon Sep 17 00:00:00 2001 From: "Moritz E. Beber" Date: Mon, 18 Oct 2021 13:33:49 +0200 Subject: [PATCH 102/852] refactor: make curl retry with exponential back-off --- modules/local/sra_fastq_ftp.nf | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/modules/local/sra_fastq_ftp.nf b/modules/local/sra_fastq_ftp.nf index 39d3659d..713a9f81 100644 --- a/modules/local/sra_fastq_ftp.nf +++ b/modules/local/sra_fastq_ftp.nf @@ -30,7 +30,10 @@ process SRA_FASTQ_FTP { script: if (meta.single_end) { """ - bash -c 'until curl $options.args -L ${fastq[0]} -o ${meta.id}.fastq.gz; do sleep 1; done'; + curl $options.args \\ + --retry 5 \\ + -L ${fastq[0]} \\ + -o ${meta.id}.fastq.gz echo "${meta.md5_1} ${meta.id}.fastq.gz" > ${meta.id}.fastq.gz.md5 md5sum -c ${meta.id}.fastq.gz.md5 @@ -42,12 +45,18 @@ process SRA_FASTQ_FTP { """ } else { """ - bash -c 'until curl $options.args -L ${fastq[0]} -o ${meta.id}_1.fastq.gz; do sleep 1; done'; + curl $options.args \\ + --retry 5 \\ + -L ${fastq[0]} \\ + -o ${meta.id}_1.fastq.gz echo "${meta.md5_1} ${meta.id}_1.fastq.gz" > ${meta.id}_1.fastq.gz.md5 md5sum -c ${meta.id}_1.fastq.gz.md5 - bash -c 'until curl $options.args -L ${fastq[1]} -o ${meta.id}_2.fastq.gz; do sleep 1; done'; + curl $options.args \\ + --retry 5 \\ + -L ${fastq[1]} \\ + -o ${meta.id}_2.fastq.gz echo "${meta.md5_2} ${meta.id}_2.fastq.gz" > ${meta.id}_2.fastq.gz.md5 md5sum -c ${meta.id}_2.fastq.gz.md5 From fc5200ceb5be32de249608e05210ea86b759736a Mon Sep 17 00:00:00 2001 From: "Moritz E. Beber" Date: Mon, 18 Oct 2021 15:27:50 +0200 Subject: [PATCH 103/852] refactor: report curl version instead of sed --- modules/local/sra_fastq_ftp.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/local/sra_fastq_ftp.nf b/modules/local/sra_fastq_ftp.nf index 713a9f81..ce08d602 100644 --- a/modules/local/sra_fastq_ftp.nf +++ b/modules/local/sra_fastq_ftp.nf @@ -40,7 +40,7 @@ process SRA_FASTQ_FTP { cat <<-END_VERSIONS > versions.yml ${getProcessName(task.process)}: - sed: \$(echo \$(sed --version 2>&1) | sed 's/^.*GNU sed) //; s/ .*\$//') + curl: \$(echo \$(curl --version | head -n 1 | sed 's/^curl //; s/ .*\$//')) END_VERSIONS """ } else { @@ -63,7 +63,7 @@ process SRA_FASTQ_FTP { cat <<-END_VERSIONS > versions.yml ${getProcessName(task.process)}: - sed: \$(echo \$(sed --version 2>&1) | sed 's/^.*GNU sed) //; s/ .*\$//') + curl: \$(echo \$(curl --version | head -n 1 | sed 's/^curl //; s/ .*\$//')) END_VERSIONS """ } From 1336b06ce12aad19a50535fe51fa0779dddd5bb2 Mon Sep 17 00:00:00 2001 From: "Moritz E. Beber" Date: Fri, 22 Oct 2021 21:50:31 +0200 Subject: [PATCH 104/852] refactor: move retry to module options args --- conf/modules.config | 2 +- modules/local/sra_fastq_ftp.nf | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 0d44e9ee..5824a876 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -33,7 +33,7 @@ params { 'sra_fastq_ftp' { publish_dir = 'fastq' publish_files = ['fastq.gz':'', 'md5':'md5'] - args = '-C - --max-time 1200' + args = '--retry 5 --continue-at - --max-time 1200' } 'sra_to_samplesheet' { publish_dir = 'samplesheet' diff --git a/modules/local/sra_fastq_ftp.nf b/modules/local/sra_fastq_ftp.nf index ce08d602..8d5adc2f 100644 --- a/modules/local/sra_fastq_ftp.nf +++ b/modules/local/sra_fastq_ftp.nf @@ -31,7 +31,6 @@ process SRA_FASTQ_FTP { if (meta.single_end) { """ curl $options.args \\ - --retry 5 \\ -L ${fastq[0]} \\ -o ${meta.id}.fastq.gz @@ -46,7 +45,6 @@ process SRA_FASTQ_FTP { } else { """ curl $options.args \\ - --retry 5 \\ -L ${fastq[0]} \\ -o ${meta.id}_1.fastq.gz @@ -54,7 +52,6 @@ process SRA_FASTQ_FTP { md5sum -c ${meta.id}_1.fastq.gz.md5 curl $options.args \\ - --retry 5 \\ -L ${fastq[1]} \\ -o ${meta.id}_2.fastq.gz From 1acd7ea2f15e91da33c56195204758ca44866b9f Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 24 Oct 2021 01:41:42 +0100 Subject: [PATCH 105/852] Apply suggestions from code review --- modules/local/sra_fastq_ftp.nf | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/local/sra_fastq_ftp.nf b/modules/local/sra_fastq_ftp.nf index 8d5adc2f..cccdd8ac 100644 --- a/modules/local/sra_fastq_ftp.nf +++ b/modules/local/sra_fastq_ftp.nf @@ -30,7 +30,8 @@ process SRA_FASTQ_FTP { script: if (meta.single_end) { """ - curl $options.args \\ + curl \\ + $options.args \\ -L ${fastq[0]} \\ -o ${meta.id}.fastq.gz @@ -44,14 +45,16 @@ process SRA_FASTQ_FTP { """ } else { """ - curl $options.args \\ + curl \\ + $options.args \\ -L ${fastq[0]} \\ -o ${meta.id}_1.fastq.gz echo "${meta.md5_1} ${meta.id}_1.fastq.gz" > ${meta.id}_1.fastq.gz.md5 md5sum -c ${meta.id}_1.fastq.gz.md5 - curl $options.args \\ + curl \\ + $options.args \\ -L ${fastq[1]} \\ -o ${meta.id}_2.fastq.gz From e4e1d4f6d4910083e684ab07680547d4b7950c2c Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 24 Oct 2021 01:48:25 +0100 Subject: [PATCH 106/852] Change contributors section --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9bf7db8f..43dcf30d 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,7 @@ The nf-core/fetchngs pipeline comes with documentation about the pipeline [usage ## Credits -nf-core/fetchngs was originally written by Harshil Patel ([@drpatelh](https://github.com/drpatelh)) from [The Bioinformatics & Biostatistics Group](https://www.crick.ac.uk/research/science-technology-platforms/bioinformatics-and-biostatistics/) at [The Francis Crick Institute, London](https://www.crick.ac.uk/) and Jose Espinosa-Carrasco ([@JoseEspinosa](https://github.com/JoseEspinosa)) from [The Comparative Bioinformatics Group](https://www.crg.eu/en/cedric_notredame) at [The Centre for Genomic Regulation, Spain](https://www.crg.eu/). +nf-core/fetchngs was originally written by Harshil Patel ([@drpatelh](https://github.com/drpatelh)) from [Seqera Labs, Spain](https://seqera.io/) and Jose Espinosa-Carrasco ([@JoseEspinosa](https://github.com/JoseEspinosa)) from [The Comparative Bioinformatics Group](https://www.crg.eu/en/cedric_notredame) at [The Centre for Genomic Regulation, Spain](https://www.crg.eu/). ## Contributions and Support From 1a01b8ccd846e6e010920b46f54032637dcc97ff Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 24 Oct 2021 01:50:44 +0100 Subject: [PATCH 107/852] Simplify matcher logic --- lib/WorkflowMain.groovy | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index 6f1fcb2d..d5814c09 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -86,8 +86,7 @@ class WorkflowMain { def pattern = /^[SEPGD][RAS][RXSMPAJXE][END]?[AB]?\d{4,9}$/ input.eachLine { line -> total_ids += 1 - def matcher = line =~ pattern - if (!matcher) { + if (!(line =~ pattern)) { no_match_ids << line } } @@ -112,8 +111,7 @@ class WorkflowMain { def pattern = /^syn\d{8}$/ input.eachLine { line -> total_ids += 1 - def matcher = line =~ pattern - if (!matcher) { + if (!(line =~ pattern)) { no_match_ids << line } } From c133d36a27c7bbe697da50fa56fb0ad6f9cf27db Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 24 Oct 2021 01:59:32 +0100 Subject: [PATCH 108/852] Use better and more concise regex for ids --- assets/schema_input.json | 2 +- lib/WorkflowMain.groovy | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/schema_input.json b/assets/schema_input.json index 00c0d47f..25006d9b 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -8,7 +8,7 @@ "type": "array", "items": { "type": "string", - "pattern": "^[SEPGDs][RASy][RXSMPAJXEn][END]?[AB]?\\d{4,9}$", + "pattern":"^(((SR|ER|DR)[APRSX])|(SAM(N|EA|D))|(PRJ(NA|EB|DB))|(GS[EM])|(syn))(\\d+)$", "errorMessage": "Please provide a valid SRA, ENA, DDBJ or GEO identifier" } } diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index d5814c09..09264303 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -83,7 +83,7 @@ class WorkflowMain { def is_sra = false def total_ids = 0 def no_match_ids = [] - def pattern = /^[SEPGD][RAS][RXSMPAJXE][END]?[AB]?\d{4,9}$/ + def pattern = /^(((SR|ER|DR)[APRSX])|(SAM(N|EA|D))|(PRJ(NA|EB|DB))|(GS[EM]))(\d+)$/ input.eachLine { line -> total_ids += 1 if (!(line =~ pattern)) { From b8398ef6983a8ccd4cc09c79afb8561c6eea869b Mon Sep 17 00:00:00 2001 From: "Moritz E. Beber" Date: Sat, 16 Oct 2021 14:19:59 +0200 Subject: [PATCH 109/852] chore: install prefetch module --- modules.json | 3 + .../modules/sratools/prefetch/functions.nf | 78 +++++++++++++++++++ .../nf-core/modules/sratools/prefetch/main.nf | 50 ++++++++++++ .../modules/sratools/prefetch/meta.yml | 43 ++++++++++ 4 files changed, 174 insertions(+) create mode 100644 modules/nf-core/modules/sratools/prefetch/functions.nf create mode 100644 modules/nf-core/modules/sratools/prefetch/main.nf create mode 100644 modules/nf-core/modules/sratools/prefetch/meta.yml diff --git a/modules.json b/modules.json index ff841d00..38d23a23 100644 --- a/modules.json +++ b/modules.json @@ -5,6 +5,9 @@ "nf-core/modules": { "custom/dumpsoftwareversions": { "git_sha": "84f2302920078b0cf7716b2a2e5fcc0be5c4531d" + }, + "sratools/prefetch": { + "git_sha": "07c0830057cc655de113d84499c7c1499460bb55" } } } diff --git a/modules/nf-core/modules/sratools/prefetch/functions.nf b/modules/nf-core/modules/sratools/prefetch/functions.nf new file mode 100644 index 00000000..85628ee0 --- /dev/null +++ b/modules/nf-core/modules/sratools/prefetch/functions.nf @@ -0,0 +1,78 @@ +// +// Utility functions used in nf-core DSL2 module files +// + +// +// Extract name of software tool from process name using $task.process +// +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +// +// Extract name of module from process name using $task.process +// +def getProcessName(task_process) { + return task_process.tokenize(':')[-1] +} + +// +// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules +// +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.args3 = args.args3 ?: '' + options.publish_by_meta = args.publish_by_meta ?: [] + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files + options.suffix = args.suffix ?: '' + return options +} + +// +// Tidy up and join elements of a list to return a path string +// +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +// +// Function to save/publish module results +// +def saveFiles(Map args) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + + // Do not publish versions.yml unless running from pytest workflow + if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { + return null + } + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] + } + path = path instanceof String ? path : '' + path_list.add(path) + } + } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" + } +} diff --git a/modules/nf-core/modules/sratools/prefetch/main.nf b/modules/nf-core/modules/sratools/prefetch/main.nf new file mode 100644 index 00000000..207d1e10 --- /dev/null +++ b/modules/nf-core/modules/sratools/prefetch/main.nf @@ -0,0 +1,50 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' + +params.options = [:] +options = initOptions(params.options) + +process SRATOOLS_PREFETCH { + tag "$id" + label 'process_low' + label 'error_retry' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } + + conda (params.enable_conda ? 'bioconda::sra-tools=2.11.0' : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container 'https://depot.galaxyproject.org/singularity/sra-tools:2.11.0--pl5262h314213e_0' + } else { + container 'quay.io/biocontainers/sra-tools:2.11.0--pl5262h314213e_0' + } + + input: + tuple val(meta), val(id) + + output: + tuple val(meta), path("$id"), emit: sra + path "versions.yml" , emit: versions + + script: + def config = "/LIBS/GUID = \"${UUID.randomUUID().toString()}\"\\n/libs/cloud/report_instance_identity = \"true\"\\n" + """ + eval "\$(vdb-config -o n NCBI_SETTINGS | sed 's/[" ]//g')" + if [[ ! -f "\${NCBI_SETTINGS}" ]]; then + mkdir -p "\$(dirname "\${NCBI_SETTINGS}")" + printf '${config}' > "\${NCBI_SETTINGS}" + fi + + prefetch \\ + $options.args \\ + --progress \\ + $id + + vdb-validate $id + + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + ${getSoftwareName(task.process)}: \$(prefetch --version 2>&1 | grep -Eo '[0-9.]+') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/sratools/prefetch/meta.yml b/modules/nf-core/modules/sratools/prefetch/meta.yml new file mode 100644 index 00000000..ab0a5ce5 --- /dev/null +++ b/modules/nf-core/modules/sratools/prefetch/meta.yml @@ -0,0 +1,43 @@ +name: sratools_prefetch +description: Download sequencing data from the NCBI Sequence Read Archive (SRA). +keywords: + - sequencing + - fastq + - prefetch +tools: + - sratools: + description: SRA Toolkit and SDK from NCBI + homepage: https://github.com/ncbi/sra-tools + documentation: https://github.com/ncbi/sra-tools/wiki + tool_dev_url: https://github.com/ncbi/sra-tools + licence: ['Public Domain'] + +input: + - meta: + type: map + description: > + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - id: + type: val + description: > + A string denoting an SRA id. + +output: + - meta: + type: map + description: > + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - sra: + type: directory + description: > + Directory containing the ETL data for the given SRA id. + pattern: "*/*.sra" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@Midnighter" From 8f665946b54633e4fc3024306152444c552e7954 Mon Sep 17 00:00:00 2001 From: "Moritz E. Beber" Date: Sat, 16 Oct 2021 14:23:14 +0200 Subject: [PATCH 110/852] chore: install fasterqdump module --- conf/modules.config | 3 + modules.json | 3 + .../modules/sratools/fasterqdump/functions.nf | 78 +++++++++++++++++++ .../modules/sratools/fasterqdump/main.nf | 58 ++++++++++++++ .../modules/sratools/fasterqdump/meta.yml | 42 ++++++++++ 5 files changed, 184 insertions(+) create mode 100644 modules/nf-core/modules/sratools/fasterqdump/functions.nf create mode 100644 modules/nf-core/modules/sratools/fasterqdump/main.nf create mode 100644 modules/nf-core/modules/sratools/fasterqdump/meta.yml diff --git a/conf/modules.config b/conf/modules.config index 5824a876..434a5c59 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -35,6 +35,9 @@ params { publish_files = ['fastq.gz':'', 'md5':'md5'] args = '--retry 5 --continue-at - --max-time 1200' } + 'sratools/fasterqdump' { + publish_dir = 'fastq' + } 'sra_to_samplesheet' { publish_dir = 'samplesheet' publish_files = false diff --git a/modules.json b/modules.json index 38d23a23..f004808d 100644 --- a/modules.json +++ b/modules.json @@ -6,6 +6,9 @@ "custom/dumpsoftwareversions": { "git_sha": "84f2302920078b0cf7716b2a2e5fcc0be5c4531d" }, + "sratools/fasterqdump": { + "git_sha": "de997825de788fe2210db16d9426f10342a1ba1d" + }, "sratools/prefetch": { "git_sha": "07c0830057cc655de113d84499c7c1499460bb55" } diff --git a/modules/nf-core/modules/sratools/fasterqdump/functions.nf b/modules/nf-core/modules/sratools/fasterqdump/functions.nf new file mode 100644 index 00000000..85628ee0 --- /dev/null +++ b/modules/nf-core/modules/sratools/fasterqdump/functions.nf @@ -0,0 +1,78 @@ +// +// Utility functions used in nf-core DSL2 module files +// + +// +// Extract name of software tool from process name using $task.process +// +def getSoftwareName(task_process) { + return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() +} + +// +// Extract name of module from process name using $task.process +// +def getProcessName(task_process) { + return task_process.tokenize(':')[-1] +} + +// +// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules +// +def initOptions(Map args) { + def Map options = [:] + options.args = args.args ?: '' + options.args2 = args.args2 ?: '' + options.args3 = args.args3 ?: '' + options.publish_by_meta = args.publish_by_meta ?: [] + options.publish_dir = args.publish_dir ?: '' + options.publish_files = args.publish_files + options.suffix = args.suffix ?: '' + return options +} + +// +// Tidy up and join elements of a list to return a path string +// +def getPathFromList(path_list) { + def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries + paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes + return paths.join('/') +} + +// +// Function to save/publish module results +// +def saveFiles(Map args) { + def ioptions = initOptions(args.options) + def path_list = [ ioptions.publish_dir ?: args.publish_dir ] + + // Do not publish versions.yml unless running from pytest workflow + if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { + return null + } + if (ioptions.publish_by_meta) { + def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta + for (key in key_list) { + if (args.meta && key instanceof String) { + def path = key + if (args.meta.containsKey(key)) { + path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] + } + path = path instanceof String ? path : '' + path_list.add(path) + } + } + } + if (ioptions.publish_files instanceof Map) { + for (ext in ioptions.publish_files) { + if (args.filename.endsWith(ext.key)) { + def ext_list = path_list.collect() + ext_list.add(ext.value) + return "${getPathFromList(ext_list)}/$args.filename" + } + } + } else if (ioptions.publish_files == null) { + return "${getPathFromList(path_list)}/$args.filename" + } +} diff --git a/modules/nf-core/modules/sratools/fasterqdump/main.nf b/modules/nf-core/modules/sratools/fasterqdump/main.nf new file mode 100644 index 00000000..08ef9045 --- /dev/null +++ b/modules/nf-core/modules/sratools/fasterqdump/main.nf @@ -0,0 +1,58 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' + +params.options = [:] +options = initOptions(params.options) + +process SRATOOLS_FASTERQDUMP { + tag "$meta.id" + label 'process_medium' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } + + conda (params.enable_conda ? 'bioconda::sra-tools=2.11.0 conda-forge::pigz=2.6' : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container 'https://depot.galaxyproject.org/singularity/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:6a9ff0e76ec016c3d0d27e0c0d362339f2d787e6-0' + } else { + container 'quay.io/biocontainers/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:6a9ff0e76ec016c3d0d27e0c0d362339f2d787e6-0' + } + + input: + tuple val(meta), path(sra) + + output: + tuple val(meta), path(output), emit: reads + path "versions.yml" , emit: versions + + script: + def config = "/LIBS/GUID = \"${UUID.randomUUID().toString()}\"\\n/libs/cloud/report_instance_identity = \"true\"\\n" + // Paired-end data extracted by fasterq-dump (--split-3 the default) always creates + // *_1.fastq *_2.fastq files but sometimes also an additional *.fastq file + // for unpaired reads which we ignore here. + output = meta.single_end ? '*.fastq.gz' : '*_{1,2}.fastq.gz' + """ + eval "\$(vdb-config -o n NCBI_SETTINGS | sed 's/[" ]//g')" + if [[ ! -f "\${NCBI_SETTINGS}" ]]; then + mkdir -p "\$(dirname "\${NCBI_SETTINGS}")" + printf '${config}' > "\${NCBI_SETTINGS}" + fi + + fasterq-dump \\ + ${options.args} \\ + --threads $task.cpus \\ + ${sra.name} + + pigz \\ + ${options.args2} \\ + --no-name \\ + --processes $task.cpus \\ + *.fastq + + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + ${getSoftwareName(task.process)}: \$(fasterq-dump --version 2>&1 | grep -Eo '[0-9.]+') + pigz: \$( pigz --version 2>&1 | sed 's/pigz //g' ) + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/sratools/fasterqdump/meta.yml b/modules/nf-core/modules/sratools/fasterqdump/meta.yml new file mode 100644 index 00000000..ac61e71f --- /dev/null +++ b/modules/nf-core/modules/sratools/fasterqdump/meta.yml @@ -0,0 +1,42 @@ +name: sratools_fasterqdump +description: Extract sequencing reads in FASTQ format from a given NCBI Sequence Read Archive (SRA). +keywords: + - sequencing + - FASTQ + - dump +tools: + - sratools: + description: SRA Toolkit and SDK from NCBI + homepage: https://github.com/ncbi/sra-tools + documentation: https://github.com/ncbi/sra-tools/wiki + tool_dev_url: https://github.com/ncbi/sra-tools + licence: ['Public Domain'] + +input: + - meta: + type: map + description: > + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - sra: + type: directory + description: Directory containing ETL data for the given SRA. + pattern: "*/*.sra" + +output: + - meta: + type: map + description: > + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - reads: + type: file + description: Extracted FASTQ file or files if the sequencing reads are paired-end. + pattern: "*.fastq.gz" + +authors: + - "@Midnighter" From d999b7f7487b82d0c06fe6587c8d0b8aaaaa2818 Mon Sep 17 00:00:00 2001 From: "Moritz E. Beber" Date: Sat, 16 Oct 2021 14:44:26 +0200 Subject: [PATCH 111/852] feat: add sra-tools subworkflow --- conf/modules.config | 3 ++ subworkflows/local/sra_fastq/main.nf | 34 ++++++++++++++++++ subworkflows/local/sra_fastq/meta.yml | 36 ++++++++++++++++++++ subworkflows/local/sra_fastq/nextflow.config | 2 ++ workflows/sra.nf | 18 +++++----- 5 files changed, 83 insertions(+), 10 deletions(-) create mode 100644 subworkflows/local/sra_fastq/main.nf create mode 100644 subworkflows/local/sra_fastq/meta.yml create mode 100644 subworkflows/local/sra_fastq/nextflow.config diff --git a/conf/modules.config b/conf/modules.config index 434a5c59..e253262e 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -35,6 +35,9 @@ params { publish_files = ['fastq.gz':'', 'md5':'md5'] args = '--retry 5 --continue-at - --max-time 1200' } + 'sratools/prefetch' { + publish_dir = 'sra' + } 'sratools/fasterqdump' { publish_dir = 'fastq' } diff --git a/subworkflows/local/sra_fastq/main.nf b/subworkflows/local/sra_fastq/main.nf new file mode 100644 index 00000000..c6590b59 --- /dev/null +++ b/subworkflows/local/sra_fastq/main.nf @@ -0,0 +1,34 @@ +// +// Download FASTQ sequencing reads from the NCBI's Sequence Read Archive (SRA). +// + +params.prefetch_options = [:] +params.fasterqdump_options = [:] + +include { SRATOOLS_PREFETCH } from '../../../modules/nf-core/modules/sratools/prefetch/main' addParams( options: params.prefetch_options ) +include { SRATOOLS_FASTERQDUMP } from '../../../modules/nf-core/modules/sratools/fasterqdump/main' addParams( options: params.fasterqdump_options ) + +workflow SRA_FASTQ { + take: + sra_ids // channel: [ val(meta), val(id) ] + + main: + + ch_versions = Channel.empty() + + // + // Prefetch sequencing reads in SRA format. + // + SRATOOLS_PREFETCH ( sra_ids ) + ch_versions = ch_versions.mix( SRATOOLS_PREFETCH.out.versions.first() ) + + // + // Convert the SRA format into one or more compressed FASTQ files. + // + SRATOOLS_FASTERQDUMP ( SRATOOLS_PREFETCH.out.sra ) + ch_versions = ch_versions.mix( SRATOOLS_FASTERQDUMP.out.versions.first() ) + + emit: + reads = SRATOOLS_FASTERQDUMP.out.reads // channel: [ val(meta), [ reads ] ] + versions = ch_versions // channel: [ versions.yml ] +} diff --git a/subworkflows/local/sra_fastq/meta.yml b/subworkflows/local/sra_fastq/meta.yml new file mode 100644 index 00000000..146176ee --- /dev/null +++ b/subworkflows/local/sra_fastq/meta.yml @@ -0,0 +1,36 @@ +name: sra_fastq +description: Download FASTQ sequencing reads from the NCBI's Sequence Read Archive (SRA). +keywords: + - sequencing + - FASTQ + - prefetch + - dump +modules: + - sratools/prefetch + - sratools/fasterqdump +input: + - meta: + type: map + description: > + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - id: + type: string + description: > + SRA identifier. +output: + - meta: + type: map + description: > + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - reads: + type: file + description: Extracted FASTQ file or files if the sequencing reads are paired-end. + pattern: "*.fastq.gz" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - '@Midnighter' diff --git a/subworkflows/local/sra_fastq/nextflow.config b/subworkflows/local/sra_fastq/nextflow.config new file mode 100644 index 00000000..07448834 --- /dev/null +++ b/subworkflows/local/sra_fastq/nextflow.config @@ -0,0 +1,2 @@ +params.prefetch_options = [:] +params.fasterqdump_options = [:] diff --git a/workflows/sra.nf b/workflows/sra.nf index dd8e13df..efc08482 100644 --- a/workflows/sra.nf +++ b/workflows/sra.nf @@ -25,6 +25,7 @@ def modules = params.modules.clone() include { SRA_IDS_TO_RUNINFO } from '../modules/local/sra_ids_to_runinfo' addParams( options: modules['sra_ids_to_runinfo'] ) include { SRA_RUNINFO_TO_FTP } from '../modules/local/sra_runinfo_to_ftp' addParams( options: modules['sra_runinfo_to_ftp'] ) include { SRA_FASTQ_FTP } from '../modules/local/sra_fastq_ftp' addParams( options: modules['sra_fastq_ftp'] ) +include { SRA_FASTQ } from '../subworkflows/local/sra_fastq/main' addParams( prefetch_options: modules['sratools/prefetch'], fasterqdump_options: modules['sratools/fasterqdump'] ) include { SRA_TO_SAMPLESHEET } from '../modules/local/sra_to_samplesheet' addParams( options: modules['sra_to_samplesheet'], results_dir: modules['sra_fastq_ftp'].publish_dir ) include { SRA_MERGE_SAMPLESHEET } from '../modules/local/sra_merge_samplesheet' addParams( options: modules['sra_merge_samplesheet'] ) include { MULTIQC_MAPPINGS_CONFIG } from '../modules/local/multiqc_mappings_config' addParams( options: modules['multiqc_mappings_config'] ) @@ -90,11 +91,17 @@ workflow SRA { ) ch_versions = ch_versions.mix(SRA_FASTQ_FTP.out.versions.first()) + // SUBWORKFLOW: Download sequencing reads without FTP links using sra-tools. + SRA_FASTQ ( + ch_sra_reads.map { meta, reads -> if (!meta.fastq_1) [meta, meta.run_accession] } + ) + ch_versions = ch_versions.mix(SRA_FASTQ.out.versions.first()) + // // MODULE: Stage FastQ files downloaded by SRA together and auto-create a samplesheet // SRA_TO_SAMPLESHEET ( - SRA_FASTQ_FTP.out.fastq, + SRA_FASTQ_FTP.out.fastq.mix(SRA_FASTQ.out.reads), params.nf_core_pipeline ?: '', params.sample_mapping_fields ) @@ -117,15 +124,6 @@ workflow SRA { ) ch_versions = ch_versions.mix(MULTIQC_MAPPINGS_CONFIG.out.versions) } - - // - // If ids don't have a direct FTP download link write them to file for download outside of the pipeline - // - def no_ids_file = ["${params.outdir}", "${modules['sra_fastq_ftp'].publish_dir}", "IDS_NOT_DOWNLOADED.txt" ].join(File.separator) - ch_sra_reads - .map { meta, reads -> if (!meta.fastq_1) "${meta.id.split('_')[0..-2].join('_')}" } - .unique() - .collectFile(name: no_ids_file, sort: true, newLine: true) } // From b37bf865e6f2a2d02d502403261eb3a20e50ee96 Mon Sep 17 00:00:00 2001 From: "Moritz E. Beber" Date: Fri, 22 Oct 2021 22:03:28 +0200 Subject: [PATCH 112/852] refactor: rename module options keys --- conf/modules.config | 4 ++-- workflows/sra.nf | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index e253262e..534b8249 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -35,10 +35,10 @@ params { publish_files = ['fastq.gz':'', 'md5':'md5'] args = '--retry 5 --continue-at - --max-time 1200' } - 'sratools/prefetch' { + 'sratools_prefetch' { publish_dir = 'sra' } - 'sratools/fasterqdump' { + 'sratools_fasterqdump' { publish_dir = 'fastq' } 'sra_to_samplesheet' { diff --git a/workflows/sra.nf b/workflows/sra.nf index efc08482..b3d357e4 100644 --- a/workflows/sra.nf +++ b/workflows/sra.nf @@ -25,7 +25,7 @@ def modules = params.modules.clone() include { SRA_IDS_TO_RUNINFO } from '../modules/local/sra_ids_to_runinfo' addParams( options: modules['sra_ids_to_runinfo'] ) include { SRA_RUNINFO_TO_FTP } from '../modules/local/sra_runinfo_to_ftp' addParams( options: modules['sra_runinfo_to_ftp'] ) include { SRA_FASTQ_FTP } from '../modules/local/sra_fastq_ftp' addParams( options: modules['sra_fastq_ftp'] ) -include { SRA_FASTQ } from '../subworkflows/local/sra_fastq/main' addParams( prefetch_options: modules['sratools/prefetch'], fasterqdump_options: modules['sratools/fasterqdump'] ) +include { SRA_FASTQ } from '../subworkflows/local/sra_fastq/main' addParams( prefetch_options: modules['sratools_prefetch'], fasterqdump_options: modules['sratools_fasterqdump'] ) include { SRA_TO_SAMPLESHEET } from '../modules/local/sra_to_samplesheet' addParams( options: modules['sra_to_samplesheet'], results_dir: modules['sra_fastq_ftp'].publish_dir ) include { SRA_MERGE_SAMPLESHEET } from '../modules/local/sra_merge_samplesheet' addParams( options: modules['sra_merge_samplesheet'] ) include { MULTIQC_MAPPINGS_CONFIG } from '../modules/local/multiqc_mappings_config' addParams( options: modules['multiqc_mappings_config'] ) From 0d0ba2445ef918a5564f2f8b37fdf83b39cd62f6 Mon Sep 17 00:00:00 2001 From: "Moritz E. Beber" Date: Mon, 25 Oct 2021 16:11:49 +0200 Subject: [PATCH 113/852] refactor: make script accept missing fastq_ftp --- bin/sra_runinfo_to_ftp.py | 236 +++++++++++++++++++++++++------------- 1 file changed, 154 insertions(+), 82 deletions(-) diff --git a/bin/sra_runinfo_to_ftp.py b/bin/sra_runinfo_to_ftp.py index a6f02136..130007b6 100755 --- a/bin/sra_runinfo_to_ftp.py +++ b/bin/sra_runinfo_to_ftp.py @@ -1,107 +1,179 @@ #!/usr/bin/env python -import os -import sys -import errno + import argparse -import collections +import csv +import logging +import sys +from itertools import chain +from pathlib import Path + + +logger = logging.getLogger() + def parse_args(args=None): Description = "Create samplesheet with FTP download links and md5ums from sample information obtained via 'sra_ids_to_runinfo.py' script." - Epilog = 'Example usage: python sra_runinfo_to_ftp.py ' + Epilog = "Example usage: python sra_runinfo_to_ftp.py " parser = argparse.ArgumentParser(description=Description, epilog=Epilog) - parser.add_argument('FILES_IN', help="Comma-separated list of metadata file created from 'sra_ids_to_runinfo.py' script.") - parser.add_argument('FILE_OUT', help="Output file containing paths to download FastQ files along with their associated md5sums.") + parser.add_argument( + "files_in", + metavar="FILES_IN", + help="Comma-separated list of metadata file created from 'sra_ids_to_runinfo.py' script.", + ) + parser.add_argument( + "file_out", + metavar="FILE_OUT", + type=Path, + help="Output file containing paths to download FastQ files along with their associated md5sums.", + ) + parser.add_argument( + "-l", + "--log-level", + help="The desired log level (default WARNING).", + choices=("CRITICAL", "ERROR", "WARNING", "INFO", "DEBUG"), + default="WARNING", + ) return parser.parse_args(args) -def make_dir(path): - if not len(path) == 0: - try: - os.makedirs(path) - except OSError as exception: - if exception.errno != errno.EEXIST: - raise + +def valid_fastq_extension(fastq): + return fastq.endswith("fastq.gz") + def parse_sra_runinfo(file_in): - runinfo_dict = {} - with open(file_in, "r") as fin: - header = fin.readline().strip().split('\t') - for line in fin: - line_dict = dict(zip(header,line.strip().split('\t'))) - line_dict = collections.OrderedDict(list(line_dict.items())) - run_id = line_dict['run_accession'] - exp_id = line_dict['experiment_accession'] - library = line_dict['library_layout'] - fastq_files = line_dict['fastq_ftp'] - fastq_md5 = line_dict['fastq_md5'] - - db_id = exp_id - sample_dict = collections.OrderedDict() - if library == 'SINGLE': - sample_dict = collections.OrderedDict([('fastq_1',''), ('fastq_2',''), ('md5_1',''), ('md5_2',''), ('single_end','true')]) - if fastq_files: - sample_dict['fastq_1'] = fastq_files - sample_dict['md5_1'] = fastq_md5 + runinfo = {} + columns = [ + "run_accession", + "experiment_accession", + "library_layout", + "fastq_ftp", + "fastq_md5", + ] + extensions = [ + "fastq_1", + "fastq_2", + "md5_1", + "md5_2", + "single_end", + ] + with open(file_in, "r", newline="") as fin: + reader = csv.DictReader(fin, delimiter="\t", skipinitialspace=True) + header = list(reader.fieldnames) + if missing := frozenset(columns).difference(frozenset(header)): + logger.critical( + f"The following expected columns are missing from {file_in}: " + f"{', '.join(missing)}." + ) + sys.exit(1) + for row in reader: + db_id = row["experiment_accession"] + if row["fastq_ftp"]: + fq_files = row["fastq_ftp"].split(";")[-2:] + fq_md5 = row["fastq_md5"].split(";")[-2:] + if len(fq_files) == 1: + assert fq_files[0].endswith( + ".fastq.gz" + ), f"Unexpected FastQ file format {file_in.name}." + if row["library_layout"] != "SINGLE": + logger.warning( + f"The library layout '{row['library_layout']}' should be " + f"'SINGLE'." + ) + sample = { + "fastq_1": fq_files[0], + "fastq_2": None, + "md5_1": fq_md5[0], + "md5_2": None, + "single_end": "true", + } + elif len(fq_files) == 2: + assert fq_files[0].endswith( + "_1.fastq.gz" + ), f"Unexpected FastQ file format {file_in.name}." + assert fq_files[1].endswith( + "_2.fastq.gz" + ), f"Unexpected FastQ file format {file_in.name}." + if row["library_layout"] != "PAIRED": + logger.warning( + f"The library layout '{row['library_layout']}' should be " + f"'PAIRED'." + ) + sample = { + "fastq_1": fq_files[0], + "fastq_2": fq_files[1], + "md5_1": fq_md5[0], + "md5_2": fq_md5[1], + "single_end": "false", + } else: - ## In some instances FTP links don't exist for FastQ files - ## These have to be downloaded via fastq-dump / fasterq-dump / parallel-fastq-dump via the run id - db_id = run_id - - elif library == 'PAIRED': - sample_dict = collections.OrderedDict([('fastq_1',''), ('fastq_2',''), ('md5_1',''), ('md5_2',''), ('single_end','false')]) - if fastq_files: - fq_files = fastq_files.split(';')[-2:] - fq_md5 = fastq_md5.split(';')[-2:] - if len(fq_files) == 2: - if fq_files[0].find('_1.fastq.gz') != -1 and fq_files[1].find('_2.fastq.gz') != -1: - sample_dict['fastq_1'] = fq_files[0] - sample_dict['fastq_2'] = fq_files[1] - sample_dict['md5_1'] = fq_md5[0] - sample_dict['md5_2'] = fq_md5[1] - else: - print("Invalid FastQ files found for database id:'{}'!.".format(run_id)) - else: - print("Invalid number of FastQ files ({}) found for paired-end database id:'{}'!.".format(len(fq_files), run_id)) - else: - db_id = run_id + raise RuntimeError(f"Unexpected number of FastQ files: {fq_files}.") + else: + # In some instances, FTP links don't exist for FastQ files. + # These have to be downloaded with the run accession using sra-tools. + db_id = row["run_accession"] + sample = dict.fromkeys(extensions, None) + if row["library_layout"] == "SINGLE": + sample["single_end"] = "true" + elif row["library_layout"] == "PAIRED": + sample["single_end"] = "false" - if sample_dict: - sample_dict.update(line_dict) - if db_id not in runinfo_dict: - runinfo_dict[db_id] = [sample_dict] + sample.update(row) + if db_id not in runinfo: + runinfo[db_id] = [sample] + else: + if sample in runinfo[db_id]: + logger.error( + f"Input run info file contains duplicate rows!\n" + f"{', '.join([row[col] for col in header])}" + ) else: - if sample_dict in runinfo_dict[db_id]: - print("Input run info file contains duplicate rows!\nLine: '{}'".format(line)) - else: - runinfo_dict[db_id].append(sample_dict) + runinfo[db_id].append(sample) + + return runinfo, header + extensions - return runinfo_dict def sra_runinfo_to_ftp(files_in, file_out): - samplesheet_dict = {} + samplesheet = {} + header = [] for file_in in files_in: - runinfo_dict = parse_sra_runinfo(file_in) - for db_id in runinfo_dict.keys(): - if db_id not in samplesheet_dict: - samplesheet_dict[db_id] = runinfo_dict[db_id] + runinfo, sample_header = parse_sra_runinfo(file_in) + header.append(sample_header) + for db_id, rows in runinfo.items(): + if db_id not in samplesheet: + samplesheet[db_id] = rows else: - print("Duplicate sample identifier found!\nID: '{}'".format(db_id)) - - ## Write samplesheet with paths to FastQ files and md5 sums - if samplesheet_dict: - out_dir = os.path.dirname(file_out) - make_dir(out_dir) - with open(file_out, "w") as fout: - header = ['id'] + list(samplesheet_dict[list(samplesheet_dict.keys())[0]][0].keys()) - fout.write("\t".join(header) + "\n") - for db_id in sorted(samplesheet_dict.keys()): - for idx,val in enumerate(samplesheet_dict[db_id]): - fout.write('\t'.join(["{}_T{}".format(db_id,idx+1)] + [val[x] for x in header[1:]]) + '\n') + logger.warning(f"Duplicate sample identifier found!\nID: '{db_id}'") + + # Create a combined header from all input files. + combined_header = header[0] + list( + set().union(chain.from_iterable(header)).difference(header[0]) + ) + combined_header.insert(0, "id") + + # Write samplesheet with paths to FastQ files and md5 sums. + if samplesheet: + with file_out.open("w", newline="") as fout: + writer = csv.DictWriter(fout, fieldnames=combined_header, delimiter="\t") + writer.writeheader() + for db_id in sorted(samplesheet): + for idx, row in enumerate(samplesheet[db_id], start=1): + row["id"] = f"{db_id}_T{idx}" + writer.writerow(row) + def main(args=None): args = parse_args(args) - sra_runinfo_to_ftp([x.strip() for x in args.FILES_IN.split(',')], args.FILE_OUT) + logging.basicConfig(level=args.log_level, format="[%(levelname)s] %(message)s") + files = [Path(x.strip()) for x in args.files_in.split(",")] + for path in files: + if not path.is_file(): + logger.critical(f"The given input file {path} was not found!") + sys.exit(1) + args.file_out.parent.mkdir(parents=True, exist_ok=True) + sra_runinfo_to_ftp(files, args.file_out) + -if __name__ == '__main__': +if __name__ == "__main__": sys.exit(main()) From 8b5847a6a1e2e85c760c2f32c4307b3a4316ef9e Mon Sep 17 00:00:00 2001 From: "Moritz E. Beber" Date: Mon, 25 Oct 2021 16:21:31 +0200 Subject: [PATCH 114/852] feat: include SRA subworkflow --- workflows/sra.nf | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/workflows/sra.nf b/workflows/sra.nf index b3d357e4..530bf91a 100644 --- a/workflows/sra.nf +++ b/workflows/sra.nf @@ -69,6 +69,8 @@ workflow SRA { ) ch_versions = ch_versions.mix(SRA_RUNINFO_TO_FTP.out.versions.first()) + + SRA_RUNINFO_TO_FTP .out .tsv @@ -79,6 +81,10 @@ workflow SRA { [ meta, [ meta.fastq_1, meta.fastq_2 ] ] } .unique() + .branch { + ftp: it[0].fastq_1 + raw: !it[0].fastq_1 + } .set { ch_sra_reads } ch_versions = ch_versions.mix(SRA_RUNINFO_TO_FTP.out.versions.first()) @@ -87,13 +93,13 @@ workflow SRA { // MODULE: If FTP link is provided in run information then download FastQ directly via FTP and validate with md5sums // SRA_FASTQ_FTP ( - ch_sra_reads.map { meta, reads -> if (meta.fastq_1) [ meta, reads ] } + ch_sra_reads.ftp ) ch_versions = ch_versions.mix(SRA_FASTQ_FTP.out.versions.first()) // SUBWORKFLOW: Download sequencing reads without FTP links using sra-tools. SRA_FASTQ ( - ch_sra_reads.map { meta, reads -> if (!meta.fastq_1) [meta, meta.run_accession] } + ch_sra_reads.raw.map { meta, reads -> [ meta, meta.run_accession ] } ) ch_versions = ch_versions.mix(SRA_FASTQ.out.versions.first()) From 8deb5f18e287e7f7082315b699462570166c4b96 Mon Sep 17 00:00:00 2001 From: "Moritz E. Beber" Date: Mon, 25 Oct 2021 16:35:20 +0200 Subject: [PATCH 115/852] docs: add credits and usage --- README.md | 4 ++-- docs/usage.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 43dcf30d..b51867ed 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ Via a single file of ids, provided one-per-line (see [example input file](https: 1. Resolve database ids back to appropriate experiment-level ids and to be compatible with the [ENA API](https://ena-docs.readthedocs.io/en/latest/retrieval/programmatic-access.html) 2. Fetch extensive id metadata including direct download links to FastQ files via ENA API -3. Download FastQ files in parallel via `curl` and perform `md5sum` check +3. Download FastQ files in parallel via `curl` if available from FTP and perform `md5sum` check. Otherwise use sra-tools to download SRAs and convert them to FastQ. 4. Collate id metadata and paths to FastQ files in a single samplesheet ### Synapse ids @@ -72,7 +72,7 @@ The nf-core/fetchngs pipeline comes with documentation about the pipeline [usage ## Credits -nf-core/fetchngs was originally written by Harshil Patel ([@drpatelh](https://github.com/drpatelh)) from [Seqera Labs, Spain](https://seqera.io/) and Jose Espinosa-Carrasco ([@JoseEspinosa](https://github.com/JoseEspinosa)) from [The Comparative Bioinformatics Group](https://www.crg.eu/en/cedric_notredame) at [The Centre for Genomic Regulation, Spain](https://www.crg.eu/). +nf-core/fetchngs was originally written by Harshil Patel ([@drpatelh](https://github.com/drpatelh)) from [Seqera Labs, Spain](https://seqera.io/) and Jose Espinosa-Carrasco ([@JoseEspinosa](https://github.com/JoseEspinosa)) from [The Comparative Bioinformatics Group](https://www.crg.eu/en/cedric_notredame) at [The Centre for Genomic Regulation, Spain](https://www.crg.eu/). Support for download of sequencing reads without FTP links via sra-tools was added by Moritz E. Beber ([@Midnighter](https://github.com/Midnighter)) from [Unseen Bio ApS, Denmark](https://unseenbio.com). ## Contributions and Support diff --git a/docs/usage.md b/docs/usage.md index 5040552b..6af310a6 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -22,7 +22,7 @@ The pipeline has been set-up to automatically download and process the raw FastQ If `SRR`/`ERR`/`DRR` run ids are provided then these will be resolved back to their appropriate `SRX`/`ERX`/`DRX` ids to be able to merge multiple runs from the same experiment. This is conceptually the same as merging multiple libraries sequenced from the same sample. -The final sample information for all identifiers is obtained from the ENA which provides direct download links for FastQ files as well as their associated md5 sums. If download links exist, the files will be downloaded in parallel by FTP otherwise they will NOT be downloaded. This is intentional because tools such as `parallel-fastq-dump`, `fasterq-dump`, `prefetch` etc require pre-existing configuration files in the users home directory which makes automation tricky across different platforms and containerisation. We may add this functionality in later releases. +The final sample information for all identifiers is obtained from the ENA which provides direct download links for FastQ files as well as their associated md5 sums. If download links exist, the files will be downloaded in parallel by FTP. Otherwise they are downloaded using sra-tools. All of the sample metadata obtained from the ENA will be appended as additional columns to help you manually curate the generated samplesheet before you run the pipeline. You can customise the metadata fields that are appended to the samplesheet via the `--ena_metadata_fields` parameter. The default list of fields used by the pipeline can be found at the top of the [`bin/sra_ids_to_runinfo.py`](https://github.com/nf-core/fetchngs/blob/master/bin/sra_ids_to_runinfo.py) script within the pipeline repo. However, this pipeline requires a minimal set of fields to download FastQ files i.e. `'run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5'`. A comprehensive list of accepted metadata fields can be obtained from the [ENA API](https://www.ebi.ac.uk/ena/portal/api/returnFields?dataPortal=ena&format=tsv&result=read_run]). From 36753b3d91469c81926ed0cc5d89d84abc85e0bc Mon Sep 17 00:00:00 2001 From: "Moritz E. Beber" Date: Mon, 25 Oct 2021 16:37:03 +0200 Subject: [PATCH 116/852] chore: add changelog entry --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e9a0cb2..5c2178bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unpublished Version / DEV] +* Add support for run accessions not available on FTP via sra-tools. + ### Enhancements & fixes * Added a workflow to download FastQ files and to create samplesheets for ids from the [Synapse platform](https://www.synapse.org/) hosted by [Sage Bionetworks](https://sagebionetworks.org/). From 408f1bc0add9ce4d8c0aa987cbe8f5a6adf3fdf1 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 25 Oct 2021 16:49:30 +0100 Subject: [PATCH 117/852] Fix #46 --- CHANGELOG.md | 1 + bin/sra_ids_to_runinfo.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e9a0cb2..a03c0774 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * Added a workflow to download FastQ files and to create samplesheets for ids from the [Synapse platform](https://www.synapse.org/) hosted by [Sage Bionetworks](https://sagebionetworks.org/). * Handle SRA identifiers that do **not** return metadata, for example, due to being private. +* [[#46](https://github.com/nf-core/fetchngs/issues/46)] - Bug in sra_ids_to_runinfo.py * Added support for [DDBJ ids](https://www.ddbj.nig.ac.jp/index-e.html). See examples below: | `DDBJ` | diff --git a/bin/sra_ids_to_runinfo.py b/bin/sra_ids_to_runinfo.py index 0f81c125..bbd1e6f0 100755 --- a/bin/sra_ids_to_runinfo.py +++ b/bin/sra_ids_to_runinfo.py @@ -269,7 +269,7 @@ def _gse_to_srx(cls, identifier): gsm_ids = [ line.split("=")[1].strip() for line in response.text().splitlines() - if line.startswith("GSM") + if line.split('=')[1].strip().startswith('GSM') ] for gsm_id in gsm_ids: ids += cls._id_to_srx(gsm_id) From 0d82d986b699ce9c30b2c3e1b4407a53d58aa7c2 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 25 Oct 2021 17:21:31 +0100 Subject: [PATCH 118/852] Change default process requirements for sra_fastq_ftp.nf --- modules/local/sra_fastq_ftp.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/sra_fastq_ftp.nf b/modules/local/sra_fastq_ftp.nf index cccdd8ac..23ea5dd5 100644 --- a/modules/local/sra_fastq_ftp.nf +++ b/modules/local/sra_fastq_ftp.nf @@ -6,7 +6,7 @@ options = initOptions(params.options) process SRA_FASTQ_FTP { tag "$meta.id" - label 'process_medium' + label 'process_low' label 'error_retry' publishDir "${params.outdir}", mode: params.publish_dir_mode, From 8c6231ca0a5364514e79673cb447f96320de39d8 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 25 Oct 2021 22:58:47 +0100 Subject: [PATCH 119/852] Update CHANGELOG --- CHANGELOG.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 49d2c5f1..0153327e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,14 +3,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unpublished Version / DEV] - -* Add support for run accessions not available on FTP via sra-tools. +## [[1.4](https://github.com/nf-core/fetchngs/releases/tag/1.4)] - 2021-10-25 ### Enhancements & fixes * Added a workflow to download FastQ files and to create samplesheets for ids from the [Synapse platform](https://www.synapse.org/) hosted by [Sage Bionetworks](https://sagebionetworks.org/). -* Handle SRA identifiers that do **not** return metadata, for example, due to being private. +* SRA identifiers not available for direct download via the ENA FTP will now be downloaded via sra-tools. +* Correctly handle errors from SRA identifiers that do **not** return metadata, for example, due to being private. * [[#46](https://github.com/nf-core/fetchngs/issues/46)] - Bug in sra_ids_to_runinfo.py * Added support for [DDBJ ids](https://www.ddbj.nig.ac.jp/index-e.html). See examples below: From 5c910777374498f92fdaa5dd826893b804fe08db Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 25 Oct 2021 22:59:02 +0100 Subject: [PATCH 120/852] Update listing in README --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b51867ed..ff3829ef 100644 --- a/README.md +++ b/README.md @@ -29,8 +29,10 @@ Via a single file of ids, provided one-per-line (see [example input file](https: ### SRA / ENA / DDBJ / GEO ids 1. Resolve database ids back to appropriate experiment-level ids and to be compatible with the [ENA API](https://ena-docs.readthedocs.io/en/latest/retrieval/programmatic-access.html) -2. Fetch extensive id metadata including direct download links to FastQ files via ENA API -3. Download FastQ files in parallel via `curl` if available from FTP and perform `md5sum` check. Otherwise use sra-tools to download SRAs and convert them to FastQ. +2. Fetch extensive id metadata via ENA API +3. Download FastQ files: + - If direct download links are available from the ENA API, fetch in parallel via `curl` and perform `md5sum` check + - Otherwise use `sra-tools` to download `.sra` files and convert them to FastQ 4. Collate id metadata and paths to FastQ files in a single samplesheet ### Synapse ids From 97e8c32ca447a0be7e02cdcfb47f05f760dc6cc2 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 25 Oct 2021 22:59:18 +0100 Subject: [PATCH 121/852] Don't publish .sra files by default --- conf/modules.config | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/modules.config b/conf/modules.config index 534b8249..2a2bcca5 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -37,6 +37,7 @@ params { } 'sratools_prefetch' { publish_dir = 'sra' + publish_files = false } 'sratools_fasterqdump' { publish_dir = 'fastq' From 2fcce24cbbd49bc0f3ee335887627322c3bcff45 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 25 Oct 2021 22:59:31 +0100 Subject: [PATCH 122/852] Bump pipeline version to 1.4 --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 45dfb946..066fb0b3 100644 --- a/nextflow.config +++ b/nextflow.config @@ -149,7 +149,7 @@ manifest { description = 'Pipeline to fetch metadata and raw FastQ files from public databases' mainScript = 'main.nf' nextflowVersion = '!>=21.04.0' - version = '1.4dev' + version = '1.4' } // Function to ensure that resource requirements don't go beyond From ef931d38e8fba8a8db26e0cdc621458cc30da2cb Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 25 Oct 2021 23:10:11 +0100 Subject: [PATCH 123/852] Update output docs with sra-tools functionality --- docs/output.md | 2 +- workflows/sra.nf | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/docs/output.md b/docs/output.md index df7fec02..6e6c610b 100644 --- a/docs/output.md +++ b/docs/output.md @@ -34,7 +34,7 @@ Please see the [usage documentation](https://nf-co.re/fetchngs/usage#introductio
-The final sample information for all identifiers is obtained from the ENA which provides direct download links for FastQ files as well as their associated md5sums. If download links exist, the files will be downloaded in parallel by FTP otherwise they will NOT be downloaded. This is intentional because the tools such as `parallel-fastq-dump`, `fasterq-dump`, `prefetch` etc require pre-existing configuration files in the users home directory which makes automation tricky across different platforms and containerisation. +The final sample information for all identifiers is obtained from the ENA which provides direct download links for FastQ files as well as their associated md5 sums. If download links exist, the files will be downloaded in parallel by FTP. Otherwise they are downloaded using sra-tools. ### Synapse ids diff --git a/workflows/sra.nf b/workflows/sra.nf index 530bf91a..4fb41ccd 100644 --- a/workflows/sra.nf +++ b/workflows/sra.nf @@ -69,8 +69,6 @@ workflow SRA { ) ch_versions = ch_versions.mix(SRA_RUNINFO_TO_FTP.out.versions.first()) - - SRA_RUNINFO_TO_FTP .out .tsv @@ -83,7 +81,7 @@ workflow SRA { .unique() .branch { ftp: it[0].fastq_1 - raw: !it[0].fastq_1 + sra: !it[0].fastq_1 } .set { ch_sra_reads } ch_versions = ch_versions.mix(SRA_RUNINFO_TO_FTP.out.versions.first()) @@ -99,7 +97,7 @@ workflow SRA { // SUBWORKFLOW: Download sequencing reads without FTP links using sra-tools. SRA_FASTQ ( - ch_sra_reads.raw.map { meta, reads -> [ meta, meta.run_accession ] } + ch_sra_reads.sra.map { meta, reads -> [ meta, meta.run_accession ] } ) ch_versions = ch_versions.mix(SRA_FASTQ.out.versions.first()) From 78c55d9f6a505771c50eb9d3c021379399c81681 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 25 Oct 2021 23:34:27 +0100 Subject: [PATCH 124/852] Fix markdownlint --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ff3829ef..e21a94a9 100644 --- a/README.md +++ b/README.md @@ -31,8 +31,8 @@ Via a single file of ids, provided one-per-line (see [example input file](https: 1. Resolve database ids back to appropriate experiment-level ids and to be compatible with the [ENA API](https://ena-docs.readthedocs.io/en/latest/retrieval/programmatic-access.html) 2. Fetch extensive id metadata via ENA API 3. Download FastQ files: - - If direct download links are available from the ENA API, fetch in parallel via `curl` and perform `md5sum` check - - Otherwise use `sra-tools` to download `.sra` files and convert them to FastQ + - If direct download links are available from the ENA API, fetch in parallel via `curl` and perform `md5sum` check + - Otherwise use `sra-tools` to download `.sra` files and convert them to FastQ 4. Collate id metadata and paths to FastQ files in a single samplesheet ### Synapse ids From 767f02e6007372a5d2c05057b4051024aaa3ab29 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 25 Oct 2021 23:37:01 +0100 Subject: [PATCH 125/852] Replace asterix with dashes for markdownling --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e21a94a9..636ba12f 100644 --- a/README.md +++ b/README.md @@ -58,9 +58,9 @@ The columns in the auto-created samplesheet can be tailored to be accepted out-o nextflow run nf-core/fetchngs -profile test, ``` - > * Please check [nf-core/configs](https://github.com/nf-core/configs#documentation) to see if a custom config file to run nf-core pipelines already exists for your Institute. If so, you can simply use `-profile ` in your command. This will enable either `docker` or `singularity` and set the appropriate execution settings for your local compute environment. - > * If you are using `singularity` then the pipeline will auto-detect this and attempt to download the Singularity images directly as opposed to performing a conversion from Docker images. If you are persistently observing issues downloading Singularity images directly due to timeout or network issues then please use the `--singularity_pull_docker_container` parameter to pull and convert the Docker image instead. Alternatively, it is highly recommended to use the [`nf-core download`](https://nf-co.re/tools/#downloading-pipelines-for-offline-use) command to pre-download all of the required containers before running the pipeline and to set the [`NXF_SINGULARITY_CACHEDIR` or `singularity.cacheDir`](https://www.nextflow.io/docs/latest/singularity.html?#singularity-docker-hub) Nextflow options to be able to store and re-use the images from a central location for future pipeline runs. - > * If you are using `conda`, it is highly recommended to use the [`NXF_CONDA_CACHEDIR` or `conda.cacheDir`](https://www.nextflow.io/docs/latest/conda.html) settings to store the environments in a central location for future pipeline runs. + > - Please check [nf-core/configs](https://github.com/nf-core/configs#documentation) to see if a custom config file to run nf-core pipelines already exists for your Institute. If so, you can simply use `-profile ` in your command. This will enable either `docker` or `singularity` and set the appropriate execution settings for your local compute environment. + > - If you are using `singularity` then the pipeline will auto-detect this and attempt to download the Singularity images directly as opposed to performing a conversion from Docker images. If you are persistently observing issues downloading Singularity images directly due to timeout or network issues then please use the `--singularity_pull_docker_container` parameter to pull and convert the Docker image instead. Alternatively, it is highly recommended to use the [`nf-core download`](https://nf-co.re/tools/#downloading-pipelines-for-offline-use) command to pre-download all of the required containers before running the pipeline and to set the [`NXF_SINGULARITY_CACHEDIR` or `singularity.cacheDir`](https://www.nextflow.io/docs/latest/singularity.html?#singularity-docker-hub) Nextflow options to be able to store and re-use the images from a central location for future pipeline runs. + > - If you are using `conda`, it is highly recommended to use the [`NXF_CONDA_CACHEDIR` or `conda.cacheDir`](https://www.nextflow.io/docs/latest/conda.html) settings to store the environments in a central location for future pipeline runs. 4. Start running your own analysis! From d739f3718be5f92e5f10e165c4fe75ee9ca9fea4 Mon Sep 17 00:00:00 2001 From: "Moritz E. Beber" Date: Tue, 26 Oct 2021 11:26:40 +0200 Subject: [PATCH 126/852] feat: add bash script to retry prefetch --- bin/retry_with_backoff.sh | 100 ++++++++++++++++++ .../nf-core/modules/sratools/prefetch/main.nf | 2 +- 2 files changed, 101 insertions(+), 1 deletion(-) create mode 100755 bin/retry_with_backoff.sh diff --git a/bin/retry_with_backoff.sh b/bin/retry_with_backoff.sh new file mode 100755 index 00000000..4bdbf1e0 --- /dev/null +++ b/bin/retry_with_backoff.sh @@ -0,0 +1,100 @@ +#!/usr/bin/env bash + +set -u + +retry_with_backoff() { + local max_attempts=${1} + local delay=${2} + local max_time=${3} + local attempt=1 + local output= + local status= + + shift 3 + + while [ ${attempt} -le ${max_attempts} ]; do + output=$("${@}") + status=${?} + + if [ ${status} -eq 0 ]; then + break + fi + + if [ ${attempt} -lt ${max_attempts} ]; then + echo "Failed attempt ${attempt} of ${max_attempts}. Retrying in ${delay} s." >&2 + sleep ${delay} + elif [ ${attempt} -eq ${max_attempts} ]; then + echo "Failed after ${attempt} attempts." >&2 + return ${status} + fi + + attempt=$(( ${attempt} + 1 )) + delay=$(( ${delay} * 2 )) + if [ ${delay} -ge ${max_time} ]; then + delay=${max_time} + fi + done + + echo "${output}" +} + +RETRY=5 +DELAY=1 +MAX_TIME=60 + +usage() { + echo "Usage:" >&2 + echo "$(basename ${0}) [-h] [-r NUM] [-d NUM] [-m NUM] COMMAND" >&2 + echo "Call the given command with retries and exponential backoff." >&2 + echo "" >&2 + echo " -r NUM Set the number of retry attempts (default ${RETRY})." >&2 + echo " -d NUM Set the base number of seconds to delay (default ${DELAY})." >&2 + echo " -m NUM Set the maximum delay in seconds (default ${MAX_TIME})." >&2 + echo "" >&2 +} + +check_numeric() { + local arg=${1} + if [[ ! ${arg} =~ ^[0-9]+$ ]]; then + echo "Illegal argument: ${arg}" >&2 + echo "Expected a number." >&2 + echo "" >&2 + usage + exit 2 + fi +} + +while getopts ":hr:d:m:" arg; do + case ${arg} in + h) + usage + exit 0 + ;; + r) + check_numeric ${OPTARG} + RETRY=${OPTARG} + ;; + d) + check_numeric ${OPTARG} + DELAY=${OPTARG} + ;; + m) + check_numeric ${OPTARG} + MAX_TIME=${OPTARG} + ;; + ?) + echo "Invalid option: -${OPTARG}" >&2 + echo "" >&2 + usage + exit 2 + ;; + :) + echo "Missing argument for: -${OPTARG}" >&2 + echo "" >&2 + usage + exit 2 + ;; + esac +done + +retry_with_backoff ${RETRY} ${DELAY} ${MAX_TIME} ${@:OPTIND} diff --git a/modules/nf-core/modules/sratools/prefetch/main.nf b/modules/nf-core/modules/sratools/prefetch/main.nf index 207d1e10..c57255f5 100644 --- a/modules/nf-core/modules/sratools/prefetch/main.nf +++ b/modules/nf-core/modules/sratools/prefetch/main.nf @@ -35,7 +35,7 @@ process SRATOOLS_PREFETCH { printf '${config}' > "\${NCBI_SETTINGS}" fi - prefetch \\ + retry_with_backoff.sh prefetch \\ $options.args \\ --progress \\ $id From 753e7e2d795a6d8f3c8736b2fe9490f9d85a2ffd Mon Sep 17 00:00:00 2001 From: "Moritz E. Beber" Date: Tue, 26 Oct 2021 11:32:20 +0200 Subject: [PATCH 127/852] chore: note change --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 49d2c5f1..6e417235 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unpublished Version / DEV] * Add support for run accessions not available on FTP via sra-tools. +* Resume interrupted downloads with prefetch. ### Enhancements & fixes From c973452f56967e8061736935a03d3cf11b163cd9 Mon Sep 17 00:00:00 2001 From: "Moritz E. Beber" Date: Tue, 26 Oct 2021 11:37:43 +0200 Subject: [PATCH 128/852] chore: reword changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e417235..7dc6402a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unpublished Version / DEV] * Add support for run accessions not available on FTP via sra-tools. -* Resume interrupted downloads with prefetch. +* Retry an error in prefetch via bash script in order to allow it to resume interrupted downloads. ### Enhancements & fixes From 01cc0fbe6a588f5a55cc0afd09ee65b9f4ec8092 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 26 Oct 2021 10:50:08 +0100 Subject: [PATCH 129/852] Update test_full data and credits for synapse --- README.md | 2 +- conf/test_full.config | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 636ba12f..a5ffb8a6 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ The nf-core/fetchngs pipeline comes with documentation about the pipeline [usage ## Credits -nf-core/fetchngs was originally written by Harshil Patel ([@drpatelh](https://github.com/drpatelh)) from [Seqera Labs, Spain](https://seqera.io/) and Jose Espinosa-Carrasco ([@JoseEspinosa](https://github.com/JoseEspinosa)) from [The Comparative Bioinformatics Group](https://www.crg.eu/en/cedric_notredame) at [The Centre for Genomic Regulation, Spain](https://www.crg.eu/). Support for download of sequencing reads without FTP links via sra-tools was added by Moritz E. Beber ([@Midnighter](https://github.com/Midnighter)) from [Unseen Bio ApS, Denmark](https://unseenbio.com). +nf-core/fetchngs was originally written by Harshil Patel ([@drpatelh](https://github.com/drpatelh)) from [Seqera Labs, Spain](https://seqera.io/) and Jose Espinosa-Carrasco ([@JoseEspinosa](https://github.com/JoseEspinosa)) from [The Comparative Bioinformatics Group](https://www.crg.eu/en/cedric_notredame) at [The Centre for Genomic Regulation, Spain](https://www.crg.eu/). Support for download of sequencing reads without FTP links via sra-tools was added by Moritz E. Beber ([@Midnighter](https://github.com/Midnighter)) from [Unseen Bio ApS, Denmark](https://unseenbio.com). The Synapse workflow was added by Daisy Han [@daisyhan97](https://github.com/daisyhan97) and Bruno Grande [@BrunoGrandePhD](https://github.com/BrunoGrandePhD) from [Sage Bionetworks, Seattle](https://sagebionetworks.org/). ## Contributions and Support diff --git a/conf/test_full.config b/conf/test_full.config index a5aea2dc..16398e23 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -15,5 +15,5 @@ params { config_profile_description = 'Full test dataset to check pipeline function' // Input data for full size test - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/rnaseq/samplesheet/public_database_ids.txt' + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/fetchngs/sra_ids_test.txt' } From cf374eab1187b8f35426f8807ed0fd10112eb33a Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 3 Nov 2021 15:23:59 +0000 Subject: [PATCH 130/852] Port pipeline to new DSL2 syntax --- conf/modules.config | 200 ++++++++++++------ modules.json | 14 +- .../main.nf => local/dumpsoftwareversions.nf} | 20 +- modules/local/functions.nf | 78 ------- modules/local/multiqc_mappings_config.nf | 17 +- modules/local/sra_fastq_ftp.nf | 27 +-- modules/local/sra_ids_to_runinfo.nf | 17 +- modules/local/sra_merge_samplesheet.nf | 17 +- modules/local/sra_runinfo_to_ftp.nf | 17 +- modules/local/sra_to_samplesheet.nf | 6 - .../main.nf => local/sratools_fasterqdump.nf} | 26 +-- modules/local/sratools_prefetch.nf | 41 ++++ modules/local/synapse_get.nf | 23 +- modules/local/synapse_list.nf | 26 +-- modules/local/synapse_merge_samplesheet.nf | 17 +- modules/local/synapse_show.nf | 26 +-- modules/local/synapse_to_samplesheet.nf | 7 - .../custom/dumpsoftwareversions/functions.nf | 78 ------- .../custom/dumpsoftwareversions/meta.yml | 33 --- .../modules/sratools/fasterqdump/functions.nf | 78 ------- .../modules/sratools/fasterqdump/meta.yml | 42 ---- .../modules/sratools/prefetch/functions.nf | 78 ------- .../nf-core/modules/sratools/prefetch/main.nf | 50 ----- .../modules/sratools/prefetch/meta.yml | 43 ---- nextflow.config | 10 +- subworkflows/local/sra_fastq/main.nf | 7 +- workflows/sra.nf | 27 +-- workflows/synapse.nf | 23 +- 28 files changed, 269 insertions(+), 779 deletions(-) rename modules/{nf-core/modules/custom/dumpsoftwareversions/main.nf => local/dumpsoftwareversions.nf} (79%) delete mode 100644 modules/local/functions.nf rename modules/{nf-core/modules/sratools/fasterqdump/main.nf => local/sratools_fasterqdump.nf} (54%) create mode 100644 modules/local/sratools_prefetch.nf delete mode 100644 modules/nf-core/modules/custom/dumpsoftwareversions/functions.nf delete mode 100644 modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml delete mode 100644 modules/nf-core/modules/sratools/fasterqdump/functions.nf delete mode 100644 modules/nf-core/modules/sratools/fasterqdump/meta.yml delete mode 100644 modules/nf-core/modules/sratools/prefetch/functions.nf delete mode 100644 modules/nf-core/modules/sratools/prefetch/main.nf delete mode 100644 modules/nf-core/modules/sratools/prefetch/meta.yml diff --git a/conf/modules.config b/conf/modules.config index 2a2bcca5..88a1a72b 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -1,74 +1,144 @@ /* ======================================================================================== - Config file for defining DSL2 per module options + Config file for defining DSL2 per module options and publishing paths ======================================================================================== Available keys to override module options: - args = Additional arguments appended to command in module. - args2 = Second set of arguments appended to command in module (multi-tool modules). - args3 = Third set of arguments appended to command in module (multi-tool modules). - publish_dir = Directory to publish results. - publish_by_meta = Groovy list of keys available in meta map to append as directories to "publish_dir" path - If publish_by_meta = true - Value of ${meta['id']} is appended as a directory to "publish_dir" path - If publish_by_meta = ['id', 'custompath'] - If "id" is in meta map and "custompath" isn't then "${meta['id']}/custompath/" - is appended as a directory to "publish_dir" path - If publish_by_meta = false / null - No directories are appended to "publish_dir" path - publish_files = Groovy map where key = "file_ext" and value = "directory" to publish results for that file extension - The value of "directory" is appended to the standard "publish_dir" path as defined above. - If publish_files = null (unspecified) - All files are published. - If publish_files = false - No files are published. - suffix = File name suffix for output files. + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.suffix = File name suffix for output files. ---------------------------------------------------------------------------------------- */ -params { - modules { - 'sra_ids_to_runinfo' { - publish_dir = 'metadata' - publish_files = false - } - 'sra_runinfo_to_ftp' { - publish_dir = 'metadata' - publish_files = ['tsv':''] - } - 'sra_fastq_ftp' { - publish_dir = 'fastq' - publish_files = ['fastq.gz':'', 'md5':'md5'] - args = '--retry 5 --continue-at - --max-time 1200' - } - 'sratools_prefetch' { - publish_dir = 'sra' - publish_files = false - } - 'sratools_fasterqdump' { - publish_dir = 'fastq' - } - 'sra_to_samplesheet' { - publish_dir = 'samplesheet' - publish_files = false - } - 'sra_merge_samplesheet' { - publish_dir = 'samplesheet' - } - 'synapse_list' { - args = '--long' - publish_dir = 'metadata' - } - 'synapse_get' { - publish_dir = 'fastq' - publish_files = ['fastq.gz':'', 'md5':'md5'] - } - 'synapse_show' { - publish_dir = 'metadata' - } - 'synapse_to_samplesheet' { - publish_dir = 'samplesheet' - publish_files = false - } - 'synapse_merge_samplesheet' { - publish_dir = 'samplesheet' - } - 'multiqc_mappings_config' { - publish_dir = 'samplesheet' - } +process { + + publishDir = [ + path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + + withName: SRA_IDS_TO_RUNINFO { + publishDir = [ + path: { "${params.outdir}/metadata" }, + enabled: false + ] + } + + withName: SRA_RUNINFO_TO_FTP { + publishDir = [ + path: { "${params.outdir}/metadata" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: SRA_FASTQ_FTP { + ext.args = '--retry 5 --continue-at - --max-time 1200' + publishDir = [ + [ + path: { "${params.outdir}/fastq" }, + mode: params.publish_dir_mode, + pattern: "*gz" + ], + [ + path: { "${params.outdir}/fastq/md5" }, + mode: params.publish_dir_mode, + pattern: "*.md5" + ] + ] + } + + withName: SRATOOLS_PREFETCH { + publishDir = [ + path: { "${params.outdir}/sra" }, + enabled: false + ] + } + + withName: SRATOOLS_FASTERQDUMP { + publishDir = [ + path: { "${params.outdir}/fastq" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: SRA_TO_SAMPLESHEET { + publishDir = [ + path: { "${params.outdir}/samplesheet" }, + enabled: false + ] + } + + withName: SRA_MERGE_SAMPLESHEET { + publishDir = [ + path: { "${params.outdir}/samplesheet" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: SYNAPSE_LIST { + ext.args = '--long' + publishDir = [ + path: { "${params.outdir}/metadata" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: SYNAPSE_GET { + publishDir = [ + [ + path: { "${params.outdir}/fastq" }, + mode: params.publish_dir_mode, + pattern: "*gz" + ], + [ + path: { "${params.outdir}/fastq/md5" }, + mode: params.publish_dir_mode, + pattern: "*.md5" + ] + ] + } + + withName: SYNAPSE_SHOW { + publishDir = [ + path: { "${params.outdir}/metadata" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: SYNAPSE_TO_SAMPLESHEET { + publishDir = [ + path: { "${params.outdir}/samplesheet" }, + enabled: false + ] + } + + withName: SYNAPSE_MERGE_SAMPLESHEET { + publishDir = [ + path: { "${params.outdir}/samplesheet" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: MULTIQC_MAPPINGS_CONFIG { + publishDir = [ + path: { "${params.outdir}/samplesheet" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: DUMPSOFTWAREVERSIONS { + publishDir = [ + path: { "${params.outdir}/pipeline_info" }, + mode: params.publish_dir_mode, + pattern: '*_versions.yml' + ] } } diff --git a/modules.json b/modules.json index f004808d..0e4143ef 100644 --- a/modules.json +++ b/modules.json @@ -1,17 +1,5 @@ { "name": "nf-core/fetchngs", "homePage": "https://github.com/nf-core/fetchngs", - "repos": { - "nf-core/modules": { - "custom/dumpsoftwareversions": { - "git_sha": "84f2302920078b0cf7716b2a2e5fcc0be5c4531d" - }, - "sratools/fasterqdump": { - "git_sha": "de997825de788fe2210db16d9426f10342a1ba1d" - }, - "sratools/prefetch": { - "git_sha": "07c0830057cc655de113d84499c7c1499460bb55" - } - } - } + "repos": {} } \ No newline at end of file diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf b/modules/local/dumpsoftwareversions.nf similarity index 79% rename from modules/nf-core/modules/custom/dumpsoftwareversions/main.nf rename to modules/local/dumpsoftwareversions.nf index faf2073f..69ebcbaa 100644 --- a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf +++ b/modules/local/dumpsoftwareversions.nf @@ -1,22 +1,12 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' -params.options = [:] -options = initOptions(params.options) - -process CUSTOM_DUMPSOFTWAREVERSIONS { +process DUMPSOFTWAREVERSIONS { label 'process_low' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'pipeline_info', meta:[:], publish_by_meta:[]) } // Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container conda (params.enable_conda ? "bioconda::multiqc=1.11" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/multiqc:1.11--pyhdfd78af_0" - } else { - container "quay.io/biocontainers/multiqc:1.11--pyhdfd78af_0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/multiqc:1.11--pyhdfd78af_0' : + 'quay.io/biocontainers/multiqc:1.11--pyhdfd78af_0' }" input: path versions @@ -73,7 +63,7 @@ process CUSTOM_DUMPSOFTWAREVERSIONS { return "\\n".join(html) module_versions = {} - module_versions["${getProcessName(task.process)}"] = { + module_versions["${task.process.tokenize(':').last()}"] = { 'python': platform.python_version(), 'yaml': yaml.__version__ } diff --git a/modules/local/functions.nf b/modules/local/functions.nf deleted file mode 100644 index 85628ee0..00000000 --- a/modules/local/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/local/multiqc_mappings_config.nf b/modules/local/multiqc_mappings_config.nf index 857c859c..15c30846 100644 --- a/modules/local/multiqc_mappings_config.nf +++ b/modules/local/multiqc_mappings_config.nf @@ -1,19 +1,10 @@ -// Import generic module functions -include { saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] process MULTIQC_MAPPINGS_CONFIG { - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } conda (params.enable_conda ? "conda-forge::python=3.9.5" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/python:3.9--1" - } else { - container "quay.io/biocontainers/python:3.9--1" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/python:3.9--1' : + 'quay.io/biocontainers/python:3.9--1' }" input: path csv @@ -29,7 +20,7 @@ process MULTIQC_MAPPINGS_CONFIG { multiqc_config.yml cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: + ${task.process.tokenize(':').last()}: python: \$(python --version | sed 's/Python //g') END_VERSIONS """ diff --git a/modules/local/sra_fastq_ftp.nf b/modules/local/sra_fastq_ftp.nf index 23ea5dd5..a775849c 100644 --- a/modules/local/sra_fastq_ftp.nf +++ b/modules/local/sra_fastq_ftp.nf @@ -1,23 +1,13 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) process SRA_FASTQ_FTP { tag "$meta.id" label 'process_low' label 'error_retry' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? "conda-forge::sed=4.7" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img" - } else { - container "biocontainers/biocontainers:v1.2.0_cv1" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img' : + 'biocontainers/biocontainers:v1.2.0_cv1' }" input: tuple val(meta), val(fastq) @@ -28,10 +18,11 @@ process SRA_FASTQ_FTP { path "versions.yml" , emit: versions script: + def args = task.ext.args ?: '' if (meta.single_end) { """ curl \\ - $options.args \\ + $args \\ -L ${fastq[0]} \\ -o ${meta.id}.fastq.gz @@ -39,14 +30,14 @@ process SRA_FASTQ_FTP { md5sum -c ${meta.id}.fastq.gz.md5 cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: + ${task.process.tokenize(':').last()}: curl: \$(echo \$(curl --version | head -n 1 | sed 's/^curl //; s/ .*\$//')) END_VERSIONS """ } else { """ curl \\ - $options.args \\ + $args \\ -L ${fastq[0]} \\ -o ${meta.id}_1.fastq.gz @@ -54,7 +45,7 @@ process SRA_FASTQ_FTP { md5sum -c ${meta.id}_1.fastq.gz.md5 curl \\ - $options.args \\ + $args \\ -L ${fastq[1]} \\ -o ${meta.id}_2.fastq.gz @@ -62,7 +53,7 @@ process SRA_FASTQ_FTP { md5sum -c ${meta.id}_2.fastq.gz.md5 cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: + ${task.process.tokenize(':').last()}: curl: \$(echo \$(curl --version | head -n 1 | sed 's/^curl //; s/ .*\$//')) END_VERSIONS """ diff --git a/modules/local/sra_ids_to_runinfo.nf b/modules/local/sra_ids_to_runinfo.nf index 8200271e..c8209690 100644 --- a/modules/local/sra_ids_to_runinfo.nf +++ b/modules/local/sra_ids_to_runinfo.nf @@ -1,21 +1,12 @@ -// Import generic module functions -include { saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] process SRA_IDS_TO_RUNINFO { tag "$id" label 'error_retry' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } conda (params.enable_conda ? "conda-forge::python=3.9.5" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/python:3.9--1" - } else { - container "quay.io/biocontainers/python:3.9--1" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/python:3.9--1' : + 'quay.io/biocontainers/python:3.9--1' }" input: val id @@ -35,7 +26,7 @@ process SRA_IDS_TO_RUNINFO { $metadata_fields cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: + ${task.process.tokenize(':').last()}: python: \$(python --version | sed 's/Python //g') END_VERSIONS """ diff --git a/modules/local/sra_merge_samplesheet.nf b/modules/local/sra_merge_samplesheet.nf index 914bac00..be3f1087 100644 --- a/modules/local/sra_merge_samplesheet.nf +++ b/modules/local/sra_merge_samplesheet.nf @@ -1,19 +1,10 @@ -// Import generic module functions -include { saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] process SRA_MERGE_SAMPLESHEET { - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } conda (params.enable_conda ? "conda-forge::sed=4.7" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img" - } else { - container "biocontainers/biocontainers:v1.2.0_cv1" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img' : + 'biocontainers/biocontainers:v1.2.0_cv1' }" input: path ('samplesheets/*') @@ -37,7 +28,7 @@ process SRA_MERGE_SAMPLESHEET { done cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: + ${task.process.tokenize(':').last()}: sed: \$(echo \$(sed --version 2>&1) | sed 's/^.*GNU sed) //; s/ .*\$//') END_VERSIONS """ diff --git a/modules/local/sra_runinfo_to_ftp.nf b/modules/local/sra_runinfo_to_ftp.nf index 80028705..a6b6a829 100644 --- a/modules/local/sra_runinfo_to_ftp.nf +++ b/modules/local/sra_runinfo_to_ftp.nf @@ -1,19 +1,10 @@ -// Import generic module functions -include { saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] process SRA_RUNINFO_TO_FTP { - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } conda (params.enable_conda ? "conda-forge::python=3.9.5" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/python:3.9--1" - } else { - container "quay.io/biocontainers/python:3.9--1" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/python:3.9--1' : + 'quay.io/biocontainers/python:3.9--1' }" input: path runinfo @@ -29,7 +20,7 @@ process SRA_RUNINFO_TO_FTP { ${runinfo.toString().tokenize(".")[0]}.runinfo_ftp.tsv cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: + ${task.process.tokenize(':').last()}: python: \$(python --version | sed 's/Python //g') END_VERSIONS """ diff --git a/modules/local/sra_to_samplesheet.nf b/modules/local/sra_to_samplesheet.nf index c4fc9af7..230ba4ca 100644 --- a/modules/local/sra_to_samplesheet.nf +++ b/modules/local/sra_to_samplesheet.nf @@ -1,14 +1,8 @@ -// Import generic module functions -include { saveFiles; getSoftwareName } from './functions' -params.options = [:] params.results_dir = '' process SRA_TO_SAMPLESHEET { tag "$meta.id" - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } memory 100.MB diff --git a/modules/nf-core/modules/sratools/fasterqdump/main.nf b/modules/local/sratools_fasterqdump.nf similarity index 54% rename from modules/nf-core/modules/sratools/fasterqdump/main.nf rename to modules/local/sratools_fasterqdump.nf index 08ef9045..cc8fb6fa 100644 --- a/modules/nf-core/modules/sratools/fasterqdump/main.nf +++ b/modules/local/sratools_fasterqdump.nf @@ -1,22 +1,12 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) process SRATOOLS_FASTERQDUMP { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? 'bioconda::sra-tools=2.11.0 conda-forge::pigz=2.6' : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container 'https://depot.galaxyproject.org/singularity/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:6a9ff0e76ec016c3d0d27e0c0d362339f2d787e6-0' - } else { - container 'quay.io/biocontainers/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:6a9ff0e76ec016c3d0d27e0c0d362339f2d787e6-0' - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:6a9ff0e76ec016c3d0d27e0c0d362339f2d787e6-0' : + 'quay.io/biocontainers/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:6a9ff0e76ec016c3d0d27e0c0d362339f2d787e6-0' }" input: tuple val(meta), path(sra) @@ -26,6 +16,8 @@ process SRATOOLS_FASTERQDUMP { path "versions.yml" , emit: versions script: + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' def config = "/LIBS/GUID = \"${UUID.randomUUID().toString()}\"\\n/libs/cloud/report_instance_identity = \"true\"\\n" // Paired-end data extracted by fasterq-dump (--split-3 the default) always creates // *_1.fastq *_2.fastq files but sometimes also an additional *.fastq file @@ -39,19 +31,19 @@ process SRATOOLS_FASTERQDUMP { fi fasterq-dump \\ - ${options.args} \\ + $args \\ --threads $task.cpus \\ ${sra.name} pigz \\ - ${options.args2} \\ + $args2 \\ --no-name \\ --processes $task.cpus \\ *.fastq cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(fasterq-dump --version 2>&1 | grep -Eo '[0-9.]+') + ${task.process.tokenize(':').last()}: + sratools: \$(fasterq-dump --version 2>&1 | grep -Eo '[0-9.]+') pigz: \$( pigz --version 2>&1 | sed 's/pigz //g' ) END_VERSIONS """ diff --git a/modules/local/sratools_prefetch.nf b/modules/local/sratools_prefetch.nf new file mode 100644 index 00000000..07be740b --- /dev/null +++ b/modules/local/sratools_prefetch.nf @@ -0,0 +1,41 @@ + +process SRATOOLS_PREFETCH { + tag "$id" + label 'process_low' + label 'error_retry' + + conda (params.enable_conda ? 'bioconda::sra-tools=2.11.0' : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/sra-tools:2.11.0--pl5262h314213e_0' : + 'quay.io/biocontainers/sra-tools:2.11.0--pl5262h314213e_0' }" + + input: + tuple val(meta), val(id) + + output: + tuple val(meta), path("$id"), emit: sra + path "versions.yml" , emit: versions + + script: + def args = task.ext.args ?: '' + def config = "/LIBS/GUID = \"${UUID.randomUUID().toString()}\"\\n/libs/cloud/report_instance_identity = \"true\"\\n" + """ + eval "\$(vdb-config -o n NCBI_SETTINGS | sed 's/[" ]//g')" + if [[ ! -f "\${NCBI_SETTINGS}" ]]; then + mkdir -p "\$(dirname "\${NCBI_SETTINGS}")" + printf '${config}' > "\${NCBI_SETTINGS}" + fi + + prefetch \\ + $args \\ + --progress \\ + $id + + vdb-validate $id + + cat <<-END_VERSIONS > versions.yml + ${task.process.tokenize(':').last()}: + sratools: \$(prefetch --version 2>&1 | grep -Eo '[0-9.]+') + END_VERSIONS + """ +} diff --git a/modules/local/synapse_get.nf b/modules/local/synapse_get.nf index 99985f48..5269286c 100644 --- a/modules/local/synapse_get.nf +++ b/modules/local/synapse_get.nf @@ -1,23 +1,13 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) process SYNAPSE_GET { tag "$meta.id" label 'process_low' label 'error_retry' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? "bioconda::synapseclient=2.4.0" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/synapseclient:2.4.0--pyh5e36f6f_0" - } else { - container "quay.io/biocontainers/synapseclient:2.4.0--pyh5e36f6f_0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/synapseclient:2.4.0--pyh5e36f6f_0' : + 'quay.io/biocontainers/synapseclient:2.4.0--pyh5e36f6f_0' }" input: val meta @@ -29,18 +19,19 @@ process SYNAPSE_GET { path "versions.yml" , emit: versions script: + def args = task.ext.args ?: '' """ synapse \\ -c $config \\ get \\ - $options.args \\ + $args \\ $meta.id echo "${meta.md5} \t ${meta.name}" > ${meta.id}.md5 cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(synapse --version | sed -e "s/Synapse Client //g") + ${task.process.tokenize(':').last()}: + synapse: \$(synapse --version | sed -e "s/Synapse Client //g") END_VERSIONS """ } diff --git a/modules/local/synapse_list.nf b/modules/local/synapse_list.nf index 20275de2..f001a186 100644 --- a/modules/local/synapse_list.nf +++ b/modules/local/synapse_list.nf @@ -1,22 +1,12 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) process SYNAPSE_LIST { tag "$id" label 'process_low' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } conda (params.enable_conda ? "bioconda::synapseclient=2.4.0" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/synapseclient:2.4.0--pyh5e36f6f_0" - } else { - container "quay.io/biocontainers/synapseclient:2.4.0--pyh5e36f6f_0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/synapseclient:2.4.0--pyh5e36f6f_0' : + 'quay.io/biocontainers/synapseclient:2.4.0--pyh5e36f6f_0' }" input: val id @@ -27,18 +17,20 @@ process SYNAPSE_LIST { path "versions.yml", emit: versions script: + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' """ synapse \\ -c $config \\ list \\ - $options.args \\ + $args \\ $id \\ - $options.args2 \\ + $args2 \\ > ${id}.list.txt cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(synapse --version | sed -e "s/Synapse Client //g") + ${task.process.tokenize(':').last()}: + syanpse: \$(synapse --version | sed -e "s/Synapse Client //g") END_VERSIONS """ } diff --git a/modules/local/synapse_merge_samplesheet.nf b/modules/local/synapse_merge_samplesheet.nf index 8027818c..e3f97fa8 100644 --- a/modules/local/synapse_merge_samplesheet.nf +++ b/modules/local/synapse_merge_samplesheet.nf @@ -1,19 +1,10 @@ -// Import generic module functions -include { saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] process SYNAPSE_MERGE_SAMPLESHEET { - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } conda (params.enable_conda ? "conda-forge::sed=4.7" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img" - } else { - container "biocontainers/biocontainers:v1.2.0_cv1" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img' : + 'biocontainers/biocontainers:v1.2.0_cv1' }" input: path ('samplesheets/*') @@ -30,7 +21,7 @@ process SYNAPSE_MERGE_SAMPLESHEET { done cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: + ${task.process.tokenize(':').last()}: sed: \$(echo \$(sed --version 2>&1) | sed 's/^.*GNU sed) //; s/ .*\$//') END_VERSIONS """ diff --git a/modules/local/synapse_show.nf b/modules/local/synapse_show.nf index 4edc4207..78593861 100644 --- a/modules/local/synapse_show.nf +++ b/modules/local/synapse_show.nf @@ -1,22 +1,12 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) process SYNAPSE_SHOW { tag "$id" label 'process_low' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } conda (params.enable_conda ? "bioconda::synapseclient=2.4.0" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/synapseclient:2.4.0--pyh5e36f6f_0" - } else { - container "quay.io/biocontainers/synapseclient:2.4.0--pyh5e36f6f_0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/synapseclient:2.4.0--pyh5e36f6f_0' : + 'quay.io/biocontainers/synapseclient:2.4.0--pyh5e36f6f_0' }" input: val id @@ -27,18 +17,20 @@ process SYNAPSE_SHOW { path "versions.yml", emit: versions script: + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' """ synapse \\ -c $config \\ show \\ - $options.args \\ + $args \\ $id \\ - $options.args2 \\ + $args2 \\ > ${id}.metadata.txt cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(synapse --version | sed -e "s/Synapse Client //g") + ${task.process.tokenize(':').last()}: + synapse: \$(synapse --version | sed -e "s/Synapse Client //g") END_VERSIONS """ } diff --git a/modules/local/synapse_to_samplesheet.nf b/modules/local/synapse_to_samplesheet.nf index 28571005..976d7ad7 100644 --- a/modules/local/synapse_to_samplesheet.nf +++ b/modules/local/synapse_to_samplesheet.nf @@ -1,14 +1,7 @@ -// Import generic module functions -include { saveFiles; getSoftwareName } from './functions' - -params.options = [:] params.results_dir = '' process SYNAPSE_TO_SAMPLESHEET { tag "$meta.id" - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } memory 100.MB diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/functions.nf b/modules/nf-core/modules/custom/dumpsoftwareversions/functions.nf deleted file mode 100644 index 85628ee0..00000000 --- a/modules/nf-core/modules/custom/dumpsoftwareversions/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml deleted file mode 100644 index 8d4a6ed4..00000000 --- a/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: custom_dumpsoftwareversions -description: Custom module used to dump software versions within the nf-core pipeline template -keywords: - - custom - - version -tools: - - custom: - description: Custom module used to dump software versions within the nf-core pipeline template - homepage: https://github.com/nf-core/tools - documentation: https://github.com/nf-core/tools - -input: - - versions: - type: file - description: YML file containing software versions - pattern: "*.yml" - -output: - - yml: - type: file - description: Standard YML file containing software versions - pattern: "software_versions.yml" - - mqc_yml: - type: file - description: MultiQC custom content YML file containing software versions - pattern: "software_versions_mqc.yml" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - -authors: - - "@drpatelh" diff --git a/modules/nf-core/modules/sratools/fasterqdump/functions.nf b/modules/nf-core/modules/sratools/fasterqdump/functions.nf deleted file mode 100644 index 85628ee0..00000000 --- a/modules/nf-core/modules/sratools/fasterqdump/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/sratools/fasterqdump/meta.yml b/modules/nf-core/modules/sratools/fasterqdump/meta.yml deleted file mode 100644 index ac61e71f..00000000 --- a/modules/nf-core/modules/sratools/fasterqdump/meta.yml +++ /dev/null @@ -1,42 +0,0 @@ -name: sratools_fasterqdump -description: Extract sequencing reads in FASTQ format from a given NCBI Sequence Read Archive (SRA). -keywords: - - sequencing - - FASTQ - - dump -tools: - - sratools: - description: SRA Toolkit and SDK from NCBI - homepage: https://github.com/ncbi/sra-tools - documentation: https://github.com/ncbi/sra-tools/wiki - tool_dev_url: https://github.com/ncbi/sra-tools - licence: ['Public Domain'] - -input: - - meta: - type: map - description: > - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - sra: - type: directory - description: Directory containing ETL data for the given SRA. - pattern: "*/*.sra" - -output: - - meta: - type: map - description: > - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - - reads: - type: file - description: Extracted FASTQ file or files if the sequencing reads are paired-end. - pattern: "*.fastq.gz" - -authors: - - "@Midnighter" diff --git a/modules/nf-core/modules/sratools/prefetch/functions.nf b/modules/nf-core/modules/sratools/prefetch/functions.nf deleted file mode 100644 index 85628ee0..00000000 --- a/modules/nf-core/modules/sratools/prefetch/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/sratools/prefetch/main.nf b/modules/nf-core/modules/sratools/prefetch/main.nf deleted file mode 100644 index 207d1e10..00000000 --- a/modules/nf-core/modules/sratools/prefetch/main.nf +++ /dev/null @@ -1,50 +0,0 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - -process SRATOOLS_PREFETCH { - tag "$id" - label 'process_low' - label 'error_retry' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } - - conda (params.enable_conda ? 'bioconda::sra-tools=2.11.0' : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container 'https://depot.galaxyproject.org/singularity/sra-tools:2.11.0--pl5262h314213e_0' - } else { - container 'quay.io/biocontainers/sra-tools:2.11.0--pl5262h314213e_0' - } - - input: - tuple val(meta), val(id) - - output: - tuple val(meta), path("$id"), emit: sra - path "versions.yml" , emit: versions - - script: - def config = "/LIBS/GUID = \"${UUID.randomUUID().toString()}\"\\n/libs/cloud/report_instance_identity = \"true\"\\n" - """ - eval "\$(vdb-config -o n NCBI_SETTINGS | sed 's/[" ]//g')" - if [[ ! -f "\${NCBI_SETTINGS}" ]]; then - mkdir -p "\$(dirname "\${NCBI_SETTINGS}")" - printf '${config}' > "\${NCBI_SETTINGS}" - fi - - prefetch \\ - $options.args \\ - --progress \\ - $id - - vdb-validate $id - - cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(prefetch --version 2>&1 | grep -Eo '[0-9.]+') - END_VERSIONS - """ -} diff --git a/modules/nf-core/modules/sratools/prefetch/meta.yml b/modules/nf-core/modules/sratools/prefetch/meta.yml deleted file mode 100644 index ab0a5ce5..00000000 --- a/modules/nf-core/modules/sratools/prefetch/meta.yml +++ /dev/null @@ -1,43 +0,0 @@ -name: sratools_prefetch -description: Download sequencing data from the NCBI Sequence Read Archive (SRA). -keywords: - - sequencing - - fastq - - prefetch -tools: - - sratools: - description: SRA Toolkit and SDK from NCBI - homepage: https://github.com/ncbi/sra-tools - documentation: https://github.com/ncbi/sra-tools/wiki - tool_dev_url: https://github.com/ncbi/sra-tools - licence: ['Public Domain'] - -input: - - meta: - type: map - description: > - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - id: - type: val - description: > - A string denoting an SRA id. - -output: - - meta: - type: map - description: > - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - sra: - type: directory - description: > - Directory containing the ETL data for the given SRA id. - pattern: "*/*.sra" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - -authors: - - "@Midnighter" diff --git a/nextflow.config b/nextflow.config index 066fb0b3..cd5e3891 100644 --- a/nextflow.config +++ b/nextflow.config @@ -28,14 +28,12 @@ params { help = false validate_params = true show_hidden_params = false - schema_ignore_params = 'modules,igenomes_base' + schema_ignore_params = 'igenomes_base' enable_conda = false - singularity_pull_docker_container = false // Config options custom_config_version = 'master' custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" - hostnames = [:] config_profile_description = null config_profile_contact = null config_profile_url = null @@ -52,9 +50,6 @@ params { // Load base.config by default for all pipelines includeConfig 'conf/base.config' -// Load modules.config for DSL2 module specific options -includeConfig 'conf/modules.config' - // Load nf-core custom profiles from different Institutions try { includeConfig "${params.custom_config_base}/nfcore_custom.config" @@ -152,6 +147,9 @@ manifest { version = '1.4' } +// Load modules.config for DSL2 module specific options +includeConfig 'conf/modules.config' + // Function to ensure that resource requirements don't go beyond // a maximum limit def check_max(obj, type) { diff --git a/subworkflows/local/sra_fastq/main.nf b/subworkflows/local/sra_fastq/main.nf index c6590b59..84db4b77 100644 --- a/subworkflows/local/sra_fastq/main.nf +++ b/subworkflows/local/sra_fastq/main.nf @@ -2,11 +2,8 @@ // Download FASTQ sequencing reads from the NCBI's Sequence Read Archive (SRA). // -params.prefetch_options = [:] -params.fasterqdump_options = [:] - -include { SRATOOLS_PREFETCH } from '../../../modules/nf-core/modules/sratools/prefetch/main' addParams( options: params.prefetch_options ) -include { SRATOOLS_FASTERQDUMP } from '../../../modules/nf-core/modules/sratools/fasterqdump/main' addParams( options: params.fasterqdump_options ) +include { SRATOOLS_PREFETCH } from '../../../modules/local/sratools_prefetch.nf' +include { SRATOOLS_FASTERQDUMP } from '../../../modules/local/sratools_fasterqdump.nf' workflow SRA_FASTQ { take: diff --git a/workflows/sra.nf b/workflows/sra.nf index 4fb41ccd..40eeab9d 100644 --- a/workflows/sra.nf +++ b/workflows/sra.nf @@ -20,23 +20,16 @@ WorkflowSra.initialise(params, log, valid_params) */ // Don't overwrite global params.modules, create a copy instead and use that within the main script. -def modules = params.modules.clone() +//def modules = params.modules.clone() -include { SRA_IDS_TO_RUNINFO } from '../modules/local/sra_ids_to_runinfo' addParams( options: modules['sra_ids_to_runinfo'] ) -include { SRA_RUNINFO_TO_FTP } from '../modules/local/sra_runinfo_to_ftp' addParams( options: modules['sra_runinfo_to_ftp'] ) -include { SRA_FASTQ_FTP } from '../modules/local/sra_fastq_ftp' addParams( options: modules['sra_fastq_ftp'] ) -include { SRA_FASTQ } from '../subworkflows/local/sra_fastq/main' addParams( prefetch_options: modules['sratools_prefetch'], fasterqdump_options: modules['sratools_fasterqdump'] ) -include { SRA_TO_SAMPLESHEET } from '../modules/local/sra_to_samplesheet' addParams( options: modules['sra_to_samplesheet'], results_dir: modules['sra_fastq_ftp'].publish_dir ) -include { SRA_MERGE_SAMPLESHEET } from '../modules/local/sra_merge_samplesheet' addParams( options: modules['sra_merge_samplesheet'] ) -include { MULTIQC_MAPPINGS_CONFIG } from '../modules/local/multiqc_mappings_config' addParams( options: modules['multiqc_mappings_config'] ) - -/* -======================================================================================== - IMPORT NF-CORE MODULES/SUBWORKFLOWS -======================================================================================== -*/ - -include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' addParams( options: [publish_files : ['_versions.yml':'']] ) +include { SRA_IDS_TO_RUNINFO } from '../modules/local/sra_ids_to_runinfo' +include { SRA_RUNINFO_TO_FTP } from '../modules/local/sra_runinfo_to_ftp' +include { SRA_FASTQ_FTP } from '../modules/local/sra_fastq_ftp' +include { SRA_FASTQ } from '../subworkflows/local/sra_fastq/main' +include { SRA_TO_SAMPLESHEET } from '../modules/local/sra_to_samplesheet' // addParams( results_dir: modules['sra_fastq_ftp'].publish_dir ) +include { SRA_MERGE_SAMPLESHEET } from '../modules/local/sra_merge_samplesheet' +include { MULTIQC_MAPPINGS_CONFIG } from '../modules/local/multiqc_mappings_config' +include { DUMPSOFTWAREVERSIONS } from '../modules/local/dumpsoftwareversions' /* ======================================================================================== @@ -133,7 +126,7 @@ workflow SRA { // // MODULE: Dump software versions for all tools used in the workflow // - CUSTOM_DUMPSOFTWAREVERSIONS ( + DUMPSOFTWAREVERSIONS ( ch_versions.unique().collectFile(name: 'collated_versions.yml') ) } diff --git a/workflows/synapse.nf b/workflows/synapse.nf index 2fc3cf69..06ce6319 100644 --- a/workflows/synapse.nf +++ b/workflows/synapse.nf @@ -20,21 +20,14 @@ if (params.synapse_config) { */ // Don't overwrite global params.modules, create a copy instead and use that within the main script. -def modules = params.modules.clone() +//def modules = params.modules.clone() -include { SYNAPSE_LIST } from '../modules/local/synapse_list' addParams( options: modules['synapse_list'] ) -include { SYNAPSE_SHOW } from '../modules/local/synapse_show' addParams( options: modules['synapse_show'] ) -include { SYNAPSE_GET } from '../modules/local/synapse_get' addParams( options: modules['synapse_get'] ) -include { SYNAPSE_TO_SAMPLESHEET } from '../modules/local/synapse_to_samplesheet' addParams( options: modules['synapse_to_samplesheet'], results_dir: modules['synapse_get'].publish_dir ) -include { SYNAPSE_MERGE_SAMPLESHEET } from '../modules/local/synapse_merge_samplesheet' addParams( options: modules['synapse_merge_samplesheet'] ) - -/* -======================================================================================== - IMPORT NF-CORE MODULES/SUBWORKFLOWS -======================================================================================== -*/ - -include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' addParams( options: [publish_files : ['_versions.yml':'']] ) +include { SYNAPSE_LIST } from '../modules/local/synapse_list' +include { SYNAPSE_SHOW } from '../modules/local/synapse_show' +include { SYNAPSE_GET } from '../modules/local/synapse_get' +include { SYNAPSE_TO_SAMPLESHEET } from '../modules/local/synapse_to_samplesheet' // addParams( results_dir: modules['synapse_get'].publish_dir ) +include { SYNAPSE_MERGE_SAMPLESHEET } from '../modules/local/synapse_merge_samplesheet' +include { DUMPSOFTWAREVERSIONS } from '../modules/local/dumpsoftwareversions' /* ======================================================================================== @@ -132,7 +125,7 @@ workflow SYNAPSE { // // MODULE: Dump software versions for all tools used in the workflow // - CUSTOM_DUMPSOFTWAREVERSIONS ( + DUMPSOFTWAREVERSIONS ( ch_versions.unique().collectFile(name: 'collated_versions.yml') ) } From 44844e3be78d15848dfe41bc77c380bf3c6cfb17 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 3 Nov 2021 15:24:28 +0000 Subject: [PATCH 131/852] Run CI for pipeline NXF and latest edge version --- .github/workflows/ci.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 08ac1cfb..6b67751c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,12 +18,11 @@ jobs: if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/fetchngs') }} runs-on: ubuntu-latest env: - NXF_VER: ${{ matrix.nxf_ver }} NXF_ANSI_LOG: false strategy: matrix: - # Nextflow versions: check pipeline minimum and current latest - nxf_ver: ["21.04.0", ""] + # Nextflow versions: check pipeline minimum and latest edge version + nxf_ver: ["NXF_VER=21.04.0", "NXF_EDGE=1"] steps: - name: Check out pipeline code uses: actions/checkout@v2 @@ -34,6 +33,8 @@ jobs: run: | wget -qO- get.nextflow.io | bash sudo mv nextflow /usr/local/bin/ + export ${{ matrix.nxf_ver }} + nextflow self-update - name: Run pipeline with SRA test data run: | From fa4be0b9cd8551b179d8e281d08cd4d9830884de Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 3 Nov 2021 15:24:49 +0000 Subject: [PATCH 132/852] Remove params.hostnames --- lib/NfcoreSchema.groovy | 3 +-- lib/NfcoreTemplate.groovy | 30 +++++++++--------------------- lib/WorkflowMain.groovy | 6 +++--- nextflow_schema.json | 13 ------------- 4 files changed, 13 insertions(+), 39 deletions(-) diff --git a/lib/NfcoreSchema.groovy b/lib/NfcoreSchema.groovy index 8d6920dd..dcb39c83 100755 --- a/lib/NfcoreSchema.groovy +++ b/lib/NfcoreSchema.groovy @@ -260,13 +260,12 @@ class NfcoreSchema { // Get pipeline parameters defined in JSON Schema def Map params_summary = [:] - def blacklist = ['hostnames'] def params_map = paramsLoad(getSchemaPath(workflow, schema_filename=schema_filename)) for (group in params_map.keySet()) { def sub_params = new LinkedHashMap() def group_params = params_map.get(group) // This gets the parameters of that particular group for (param in group_params.keySet()) { - if (params.containsKey(param) && !blacklist.contains(param)) { + if (params.containsKey(param)) { def params_value = params.get(param) def schema_value = group_params.get(param).default def param_type = group_params.get(param).type diff --git a/lib/NfcoreTemplate.groovy b/lib/NfcoreTemplate.groovy index 3dd46e64..4592007f 100755 --- a/lib/NfcoreTemplate.groovy +++ b/lib/NfcoreTemplate.groovy @@ -19,27 +19,16 @@ class NfcoreTemplate { } // - // Check params.hostnames + // Warn if a -profile or Nextflow config has not been provided to run the pipeline // - public static void hostName(workflow, params, log) { - Map colors = logColours(params.monochrome_logs) - if (params.hostnames) { - try { - def hostname = "hostname".execute().text.trim() - params.hostnames.each { prof, hnames -> - hnames.each { hname -> - if (hostname.contains(hname) && !workflow.profile.contains(prof)) { - log.info "=${colors.yellow}====================================================${colors.reset}=\n" + - "${colors.yellow}WARN: You are running with `-profile $workflow.profile`\n" + - " but your machine hostname is ${colors.white}'$hostname'${colors.reset}.\n" + - " ${colors.yellow_bold}Please use `-profile $prof${colors.reset}`\n" + - "=${colors.yellow}====================================================${colors.reset}=" - } - } - } - } catch (Exception e) { - log.warn "[$workflow.manifest.name] Could not determine 'hostname' - skipping check. Reason: ${e.message}." - } + public static void checkConfigProvided(workflow, log) { + if (workflow.profile == 'standard' && workflow.configFiles.size() <= 1) { + log.warn "[$workflow.manifest.name] You are attempting to run the pipeline without any custom configuration!\n\n" + + "This will be dependent on your local compute enviroment but can be acheived via one or more of the following:\n" + + " (1) Using an existing pipeline profile e.g. `-profile docker` or `-profile singularity`\n" + + " (2) Using an existing nf-core/configs for your Institution e.g. `-profile crick` or `-profile uppmax`\n" + + " (3) Using your own local custom config e.g. `-c /path/to/your/custom.config`\n\n" + + "Please refer to the quick start section and usage docs for the pipeline.\n " } } @@ -146,7 +135,6 @@ class NfcoreTemplate { log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed successfully, but with errored process(es) ${colors.reset}-" } } else { - hostName(workflow, params, log) log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed with errors${colors.reset}-" } } diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index 09264303..e8f3c20d 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -60,6 +60,9 @@ class WorkflowMain { // Print parameter summary log to screen log.info paramsSummaryLog(workflow, params, log) + // Check that a -profile or Nextflow config has been provided to run the pipeline + NfcoreTemplate.checkConfigProvided(workflow, log) + // Check that conda channels are set-up correctly if (params.enable_conda) { Utils.checkCondaChannels(log) @@ -68,9 +71,6 @@ class WorkflowMain { // Check AWS batch settings NfcoreTemplate.awsBatch(workflow, params) - // Check the hostnames against configured profiles - NfcoreTemplate.hostName(workflow, params, log) - // Check input has been provided if (!params.input) { log.error "Please provide an input file containing ids to the pipeline - one per line e.g. '--input ids.txt'" diff --git a/nextflow_schema.json b/nextflow_schema.json index b2f26972..be10a344 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -88,12 +88,6 @@ "help_text": "If you're running offline, Nextflow will not be able to fetch the institutional config files from the internet. If you don't need them, then this is not a problem. If you do need them, you should download the files from the repo and tell Nextflow where to find them with this parameter.", "fa_icon": "fas fa-users-cog" }, - "hostnames": { - "type": "string", - "description": "Institutional configs hostname.", - "hidden": true, - "fa_icon": "fas fa-users-cog" - }, "config_profile_name": { "type": "string", "description": "Institutional config name.", @@ -230,13 +224,6 @@ "description": "Run this workflow with Conda. You can also use '-profile conda' instead of providing this parameter.", "hidden": true, "fa_icon": "fas fa-bacon" - }, - "singularity_pull_docker_container": { - "type": "boolean", - "description": "Instead of directly downloading Singularity images for use with Singularity, force the workflow to pull and convert Docker containers instead.", - "hidden": true, - "fa_icon": "fas fa-toolbox", - "help_text": "This may be useful for example if you are unable to directly pull Singularity containers to run the pipeline due to http/https proxy issues." } } } From ef640c724e1b69466829576844f885e77104b619 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 3 Nov 2021 15:55:13 +0000 Subject: [PATCH 133/852] Fix nf-core lint --- .nf-core.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.nf-core.yml b/.nf-core.yml index 92e07317..b8e4d216 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -2,7 +2,9 @@ lint: files_unchanged: - .github/CONTRIBUTING.md - assets/sendmail_template.txt + - lib/NfcoreSchema.groovy - lib/NfcoreTemplate.groovy files_exist: - bin/scrape_software_versions.py - modules/local/get_software_versions.nf + actions_ci: False From c7cbd2f9dcf3212f7483c26a709054c01e00e801 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 4 Nov 2021 11:49:52 +0000 Subject: [PATCH 134/852] Add params.input_type to split out config options for each workflow --- conf/modules.config | 224 ++++++++++++++++++++++----------------- conf/test_synapse.config | 3 +- lib/WorkflowMain.groovy | 8 ++ main.nf | 24 +++-- nextflow.config | 1 + nextflow_schema.json | 10 ++ 6 files changed, 162 insertions(+), 108 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 88a1a72b..0f6c8138 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -10,6 +10,9 @@ ---------------------------------------------------------------------------------------- */ +// +// Generic process options for all workflows +// process { publishDir = [ @@ -18,127 +21,150 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] - withName: SRA_IDS_TO_RUNINFO { - publishDir = [ - path: { "${params.outdir}/metadata" }, - enabled: false - ] - } - - withName: SRA_RUNINFO_TO_FTP { + withName: DUMPSOFTWAREVERSIONS { publishDir = [ - path: { "${params.outdir}/metadata" }, + path: { "${params.outdir}/pipeline_info" }, mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + pattern: '*_versions.yml' ] } - withName: SRA_FASTQ_FTP { - ext.args = '--retry 5 --continue-at - --max-time 1200' - publishDir = [ - [ +} + +// +// Process options for the SRA workflow +// +if (params.input_type == 'sra') { + + process { + + withName: SRA_IDS_TO_RUNINFO { + publishDir = [ + path: { "${params.outdir}/metadata" }, + enabled: false + ] + } + + withName: SRA_RUNINFO_TO_FTP { + publishDir = [ + path: { "${params.outdir}/metadata" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: SRA_FASTQ_FTP { + ext.args = '--retry 5 --continue-at - --max-time 1200' + publishDir = [ + [ + path: { "${params.outdir}/fastq" }, + mode: params.publish_dir_mode, + pattern: "*gz" + ], + [ + path: { "${params.outdir}/fastq/md5" }, + mode: params.publish_dir_mode, + pattern: "*.md5" + ] + ] + } + + withName: SRATOOLS_PREFETCH { + publishDir = [ + path: { "${params.outdir}/sra" }, + enabled: false + ] + } + + withName: SRATOOLS_FASTERQDUMP { + publishDir = [ path: { "${params.outdir}/fastq" }, mode: params.publish_dir_mode, - pattern: "*gz" - ], - [ - path: { "${params.outdir}/fastq/md5" }, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: SRA_TO_SAMPLESHEET { + publishDir = [ + path: { "${params.outdir}/samplesheet" }, + enabled: false + ] + } + + withName: SRA_MERGE_SAMPLESHEET { + publishDir = [ + path: { "${params.outdir}/samplesheet" }, mode: params.publish_dir_mode, - pattern: "*.md5" + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] - ] - } + } - withName: SRATOOLS_PREFETCH { - publishDir = [ - path: { "${params.outdir}/sra" }, - enabled: false - ] - } + withName: MULTIQC_MAPPINGS_CONFIG { + publishDir = [ + path: { "${params.outdir}/samplesheet" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } - withName: SRATOOLS_FASTERQDUMP { - publishDir = [ - path: { "${params.outdir}/fastq" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] } - withName: SRA_TO_SAMPLESHEET { - publishDir = [ - path: { "${params.outdir}/samplesheet" }, - enabled: false - ] - } +} - withName: SRA_MERGE_SAMPLESHEET { - publishDir = [ - path: { "${params.outdir}/samplesheet" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } +// +// Process options for the Synapse workflow +// +if (params.input_type == 'synapse') { - withName: SYNAPSE_LIST { - ext.args = '--long' - publishDir = [ - path: { "${params.outdir}/metadata" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } + process { - withName: SYNAPSE_GET { - publishDir = [ - [ - path: { "${params.outdir}/fastq" }, - mode: params.publish_dir_mode, - pattern: "*gz" - ], - [ - path: { "${params.outdir}/fastq/md5" }, + withName: SYNAPSE_LIST { + ext.args = '--long' + publishDir = [ + path: { "${params.outdir}/metadata" }, mode: params.publish_dir_mode, - pattern: "*.md5" + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] - ] - } + } + + withName: SYNAPSE_GET { + publishDir = [ + [ + path: { "${params.outdir}/fastq" }, + mode: params.publish_dir_mode, + pattern: "*gz" + ], + [ + path: { "${params.outdir}/fastq/md5" }, + mode: params.publish_dir_mode, + pattern: "*.md5" + ] + ] + } - withName: SYNAPSE_SHOW { - publishDir = [ - path: { "${params.outdir}/metadata" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } + withName: SYNAPSE_SHOW { + publishDir = [ + path: { "${params.outdir}/metadata" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } - withName: SYNAPSE_TO_SAMPLESHEET { - publishDir = [ - path: { "${params.outdir}/samplesheet" }, - enabled: false - ] - } + withName: SYNAPSE_TO_SAMPLESHEET { + publishDir = [ + path: { "${params.outdir}/samplesheet" }, + enabled: false + ] + } - withName: SYNAPSE_MERGE_SAMPLESHEET { - publishDir = [ - path: { "${params.outdir}/samplesheet" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } + withName: SYNAPSE_MERGE_SAMPLESHEET { + publishDir = [ + path: { "${params.outdir}/samplesheet" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } - withName: MULTIQC_MAPPINGS_CONFIG { - publishDir = [ - path: { "${params.outdir}/samplesheet" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] } - withName: DUMPSOFTWAREVERSIONS { - publishDir = [ - path: { "${params.outdir}/pipeline_info" }, - mode: params.publish_dir_mode, - pattern: '*_versions.yml' - ] - } } diff --git a/conf/test_synapse.config b/conf/test_synapse.config index d68d4098..d9433493 100644 --- a/conf/test_synapse.config +++ b/conf/test_synapse.config @@ -20,5 +20,6 @@ params { max_time = 6.h // Input data - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/fetchngs/synapse_ids_test.txt' + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/fetchngs/synapse_ids_test.txt' + input_type = 'synapse' } diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index e8f3c20d..f64fa80f 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -46,6 +46,7 @@ class WorkflowMain { // Validate parameters and print summary to screen // public static void initialise(workflow, params, log) { + // Print help to screen if required if (params.help) { log.info help(workflow, params, log) @@ -76,6 +77,13 @@ class WorkflowMain { log.error "Please provide an input file containing ids to the pipeline - one per line e.g. '--input ids.txt'" System.exit(1) } + + // Check valid input_type has been provided + def input_types = ['sra', 'synapse'] + if (!input_types.contains(params.input_type)) { + log.error "Invalid option: '${params.input_type}'. Valid options for '--input_type': ${input_types.join(', ')}." + System.exit(1) + } } // Check if input ids are from the SRA diff --git a/main.nf b/main.nf index 98b25cb1..a2ae62f1 100644 --- a/main.nf +++ b/main.nf @@ -37,18 +37,26 @@ Channel ======================================================================================== */ -// Auto-detect id type -def id_type = '' +// Auto-detect input id type +def input_type = '' if (WorkflowMain.isSraId(ch_input, log)) { - id_type = 'sra' - include { SRA } from './workflows/sra' + input_type = 'sra' } else if (WorkflowMain.isSynapseId(ch_input, log)) { - id_type = 'synapse' - include { SYNAPSE } from './workflows/synapse' + input_type = 'synapse' } else { exit 1, 'Ids provided via --input not recognised please make sure they are either SRA / ENA / DDBJ / GEO or Synapse ids!' } +if (params.input_type == input_type) { + if (params.input_type == 'sra') { + include { SRA } from './workflows/sra' + } else if (params.input_type == 'synapse') { + include { SYNAPSE } from './workflows/synapse' + } +} else { + exit 1, "Ids auto-detected as ${input_type}. Please provide '--input_type ${input_type}' as a parameter to the pipeline!" +} + // // WORKFLOW: Run main nf-core/fetchngs analysis pipeline depending on type of identifier provided // @@ -57,13 +65,13 @@ workflow NFCORE_FETCHNGS { // // WORKFLOW: Download FastQ files for SRA / ENA / DDBJ / GEO ids // - if (id_type == 'sra') { + if (params.input_type == 'sra') { SRA ( ch_ids ) // // WORKFLOW: Download FastQ files for Synapse ids // - } else if (id_type == 'synapse') { + } else if (params.input_type == 'synapse') { SYNAPSE ( ch_ids ) } } diff --git a/nextflow.config b/nextflow.config index cd5e3891..6ae6a8da 100644 --- a/nextflow.config +++ b/nextflow.config @@ -11,6 +11,7 @@ params { // Input options input = null + input_type = 'sra' nf_core_pipeline = null ena_metadata_fields = null sample_mapping_fields = 'run_accession,sample_accession,experiment_alias,run_alias,sample_alias,experiment_title,sample_title,sample_description,description' diff --git a/nextflow_schema.json b/nextflow_schema.json index be10a344..1f923f28 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -23,6 +23,16 @@ "fa_icon": "fas fa-file-excel", "description": "File containing SRA/ENA/DDBJ/GEO identifiers one per line to download their associated metadata and FastQ files." }, + "input_type": { + "type": "string", + "default": "sra", + "description": "Specifies the type of identifier provided via `--input` - available options are 'sra' and 'synapse'.", + "fa_icon": "fas fa-keyboard", + "enum": [ + "sra", + "synapse" + ] + }, "ena_metadata_fields": { "type": "string", "fa_icon": "fas fa-columns", From 107e3e5dc96ae9394f058385d51342041be8ffbc Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 4 Nov 2021 12:26:14 +0000 Subject: [PATCH 135/852] Refactor sra_fastq subworkflow to be local --- .../local/{sra_fastq/main.nf => sra_fastq.nf} | 4 +-- subworkflows/local/sra_fastq/meta.yml | 36 ------------------- subworkflows/local/sra_fastq/nextflow.config | 2 -- workflows/sra.nf | 2 +- 4 files changed, 3 insertions(+), 41 deletions(-) rename subworkflows/local/{sra_fastq/main.nf => sra_fastq.nf} (82%) delete mode 100644 subworkflows/local/sra_fastq/meta.yml delete mode 100644 subworkflows/local/sra_fastq/nextflow.config diff --git a/subworkflows/local/sra_fastq/main.nf b/subworkflows/local/sra_fastq.nf similarity index 82% rename from subworkflows/local/sra_fastq/main.nf rename to subworkflows/local/sra_fastq.nf index 84db4b77..04039f79 100644 --- a/subworkflows/local/sra_fastq/main.nf +++ b/subworkflows/local/sra_fastq.nf @@ -2,8 +2,8 @@ // Download FASTQ sequencing reads from the NCBI's Sequence Read Archive (SRA). // -include { SRATOOLS_PREFETCH } from '../../../modules/local/sratools_prefetch.nf' -include { SRATOOLS_FASTERQDUMP } from '../../../modules/local/sratools_fasterqdump.nf' +include { SRATOOLS_PREFETCH } from '../../modules/local/sratools_prefetch.nf' +include { SRATOOLS_FASTERQDUMP } from '../../modules/local/sratools_fasterqdump.nf' workflow SRA_FASTQ { take: diff --git a/subworkflows/local/sra_fastq/meta.yml b/subworkflows/local/sra_fastq/meta.yml deleted file mode 100644 index 146176ee..00000000 --- a/subworkflows/local/sra_fastq/meta.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: sra_fastq -description: Download FASTQ sequencing reads from the NCBI's Sequence Read Archive (SRA). -keywords: - - sequencing - - FASTQ - - prefetch - - dump -modules: - - sratools/prefetch - - sratools/fasterqdump -input: - - meta: - type: map - description: > - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - id: - type: string - description: > - SRA identifier. -output: - - meta: - type: map - description: > - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - reads: - type: file - description: Extracted FASTQ file or files if the sequencing reads are paired-end. - pattern: "*.fastq.gz" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" -authors: - - '@Midnighter' diff --git a/subworkflows/local/sra_fastq/nextflow.config b/subworkflows/local/sra_fastq/nextflow.config deleted file mode 100644 index 07448834..00000000 --- a/subworkflows/local/sra_fastq/nextflow.config +++ /dev/null @@ -1,2 +0,0 @@ -params.prefetch_options = [:] -params.fasterqdump_options = [:] diff --git a/workflows/sra.nf b/workflows/sra.nf index 40eeab9d..e23d968e 100644 --- a/workflows/sra.nf +++ b/workflows/sra.nf @@ -25,7 +25,7 @@ WorkflowSra.initialise(params, log, valid_params) include { SRA_IDS_TO_RUNINFO } from '../modules/local/sra_ids_to_runinfo' include { SRA_RUNINFO_TO_FTP } from '../modules/local/sra_runinfo_to_ftp' include { SRA_FASTQ_FTP } from '../modules/local/sra_fastq_ftp' -include { SRA_FASTQ } from '../subworkflows/local/sra_fastq/main' +include { SRA_FASTQ } from '../subworkflows/local/sra_fastq' include { SRA_TO_SAMPLESHEET } from '../modules/local/sra_to_samplesheet' // addParams( results_dir: modules['sra_fastq_ftp'].publish_dir ) include { SRA_MERGE_SAMPLESHEET } from '../modules/local/sra_merge_samplesheet' include { MULTIQC_MAPPINGS_CONFIG } from '../modules/local/multiqc_mappings_config' From 4be83f200d661a24ec074752702cffd9ab7bb329 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 4 Nov 2021 12:51:55 +0000 Subject: [PATCH 136/852] Remove last remaining addParams call --- modules/local/sra_to_samplesheet.nf | 6 ++---- modules/local/synapse_to_samplesheet.nf | 7 +++---- workflows/sra.nf | 5 +---- workflows/synapse.nf | 5 +---- 4 files changed, 7 insertions(+), 16 deletions(-) diff --git a/modules/local/sra_to_samplesheet.nf b/modules/local/sra_to_samplesheet.nf index 230ba4ca..dbbc6613 100644 --- a/modules/local/sra_to_samplesheet.nf +++ b/modules/local/sra_to_samplesheet.nf @@ -1,6 +1,4 @@ -params.results_dir = '' - process SRA_TO_SAMPLESHEET { tag "$meta.id" @@ -32,8 +30,8 @@ process SRA_TO_SAMPLESHEET { // Add relevant fields to the beginning of the map pipeline_map = [ sample : "${meta.id.split('_')[0..-2].join('_')}", - fastq_1 : "${params.outdir}/${params.results_dir}/${fastq[0]}", - fastq_2 : meta.single_end ? '' : "${params.outdir}/${params.results_dir}/${fastq[1]}" + fastq_1 : "${params.outdir}/fastq/${fastq[0]}", + fastq_2 : meta.single_end ? '' : "${params.outdir}/fastq/${fastq[1]}" ] // Add nf-core pipeline specific entries diff --git a/modules/local/synapse_to_samplesheet.nf b/modules/local/synapse_to_samplesheet.nf index 976d7ad7..40519ec0 100644 --- a/modules/local/synapse_to_samplesheet.nf +++ b/modules/local/synapse_to_samplesheet.nf @@ -1,4 +1,3 @@ -params.results_dir = '' process SYNAPSE_TO_SAMPLESHEET { tag "$meta.id" @@ -18,11 +17,11 @@ process SYNAPSE_TO_SAMPLESHEET { def meta_map = meta.clone() meta_map.remove("id") - def fastq_1 = "${params.outdir}/${params.results_dir}/${fastq}" + def fastq_1 = "${params.outdir}/fastq/${fastq}" def fastq_2 = '' if (fastq instanceof List && fastq.size() == 2) { - fastq_1 = "${params.outdir}/${params.results_dir}/${fastq[0]}" - fastq_2 = "${params.outdir}/${params.results_dir}/${fastq[1]}" + fastq_1 = "${params.outdir}/fastq/${fastq[0]}" + fastq_2 = "${params.outdir}/fastq/${fastq[1]}" } // Add relevant fields to the beginning of the map diff --git a/workflows/sra.nf b/workflows/sra.nf index e23d968e..c108812f 100644 --- a/workflows/sra.nf +++ b/workflows/sra.nf @@ -19,14 +19,11 @@ WorkflowSra.initialise(params, log, valid_params) ======================================================================================== */ -// Don't overwrite global params.modules, create a copy instead and use that within the main script. -//def modules = params.modules.clone() - include { SRA_IDS_TO_RUNINFO } from '../modules/local/sra_ids_to_runinfo' include { SRA_RUNINFO_TO_FTP } from '../modules/local/sra_runinfo_to_ftp' include { SRA_FASTQ_FTP } from '../modules/local/sra_fastq_ftp' include { SRA_FASTQ } from '../subworkflows/local/sra_fastq' -include { SRA_TO_SAMPLESHEET } from '../modules/local/sra_to_samplesheet' // addParams( results_dir: modules['sra_fastq_ftp'].publish_dir ) +include { SRA_TO_SAMPLESHEET } from '../modules/local/sra_to_samplesheet' include { SRA_MERGE_SAMPLESHEET } from '../modules/local/sra_merge_samplesheet' include { MULTIQC_MAPPINGS_CONFIG } from '../modules/local/multiqc_mappings_config' include { DUMPSOFTWAREVERSIONS } from '../modules/local/dumpsoftwareversions' diff --git a/workflows/synapse.nf b/workflows/synapse.nf index 06ce6319..5a7e3fe7 100644 --- a/workflows/synapse.nf +++ b/workflows/synapse.nf @@ -19,13 +19,10 @@ if (params.synapse_config) { ======================================================================================== */ -// Don't overwrite global params.modules, create a copy instead and use that within the main script. -//def modules = params.modules.clone() - include { SYNAPSE_LIST } from '../modules/local/synapse_list' include { SYNAPSE_SHOW } from '../modules/local/synapse_show' include { SYNAPSE_GET } from '../modules/local/synapse_get' -include { SYNAPSE_TO_SAMPLESHEET } from '../modules/local/synapse_to_samplesheet' // addParams( results_dir: modules['synapse_get'].publish_dir ) +include { SYNAPSE_TO_SAMPLESHEET } from '../modules/local/synapse_to_samplesheet' include { SYNAPSE_MERGE_SAMPLESHEET } from '../modules/local/synapse_merge_samplesheet' include { DUMPSOFTWAREVERSIONS } from '../modules/local/dumpsoftwareversions' From eb5816e9c1e5a9f55a8369fdaba66f2c2d7f592d Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 4 Nov 2021 12:55:00 +0000 Subject: [PATCH 137/852] Update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0153327e..65d06ea6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Enhancements & fixes +* Convert pipeline to updated Nextflow DSL2 syntax for future adoption across nf-core * Added a workflow to download FastQ files and to create samplesheets for ids from the [Synapse platform](https://www.synapse.org/) hosted by [Sage Bionetworks](https://sagebionetworks.org/). * SRA identifiers not available for direct download via the ENA FTP will now be downloaded via sra-tools. * Correctly handle errors from SRA identifiers that do **not** return metadata, for example, due to being private. From ddcb96d7ca0c89b9276b5b2b1ce3f6a86b0c9e72 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 4 Nov 2021 15:39:54 +0000 Subject: [PATCH 138/852] Fix assignment alignment --- modules/local/sratools_fasterqdump.nf | 4 ++-- modules/local/sratools_prefetch.nf | 2 +- modules/local/synapse_list.nf | 2 +- modules/local/synapse_show.nf | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/local/sratools_fasterqdump.nf b/modules/local/sratools_fasterqdump.nf index cc8fb6fa..ae69b5e6 100644 --- a/modules/local/sratools_fasterqdump.nf +++ b/modules/local/sratools_fasterqdump.nf @@ -16,8 +16,8 @@ process SRATOOLS_FASTERQDUMP { path "versions.yml" , emit: versions script: - def args = task.ext.args ?: '' - def args2 = task.ext.args2 ?: '' + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' def config = "/LIBS/GUID = \"${UUID.randomUUID().toString()}\"\\n/libs/cloud/report_instance_identity = \"true\"\\n" // Paired-end data extracted by fasterq-dump (--split-3 the default) always creates // *_1.fastq *_2.fastq files but sometimes also an additional *.fastq file diff --git a/modules/local/sratools_prefetch.nf b/modules/local/sratools_prefetch.nf index 07be740b..033aeedf 100644 --- a/modules/local/sratools_prefetch.nf +++ b/modules/local/sratools_prefetch.nf @@ -17,7 +17,7 @@ process SRATOOLS_PREFETCH { path "versions.yml" , emit: versions script: - def args = task.ext.args ?: '' + def args = task.ext.args ?: '' def config = "/LIBS/GUID = \"${UUID.randomUUID().toString()}\"\\n/libs/cloud/report_instance_identity = \"true\"\\n" """ eval "\$(vdb-config -o n NCBI_SETTINGS | sed 's/[" ]//g')" diff --git a/modules/local/synapse_list.nf b/modules/local/synapse_list.nf index f001a186..0255c925 100644 --- a/modules/local/synapse_list.nf +++ b/modules/local/synapse_list.nf @@ -17,7 +17,7 @@ process SYNAPSE_LIST { path "versions.yml", emit: versions script: - def args = task.ext.args ?: '' + def args = task.ext.args ?: '' def args2 = task.ext.args2 ?: '' """ synapse \\ diff --git a/modules/local/synapse_show.nf b/modules/local/synapse_show.nf index 78593861..9a81493a 100644 --- a/modules/local/synapse_show.nf +++ b/modules/local/synapse_show.nf @@ -17,7 +17,7 @@ process SYNAPSE_SHOW { path "versions.yml", emit: versions script: - def args = task.ext.args ?: '' + def args = task.ext.args ?: '' def args2 = task.ext.args2 ?: '' """ synapse \\ From 4b2e0f82775d0475c0fb51948ee0405fa3d69605 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 8 Nov 2021 11:23:21 +0000 Subject: [PATCH 139/852] Update main.nf --- modules/nf-core/modules/sratools/prefetch/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/nf-core/modules/sratools/prefetch/main.nf b/modules/nf-core/modules/sratools/prefetch/main.nf index c57255f5..207d1e10 100644 --- a/modules/nf-core/modules/sratools/prefetch/main.nf +++ b/modules/nf-core/modules/sratools/prefetch/main.nf @@ -35,7 +35,7 @@ process SRATOOLS_PREFETCH { printf '${config}' > "\${NCBI_SETTINGS}" fi - retry_with_backoff.sh prefetch \\ + prefetch \\ $options.args \\ --progress \\ $id From 0238704dce66dd698f2c85168f9684b3e529d1e4 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 8 Nov 2021 12:38:52 +0000 Subject: [PATCH 140/852] Name output files with EXPID_RUNID_T1 --- bin/sra_runinfo_to_ftp.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bin/sra_runinfo_to_ftp.py b/bin/sra_runinfo_to_ftp.py index 130007b6..094782f8 100755 --- a/bin/sra_runinfo_to_ftp.py +++ b/bin/sra_runinfo_to_ftp.py @@ -112,7 +112,6 @@ def parse_sra_runinfo(file_in): else: # In some instances, FTP links don't exist for FastQ files. # These have to be downloaded with the run accession using sra-tools. - db_id = row["run_accession"] sample = dict.fromkeys(extensions, None) if row["library_layout"] == "SINGLE": sample["single_end"] = "true" @@ -160,6 +159,8 @@ def sra_runinfo_to_ftp(files_in, file_out): for db_id in sorted(samplesheet): for idx, row in enumerate(samplesheet[db_id], start=1): row["id"] = f"{db_id}_T{idx}" + if 'run_accession' in row: + row["id"] = f"{db_id}_{row['run_accession']}_T{idx}" writer.writerow(row) From 5909b7587842a6ce4fe0ce074c7382b7e779847c Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 8 Nov 2021 12:39:09 +0000 Subject: [PATCH 141/852] Output md5sums for fasterqdump --- conf/modules.config | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 0f6c8138..753ab27d 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -78,9 +78,16 @@ if (params.input_type == 'sra') { withName: SRATOOLS_FASTERQDUMP { publishDir = [ - path: { "${params.outdir}/fastq" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + [ + path: { "${params.outdir}/fastq" }, + mode: params.publish_dir_mode, + pattern: "*gz" + ], + [ + path: { "${params.outdir}/fastq/md5" }, + mode: params.publish_dir_mode, + pattern: "*.md5" + ] ] } From a9b05fd83681123e230553d402605750180fddb9 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 8 Nov 2021 12:39:27 +0000 Subject: [PATCH 142/852] Rename FastQs by meta.id and output md5sums for fasterqdump --- modules/local/sratools_fasterqdump.nf | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/modules/local/sratools_fasterqdump.nf b/modules/local/sratools_fasterqdump.nf index ae69b5e6..f834eb8b 100644 --- a/modules/local/sratools_fasterqdump.nf +++ b/modules/local/sratools_fasterqdump.nf @@ -12,8 +12,9 @@ process SRATOOLS_FASTERQDUMP { tuple val(meta), path(sra) output: - tuple val(meta), path(output), emit: reads - path "versions.yml" , emit: versions + tuple val(meta), path(fastq_output), emit: reads + tuple val(meta), path(md5_output) , emit: md5 + path "versions.yml" , emit: versions script: def args = task.ext.args ?: '' @@ -22,7 +23,8 @@ process SRATOOLS_FASTERQDUMP { // Paired-end data extracted by fasterq-dump (--split-3 the default) always creates // *_1.fastq *_2.fastq files but sometimes also an additional *.fastq file // for unpaired reads which we ignore here. - output = meta.single_end ? '*.fastq.gz' : '*_{1,2}.fastq.gz' + fastq_output = meta.single_end ? '*.fastq.gz' : '*_{1,2}.fastq.gz' + md5_output = meta.single_end ? '*.fastq.gz.md5' : '*_{1,2}.fastq.gz.md5' """ eval "\$(vdb-config -o n NCBI_SETTINGS | sed 's/[" ]//g')" if [[ ! -f "\${NCBI_SETTINGS}" ]]; then @@ -41,6 +43,22 @@ process SRATOOLS_FASTERQDUMP { --processes $task.cpus \\ *.fastq + ## Rename FastQ files by meta.id + if [ -f ${sra.name}.fastq.gz ]; then + mv ${sra.name}.fastq.gz ${meta.id}.fastq.gz + md5sum ${meta.id}.fastq.gz > ${meta.id}.fastq.gz.md5 + fi + + if [ -f ${sra.name}_1.fastq.gz ]; then + mv ${sra.name}_1.fastq.gz ${meta.id}_1.fastq.gz + md5sum ${meta.id}_1.fastq.gz > ${meta.id}_1.fastq.gz.md5 + fi + + if [ -f ${sra.name}_2.fastq.gz ]; then + mv ${sra.name}_2.fastq.gz ${meta.id}_2.fastq.gz + md5sum ${meta.id}_2.fastq.gz > ${meta.id}_2.fastq.gz.md5 + fi + cat <<-END_VERSIONS > versions.yml ${task.process.tokenize(':').last()}: sratools: \$(fasterq-dump --version 2>&1 | grep -Eo '[0-9.]+') From e4384a3a759ebae2d423610dc2c57b72d649c35b Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 8 Nov 2021 12:40:02 +0000 Subject: [PATCH 143/852] Run custom bash script for retry with prefetch --- modules/local/sratools_prefetch.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/sratools_prefetch.nf b/modules/local/sratools_prefetch.nf index 033aeedf..1edb16a3 100644 --- a/modules/local/sratools_prefetch.nf +++ b/modules/local/sratools_prefetch.nf @@ -26,7 +26,7 @@ process SRATOOLS_PREFETCH { printf '${config}' > "\${NCBI_SETTINGS}" fi - prefetch \\ + retry_with_backoff.sh prefetch \\ $args \\ --progress \\ $id From 8c895a47cbcd39f60ac689084f3cdbdf655d45c6 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 8 Nov 2021 12:57:12 +0000 Subject: [PATCH 144/852] Dump experiment accession by default in mappings files --- nextflow.config | 2 +- nextflow_schema.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/nextflow.config b/nextflow.config index 6ae6a8da..9e9e2c16 100644 --- a/nextflow.config +++ b/nextflow.config @@ -14,7 +14,7 @@ params { input_type = 'sra' nf_core_pipeline = null ena_metadata_fields = null - sample_mapping_fields = 'run_accession,sample_accession,experiment_alias,run_alias,sample_alias,experiment_title,sample_title,sample_description,description' + sample_mapping_fields = 'experiment_accession,run_accession,sample_accession,experiment_alias,run_alias,sample_alias,experiment_title,sample_title,sample_description,description' synapse_config = null skip_fastq_download = false diff --git a/nextflow_schema.json b/nextflow_schema.json index 1f923f28..c033f6c4 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -43,7 +43,7 @@ "type": "string", "fa_icon": "fas fa-globe-americas", "description": "Comma-separated list of ENA metadata fields used to create a separate 'id_mappings.csv' and 'multiqc_config.yml' with selected fields that can be used to rename samples in general and in MultiQC.", - "default": "run_accession,sample_accession,experiment_alias,run_alias,sample_alias,experiment_title,sample_title,sample_description,description" + "default": "experiment_accession,run_accession,sample_accession,experiment_alias,run_alias,sample_alias,experiment_title,sample_title,sample_description,description" }, "nf_core_pipeline": { "type": "string", From 4b0c836744613f7f6ee6da80474937fede8079eb Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 8 Nov 2021 13:05:40 +0000 Subject: [PATCH 145/852] Update CHANGELOG and add links to sra-tools --- CHANGELOG.md | 2 +- CITATIONS.md | 2 ++ README.md | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 327cd99b..dde659d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * Convert pipeline to updated Nextflow DSL2 syntax for future adoption across nf-core * Added a workflow to download FastQ files and to create samplesheets for ids from the [Synapse platform](https://www.synapse.org/) hosted by [Sage Bionetworks](https://sagebionetworks.org/). -* SRA identifiers not available for direct download via the ENA FTP will now be downloaded via sra-tools. +* SRA identifiers not available for direct download via the ENA FTP will now be downloaded via [`sra-tools`](https://github.com/ncbi/sra-tools). * Correctly handle errors from SRA identifiers that do **not** return metadata, for example, due to being private. * Retry an error in prefetch via bash script in order to allow it to resume interrupted downloads. * [[#46](https://github.com/nf-core/fetchngs/issues/46)] - Bug in sra_ids_to_runinfo.py diff --git a/CITATIONS.md b/CITATIONS.md index 01819d3e..88db364c 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -28,6 +28,8 @@ * [GEO](https://pubmed.ncbi.nlm.nih.gov/23193258/) > Barrett T, Wilhite SE, Ledoux P, Evangelista C, Kim IF, Tomashevsky M, Marshall KA, Phillippy KH, Sherman PM, Holko M, Yefanov A, Lee H, Zhang N, Robertson CL, Serova N, Davis S, Soboleva A. NCBI GEO: archive for functional genomics data sets--update. Nucleic Acids Res. 2013 Jan;41(Database issue):D991-5. doi: 10.1093/nar/gks1193. Epub 2012 Nov 27. PubMed PMID: 23193258; PubMed Central PMCID: PMC3531084. +* [sra-tools](https://github.com/ncbi/sra-tools) + * [Synapse](https://pubmed.ncbi.nlm.nih.gov/24071850/) > Omberg L, Ellrott K, Yuan Y, Kandoth C, Wong C, Kellen MR, Friend SH, Stuart J, Liang H, Margolin AA. Enabling transparent and collaborative computational analysis of 12 tumor types within The Cancer Genome Atlas. Nat Genet. 2013 Oct;45(10):1121-6. doi: 10.1038/ng.2761. PMID: 24071850; PMCID: PMC3950337. diff --git a/README.md b/README.md index a5ffb8a6..cb694fd5 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ Via a single file of ids, provided one-per-line (see [example input file](https: 2. Fetch extensive id metadata via ENA API 3. Download FastQ files: - If direct download links are available from the ENA API, fetch in parallel via `curl` and perform `md5sum` check - - Otherwise use `sra-tools` to download `.sra` files and convert them to FastQ + - Otherwise use [`sra-tools`](https://github.com/ncbi/sra-tools) to download `.sra` files and convert them to FastQ 4. Collate id metadata and paths to FastQ files in a single samplesheet ### Synapse ids From b9f954766aadadcd927717d788205e12819f211b Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 8 Nov 2021 13:08:19 +0000 Subject: [PATCH 146/852] Move sra-tools citation --- CITATIONS.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CITATIONS.md b/CITATIONS.md index 88db364c..a1d9d91b 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -14,6 +14,8 @@ * [Requests](https://docs.python-requests.org/) +* [sra-tools](https://github.com/ncbi/sra-tools) + ## Pipeline resources * [ENA](https://pubmed.ncbi.nlm.nih.gov/33175160/) @@ -28,8 +30,6 @@ * [GEO](https://pubmed.ncbi.nlm.nih.gov/23193258/) > Barrett T, Wilhite SE, Ledoux P, Evangelista C, Kim IF, Tomashevsky M, Marshall KA, Phillippy KH, Sherman PM, Holko M, Yefanov A, Lee H, Zhang N, Robertson CL, Serova N, Davis S, Soboleva A. NCBI GEO: archive for functional genomics data sets--update. Nucleic Acids Res. 2013 Jan;41(Database issue):D991-5. doi: 10.1093/nar/gks1193. Epub 2012 Nov 27. PubMed PMID: 23193258; PubMed Central PMCID: PMC3531084. -* [sra-tools](https://github.com/ncbi/sra-tools) - * [Synapse](https://pubmed.ncbi.nlm.nih.gov/24071850/) > Omberg L, Ellrott K, Yuan Y, Kandoth C, Wong C, Kellen MR, Friend SH, Stuart J, Liang H, Margolin AA. Enabling transparent and collaborative computational analysis of 12 tumor types within The Cancer Genome Atlas. Nat Genet. 2013 Oct;45(10):1121-6. doi: 10.1038/ng.2761. PMID: 24071850; PMCID: PMC3950337. From 7d582eeca51b1e9f224e6ca8f28d25dc0b1df1cf Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 8 Nov 2021 13:12:34 +0000 Subject: [PATCH 147/852] Update CHANLGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index dde659d5..ff5301b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * SRA identifiers not available for direct download via the ENA FTP will now be downloaded via [`sra-tools`](https://github.com/ncbi/sra-tools). * Correctly handle errors from SRA identifiers that do **not** return metadata, for example, due to being private. * Retry an error in prefetch via bash script in order to allow it to resume interrupted downloads. +* Rename output FastQ files using `{EXP_ACC}_{RUN_ACC}_T1*fastq.gz` convention for run id provenance * [[#46](https://github.com/nf-core/fetchngs/issues/46)] - Bug in sra_ids_to_runinfo.py * Added support for [DDBJ ids](https://www.ddbj.nig.ac.jp/index-e.html). See examples below: From 6675b96ca282bf2c0d102048793ca85b652b1ec9 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 8 Nov 2021 14:42:25 +0000 Subject: [PATCH 148/852] Replace *_T* suffix with run accession --- bin/sra_runinfo_to_ftp.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/sra_runinfo_to_ftp.py b/bin/sra_runinfo_to_ftp.py index 094782f8..d9400b2f 100755 --- a/bin/sra_runinfo_to_ftp.py +++ b/bin/sra_runinfo_to_ftp.py @@ -158,9 +158,9 @@ def sra_runinfo_to_ftp(files_in, file_out): writer.writeheader() for db_id in sorted(samplesheet): for idx, row in enumerate(samplesheet[db_id], start=1): - row["id"] = f"{db_id}_T{idx}" + row["id"] = f"{db_id}" if 'run_accession' in row: - row["id"] = f"{db_id}_{row['run_accession']}_T{idx}" + row["id"] = f"{db_id}_{row['run_accession']}" writer.writerow(row) From d11da5602fe65f2c37a43e5d4be418c4408f5fae Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 8 Nov 2021 14:42:46 +0000 Subject: [PATCH 149/852] Fix bug in md5sum output format --- modules/local/sra_fastq_ftp.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/local/sra_fastq_ftp.nf b/modules/local/sra_fastq_ftp.nf index a775849c..dfbe72dd 100644 --- a/modules/local/sra_fastq_ftp.nf +++ b/modules/local/sra_fastq_ftp.nf @@ -26,7 +26,7 @@ process SRA_FASTQ_FTP { -L ${fastq[0]} \\ -o ${meta.id}.fastq.gz - echo "${meta.md5_1} ${meta.id}.fastq.gz" > ${meta.id}.fastq.gz.md5 + echo "${meta.md5_1} ${meta.id}.fastq.gz" > ${meta.id}.fastq.gz.md5 md5sum -c ${meta.id}.fastq.gz.md5 cat <<-END_VERSIONS > versions.yml @@ -41,7 +41,7 @@ process SRA_FASTQ_FTP { -L ${fastq[0]} \\ -o ${meta.id}_1.fastq.gz - echo "${meta.md5_1} ${meta.id}_1.fastq.gz" > ${meta.id}_1.fastq.gz.md5 + echo "${meta.md5_1} ${meta.id}_1.fastq.gz" > ${meta.id}_1.fastq.gz.md5 md5sum -c ${meta.id}_1.fastq.gz.md5 curl \\ @@ -49,7 +49,7 @@ process SRA_FASTQ_FTP { -L ${fastq[1]} \\ -o ${meta.id}_2.fastq.gz - echo "${meta.md5_2} ${meta.id}_2.fastq.gz" > ${meta.id}_2.fastq.gz.md5 + echo "${meta.md5_2} ${meta.id}_2.fastq.gz" > ${meta.id}_2.fastq.gz.md5 md5sum -c ${meta.id}_2.fastq.gz.md5 cat <<-END_VERSIONS > versions.yml From 73eb06ce77366a5d36b5e3088f3d83806a639a87 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 8 Nov 2021 14:44:44 +0000 Subject: [PATCH 150/852] Update CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ff5301b4..04e4c46b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * SRA identifiers not available for direct download via the ENA FTP will now be downloaded via [`sra-tools`](https://github.com/ncbi/sra-tools). * Correctly handle errors from SRA identifiers that do **not** return metadata, for example, due to being private. * Retry an error in prefetch via bash script in order to allow it to resume interrupted downloads. -* Rename output FastQ files using `{EXP_ACC}_{RUN_ACC}_T1*fastq.gz` convention for run id provenance +* Name output FastQ files by `{EXP_ACC}_{RUN_ACC}*fastq.gz` instead of `{EXP_ACC}_{T*}*fastq.gz` for run id provenance * [[#46](https://github.com/nf-core/fetchngs/issues/46)] - Bug in sra_ids_to_runinfo.py * Added support for [DDBJ ids](https://www.ddbj.nig.ac.jp/index-e.html). See examples below: From 04d0de247bd0284c492e698475950923e7de6fa1 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 8 Nov 2021 15:05:32 +0000 Subject: [PATCH 151/852] Add --force_sratools_download parameter --- CHANGELOG.md | 3 ++- nextflow.config | 1 + nextflow_schema.json | 5 +++++ workflows/sra.nf | 7 +++++-- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 04e4c46b..0b89d9ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,13 +3,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [[1.4](https://github.com/nf-core/fetchngs/releases/tag/1.4)] - 2021-10-25 +## [[1.4](https://github.com/nf-core/fetchngs/releases/tag/1.4)] - 2021-11-09 ### Enhancements & fixes * Convert pipeline to updated Nextflow DSL2 syntax for future adoption across nf-core * Added a workflow to download FastQ files and to create samplesheets for ids from the [Synapse platform](https://www.synapse.org/) hosted by [Sage Bionetworks](https://sagebionetworks.org/). * SRA identifiers not available for direct download via the ENA FTP will now be downloaded via [`sra-tools`](https://github.com/ncbi/sra-tools). +* Added `--force_sratools_download` parameter to preferentially download all FastQ files via `sra-tools` instead of ENA FTP. * Correctly handle errors from SRA identifiers that do **not** return metadata, for example, due to being private. * Retry an error in prefetch via bash script in order to allow it to resume interrupted downloads. * Name output FastQ files by `{EXP_ACC}_{RUN_ACC}*fastq.gz` instead of `{EXP_ACC}_{T*}*fastq.gz` for run id provenance diff --git a/nextflow.config b/nextflow.config index 9e9e2c16..1fb304d3 100644 --- a/nextflow.config +++ b/nextflow.config @@ -16,6 +16,7 @@ params { ena_metadata_fields = null sample_mapping_fields = 'experiment_accession,run_accession,sample_accession,experiment_alias,run_alias,sample_alias,experiment_title,sample_title,sample_description,description' synapse_config = null + force_sratools_download = false skip_fastq_download = false // Boilerplate options diff --git a/nextflow_schema.json b/nextflow_schema.json index c033f6c4..2831dac7 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -50,6 +50,11 @@ "fa_icon": "fab fa-apple", "description": "Name of supported nf-core pipeline e.g. 'rnaseq'. A samplesheet for direct use with the pipeline will be created with the appropriate columns." }, + "force_sratools_download": { + "type": "boolean", + "fa_icon": "fas fa-tools", + "description": "Force download FastQ files via sra-tools instead of via the ENA FTP." + }, "skip_fastq_download": { "type": "boolean", "fa_icon": "fas fa-fast-forward", diff --git a/workflows/sra.nf b/workflows/sra.nf index c108812f..c5fec775 100644 --- a/workflows/sra.nf +++ b/workflows/sra.nf @@ -70,13 +70,14 @@ workflow SRA { } .unique() .branch { - ftp: it[0].fastq_1 - sra: !it[0].fastq_1 + ftp: it[0].fastq_1 && !params.force_sratools_download + sra: !it[0].fastq_1 || params.force_sratools_download } .set { ch_sra_reads } ch_versions = ch_versions.mix(SRA_RUNINFO_TO_FTP.out.versions.first()) if (!params.skip_fastq_download) { + // // MODULE: If FTP link is provided in run information then download FastQ directly via FTP and validate with md5sums // @@ -85,7 +86,9 @@ workflow SRA { ) ch_versions = ch_versions.mix(SRA_FASTQ_FTP.out.versions.first()) + // // SUBWORKFLOW: Download sequencing reads without FTP links using sra-tools. + // SRA_FASTQ ( ch_sra_reads.sra.map { meta, reads -> [ meta, meta.run_accession ] } ) From c1e8040905fc0e5886d425177ef9ae1803d25caa Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 8 Nov 2021 15:06:46 +0000 Subject: [PATCH 152/852] Add CI test for --force_sratools_download --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6b67751c..4b3fe636 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -54,6 +54,7 @@ jobs: "--nf_core_pipeline rnaseq", "--ena_metadata_fields run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5 --sample_mapping_fields run_accession,library_layout", --skip_fastq_download, + --force_sratools_download ] steps: - name: Check out pipeline code From 4068b2949a0fe0dfcafe407e68a7e2e5ac48d61f Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 8 Nov 2021 15:22:59 +0000 Subject: [PATCH 153/852] Remove tool specific options section for now --- docs/usage.md | 36 ------------------------------------ 1 file changed, 36 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 6af310a6..3cb17fcd 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -186,42 +186,6 @@ process { > **NB:** We specify just the process name i.e. `STAR_ALIGN` in the config file and not the full task name string that is printed to screen in the error message or on the terminal whilst the pipeline is running i.e. `RNASEQ:ALIGN_STAR:STAR_ALIGN`. You may get a warning suggesting that the process selector isn't recognised but you can ignore that if the process name has been specified correctly. This is something that needs to be fixed upstream in core Nextflow. -### Tool-specific options - -For the ultimate flexibility, we have implemented and are using Nextflow DSL2 modules in a way where it is possible for both developers and users to change tool-specific command-line arguments (e.g. providing an additional command-line argument to the `STAR_ALIGN` process) as well as publishing options (e.g. saving files produced by the `STAR_ALIGN` process that aren't saved by default by the pipeline). In the majority of instances, as a user you won't have to change the default options set by the pipeline developer(s), however, there may be edge cases where creating a simple custom config file can improve the behaviour of the pipeline if for example it is failing due to a weird error that requires setting a tool-specific parameter to deal with smaller / larger genomes. - -The command-line arguments passed to STAR in the `STAR_ALIGN` module are a combination of: - -* Mandatory arguments or those that need to be evaluated within the scope of the module, as supplied in the [`script`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/modules/nf-core/software/star/align/main.nf#L49-L55) section of the module file. - -* An [`options.args`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/modules/nf-core/software/star/align/main.nf#L56) string of non-mandatory parameters that is set to be empty by default in the module but can be overwritten when including the module in the sub-workflow / workflow context via the `addParams` Nextflow option. - -The nf-core/rnaseq pipeline has a sub-workflow (see [terminology](https://github.com/nf-core/modules#terminology)) specifically to align reads with STAR and to sort, index and generate some basic stats on the resulting BAM files using SAMtools. At the top of this file we import the `STAR_ALIGN` module via the Nextflow [`include`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/subworkflows/nf-core/align_star.nf#L10) keyword and by default the options passed to the module via the `addParams` option are set as an empty Groovy map [here](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/subworkflows/nf-core/align_star.nf#L5); this in turn means `options.args` will be set to empty by default in the module file too. This is an intentional design choice and allows us to implement well-written sub-workflows composed of a chain of tools that by default run with the bare minimum parameter set for any given tool in order to make it much easier to share across pipelines and to provide the flexibility for users and developers to customise any non-mandatory arguments. - -When including the sub-workflow above in the main pipeline workflow we use the same `include` statement, however, we now have the ability to overwrite options for each of the tools in the sub-workflow including the [`align_options`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/workflows/rnaseq.nf#L225) variable that will be used specifically to overwrite the optional arguments passed to the `STAR_ALIGN` module. In this case, the options to be provided to `STAR_ALIGN` have been assigned sensible defaults by the developer(s) in the pipeline's [`modules.config`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/modules.config#L70-L74) and can be accessed and customised in the [workflow context](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/workflows/rnaseq.nf#L201-L204) too before eventually passing them to the sub-workflow as a Groovy map called `star_align_options`. These options will then be propagated from `workflow -> sub-workflow -> module`. - -As mentioned at the beginning of this section it may also be necessary for users to overwrite the options passed to modules to be able to customise specific aspects of the way in which a particular tool is executed by the pipeline. Given that all of the default module options are stored in the pipeline's `modules.config` as a [`params` variable](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/modules.config#L24-L25) it is also possible to overwrite any of these options via a custom config file. - -Say for example we want to append an additional, non-mandatory parameter (i.e. `--outFilterMismatchNmax 16`) to the arguments passed to the `STAR_ALIGN` module. Firstly, we need to copy across the default `args` specified in the [`modules.config`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/modules.config#L71) and create a custom config file that is a composite of the default `args` as well as the additional options you would like to provide. This is very important because Nextflow will overwrite the default value of `args` that you provide via the custom config. - -As you will see in the example below, we have: - -* appended `--outFilterMismatchNmax 16` to the default `args` used by the module. -* changed the default `publish_dir` value to where the files will eventually be published in the main results directory. -* appended `'bam':''` to the default value of `publish_files` so that the BAM files generated by the process will also be saved in the top-level results directory for the module. Note: `'out':'log'` means any file/directory ending in `out` will now be saved in a separate directory called `my_star_directory/log/`. - -```nextflow -params { - modules { - 'star_align' { - args = "--quantMode TranscriptomeSAM --twopassMode Basic --outSAMtype BAM Unsorted --readFilesCommand zcat --runRNGseed 0 --outFilterMultimapNmax 20 --alignSJDBoverhangMin 1 --outSAMattributes NH HI AS NM MD --quantTranscriptomeBan Singleend --outFilterMismatchNmax 16" - publish_dir = "my_star_directory" - publish_files = ['out':'log', 'tab':'log', 'bam':''] - } - } -} -``` - ### Updating containers The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. If for some reason you need to use a different version of a particular tool with the pipeline then you just need to identify the `process` name and override the Nextflow `container` definition for that process using the `withName` declaration. For example, in the [nf-core/viralrecon](https://nf-co.re/viralrecon) pipeline a tool called [Pangolin](https://github.com/cov-lineages/pangolin) has been used during the COVID-19 pandemic to assign lineages to SARS-CoV-2 genome sequenced samples. Given that the lineage assignments change quite frequently it doesn't make sense to re-release the nf-core/viralrecon everytime a new version of Pangolin has been released. However, you can override the default container used by the pipeline by creating a custom config file and passing it as a command-line argument via `-c custom.config`. From cacf5aaf0a8763862892c68b7b86b80444c36634 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 8 Nov 2021 15:33:43 +0000 Subject: [PATCH 154/852] Update test ids link in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cb694fd5..58e4a8a7 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ On release, automated continuous integration tests run the pipeline on a full-si ## Pipeline summary -Via a single file of ids, provided one-per-line (see [example input file](https://raw.githubusercontent.com/nf-core/test-datasets/rnaseq/samplesheet/public_database_ids.txt)) the pipeline performs the following steps: +Via a single file of ids, provided one-per-line (see [example input file](https://raw.githubusercontent.com/nf-core/test-datasets/fetchngs/sra_ids_test.txt)) the pipeline performs the following steps: ### SRA / ENA / DDBJ / GEO ids From 021bdad14c0d7af9c0b864aa1514729778f7f616 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 8 Nov 2021 15:43:01 +0000 Subject: [PATCH 155/852] Rename subworkflow to sra_fastq_sratools.nf --- subworkflows/local/{sra_fastq.nf => sra_fastq_sratools.nf} | 2 +- workflows/sra.nf | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) rename subworkflows/local/{sra_fastq.nf => sra_fastq_sratools.nf} (96%) diff --git a/subworkflows/local/sra_fastq.nf b/subworkflows/local/sra_fastq_sratools.nf similarity index 96% rename from subworkflows/local/sra_fastq.nf rename to subworkflows/local/sra_fastq_sratools.nf index 04039f79..e093fe2f 100644 --- a/subworkflows/local/sra_fastq.nf +++ b/subworkflows/local/sra_fastq_sratools.nf @@ -5,7 +5,7 @@ include { SRATOOLS_PREFETCH } from '../../modules/local/sratools_prefetch.nf' include { SRATOOLS_FASTERQDUMP } from '../../modules/local/sratools_fasterqdump.nf' -workflow SRA_FASTQ { +workflow SRA_FASTQ_SRATOOLS { take: sra_ids // channel: [ val(meta), val(id) ] diff --git a/workflows/sra.nf b/workflows/sra.nf index c5fec775..8600aa00 100644 --- a/workflows/sra.nf +++ b/workflows/sra.nf @@ -22,7 +22,7 @@ WorkflowSra.initialise(params, log, valid_params) include { SRA_IDS_TO_RUNINFO } from '../modules/local/sra_ids_to_runinfo' include { SRA_RUNINFO_TO_FTP } from '../modules/local/sra_runinfo_to_ftp' include { SRA_FASTQ_FTP } from '../modules/local/sra_fastq_ftp' -include { SRA_FASTQ } from '../subworkflows/local/sra_fastq' +include { SRA_FASTQ_SRATOOLS } from '../subworkflows/local/sra_fastq_sratools' include { SRA_TO_SAMPLESHEET } from '../modules/local/sra_to_samplesheet' include { SRA_MERGE_SAMPLESHEET } from '../modules/local/sra_merge_samplesheet' include { MULTIQC_MAPPINGS_CONFIG } from '../modules/local/multiqc_mappings_config' @@ -89,7 +89,7 @@ workflow SRA { // // SUBWORKFLOW: Download sequencing reads without FTP links using sra-tools. // - SRA_FASTQ ( + SRA_FASTQ_SRATOOLS ( ch_sra_reads.sra.map { meta, reads -> [ meta, meta.run_accession ] } ) ch_versions = ch_versions.mix(SRA_FASTQ.out.versions.first()) From e5e59e982ceb0322c62ec5975cfbb3f790d80121 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 8 Nov 2021 15:46:25 +0000 Subject: [PATCH 156/852] Fix tests --- workflows/sra.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workflows/sra.nf b/workflows/sra.nf index 8600aa00..4012a571 100644 --- a/workflows/sra.nf +++ b/workflows/sra.nf @@ -92,13 +92,13 @@ workflow SRA { SRA_FASTQ_SRATOOLS ( ch_sra_reads.sra.map { meta, reads -> [ meta, meta.run_accession ] } ) - ch_versions = ch_versions.mix(SRA_FASTQ.out.versions.first()) + ch_versions = ch_versions.mix(SRA_FASTQ_SRATOOLS.out.versions.first()) // // MODULE: Stage FastQ files downloaded by SRA together and auto-create a samplesheet // SRA_TO_SAMPLESHEET ( - SRA_FASTQ_FTP.out.fastq.mix(SRA_FASTQ.out.reads), + SRA_FASTQ_FTP.out.fastq.mix(SRA_FASTQ_SRATOOLS.out.reads), params.nf_core_pipeline ?: '', params.sample_mapping_fields ) From b0363de5626ce526a889b2c5ef6e6f2d9bb49991 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 9 Nov 2021 12:11:18 +0000 Subject: [PATCH 157/852] Update DSL2 docs in CONTRIBUTING.md --- .github/CONTRIBUTING.md | 54 ++++++++++------------------------------- 1 file changed, 13 insertions(+), 41 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 888cff34..f294492d 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -61,21 +61,16 @@ For further information/help, please consult the [nf-core/fetchngs documentation To make the nf-core/fetchngs code and processing logic more understandable for new contributors and to ensure quality, we semi-standardise the way the code and other contributions are written. -### Adding a new step - -If you wish to contribute a new step, please use the following coding standards: - -1. Define the corresponding input channel into your new process from the expected previous process channel -2. Write the process block (see below). -3. Define the output channel if needed (see below). -4. Add any new flags/options to `nextflow.config` with a default (see below). -5. Add any new flags/options to `nextflow_schema.json` with help text (with `nf-core schema build`). -6. Add any new flags/options to the help message (for integer/text parameters, print to help the corresponding `nextflow.config` parameter). -7. Add sanity checks for all relevant parameters. -8. Add any new software to the `scrape_software_versions.py` script in `bin/` and the version command to the `scrape_software_versions` process in `main.nf`. -9. Do local tests that the new code works properly and as expected. -10. Add a new test command in `.github/workflow/ci.yml`. -11. Add any descriptions of output files to `docs/output.md`. +### Adding a new step or module + +If you wish to contribute a new step or module please see the [official guidelines](https://nf-co.re/developers/adding_modules#new-module-guidelines-and-pr-review-checklist) and use the following coding standards: + +1. Add any new flags/options to `nextflow.config` with a default (see section below). +2. Add any new flags/options to `nextflow_schema.json` with help text via `nf-core schema build`. +3. Add sanity checks for all relevant parameters. +4. Perform local tests to validate that the new code works as expected. +5. If applicable, add a new test command in `.github/workflow/ci.yml`. +6. Add any descriptions of output files to `docs/output.md`. ### Default values @@ -87,40 +82,17 @@ Once there, use `nf-core schema build` to add to `nextflow_schema.json`. Sensible defaults for process resource requirements (CPUs / memory / time) for a process should be defined in `conf/base.config`. These should generally be specified generic with `withLabel:` selectors so they can be shared across multiple processes/steps of the pipeline. A nf-core standard set of labels that should be followed where possible can be seen in the [nf-core pipeline template](https://github.com/nf-core/tools/blob/master/nf_core/pipeline-template/conf/base.config), which has the default process as a single core-process, and then different levels of multi-core configurations for increasingly large memory requirements defined with standardised labels. -The process resources can be passed on to the tool dynamically within the process with the `${task.cpu}` and `${task.memory}` variables in the `script:` block. - -### Naming schemes +### Channel naming convention Please use the following naming schemes, to make it easy to understand what is going where. -* initial process channel: `ch_output_from_` -* intermediate and terminal channels: `ch__for_` +* Initial process channel: `ch_output_from_` +* Intermediate and terminal channels: `ch__for_` ### Nextflow version bumping If you are using a new feature from core Nextflow, you may bump the minimum required version of nextflow in the pipeline with: `nf-core bump-version --nextflow . [min-nf-version]` -### Software version reporting - -If you add a new tool to the pipeline, please ensure you add the information of the tool to the `get_software_version` process. - -Add to the script block of the process, something like the following: - -```bash - --version &> v_.txt 2>&1 || true -``` - -or - -```bash - --help | head -n 1 &> v_.txt 2>&1 || true -``` - -You then need to edit the script `bin/scrape_software_versions.py` to: - -1. Add a Python regex for your tool's `--version` output (as in stored in the `v_.txt` file), to ensure the version is reported as a `v` and the version number e.g. `v2.1.1` -2. Add a HTML entry to the `OrderedDict` for formatting in MultiQC. - ### Images and figures For overview images and other documents we follow the nf-core [style guidelines and examples](https://nf-co.re/developers/design_guidelines). From e1cb675c04392bcc799cc58bc19120904828b01f Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 9 Nov 2021 17:31:53 +0000 Subject: [PATCH 158/852] Bump version to 1.5dev --- CHANGELOG.md | 4 ++++ nextflow.config | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b89d9ae..f3e67547 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unpublished Version / DEV] + +### Enhancements & fixes + ## [[1.4](https://github.com/nf-core/fetchngs/releases/tag/1.4)] - 2021-11-09 ### Enhancements & fixes diff --git a/nextflow.config b/nextflow.config index 1fb304d3..ea68a9b1 100644 --- a/nextflow.config +++ b/nextflow.config @@ -146,7 +146,7 @@ manifest { description = 'Pipeline to fetch metadata and raw FastQ files from public databases' mainScript = 'main.nf' nextflowVersion = '!>=21.04.0' - version = '1.4' + version = '1.5dev' } // Load modules.config for DSL2 module specific options From 08d7c1e245ef726ed07b9c5ad60846d1030f494e Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sat, 27 Nov 2021 09:46:04 +0000 Subject: [PATCH 159/852] Install updated syntax module from nf-core/modules --- modules/local/dumpsoftwareversions.nf | 96 ------------------- .../custom/dumpsoftwareversions/main.nf | 21 ++++ .../custom/dumpsoftwareversions/meta.yml | 34 +++++++ .../templates/dumpsoftwareversions.py | 89 +++++++++++++++++ .../modules/sratools/fasterqdump/main.nf} | 31 ++---- .../modules/sratools/fasterqdump/meta.yml | 42 ++++++++ .../modules/sratools/prefetch/main.nf} | 7 +- .../modules/sratools/prefetch/meta.yml | 43 +++++++++ 8 files changed, 238 insertions(+), 125 deletions(-) delete mode 100644 modules/local/dumpsoftwareversions.nf create mode 100644 modules/nf-core/modules/custom/dumpsoftwareversions/main.nf create mode 100644 modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml create mode 100644 modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py rename modules/{local/sratools_fasterqdump.nf => nf-core/modules/sratools/fasterqdump/main.nf} (61%) create mode 100644 modules/nf-core/modules/sratools/fasterqdump/meta.yml rename modules/{local/sratools_prefetch.nf => nf-core/modules/sratools/prefetch/main.nf} (90%) create mode 100644 modules/nf-core/modules/sratools/prefetch/meta.yml diff --git a/modules/local/dumpsoftwareversions.nf b/modules/local/dumpsoftwareversions.nf deleted file mode 100644 index 69ebcbaa..00000000 --- a/modules/local/dumpsoftwareversions.nf +++ /dev/null @@ -1,96 +0,0 @@ - -process DUMPSOFTWAREVERSIONS { - label 'process_low' - - // Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container - conda (params.enable_conda ? "bioconda::multiqc=1.11" : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.11--pyhdfd78af_0' : - 'quay.io/biocontainers/multiqc:1.11--pyhdfd78af_0' }" - - input: - path versions - - output: - path "software_versions.yml" , emit: yml - path "software_versions_mqc.yml", emit: mqc_yml - path "versions.yml" , emit: versions - - script: - """ - #!/usr/bin/env python - - import yaml - import platform - from textwrap import dedent - - def _make_versions_html(versions): - html = [ - dedent( - '''\\ - - - - - - - - - - ''' - ) - ] - for process, tmp_versions in sorted(versions.items()): - html.append("") - for i, (tool, version) in enumerate(sorted(tmp_versions.items())): - html.append( - dedent( - f'''\\ - - - - - - ''' - ) - ) - html.append("") - html.append("
Process Name Software Version
{process if (i == 0) else ''}{tool}{version}
") - return "\\n".join(html) - - module_versions = {} - module_versions["${task.process.tokenize(':').last()}"] = { - 'python': platform.python_version(), - 'yaml': yaml.__version__ - } - - with open("$versions") as f: - workflow_versions = yaml.load(f, Loader=yaml.BaseLoader) | module_versions - - workflow_versions["Workflow"] = { - "Nextflow": "$workflow.nextflow.version", - "$workflow.manifest.name": "$workflow.manifest.version" - } - - versions_mqc = { - 'id': 'software_versions', - 'section_name': '${workflow.manifest.name} Software Versions', - 'section_href': 'https://github.com/${workflow.manifest.name}', - 'plot_type': 'html', - 'description': 'are collected at run time from the software output.', - 'data': _make_versions_html(workflow_versions) - } - - with open("software_versions.yml", 'w') as f: - yaml.dump(workflow_versions, f, default_flow_style=False) - with open("software_versions_mqc.yml", 'w') as f: - yaml.dump(versions_mqc, f, default_flow_style=False) - - with open('versions.yml', 'w') as f: - yaml.dump(module_versions, f, default_flow_style=False) - """ -} diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf b/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf new file mode 100644 index 00000000..934bb467 --- /dev/null +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf @@ -0,0 +1,21 @@ +process CUSTOM_DUMPSOFTWAREVERSIONS { + label 'process_low' + + // Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container + conda (params.enable_conda ? "bioconda::multiqc=1.11" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/multiqc:1.11--pyhdfd78af_0' : + 'quay.io/biocontainers/multiqc:1.11--pyhdfd78af_0' }" + + input: + path versions + + output: + path "software_versions.yml" , emit: yml + path "software_versions_mqc.yml", emit: mqc_yml + path "versions.yml" , emit: versions + + script: + def args = task.ext.args ?: '' + template 'dumpsoftwareversions.py' +} diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml new file mode 100644 index 00000000..5b5b8a60 --- /dev/null +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml @@ -0,0 +1,34 @@ +name: custom_dumpsoftwareversions +description: Custom module used to dump software versions within the nf-core pipeline template +keywords: + - custom + - version +tools: + - custom: + description: Custom module used to dump software versions within the nf-core pipeline template + homepage: https://github.com/nf-core/tools + documentation: https://github.com/nf-core/tools + licence: ['MIT'] +input: + - versions: + type: file + description: YML file containing software versions + pattern: "*.yml" + +output: + - yml: + type: file + description: Standard YML file containing software versions + pattern: "software_versions.yml" + - mqc_yml: + type: file + description: MultiQC custom content YML file containing software versions + pattern: "software_versions_mqc.yml" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@drpatelh" + - "@grst" diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py b/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py new file mode 100644 index 00000000..d1390392 --- /dev/null +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python + +import yaml +import platform +from textwrap import dedent + + +def _make_versions_html(versions): + html = [ + dedent( + """\\ + + + + + + + + + + """ + ) + ] + for process, tmp_versions in sorted(versions.items()): + html.append("") + for i, (tool, version) in enumerate(sorted(tmp_versions.items())): + html.append( + dedent( + f"""\\ + + + + + + """ + ) + ) + html.append("") + html.append("
Process Name Software Version
{process if (i == 0) else ''}{tool}{version}
") + return "\\n".join(html) + + +versions_this_module = {} +versions_this_module["${task.process}"] = { + "python": platform.python_version(), + "yaml": yaml.__version__, +} + +with open("$versions") as f: + versions_by_process = yaml.load(f, Loader=yaml.BaseLoader) | versions_this_module + +# aggregate versions by the module name (derived from fully-qualified process name) +versions_by_module = {} +for process, process_versions in versions_by_process.items(): + module = process.split(":")[-1] + try: + assert versions_by_module[module] == process_versions, ( + "We assume that software versions are the same between all modules. " + "If you see this error-message it means you discovered an edge-case " + "and should open an issue in nf-core/tools. " + ) + except KeyError: + versions_by_module[module] = process_versions + +versions_by_module["Workflow"] = { + "Nextflow": "$workflow.nextflow.version", + "$workflow.manifest.name": "$workflow.manifest.version", +} + +versions_mqc = { + "id": "software_versions", + "section_name": "${workflow.manifest.name} Software Versions", + "section_href": "https://github.com/${workflow.manifest.name}", + "plot_type": "html", + "description": "are collected at run time from the software output.", + "data": _make_versions_html(versions_by_module), +} + +with open("software_versions.yml", "w") as f: + yaml.dump(versions_by_module, f, default_flow_style=False) +with open("software_versions_mqc.yml", "w") as f: + yaml.dump(versions_mqc, f, default_flow_style=False) + +with open("versions.yml", "w") as f: + yaml.dump(versions_this_module, f, default_flow_style=False) diff --git a/modules/local/sratools_fasterqdump.nf b/modules/nf-core/modules/sratools/fasterqdump/main.nf similarity index 61% rename from modules/local/sratools_fasterqdump.nf rename to modules/nf-core/modules/sratools/fasterqdump/main.nf index f834eb8b..73e3673d 100644 --- a/modules/local/sratools_fasterqdump.nf +++ b/modules/nf-core/modules/sratools/fasterqdump/main.nf @@ -1,4 +1,3 @@ - process SRATOOLS_FASTERQDUMP { tag "$meta.id" label 'process_medium' @@ -12,19 +11,17 @@ process SRATOOLS_FASTERQDUMP { tuple val(meta), path(sra) output: - tuple val(meta), path(fastq_output), emit: reads - tuple val(meta), path(md5_output) , emit: md5 - path "versions.yml" , emit: versions + tuple val(meta), path(output), emit: reads + path "versions.yml" , emit: versions script: - def args = task.ext.args ?: '' - def args2 = task.ext.args2 ?: '' + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' def config = "/LIBS/GUID = \"${UUID.randomUUID().toString()}\"\\n/libs/cloud/report_instance_identity = \"true\"\\n" // Paired-end data extracted by fasterq-dump (--split-3 the default) always creates // *_1.fastq *_2.fastq files but sometimes also an additional *.fastq file // for unpaired reads which we ignore here. - fastq_output = meta.single_end ? '*.fastq.gz' : '*_{1,2}.fastq.gz' - md5_output = meta.single_end ? '*.fastq.gz.md5' : '*_{1,2}.fastq.gz.md5' + output = meta.single_end ? '*.fastq.gz' : '*_{1,2}.fastq.gz' """ eval "\$(vdb-config -o n NCBI_SETTINGS | sed 's/[" ]//g')" if [[ ! -f "\${NCBI_SETTINGS}" ]]; then @@ -43,24 +40,8 @@ process SRATOOLS_FASTERQDUMP { --processes $task.cpus \\ *.fastq - ## Rename FastQ files by meta.id - if [ -f ${sra.name}.fastq.gz ]; then - mv ${sra.name}.fastq.gz ${meta.id}.fastq.gz - md5sum ${meta.id}.fastq.gz > ${meta.id}.fastq.gz.md5 - fi - - if [ -f ${sra.name}_1.fastq.gz ]; then - mv ${sra.name}_1.fastq.gz ${meta.id}_1.fastq.gz - md5sum ${meta.id}_1.fastq.gz > ${meta.id}_1.fastq.gz.md5 - fi - - if [ -f ${sra.name}_2.fastq.gz ]; then - mv ${sra.name}_2.fastq.gz ${meta.id}_2.fastq.gz - md5sum ${meta.id}_2.fastq.gz > ${meta.id}_2.fastq.gz.md5 - fi - cat <<-END_VERSIONS > versions.yml - ${task.process.tokenize(':').last()}: + "${task.process}": sratools: \$(fasterq-dump --version 2>&1 | grep -Eo '[0-9.]+') pigz: \$( pigz --version 2>&1 | sed 's/pigz //g' ) END_VERSIONS diff --git a/modules/nf-core/modules/sratools/fasterqdump/meta.yml b/modules/nf-core/modules/sratools/fasterqdump/meta.yml new file mode 100644 index 00000000..1478bed8 --- /dev/null +++ b/modules/nf-core/modules/sratools/fasterqdump/meta.yml @@ -0,0 +1,42 @@ +name: sratools_fasterqdump +description: Extract sequencing reads in FASTQ format from a given NCBI Sequence Read Archive (SRA). +keywords: + - sequencing + - FASTQ + - dump +tools: + - sratools: + description: SRA Toolkit and SDK from NCBI + homepage: https://github.com/ncbi/sra-tools + documentation: https://github.com/ncbi/sra-tools/wiki + tool_dev_url: https://github.com/ncbi/sra-tools + licence: ['US-Government-Work'] + +input: + - meta: + type: map + description: > + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - sra: + type: directory + description: Directory containing ETL data for the given SRA. + pattern: "*/*.sra" + +output: + - meta: + type: map + description: > + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - reads: + type: file + description: Extracted FASTQ file or files if the sequencing reads are paired-end. + pattern: "*.fastq.gz" + +authors: + - "@Midnighter" diff --git a/modules/local/sratools_prefetch.nf b/modules/nf-core/modules/sratools/prefetch/main.nf similarity index 90% rename from modules/local/sratools_prefetch.nf rename to modules/nf-core/modules/sratools/prefetch/main.nf index 1edb16a3..1e1eb802 100644 --- a/modules/local/sratools_prefetch.nf +++ b/modules/nf-core/modules/sratools/prefetch/main.nf @@ -1,4 +1,3 @@ - process SRATOOLS_PREFETCH { tag "$id" label 'process_low' @@ -17,7 +16,7 @@ process SRATOOLS_PREFETCH { path "versions.yml" , emit: versions script: - def args = task.ext.args ?: '' + def args = task.ext.args ?: '' def config = "/LIBS/GUID = \"${UUID.randomUUID().toString()}\"\\n/libs/cloud/report_instance_identity = \"true\"\\n" """ eval "\$(vdb-config -o n NCBI_SETTINGS | sed 's/[" ]//g')" @@ -26,7 +25,7 @@ process SRATOOLS_PREFETCH { printf '${config}' > "\${NCBI_SETTINGS}" fi - retry_with_backoff.sh prefetch \\ + prefetch \\ $args \\ --progress \\ $id @@ -34,7 +33,7 @@ process SRATOOLS_PREFETCH { vdb-validate $id cat <<-END_VERSIONS > versions.yml - ${task.process.tokenize(':').last()}: + "${task.process}": sratools: \$(prefetch --version 2>&1 | grep -Eo '[0-9.]+') END_VERSIONS """ diff --git a/modules/nf-core/modules/sratools/prefetch/meta.yml b/modules/nf-core/modules/sratools/prefetch/meta.yml new file mode 100644 index 00000000..22213b29 --- /dev/null +++ b/modules/nf-core/modules/sratools/prefetch/meta.yml @@ -0,0 +1,43 @@ +name: sratools_prefetch +description: Download sequencing data from the NCBI Sequence Read Archive (SRA). +keywords: + - sequencing + - fastq + - prefetch +tools: + - sratools: + description: SRA Toolkit and SDK from NCBI + homepage: https://github.com/ncbi/sra-tools + documentation: https://github.com/ncbi/sra-tools/wiki + tool_dev_url: https://github.com/ncbi/sra-tools + licence: ['US-Government-Work'] + +input: + - meta: + type: map + description: > + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - id: + type: val + description: > + A string denoting an SRA id. + +output: + - meta: + type: map + description: > + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - sra: + type: directory + description: > + Directory containing the ETL data for the given SRA id. + pattern: "*/*.sra" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@Midnighter" From 1f307ce46f565be526f92d119dc16df01bbab8e5 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sat, 27 Nov 2021 09:46:34 +0000 Subject: [PATCH 160/852] Change version command to use task.process --- modules/local/multiqc_mappings_config.nf | 2 +- modules/local/sra_fastq_ftp.nf | 4 ++-- modules/local/sra_ids_to_runinfo.nf | 2 +- modules/local/sra_merge_samplesheet.nf | 2 +- modules/local/sra_runinfo_to_ftp.nf | 2 +- modules/local/synapse_get.nf | 2 +- modules/local/synapse_list.nf | 2 +- modules/local/synapse_merge_samplesheet.nf | 2 +- modules/local/synapse_show.nf | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/modules/local/multiqc_mappings_config.nf b/modules/local/multiqc_mappings_config.nf index 15c30846..31f06dae 100644 --- a/modules/local/multiqc_mappings_config.nf +++ b/modules/local/multiqc_mappings_config.nf @@ -20,7 +20,7 @@ process MULTIQC_MAPPINGS_CONFIG { multiqc_config.yml cat <<-END_VERSIONS > versions.yml - ${task.process.tokenize(':').last()}: + "${task.process}": python: \$(python --version | sed 's/Python //g') END_VERSIONS """ diff --git a/modules/local/sra_fastq_ftp.nf b/modules/local/sra_fastq_ftp.nf index dfbe72dd..2dc0c8ae 100644 --- a/modules/local/sra_fastq_ftp.nf +++ b/modules/local/sra_fastq_ftp.nf @@ -30,7 +30,7 @@ process SRA_FASTQ_FTP { md5sum -c ${meta.id}.fastq.gz.md5 cat <<-END_VERSIONS > versions.yml - ${task.process.tokenize(':').last()}: + "${task.process}": curl: \$(echo \$(curl --version | head -n 1 | sed 's/^curl //; s/ .*\$//')) END_VERSIONS """ @@ -53,7 +53,7 @@ process SRA_FASTQ_FTP { md5sum -c ${meta.id}_2.fastq.gz.md5 cat <<-END_VERSIONS > versions.yml - ${task.process.tokenize(':').last()}: + "${task.process}" curl: \$(echo \$(curl --version | head -n 1 | sed 's/^curl //; s/ .*\$//')) END_VERSIONS """ diff --git a/modules/local/sra_ids_to_runinfo.nf b/modules/local/sra_ids_to_runinfo.nf index c8209690..57fdb10e 100644 --- a/modules/local/sra_ids_to_runinfo.nf +++ b/modules/local/sra_ids_to_runinfo.nf @@ -26,7 +26,7 @@ process SRA_IDS_TO_RUNINFO { $metadata_fields cat <<-END_VERSIONS > versions.yml - ${task.process.tokenize(':').last()}: + "${task.process}": python: \$(python --version | sed 's/Python //g') END_VERSIONS """ diff --git a/modules/local/sra_merge_samplesheet.nf b/modules/local/sra_merge_samplesheet.nf index be3f1087..863dfaa7 100644 --- a/modules/local/sra_merge_samplesheet.nf +++ b/modules/local/sra_merge_samplesheet.nf @@ -28,7 +28,7 @@ process SRA_MERGE_SAMPLESHEET { done cat <<-END_VERSIONS > versions.yml - ${task.process.tokenize(':').last()}: + "${task.process}": sed: \$(echo \$(sed --version 2>&1) | sed 's/^.*GNU sed) //; s/ .*\$//') END_VERSIONS """ diff --git a/modules/local/sra_runinfo_to_ftp.nf b/modules/local/sra_runinfo_to_ftp.nf index a6b6a829..13fa6c3e 100644 --- a/modules/local/sra_runinfo_to_ftp.nf +++ b/modules/local/sra_runinfo_to_ftp.nf @@ -20,7 +20,7 @@ process SRA_RUNINFO_TO_FTP { ${runinfo.toString().tokenize(".")[0]}.runinfo_ftp.tsv cat <<-END_VERSIONS > versions.yml - ${task.process.tokenize(':').last()}: + "${task.process}": python: \$(python --version | sed 's/Python //g') END_VERSIONS """ diff --git a/modules/local/synapse_get.nf b/modules/local/synapse_get.nf index 5269286c..885a9a95 100644 --- a/modules/local/synapse_get.nf +++ b/modules/local/synapse_get.nf @@ -30,7 +30,7 @@ process SYNAPSE_GET { echo "${meta.md5} \t ${meta.name}" > ${meta.id}.md5 cat <<-END_VERSIONS > versions.yml - ${task.process.tokenize(':').last()}: + "${task.process}": synapse: \$(synapse --version | sed -e "s/Synapse Client //g") END_VERSIONS """ diff --git a/modules/local/synapse_list.nf b/modules/local/synapse_list.nf index 0255c925..58034038 100644 --- a/modules/local/synapse_list.nf +++ b/modules/local/synapse_list.nf @@ -29,7 +29,7 @@ process SYNAPSE_LIST { > ${id}.list.txt cat <<-END_VERSIONS > versions.yml - ${task.process.tokenize(':').last()}: + "${task.process}": syanpse: \$(synapse --version | sed -e "s/Synapse Client //g") END_VERSIONS """ diff --git a/modules/local/synapse_merge_samplesheet.nf b/modules/local/synapse_merge_samplesheet.nf index e3f97fa8..01461e14 100644 --- a/modules/local/synapse_merge_samplesheet.nf +++ b/modules/local/synapse_merge_samplesheet.nf @@ -21,7 +21,7 @@ process SYNAPSE_MERGE_SAMPLESHEET { done cat <<-END_VERSIONS > versions.yml - ${task.process.tokenize(':').last()}: + "${task.process}": sed: \$(echo \$(sed --version 2>&1) | sed 's/^.*GNU sed) //; s/ .*\$//') END_VERSIONS """ diff --git a/modules/local/synapse_show.nf b/modules/local/synapse_show.nf index 9a81493a..e03fb2f1 100644 --- a/modules/local/synapse_show.nf +++ b/modules/local/synapse_show.nf @@ -29,7 +29,7 @@ process SYNAPSE_SHOW { > ${id}.metadata.txt cat <<-END_VERSIONS > versions.yml - ${task.process.tokenize(':').last()}: + "${task.process}": synapse: \$(synapse --version | sed -e "s/Synapse Client //g") END_VERSIONS """ From ab3bf4ed865069fa0ae3cdb91dd8ff380af13240 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sat, 27 Nov 2021 09:46:46 +0000 Subject: [PATCH 161/852] Install nf-core modules --- modules.json | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/modules.json b/modules.json index 0e4143ef..5d0b0fe9 100644 --- a/modules.json +++ b/modules.json @@ -1,5 +1,17 @@ { "name": "nf-core/fetchngs", "homePage": "https://github.com/nf-core/fetchngs", - "repos": {} + "repos": { + "nf-core/modules": { + "custom/dumpsoftwareversions": { + "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" + }, + "sratools/fasterqdump": { + "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" + }, + "sratools/prefetch": { + "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" + } + } + } } \ No newline at end of file From b1ced19ee6874ae89443323abf88d760288a1a8c Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sat, 27 Nov 2021 09:47:34 +0000 Subject: [PATCH 162/852] Add executor local for native groovy processes --- modules/local/sra_to_samplesheet.nf | 1 + modules/local/synapse_to_samplesheet.nf | 1 + 2 files changed, 2 insertions(+) diff --git a/modules/local/sra_to_samplesheet.nf b/modules/local/sra_to_samplesheet.nf index dbbc6613..465144d7 100644 --- a/modules/local/sra_to_samplesheet.nf +++ b/modules/local/sra_to_samplesheet.nf @@ -2,6 +2,7 @@ process SRA_TO_SAMPLESHEET { tag "$meta.id" + executor 'local' memory 100.MB input: diff --git a/modules/local/synapse_to_samplesheet.nf b/modules/local/synapse_to_samplesheet.nf index 40519ec0..2e7945ed 100644 --- a/modules/local/synapse_to_samplesheet.nf +++ b/modules/local/synapse_to_samplesheet.nf @@ -2,6 +2,7 @@ process SYNAPSE_TO_SAMPLESHEET { tag "$meta.id" + executor 'local' memory 100.MB input: From 4fcd56b631835b81840d1102d1a726b2238c6415 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sat, 27 Nov 2021 20:53:40 +0000 Subject: [PATCH 163/852] Bump NF version from 21.04.0 to 21.10.3 --- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- .github/workflows/ci.yml | 2 +- README.md | 4 ++-- nextflow.config | 3 +-- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 11bb35bf..406ca8df 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -51,7 +51,7 @@ Have you provided the following extra information/files: ## Nextflow Installation -- Version: +- Version: ## Container engine diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4b3fe636..eb26bd07 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,7 +22,7 @@ jobs: strategy: matrix: # Nextflow versions: check pipeline minimum and latest edge version - nxf_ver: ["NXF_VER=21.04.0", "NXF_EDGE=1"] + nxf_ver: ["NXF_VER=21.10.3", "NXF_EDGE=1"] steps: - name: Check out pipeline code uses: actions/checkout@v2 diff --git a/README.md b/README.md index 58e4a8a7..eb046d87 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ [![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/fetchngs/results) [![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.5070524-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.5070524) -[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A521.04.0-23aa62.svg?labelColor=000000)](https://www.nextflow.io/) +[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A521.10.3-23aa62.svg?labelColor=000000)](https://www.nextflow.io/) [![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/) [![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/) [![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/) @@ -48,7 +48,7 @@ The columns in the auto-created samplesheet can be tailored to be accepted out-o ## Quick Start -1. Install [`Nextflow`](https://www.nextflow.io/docs/latest/getstarted.html#installation) (`>=21.04.0`) +1. Install [`Nextflow`](https://www.nextflow.io/docs/latest/getstarted.html#installation) (`>=21.10.3`) 2. Install any of [`Docker`](https://docs.docker.com/engine/installation/), [`Singularity`](https://www.sylabs.io/guides/3.0/user-guide/), [`Podman`](https://podman.io/), [`Shifter`](https://nersc.gitlab.io/development/shifter/how-to-use/) or [`Charliecloud`](https://hpc.github.io/charliecloud/) for full pipeline reproducibility _(please only use [`Conda`](https://conda.io/miniconda.html) as a last resort; see [docs](https://nf-co.re/usage/configuration#basic-configuration-profiles))_ diff --git a/nextflow.config b/nextflow.config index ea68a9b1..5cc0cdac 100644 --- a/nextflow.config +++ b/nextflow.config @@ -22,7 +22,6 @@ params { // Boilerplate options outdir = './results' tracedir = "${params.outdir}/pipeline_info" - publish_dir_mode = 'copy' email = null email_on_fail = null plaintext_email = false @@ -145,7 +144,7 @@ manifest { homePage = 'https://github.com/nf-core/fetchngs' description = 'Pipeline to fetch metadata and raw FastQ files from public databases' mainScript = 'main.nf' - nextflowVersion = '!>=21.04.0' + nextflowVersion = '!>=21.10.3' version = '1.5dev' } From 2c28be248ced1ebb7d2a199434c9546cb10ac95c Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sat, 27 Nov 2021 20:55:08 +0000 Subject: [PATCH 164/852] Move sratools modules to local due to customisation --- modules.json | 6 --- .../main.nf => local/sratools_fasterqdump.nf} | 27 ++++++++++-- .../main.nf => local/sratools_prefetch.nf} | 3 +- .../modules/sratools/fasterqdump/meta.yml | 42 ------------------ .../modules/sratools/prefetch/meta.yml | 43 ------------------- subworkflows/local/sra_fastq_sratools.nf | 4 +- 6 files changed, 27 insertions(+), 98 deletions(-) rename modules/{nf-core/modules/sratools/fasterqdump/main.nf => local/sratools_fasterqdump.nf} (64%) rename modules/{nf-core/modules/sratools/prefetch/main.nf => local/sratools_prefetch.nf} (96%) delete mode 100644 modules/nf-core/modules/sratools/fasterqdump/meta.yml delete mode 100644 modules/nf-core/modules/sratools/prefetch/meta.yml diff --git a/modules.json b/modules.json index 5d0b0fe9..eba88bd4 100644 --- a/modules.json +++ b/modules.json @@ -5,12 +5,6 @@ "nf-core/modules": { "custom/dumpsoftwareversions": { "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" - }, - "sratools/fasterqdump": { - "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" - }, - "sratools/prefetch": { - "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" } } } diff --git a/modules/nf-core/modules/sratools/fasterqdump/main.nf b/modules/local/sratools_fasterqdump.nf similarity index 64% rename from modules/nf-core/modules/sratools/fasterqdump/main.nf rename to modules/local/sratools_fasterqdump.nf index 73e3673d..7a75e551 100644 --- a/modules/nf-core/modules/sratools/fasterqdump/main.nf +++ b/modules/local/sratools_fasterqdump.nf @@ -1,3 +1,4 @@ + process SRATOOLS_FASTERQDUMP { tag "$meta.id" label 'process_medium' @@ -11,17 +12,19 @@ process SRATOOLS_FASTERQDUMP { tuple val(meta), path(sra) output: - tuple val(meta), path(output), emit: reads - path "versions.yml" , emit: versions + tuple val(meta), path(fastq_output), emit: reads + tuple val(meta), path(md5_output) , emit: md5 + path "versions.yml" , emit: versions script: - def args = task.ext.args ?: '' + def args = task.ext.args ?: '' def args2 = task.ext.args2 ?: '' def config = "/LIBS/GUID = \"${UUID.randomUUID().toString()}\"\\n/libs/cloud/report_instance_identity = \"true\"\\n" // Paired-end data extracted by fasterq-dump (--split-3 the default) always creates // *_1.fastq *_2.fastq files but sometimes also an additional *.fastq file // for unpaired reads which we ignore here. - output = meta.single_end ? '*.fastq.gz' : '*_{1,2}.fastq.gz' + fastq_output = meta.single_end ? '*.fastq.gz' : '*_{1,2}.fastq.gz' + md5_output = meta.single_end ? '*.fastq.gz.md5' : '*_{1,2}.fastq.gz.md5' """ eval "\$(vdb-config -o n NCBI_SETTINGS | sed 's/[" ]//g')" if [[ ! -f "\${NCBI_SETTINGS}" ]]; then @@ -40,6 +43,22 @@ process SRATOOLS_FASTERQDUMP { --processes $task.cpus \\ *.fastq + ## Rename FastQ files by meta.id + if [ -f ${sra.name}.fastq.gz ]; then + mv ${sra.name}.fastq.gz ${meta.id}.fastq.gz + md5sum ${meta.id}.fastq.gz > ${meta.id}.fastq.gz.md5 + fi + + if [ -f ${sra.name}_1.fastq.gz ]; then + mv ${sra.name}_1.fastq.gz ${meta.id}_1.fastq.gz + md5sum ${meta.id}_1.fastq.gz > ${meta.id}_1.fastq.gz.md5 + fi + + if [ -f ${sra.name}_2.fastq.gz ]; then + mv ${sra.name}_2.fastq.gz ${meta.id}_2.fastq.gz + md5sum ${meta.id}_2.fastq.gz > ${meta.id}_2.fastq.gz.md5 + fi + cat <<-END_VERSIONS > versions.yml "${task.process}": sratools: \$(fasterq-dump --version 2>&1 | grep -Eo '[0-9.]+') diff --git a/modules/nf-core/modules/sratools/prefetch/main.nf b/modules/local/sratools_prefetch.nf similarity index 96% rename from modules/nf-core/modules/sratools/prefetch/main.nf rename to modules/local/sratools_prefetch.nf index 1e1eb802..76679a93 100644 --- a/modules/nf-core/modules/sratools/prefetch/main.nf +++ b/modules/local/sratools_prefetch.nf @@ -1,3 +1,4 @@ + process SRATOOLS_PREFETCH { tag "$id" label 'process_low' @@ -25,7 +26,7 @@ process SRATOOLS_PREFETCH { printf '${config}' > "\${NCBI_SETTINGS}" fi - prefetch \\ + retry_with_backoff.sh prefetch \\ $args \\ --progress \\ $id diff --git a/modules/nf-core/modules/sratools/fasterqdump/meta.yml b/modules/nf-core/modules/sratools/fasterqdump/meta.yml deleted file mode 100644 index 1478bed8..00000000 --- a/modules/nf-core/modules/sratools/fasterqdump/meta.yml +++ /dev/null @@ -1,42 +0,0 @@ -name: sratools_fasterqdump -description: Extract sequencing reads in FASTQ format from a given NCBI Sequence Read Archive (SRA). -keywords: - - sequencing - - FASTQ - - dump -tools: - - sratools: - description: SRA Toolkit and SDK from NCBI - homepage: https://github.com/ncbi/sra-tools - documentation: https://github.com/ncbi/sra-tools/wiki - tool_dev_url: https://github.com/ncbi/sra-tools - licence: ['US-Government-Work'] - -input: - - meta: - type: map - description: > - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - sra: - type: directory - description: Directory containing ETL data for the given SRA. - pattern: "*/*.sra" - -output: - - meta: - type: map - description: > - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - - reads: - type: file - description: Extracted FASTQ file or files if the sequencing reads are paired-end. - pattern: "*.fastq.gz" - -authors: - - "@Midnighter" diff --git a/modules/nf-core/modules/sratools/prefetch/meta.yml b/modules/nf-core/modules/sratools/prefetch/meta.yml deleted file mode 100644 index 22213b29..00000000 --- a/modules/nf-core/modules/sratools/prefetch/meta.yml +++ /dev/null @@ -1,43 +0,0 @@ -name: sratools_prefetch -description: Download sequencing data from the NCBI Sequence Read Archive (SRA). -keywords: - - sequencing - - fastq - - prefetch -tools: - - sratools: - description: SRA Toolkit and SDK from NCBI - homepage: https://github.com/ncbi/sra-tools - documentation: https://github.com/ncbi/sra-tools/wiki - tool_dev_url: https://github.com/ncbi/sra-tools - licence: ['US-Government-Work'] - -input: - - meta: - type: map - description: > - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - id: - type: val - description: > - A string denoting an SRA id. - -output: - - meta: - type: map - description: > - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - sra: - type: directory - description: > - Directory containing the ETL data for the given SRA id. - pattern: "*/*.sra" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - -authors: - - "@Midnighter" diff --git a/subworkflows/local/sra_fastq_sratools.nf b/subworkflows/local/sra_fastq_sratools.nf index e093fe2f..1d59eb61 100644 --- a/subworkflows/local/sra_fastq_sratools.nf +++ b/subworkflows/local/sra_fastq_sratools.nf @@ -2,8 +2,8 @@ // Download FASTQ sequencing reads from the NCBI's Sequence Read Archive (SRA). // -include { SRATOOLS_PREFETCH } from '../../modules/local/sratools_prefetch.nf' -include { SRATOOLS_FASTERQDUMP } from '../../modules/local/sratools_fasterqdump.nf' +include { SRATOOLS_PREFETCH } from '../../modules/local/sratools_prefetch' +include { SRATOOLS_FASTERQDUMP } from '../../modules/local/sratools_fasterqdump' workflow SRA_FASTQ_SRATOOLS { take: From 25640bd6aae7b2e7b8625883b109c4c4880a00b0 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sat, 27 Nov 2021 20:55:17 +0000 Subject: [PATCH 165/852] Update CHANGELOG --- CHANGELOG.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f3e67547..4d6341df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unpublished Version / DEV] +## [[1.5](https://github.com/nf-core/fetchngs/releases/tag/1.5] - 2021-11-29 + +* Finish porting the pipeline to the updated Nextflow DSL2 syntax adopted on nf-core/modules + * Bump minimum Nextflow version from `21.04.0` -> `21.10.3` + * Removed `--publish_dir_mode` as it is no longer required for the new syntax ### Enhancements & fixes From 6e3259a057975c93a30361f5b75208f92aba02fa Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sat, 27 Nov 2021 20:55:34 +0000 Subject: [PATCH 166/852] Remove params.publish_dir_mode --- conf/modules.config | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 753ab27d..c08c1fe6 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -17,14 +17,14 @@ process { publishDir = [ path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, - mode: params.publish_dir_mode, + mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] - withName: DUMPSOFTWAREVERSIONS { + withName: CUSTOM_DUMPSOFTWAREVERSIONS { publishDir = [ path: { "${params.outdir}/pipeline_info" }, - mode: params.publish_dir_mode, + mode: 'copy', pattern: '*_versions.yml' ] } @@ -48,7 +48,7 @@ if (params.input_type == 'sra') { withName: SRA_RUNINFO_TO_FTP { publishDir = [ path: { "${params.outdir}/metadata" }, - mode: params.publish_dir_mode, + mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -58,12 +58,12 @@ if (params.input_type == 'sra') { publishDir = [ [ path: { "${params.outdir}/fastq" }, - mode: params.publish_dir_mode, + mode: 'copy', pattern: "*gz" ], [ path: { "${params.outdir}/fastq/md5" }, - mode: params.publish_dir_mode, + mode: 'copy', pattern: "*.md5" ] ] @@ -80,12 +80,12 @@ if (params.input_type == 'sra') { publishDir = [ [ path: { "${params.outdir}/fastq" }, - mode: params.publish_dir_mode, + mode: 'copy', pattern: "*gz" ], [ path: { "${params.outdir}/fastq/md5" }, - mode: params.publish_dir_mode, + mode: 'copy', pattern: "*.md5" ] ] @@ -101,7 +101,7 @@ if (params.input_type == 'sra') { withName: SRA_MERGE_SAMPLESHEET { publishDir = [ path: { "${params.outdir}/samplesheet" }, - mode: params.publish_dir_mode, + mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -109,7 +109,7 @@ if (params.input_type == 'sra') { withName: MULTIQC_MAPPINGS_CONFIG { publishDir = [ path: { "${params.outdir}/samplesheet" }, - mode: params.publish_dir_mode, + mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -129,7 +129,7 @@ if (params.input_type == 'synapse') { ext.args = '--long' publishDir = [ path: { "${params.outdir}/metadata" }, - mode: params.publish_dir_mode, + mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -138,12 +138,12 @@ if (params.input_type == 'synapse') { publishDir = [ [ path: { "${params.outdir}/fastq" }, - mode: params.publish_dir_mode, + mode: 'copy', pattern: "*gz" ], [ path: { "${params.outdir}/fastq/md5" }, - mode: params.publish_dir_mode, + mode: 'copy', pattern: "*.md5" ] ] @@ -152,7 +152,7 @@ if (params.input_type == 'synapse') { withName: SYNAPSE_SHOW { publishDir = [ path: { "${params.outdir}/metadata" }, - mode: params.publish_dir_mode, + mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -167,7 +167,7 @@ if (params.input_type == 'synapse') { withName: SYNAPSE_MERGE_SAMPLESHEET { publishDir = [ path: { "${params.outdir}/samplesheet" }, - mode: params.publish_dir_mode, + mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } From 12fcb97082ba84016fd525f895a819daecedbca2 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sat, 27 Nov 2021 20:55:38 +0000 Subject: [PATCH 167/852] Remove params.publish_dir_mode --- nextflow_schema.json | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 2831dac7..ae439a7b 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -177,22 +177,6 @@ "fa_icon": "fas fa-question-circle", "hidden": true }, - "publish_dir_mode": { - "type": "string", - "default": "copy", - "description": "Method used to save pipeline results to output directory.", - "help_text": "The Nextflow `publishDir` option specifies which intermediate files should be saved to the output directory. This option tells the pipeline what method should be used to move these files. See [Nextflow docs](https://www.nextflow.io/docs/latest/process.html#publishdir) for details.", - "fa_icon": "fas fa-copy", - "enum": [ - "symlink", - "rellink", - "link", - "copy", - "copyNoFollow", - "move" - ], - "hidden": true - }, "email_on_fail": { "type": "string", "description": "Email address for completion summary, only when pipeline fails.", From 194fb72e63592819a03a61657126a02e0dedd5c3 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sat, 27 Nov 2021 20:55:55 +0000 Subject: [PATCH 168/852] Fix tyop in versions syntax --- modules/local/sra_fastq_ftp.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/sra_fastq_ftp.nf b/modules/local/sra_fastq_ftp.nf index 2dc0c8ae..edb5241a 100644 --- a/modules/local/sra_fastq_ftp.nf +++ b/modules/local/sra_fastq_ftp.nf @@ -53,7 +53,7 @@ process SRA_FASTQ_FTP { md5sum -c ${meta.id}_2.fastq.gz.md5 cat <<-END_VERSIONS > versions.yml - "${task.process}" + "${task.process}": curl: \$(echo \$(curl --version | head -n 1 | sed 's/^curl //; s/ .*\$//')) END_VERSIONS """ From 4ee548901ab86a757cf7359cbfd78aeace977e3c Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sat, 27 Nov 2021 20:56:10 +0000 Subject: [PATCH 169/852] Rename dumpsoftwareversions module --- workflows/sra.nf | 14 +++++++++++--- workflows/synapse.nf | 11 +++++++++-- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/workflows/sra.nf b/workflows/sra.nf index 4012a571..9336fcc1 100644 --- a/workflows/sra.nf +++ b/workflows/sra.nf @@ -22,11 +22,19 @@ WorkflowSra.initialise(params, log, valid_params) include { SRA_IDS_TO_RUNINFO } from '../modules/local/sra_ids_to_runinfo' include { SRA_RUNINFO_TO_FTP } from '../modules/local/sra_runinfo_to_ftp' include { SRA_FASTQ_FTP } from '../modules/local/sra_fastq_ftp' -include { SRA_FASTQ_SRATOOLS } from '../subworkflows/local/sra_fastq_sratools' include { SRA_TO_SAMPLESHEET } from '../modules/local/sra_to_samplesheet' include { SRA_MERGE_SAMPLESHEET } from '../modules/local/sra_merge_samplesheet' include { MULTIQC_MAPPINGS_CONFIG } from '../modules/local/multiqc_mappings_config' -include { DUMPSOFTWAREVERSIONS } from '../modules/local/dumpsoftwareversions' + +include { SRA_FASTQ_SRATOOLS } from '../subworkflows/local/sra_fastq_sratools' + +/* +======================================================================================== + IMPORT NF-CORE MODULES/SUBWORKFLOWS +======================================================================================== +*/ + +include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' /* ======================================================================================== @@ -126,7 +134,7 @@ workflow SRA { // // MODULE: Dump software versions for all tools used in the workflow // - DUMPSOFTWAREVERSIONS ( + CUSTOM_DUMPSOFTWAREVERSIONS ( ch_versions.unique().collectFile(name: 'collated_versions.yml') ) } diff --git a/workflows/synapse.nf b/workflows/synapse.nf index 5a7e3fe7..2a673623 100644 --- a/workflows/synapse.nf +++ b/workflows/synapse.nf @@ -24,7 +24,14 @@ include { SYNAPSE_SHOW } from '../modules/local/synapse_show' include { SYNAPSE_GET } from '../modules/local/synapse_get' include { SYNAPSE_TO_SAMPLESHEET } from '../modules/local/synapse_to_samplesheet' include { SYNAPSE_MERGE_SAMPLESHEET } from '../modules/local/synapse_merge_samplesheet' -include { DUMPSOFTWAREVERSIONS } from '../modules/local/dumpsoftwareversions' + +/* +======================================================================================== + IMPORT NF-CORE MODULES/SUBWORKFLOWS +======================================================================================== +*/ + +include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' /* ======================================================================================== @@ -122,7 +129,7 @@ workflow SYNAPSE { // // MODULE: Dump software versions for all tools used in the workflow // - DUMPSOFTWAREVERSIONS ( + CUSTOM_DUMPSOFTWAREVERSIONS ( ch_versions.unique().collectFile(name: 'collated_versions.yml') ) } From 27f7827e579551bd9768dd11ac8fa8919bc42619 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sat, 27 Nov 2021 21:30:57 +0000 Subject: [PATCH 170/852] Bump version to 1.5 --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 5cc0cdac..f3284c52 100644 --- a/nextflow.config +++ b/nextflow.config @@ -145,7 +145,7 @@ manifest { description = 'Pipeline to fetch metadata and raw FastQ files from public databases' mainScript = 'main.nf' nextflowVersion = '!>=21.10.3' - version = '1.5dev' + version = '1.5' } // Load modules.config for DSL2 module specific options From c12cee0800398762ab9737d7ab35586c1fc7a01f Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 28 Nov 2021 14:14:35 +0000 Subject: [PATCH 171/852] Upgrade CI tests to those on dev --- .github/workflows/awsfulltest.yml | 11 ++++++++--- .github/workflows/awstest.yml | 9 +++++---- .github/workflows/ci.yml | 7 +++---- .github/workflows/linting_comment.yml | 1 + 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index a40a53f4..dc26b72d 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -14,10 +14,14 @@ jobs: runs-on: ubuntu-latest steps: - name: Launch workflow via tower - uses: nf-core/tower-action@master + uses: nf-core/tower-action@v2 + # TODO nf-core: You can customise AWS full pipeline tests as required + # Add full size test data (but still relatively small datasets for few samples) + # on the `test_full.config` test runs with only one set of parameters + with: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} - bearer_token: ${{ secrets.TOWER_BEARER_TOKEN }} + access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} pipeline: ${{ github.repository }} revision: ${{ github.sha }} @@ -26,4 +30,5 @@ jobs: { "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/fetchngs/results-${{ github.sha }}" } - profiles: '[ "test_full", "aws_tower" ]' + profiles: test_full,aws_tower + diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index 6f008aed..df53dcf3 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -11,11 +11,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Launch workflow via tower - uses: nf-core/tower-action@master - + uses: nf-core/tower-action@v2 + with: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} - bearer_token: ${{ secrets.TOWER_BEARER_TOKEN }} + access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} pipeline: ${{ github.repository }} revision: ${{ github.sha }} @@ -24,4 +24,5 @@ jobs: { "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/fetchngs/results-${{ github.sha }}" } - profiles: '[ "test", "aws_tower" ]' + profiles: test,aws_tower + diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index eb26bd07..56193da8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,9 +8,6 @@ on: release: types: [published] -# Uncomment if we need an edge release of Nextflow again -# env: NXF_EDGE: 1 - jobs: test: name: Run workflow tests @@ -22,7 +19,9 @@ jobs: strategy: matrix: # Nextflow versions: check pipeline minimum and latest edge version - nxf_ver: ["NXF_VER=21.10.3", "NXF_EDGE=1"] + nxf_ver: + - 'NXF_VER=21.10.3' + # - 'NXF_EDGE=1' steps: - name: Check out pipeline code uses: actions/checkout@v2 diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 90f03c6f..44d72994 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -15,6 +15,7 @@ jobs: uses: dawidd6/action-download-artifact@v2 with: workflow: linting.yml + workflow_conclusion: completed - name: Get PR number id: pr_number From e141707b26b2c07732eb2fe2ef71e88baa2c823b Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 28 Nov 2021 14:18:57 +0000 Subject: [PATCH 172/852] Fix linting --- .github/workflows/ci.yml | 2 +- .nf-core.yml | 2 ++ CHANGELOG.md | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 56193da8..a159501f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,7 +20,7 @@ jobs: matrix: # Nextflow versions: check pipeline minimum and latest edge version nxf_ver: - - 'NXF_VER=21.10.3' + - 'NXF_VER=21.10.3' # - 'NXF_EDGE=1' steps: - name: Check out pipeline code diff --git a/.nf-core.yml b/.nf-core.yml index b8e4d216..efb97174 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,6 +1,8 @@ lint: files_unchanged: - .github/CONTRIBUTING.md + - .github/ISSUE_TEMPLATE/bug_report.md + - .github/workflows/linting_comment.yml - assets/sendmail_template.txt - lib/NfcoreSchema.groovy - lib/NfcoreTemplate.groovy diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d6341df..37feff4a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [[1.5](https://github.com/nf-core/fetchngs/releases/tag/1.5] - 2021-11-29 +## [[1.5](https://github.com/nf-core/fetchngs/releases/tag/1.5)] - 2021-11-29 * Finish porting the pipeline to the updated Nextflow DSL2 syntax adopted on nf-core/modules * Bump minimum Nextflow version from `21.04.0` -> `21.10.3` From b21a617b8402c0ec43fbd182854f94550360ddcc Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 28 Nov 2021 20:06:48 +0000 Subject: [PATCH 173/852] Lint and fix repo relative to latest dev --- .gitattributes | 2 + .github/CONTRIBUTING.md | 56 ++++++++++++++----- .github/ISSUE_TEMPLATE/bug_report.md | 63 ---------------------- .github/ISSUE_TEMPLATE/bug_report.yml | 52 ++++++++++++++++++ .github/ISSUE_TEMPLATE/config.yml | 1 - .github/ISSUE_TEMPLATE/feature_request.md | 32 ----------- .github/ISSUE_TEMPLATE/feature_request.yml | 11 ++++ .github/workflows/awsfulltest.yml | 5 +- .nf-core.yml | 16 +++--- lib/NfcoreSchema.groovy | 19 +++++-- 10 files changed, 133 insertions(+), 124 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml diff --git a/.gitattributes b/.gitattributes index 7fe55006..050bb120 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,3 @@ *.config linguist-language=nextflow +modules/nf-core/** linguist-generated +subworkflows/nf-core/** linguist-generated diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index f294492d..1d7943a5 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -61,16 +61,23 @@ For further information/help, please consult the [nf-core/fetchngs documentation To make the nf-core/fetchngs code and processing logic more understandable for new contributors and to ensure quality, we semi-standardise the way the code and other contributions are written. -### Adding a new step or module - -If you wish to contribute a new step or module please see the [official guidelines](https://nf-co.re/developers/adding_modules#new-module-guidelines-and-pr-review-checklist) and use the following coding standards: - -1. Add any new flags/options to `nextflow.config` with a default (see section below). -2. Add any new flags/options to `nextflow_schema.json` with help text via `nf-core schema build`. -3. Add sanity checks for all relevant parameters. -4. Perform local tests to validate that the new code works as expected. -5. If applicable, add a new test command in `.github/workflow/ci.yml`. -6. Add any descriptions of output files to `docs/output.md`. +### Adding a new step + +If you wish to contribute a new step, please use the following coding standards: + +1. Define the corresponding input channel into your new process from the expected previous process channel +2. Write the process block (see below). +3. Define the output channel if needed (see below). +4. Add any new flags/options to `nextflow.config` with a default (see below). +5. Add any new flags/options to `nextflow_schema.json` with help text (with `nf-core schema build`). +6. Add any new flags/options to the help message (for integer/text parameters, print to help the corresponding `nextflow.config` parameter). +7. Add sanity checks for all relevant parameters. +8. Add any new software to the `scrape_software_versions.py` script in `bin/` and the version command to the `scrape_software_versions` process in `main.nf`. +9. Do local tests that the new code works properly and as expected. +10. Add a new test command in `.github/workflow/ci.yml`. +11. If applicable add a [MultiQC](https://https://multiqc.info/) module. +12. Update MultiQC config `assets/multiqc_config.yaml` so relevant suffixes, name clean up, General Statistics Table column order, and module figures are in the right order. +13. Optional: Add any descriptions of MultiQC report sections and output files to `docs/output.md`. ### Default values @@ -82,17 +89,40 @@ Once there, use `nf-core schema build` to add to `nextflow_schema.json`. Sensible defaults for process resource requirements (CPUs / memory / time) for a process should be defined in `conf/base.config`. These should generally be specified generic with `withLabel:` selectors so they can be shared across multiple processes/steps of the pipeline. A nf-core standard set of labels that should be followed where possible can be seen in the [nf-core pipeline template](https://github.com/nf-core/tools/blob/master/nf_core/pipeline-template/conf/base.config), which has the default process as a single core-process, and then different levels of multi-core configurations for increasingly large memory requirements defined with standardised labels. -### Channel naming convention +The process resources can be passed on to the tool dynamically within the process with the `${task.cpu}` and `${task.memory}` variables in the `script:` block. + +### Naming schemes Please use the following naming schemes, to make it easy to understand what is going where. -* Initial process channel: `ch_output_from_` -* Intermediate and terminal channels: `ch__for_` +* initial process channel: `ch_output_from_` +* intermediate and terminal channels: `ch__for_` ### Nextflow version bumping If you are using a new feature from core Nextflow, you may bump the minimum required version of nextflow in the pipeline with: `nf-core bump-version --nextflow . [min-nf-version]` +### Software version reporting + +If you add a new tool to the pipeline, please ensure you add the information of the tool to the `get_software_version` process. + +Add to the script block of the process, something like the following: + +```bash + --version &> v_.txt 2>&1 || true +``` + +or + +```bash + --help | head -n 1 &> v_.txt 2>&1 || true +``` + +You then need to edit the script `bin/scrape_software_versions.py` to: + +1. Add a Python regex for your tool's `--version` output (as in stored in the `v_.txt` file), to ensure the version is reported as a `v` and the version number e.g. `v2.1.1` +2. Add a HTML entry to the `OrderedDict` for formatting in MultiQC. + ### Images and figures For overview images and other documents we follow the nf-core [style guidelines and examples](https://nf-co.re/developers/design_guidelines). diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 406ca8df..00000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -name: Bug report -about: Report something that is broken or incorrect -labels: bug ---- - - - -## Check Documentation - -I have checked the following places for your error: - -- [ ] [nf-core website: troubleshooting](https://nf-co.re/usage/troubleshooting) -- [ ] [nf-core/fetchngs pipeline documentation](https://nf-co.re/fetchngs/usage) - -## Description of the bug - - - -## Steps to reproduce - -Steps to reproduce the behaviour: - -1. Command line: -2. See error: - -## Expected behaviour - - - -## Log files - -Have you provided the following extra information/files: - -- [ ] The command used to run the pipeline -- [ ] The `.nextflow.log` file - -## System - -- Hardware: -- Executor: -- OS: -- Version - -## Nextflow Installation - -- Version: - -## Container engine - -- Engine: -- version: - -## Additional context - - diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 00000000..7fc6710e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,52 @@ + +name: Bug report +description: Report something that is broken or incorrect +labels: bug +body: + + - type: markdown + attributes: + value: | + Before you post this issue, please check the documentation: + + - [nf-core website: troubleshooting](https://nf-co.re/usage/troubleshooting) + - [nf-core/fetchngs pipeline documentation](https://nf-co.re/fetchngs/usage) + + - type: textarea + id: description + attributes: + label: Description of the bug + description: A clear and concise description of what the bug is. + validations: + required: true + + - type: textarea + id: command_used + attributes: + label: Command used and terminal output + description: Steps to reproduce the behaviour. Please paste the command you used to launch the pipeline and the output from your terminal. + render: console + placeholder: | + $ nextflow run ... + + Some output where something broke + + - type: textarea + id: files + attributes: + label: Relevant files + description: | + Please upload (drag and drop) and relevant files. Make into a `.zip` file if the extension is not allowed. + Your verbose log file `.nextflow.log` is often useful _(this is a hidden file in the directory where you launched the pipeline)_ as well as custom Nextflow configuration files. + + - type: textarea + id: system + attributes: + label: System information + description: | + * Nextflow version _(eg. 21.10.3)_ + * Hardware _(eg. HPC, Desktop, Cloud)_ + * Executor _(eg. slurm, local, awsbatch)_ + * Container engine: _(e.g. Docker, Singularity, Conda, Podman, Shifter or Charliecloud)_ + * OS _(eg. CentOS Linux, macOS, Linux Mint)_ + * Version of nf-core/fetchngs _(eg. 1.1, 1.5, 1.8.2)_ diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 7a59f73a..41a8beb7 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,4 +1,3 @@ -blank_issues_enabled: false contact_links: - name: Join nf-core url: https://nf-co.re/join diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index c554f29b..00000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for the nf-core/fetchngs pipeline -labels: enhancement ---- - - - -## Is your feature request related to a problem? Please describe - - - - - -## Describe the solution you'd like - - - -## Describe alternatives you've considered - - - -## Additional context - - diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 00000000..f8ea51da --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,11 @@ +name: Feature request +description: Suggest an idea for the nf-core/fetchngs pipeline +labels: enhancement +body: + - type: textarea + id: description + attributes: + label: Description of feature + description: Please describe your suggestion for a new feature. It might help to describe a problem or use case, plus any alternatives that you have considered. + validations: + required: true diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index dc26b72d..70f39ce3 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -15,10 +15,7 @@ jobs: steps: - name: Launch workflow via tower uses: nf-core/tower-action@v2 - # TODO nf-core: You can customise AWS full pipeline tests as required - # Add full size test data (but still relatively small datasets for few samples) - # on the `test_full.config` test runs with only one set of parameters - + with: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} diff --git a/.nf-core.yml b/.nf-core.yml index efb97174..a660c3f8 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,12 +1,12 @@ lint: files_unchanged: - - .github/CONTRIBUTING.md - - .github/ISSUE_TEMPLATE/bug_report.md - - .github/workflows/linting_comment.yml +# - .github/CONTRIBUTING.md +# - .github/ISSUE_TEMPLATE/bug_report.md +# - .github/workflows/linting_comment.yml - assets/sendmail_template.txt - - lib/NfcoreSchema.groovy +# - lib/NfcoreSchema.groovy - lib/NfcoreTemplate.groovy - files_exist: - - bin/scrape_software_versions.py - - modules/local/get_software_versions.nf - actions_ci: False +# files_exist: +# - bin/scrape_software_versions.py +# - modules/local/get_software_versions.nf +# actions_ci: False diff --git a/lib/NfcoreSchema.groovy b/lib/NfcoreSchema.groovy index dcb39c83..5f681078 100755 --- a/lib/NfcoreSchema.groovy +++ b/lib/NfcoreSchema.groovy @@ -105,9 +105,13 @@ class NfcoreSchema { // Collect expected parameters from the schema def expectedParams = [] + def enums = [:] for (group in schemaParams) { for (p in group.value['properties']) { expectedParams.push(p.key) + if (group.value['properties'][p.key].containsKey('enum')) { + enums[p.key] = group.value['properties'][p.key]['enum'] + } } } @@ -155,7 +159,7 @@ class NfcoreSchema { println '' log.error 'ERROR: Validation of pipeline parameters failed!' JSONObject exceptionJSON = e.toJSON() - printExceptions(exceptionJSON, params_json, log) + printExceptions(exceptionJSON, params_json, log, enums) println '' has_error = true } @@ -329,7 +333,7 @@ class NfcoreSchema { // // Loop over nested exceptions and print the causingException // - private static void printExceptions(ex_json, params_json, log) { + private static void printExceptions(ex_json, params_json, log, enums, limit=5) { def causingExceptions = ex_json['causingExceptions'] if (causingExceptions.length() == 0) { def m = ex_json['message'] =~ /required key \[([^\]]+)\] not found/ @@ -345,7 +349,16 @@ class NfcoreSchema { else { def param = ex_json['pointerToViolation'] - ~/^#\// def param_val = params_json[param].toString() - log.error "* --${param}: ${ex_json['message']} (${param_val})" + if (enums.containsKey(param)) { + def error_msg = "* --${param}: '${param_val}' is not a valid choice (Available choices" + if (enums[param].size() > limit) { + log.error "${error_msg} (${limit} of ${enums[param].size()}): ${enums[param][0..limit-1].join(', ')}, ... )" + } else { + log.error "${error_msg}: ${enums[param].join(', ')})" + } + } else { + log.error "* --${param}: ${ex_json['message']} (${param_val})" + } } } for (ex in causingExceptions) { From 881e1f897c5d7fdbb39afabd4f5d31d9992b7502 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 28 Nov 2021 20:14:39 +0000 Subject: [PATCH 174/852] Fix nf-core lint --- .nf-core.yml | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index a660c3f8..27864ada 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,12 +1,14 @@ lint: files_unchanged: -# - .github/CONTRIBUTING.md -# - .github/ISSUE_TEMPLATE/bug_report.md -# - .github/workflows/linting_comment.yml + - .gitattributes + - .github/ISSUE_TEMPLATE/config.yml + - .github/workflows/linting_comment.yml - assets/sendmail_template.txt -# - lib/NfcoreSchema.groovy + - lib/NfcoreSchema.groovy - lib/NfcoreTemplate.groovy -# files_exist: -# - bin/scrape_software_versions.py -# - modules/local/get_software_versions.nf -# actions_ci: False + files_exist: + - .github/ISSUE_TEMPLATE/bug_report.md + - .github/ISSUE_TEMPLATE/feature_request.md + - bin/scrape_software_versions.py + - modules/local/get_software_versions.nf + actions_ci: False From eab36c98b6362ecf810ec0dbed06423c8766a334 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 29 Nov 2021 10:51:32 +0000 Subject: [PATCH 175/852] Address review comments --- .github/CONTRIBUTING.md | 36 +++++++----------------------------- 1 file changed, 7 insertions(+), 29 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 1d7943a5..e401c046 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -70,14 +70,13 @@ If you wish to contribute a new step, please use the following coding standards: 3. Define the output channel if needed (see below). 4. Add any new flags/options to `nextflow.config` with a default (see below). 5. Add any new flags/options to `nextflow_schema.json` with help text (with `nf-core schema build`). -6. Add any new flags/options to the help message (for integer/text parameters, print to help the corresponding `nextflow.config` parameter). -7. Add sanity checks for all relevant parameters. -8. Add any new software to the `scrape_software_versions.py` script in `bin/` and the version command to the `scrape_software_versions` process in `main.nf`. -9. Do local tests that the new code works properly and as expected. -10. Add a new test command in `.github/workflow/ci.yml`. -11. If applicable add a [MultiQC](https://https://multiqc.info/) module. -12. Update MultiQC config `assets/multiqc_config.yaml` so relevant suffixes, name clean up, General Statistics Table column order, and module figures are in the right order. -13. Optional: Add any descriptions of MultiQC report sections and output files to `docs/output.md`. +6. Add sanity checks for all relevant parameters. +7. Add any new software to the `scrape_software_versions.py` script in `bin/` and the version command to the `scrape_software_versions` process in `main.nf`. +8. Perform local tests to validate that the new code works as expected. +9. Add a new test command in `.github/workflow/ci.yml`. +10. If applicable add a [MultiQC](https://https://multiqc.info/) module. +11. Update MultiQC config `assets/multiqc_config.yaml` so relevant suffixes, name clean up, General Statistics Table column order, and module figures are in the right order. +12. Optional: Add any descriptions of MultiQC report sections and output files to `docs/output.md`. ### Default values @@ -102,27 +101,6 @@ Please use the following naming schemes, to make it easy to understand what is g If you are using a new feature from core Nextflow, you may bump the minimum required version of nextflow in the pipeline with: `nf-core bump-version --nextflow . [min-nf-version]` -### Software version reporting - -If you add a new tool to the pipeline, please ensure you add the information of the tool to the `get_software_version` process. - -Add to the script block of the process, something like the following: - -```bash - --version &> v_.txt 2>&1 || true -``` - -or - -```bash - --help | head -n 1 &> v_.txt 2>&1 || true -``` - -You then need to edit the script `bin/scrape_software_versions.py` to: - -1. Add a Python regex for your tool's `--version` output (as in stored in the `v_.txt` file), to ensure the version is reported as a `v` and the version number e.g. `v2.1.1` -2. Add a HTML entry to the `OrderedDict` for formatting in MultiQC. - ### Images and figures For overview images and other documents we follow the nf-core [style guidelines and examples](https://nf-co.re/developers/design_guidelines). From 0c5a67b2b0e7f4620d3fa3253fa48e89776e8bf0 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 29 Nov 2021 10:55:09 +0000 Subject: [PATCH 176/852] Fix nf-core lint --- .nf-core.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.nf-core.yml b/.nf-core.yml index 27864ada..4403ba5c 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -3,6 +3,7 @@ lint: - .gitattributes - .github/ISSUE_TEMPLATE/config.yml - .github/workflows/linting_comment.yml + - .github/CONTRIBUTING.md - assets/sendmail_template.txt - lib/NfcoreSchema.groovy - lib/NfcoreTemplate.groovy From 541ab9a8cd31c713570174e3426e554013b89e5e Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 29 Nov 2021 17:41:02 +0000 Subject: [PATCH 177/852] Change ext.suffix to ext.prefix --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index c08c1fe6..eb3c936c 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -6,7 +6,7 @@ ext.args = Additional arguments appended to command in module. ext.args2 = Second set of arguments appended to command in module (multi-tool modules). ext.args3 = Third set of arguments appended to command in module (multi-tool modules). - ext.suffix = File name suffix for output files. + ext.prefix = File name prefix for output files. ---------------------------------------------------------------------------------------- */ From d1602635309d835951f502b2e5ca3408ace637ec Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 30 Nov 2021 09:19:00 +0000 Subject: [PATCH 178/852] Update date in CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 37feff4a..056c3602 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [[1.5](https://github.com/nf-core/fetchngs/releases/tag/1.5)] - 2021-11-29 +## [[1.5](https://github.com/nf-core/fetchngs/releases/tag/1.5)] - 2021-11-30 * Finish porting the pipeline to the updated Nextflow DSL2 syntax adopted on nf-core/modules * Bump minimum Nextflow version from `21.04.0` -> `21.10.3` From 8688a82879cd41c13cfa6a2689d554ab8f63ea5e Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 30 Nov 2021 09:43:29 +0000 Subject: [PATCH 179/852] Update contributing bullets --- .github/CONTRIBUTING.md | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index e401c046..9aa27773 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -68,15 +68,13 @@ If you wish to contribute a new step, please use the following coding standards: 1. Define the corresponding input channel into your new process from the expected previous process channel 2. Write the process block (see below). 3. Define the output channel if needed (see below). -4. Add any new flags/options to `nextflow.config` with a default (see below). -5. Add any new flags/options to `nextflow_schema.json` with help text (with `nf-core schema build`). -6. Add sanity checks for all relevant parameters. -7. Add any new software to the `scrape_software_versions.py` script in `bin/` and the version command to the `scrape_software_versions` process in `main.nf`. -8. Perform local tests to validate that the new code works as expected. -9. Add a new test command in `.github/workflow/ci.yml`. -10. If applicable add a [MultiQC](https://https://multiqc.info/) module. -11. Update MultiQC config `assets/multiqc_config.yaml` so relevant suffixes, name clean up, General Statistics Table column order, and module figures are in the right order. -12. Optional: Add any descriptions of MultiQC report sections and output files to `docs/output.md`. +4. Add any new parameters to `nextflow.config` with a default (see below). +5. Add any new parameters to `nextflow_schema.json` with help text (via the `nf-core schema build` tool). +6. Add sanity checks and validation for all relevant parameters. +7. Perform local tests to validate that the new code works as expected. +8. If applicable, add a new test command in `.github/workflow/ci.yml`. +9. Update MultiQC config `assets/multiqc_config.yaml` so relevant suffixes, file name clean up and module plots are in the appropriate order. If applicable, add a [MultiQC](https://https://multiqc.info/) module. +10. Add a description of the output files and if relevant any appropriate images from the MultiQC report to `docs/output.md`. ### Default values From ad5c88a537ebd6f57a504ae5b6556bcfc3166dac Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 30 Nov 2021 11:34:34 +0000 Subject: [PATCH 180/852] Add pre-run script with min NF version for Tower Action --- .github/workflows/awsfulltest.yml | 1 + .github/workflows/awstest.yml | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index 70f39ce3..83e2793d 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -28,4 +28,5 @@ jobs: "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/fetchngs/results-${{ github.sha }}" } profiles: test_full,aws_tower + pre_run_script: 'export NXF_VER=21.10.3' diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index df53dcf3..7cf6d570 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -12,7 +12,7 @@ jobs: steps: - name: Launch workflow via tower uses: nf-core/tower-action@v2 - + with: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} @@ -25,4 +25,5 @@ jobs: "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/fetchngs/results-${{ github.sha }}" } profiles: test,aws_tower + pre_run_script: 'export NXF_VER=21.10.3' From 187c1169038228d45a13a06c405cca57178f4867 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 1 Dec 2021 08:08:34 +0000 Subject: [PATCH 181/852] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 056c3602..edcf2fa5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [[1.5](https://github.com/nf-core/fetchngs/releases/tag/1.5)] - 2021-11-30 +## [[1.5](https://github.com/nf-core/fetchngs/releases/tag/1.5)] - 2021-12-01 * Finish porting the pipeline to the updated Nextflow DSL2 syntax adopted on nf-core/modules * Bump minimum Nextflow version from `21.04.0` -> `21.10.3` From a6a670ebe14006959279da95031eba4f5c82c6a9 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 1 Dec 2021 09:32:13 +0000 Subject: [PATCH 182/852] Bump version to 1.6dev --- CHANGELOG.md | 4 ++++ nextflow.config | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index edcf2fa5..a6bd63a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unpublished Version / DEV] + +### Enhancements & fixes + ## [[1.5](https://github.com/nf-core/fetchngs/releases/tag/1.5)] - 2021-12-01 * Finish porting the pipeline to the updated Nextflow DSL2 syntax adopted on nf-core/modules diff --git a/nextflow.config b/nextflow.config index f3284c52..2ad3e221 100644 --- a/nextflow.config +++ b/nextflow.config @@ -145,7 +145,7 @@ manifest { description = 'Pipeline to fetch metadata and raw FastQ files from public databases' mainScript = 'main.nf' nextflowVersion = '!>=21.10.3' - version = '1.5' + version = '1.6dev' } // Load modules.config for DSL2 module specific options From 3a402f20b71d8ceb04a18c18ef046c4b4b7926d9 Mon Sep 17 00:00:00 2001 From: "James A. Fellows Yates" Date: Mon, 13 Dec 2021 09:35:34 +0100 Subject: [PATCH 183/852] Fix typo in URL for usage to ENA API --- docs/usage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/usage.md b/docs/usage.md index 3cb17fcd..b21aa80d 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -24,7 +24,7 @@ If `SRR`/`ERR`/`DRR` run ids are provided then these will be resolved back to th The final sample information for all identifiers is obtained from the ENA which provides direct download links for FastQ files as well as their associated md5 sums. If download links exist, the files will be downloaded in parallel by FTP. Otherwise they are downloaded using sra-tools. -All of the sample metadata obtained from the ENA will be appended as additional columns to help you manually curate the generated samplesheet before you run the pipeline. You can customise the metadata fields that are appended to the samplesheet via the `--ena_metadata_fields` parameter. The default list of fields used by the pipeline can be found at the top of the [`bin/sra_ids_to_runinfo.py`](https://github.com/nf-core/fetchngs/blob/master/bin/sra_ids_to_runinfo.py) script within the pipeline repo. However, this pipeline requires a minimal set of fields to download FastQ files i.e. `'run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5'`. A comprehensive list of accepted metadata fields can be obtained from the [ENA API](https://www.ebi.ac.uk/ena/portal/api/returnFields?dataPortal=ena&format=tsv&result=read_run]). +All of the sample metadata obtained from the ENA will be appended as additional columns to help you manually curate the generated samplesheet before you run the pipeline. You can customise the metadata fields that are appended to the samplesheet via the `--ena_metadata_fields` parameter. The default list of fields used by the pipeline can be found at the top of the [`bin/sra_ids_to_runinfo.py`](https://github.com/nf-core/fetchngs/blob/master/bin/sra_ids_to_runinfo.py) script within the pipeline repo. However, this pipeline requires a minimal set of fields to download FastQ files i.e. `'run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5'`. A comprehensive list of accepted metadata fields can be obtained from the [ENA API](https://www.ebi.ac.uk/ena/portal/api/returnFields?dataPortal=ena&format=tsv&result=read_run). If you have a GEO accession (found in the data availability section of published papers) you can directly download a text file containing the appropriate SRA ids to pass to the pipeline: From 4a2e3c435eaf6cd4eb5cbc454f9fc6ddaa864f48 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 27 Dec 2021 17:56:58 +0000 Subject: [PATCH 184/852] Replace dodgy logo --- docs/images/nf-core-fetchngs_logo_dark.png | Bin 288 -> 75668 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/images/nf-core-fetchngs_logo_dark.png b/docs/images/nf-core-fetchngs_logo_dark.png index dee3db82069b61e9a5380d940355f47ff565057c..e3452bf155e8506e48106bd0ac5f7056141c1511 100644 GIT binary patch literal 75668 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%0D6Aha9ZZvy3Owj0R@{kHIA1_W(q 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 BPEP;; literal 288 zcmaKn!EVAZ5Jd0(iYfQTPzk9AD^kHmL`q9kxd)CWS%D=(itV(`-**E&_qa1VJ8y-0 z(7UzWHwIh#TBG?`)zuoaM=2{~H&SY=@6J;(m(sk=N};CBQfXf{12_ Date: Tue, 15 Mar 2022 21:01:08 +0000 Subject: [PATCH 185/852] Remove igenomes.config remnants from last template sync --- nextflow.config | 7 ------- 1 file changed, 7 deletions(-) diff --git a/nextflow.config b/nextflow.config index bcc5e436..6501496b 100644 --- a/nextflow.config +++ b/nextflow.config @@ -110,13 +110,6 @@ profiles { test_full { includeConfig 'conf/test_full.config' } } -// Load igenomes.config if required -if (!params.igenomes_ignore) { - includeConfig 'conf/igenomes.config' -} else { - params.genomes = [:] -} - // Export these variables to prevent local Python/R libraries from conflicting with those in the container // The JULIA depot path has been adjusted to a fixed path `/usr/local/share/julia` that needs to be used for packages in the container. // See https://apeltzer.github.io/post/03-julia-lang-nextflow/ for details on that. Once we have a common agreement on where to keep Julia packages, this is adjustable. From c1b2abc018291e8eca2d1a8415e77a41a1cc8641 Mon Sep 17 00:00:00 2001 From: maxibor Date: Thu, 17 Mar 2022 10:30:09 +0100 Subject: [PATCH 186/852] Add troubleshooting section and FTP alternative docs --- docs/usage.md | 6 ++++++ nextflow_schema.json | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/docs/usage.md b/docs/usage.md index b21aa80d..6e09c9a7 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -251,3 +251,9 @@ We recommend adding the following line to your environment to limit this (typica ```console NXF_OPTS='-Xms1g -Xmx4g' ``` + +## Troubleshooting + +### `FTP` download is blocked at my workplace/institution, how can I still use *nf-core/fetchngs* ? + +If downloading data with FTP is blocked on your network connection, you may want to use the [`--force_sratools_download`](https://nf-co.re/fetchngs/1.5/parameters#force_sratools_download) flag to force fetchngs download using [sra-tools](https://github.com/ncbi/sra-tools) instead of the ENA FTP. diff --git a/nextflow_schema.json b/nextflow_schema.json index ae439a7b..550b91c8 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -53,7 +53,8 @@ "force_sratools_download": { "type": "boolean", "fa_icon": "fas fa-tools", - "description": "Force download FastQ files via sra-tools instead of via the ENA FTP." + "description": "Force download FastQ files via sra-tools instead of via the ENA FTP.", + "help_text": "If downloading data through FTP is blocked on your network connection, you may want to use this flag to force fetchngs to download using sra-tools instead of the ENA FTP. " }, "skip_fastq_download": { "type": "boolean", From dca46e6ece994b0af66f27a792dce7477cd76178 Mon Sep 17 00:00:00 2001 From: maxibor Date: Thu, 17 Mar 2022 11:52:20 +0100 Subject: [PATCH 187/852] fix linting --- docs/usage.md | 6 +++--- nextflow_schema.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 6e09c9a7..7b59a707 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -174,7 +174,7 @@ Work dir: Tip: you can replicate the issue by changing to the process work dir and entering the command `bash .command.run` ``` -To bypass this error you would need to find exactly which resources are set by the `STAR_ALIGN` process. The quickest way is to search for `process STAR_ALIGN` in the [nf-core/rnaseq Github repo](https://github.com/nf-core/rnaseq/search?q=process+STAR_ALIGN). We have standardised the structure of Nextflow DSL2 pipelines such that all module files will be present in the `modules/` directory and so based on the search results the file we want is `modules/nf-core/software/star/align/main.nf`. If you click on the link to that file you will notice that there is a `label` directive at the top of the module that is set to [`label process_high`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/modules/nf-core/software/star/align/main.nf#L9). The [Nextflow `label`](https://www.nextflow.io/docs/latest/process.html#label) directive allows us to organise workflow processes in separate groups which can be referenced in a configuration file to select and configure subset of processes having similar computing requirements. The default values for the `process_high` label are set in the pipeline's [`base.config`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/base.config#L33-L37) which in this case is defined as 72GB. Providing you haven't set any other standard nf-core parameters to __cap__ the [maximum resources](https://nf-co.re/usage/configuration#max-resources) used by the pipeline then we can try and bypass the `STAR_ALIGN` process failure by creating a custom config file that sets at least 72GB of memory, in this case increased to 100GB. The custom config below can then be provided to the pipeline via the [`-c`](#-c) parameter as highlighted in previous sections. +To bypass this error you would need to find exactly which resources are set by the `STAR_ALIGN` process. The quickest way is to search for `process STAR_ALIGN` in the [nf-core/rnaseq Github repo](https://github.com/nf-core/rnaseq/search?q=process+STAR_ALIGN). We have standardised the structure of Nextflow DSL2 pipelines such that all module files will be present in the `modules/` directory and so based on the search results the file we want is `modules/nf-core/software/star/align/main.nf`. If you click on the link to that file you will notice that there is a `label` directive at the top of the module that is set to [`label process_high`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/modules/nf-core/software/star/align/main.nf#L9). The [Nextflow `label`](https://www.nextflow.io/docs/latest/process.html#label) directive allows us to organise workflow processes in separate groups which can be referenced in a configuration file to select and configure subset of processes having similar computing requirements. The default values for the `process_high` label are set in the pipeline's [`base.config`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/base.config#L33-L37) which in this case is defined as 72GB. Providing you haven't set any other standard nf-core parameters to **cap** the [maximum resources](https://nf-co.re/usage/configuration#max-resources) used by the pipeline then we can try and bypass the `STAR_ALIGN` process failure by creating a custom config file that sets at least 72GB of memory, in this case increased to 100GB. The custom config below can then be provided to the pipeline via the [`-c`](#-c) parameter as highlighted in previous sections. ```nextflow process { @@ -254,6 +254,6 @@ NXF_OPTS='-Xms1g -Xmx4g' ## Troubleshooting -### `FTP` download is blocked at my workplace/institution, how can I still use *nf-core/fetchngs* ? +### `FTP` download is blocked at my workplace/institution, how can I still use _nf-core/fetchngs_ ? -If downloading data with FTP is blocked on your network connection, you may want to use the [`--force_sratools_download`](https://nf-co.re/fetchngs/1.5/parameters#force_sratools_download) flag to force fetchngs download using [sra-tools](https://github.com/ncbi/sra-tools) instead of the ENA FTP. +If downloading data with FTP is blocked on your network connection, you may want to use the [`--force_sratools_download`](https://nf-co.re/fetchngs/1.5/parameters#force_sratools_download) flag to force fetchngs download using [sra-tools](https://github.com/ncbi/sra-tools) instead of the ENA FTP. diff --git a/nextflow_schema.json b/nextflow_schema.json index 550b91c8..57676091 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -53,7 +53,7 @@ "force_sratools_download": { "type": "boolean", "fa_icon": "fas fa-tools", - "description": "Force download FastQ files via sra-tools instead of via the ENA FTP.", + "description": "Force download FASTQ files via sra-tools instead of via the ENA FTP.", "help_text": "If downloading data through FTP is blocked on your network connection, you may want to use this flag to force fetchngs to download using sra-tools instead of the ENA FTP. " }, "skip_fastq_download": { From ce7bb867348d37878826796ed40658df0862cbb2 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 31 Mar 2022 22:34:50 +0100 Subject: [PATCH 188/852] Fix prettier --- CHANGELOG.md | 64 ++++++++++++++++++++-------------------- CITATIONS.md | 35 ++++++++++++---------- README.md | 12 ++++---- assets/schema_input.json | 2 +- docs/output.md | 54 ++++++++++++++++----------------- docs/usage.md | 14 ++++----- modules.json | 2 +- nextflow_schema.json | 7 ++--- 8 files changed, 96 insertions(+), 94 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f7d9d75a..7bbf0e90 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,13 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Enhancements & fixes -* Updated pipeline template to [nf-core/tools 2.2](https://github.com/nf-core/tools/releases/tag/2.2) +- Updated pipeline template to [nf-core/tools 2.2](https://github.com/nf-core/tools/releases/tag/2.2) ## [[1.5](https://github.com/nf-core/fetchngs/releases/tag/1.5)] - 2021-12-01 -* Finish porting the pipeline to the updated Nextflow DSL2 syntax adopted on nf-core/modules - * Bump minimum Nextflow version from `21.04.0` -> `21.10.3` - * Removed `--publish_dir_mode` as it is no longer required for the new syntax +- Finish porting the pipeline to the updated Nextflow DSL2 syntax adopted on nf-core/modules + - Bump minimum Nextflow version from `21.04.0` -> `21.10.3` + - Removed `--publish_dir_mode` as it is no longer required for the new syntax ### Enhancements & fixes @@ -21,51 +21,51 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Enhancements & fixes -* Convert pipeline to updated Nextflow DSL2 syntax for future adoption across nf-core -* Added a workflow to download FastQ files and to create samplesheets for ids from the [Synapse platform](https://www.synapse.org/) hosted by [Sage Bionetworks](https://sagebionetworks.org/). -* SRA identifiers not available for direct download via the ENA FTP will now be downloaded via [`sra-tools`](https://github.com/ncbi/sra-tools). -* Added `--force_sratools_download` parameter to preferentially download all FastQ files via `sra-tools` instead of ENA FTP. -* Correctly handle errors from SRA identifiers that do **not** return metadata, for example, due to being private. -* Retry an error in prefetch via bash script in order to allow it to resume interrupted downloads. -* Name output FastQ files by `{EXP_ACC}_{RUN_ACC}*fastq.gz` instead of `{EXP_ACC}_{T*}*fastq.gz` for run id provenance -* [[#46](https://github.com/nf-core/fetchngs/issues/46)] - Bug in sra_ids_to_runinfo.py -* Added support for [DDBJ ids](https://www.ddbj.nig.ac.jp/index-e.html). See examples below: - -| `DDBJ` | -|---------------| -| PRJDB4176 | -| SAMD00114846 | -| DRA008156 | -| DRP004793 | -| DRR171822 | -| DRS090921 | -| DRX162434 | +- Convert pipeline to updated Nextflow DSL2 syntax for future adoption across nf-core +- Added a workflow to download FastQ files and to create samplesheets for ids from the [Synapse platform](https://www.synapse.org/) hosted by [Sage Bionetworks](https://sagebionetworks.org/). +- SRA identifiers not available for direct download via the ENA FTP will now be downloaded via [`sra-tools`](https://github.com/ncbi/sra-tools). +- Added `--force_sratools_download` parameter to preferentially download all FastQ files via `sra-tools` instead of ENA FTP. +- Correctly handle errors from SRA identifiers that do **not** return metadata, for example, due to being private. +- Retry an error in prefetch via bash script in order to allow it to resume interrupted downloads. +- Name output FastQ files by `{EXP_ACC}_{RUN_ACC}*fastq.gz` instead of `{EXP_ACC}_{T*}*fastq.gz` for run id provenance +- [[#46](https://github.com/nf-core/fetchngs/issues/46)] - Bug in sra_ids_to_runinfo.py +- Added support for [DDBJ ids](https://www.ddbj.nig.ac.jp/index-e.html). See examples below: + +| `DDBJ` | +| ------------ | +| PRJDB4176 | +| SAMD00114846 | +| DRA008156 | +| DRP004793 | +| DRR171822 | +| DRS090921 | +| DRX162434 | ## [[1.3](https://github.com/nf-core/fetchngs/releases/tag/1.3)] - 2021-09-15 ### Enhancements & fixes -* Replaced Python `requests` with `urllib` to fetch ENA metadata +- Replaced Python `requests` with `urllib` to fetch ENA metadata ### Software dependencies -| Dependency | Old version | New version | -|-------------|-------------|-------------| -| `python` | 3.8.3 | 3.9.5 | +| Dependency | Old version | New version | +| ---------- | ----------- | ----------- | +| `python` | 3.8.3 | 3.9.5 | ## [[1.2](https://github.com/nf-core/fetchngs/releases/tag/1.2)] - 2021-07-28 ### Enhancements & fixes -* Updated pipeline template to [nf-core/tools 2.1](https://github.com/nf-core/tools/releases/tag/2.1) -* [[#26](https://github.com/nf-core/fetchngs/pull/26)] - Update broken EBI API URL +- Updated pipeline template to [nf-core/tools 2.1](https://github.com/nf-core/tools/releases/tag/2.1) +- [[#26](https://github.com/nf-core/fetchngs/pull/26)] - Update broken EBI API URL ## [[1.1](https://github.com/nf-core/fetchngs/releases/tag/1.1)] - 2021-06-22 ### Enhancements & fixes -* [[#12](https://github.com/nf-core/fetchngs/issues/12)] - Error when using singularity - /etc/resolv.conf doesn't exist in container -* Added `--sample_mapping_fields` parameter to create a separate `id_mappings.csv` and `multiqc_config.yml` with selected fields that can be used to rename samples in general and in [MultiQC](https://multiqc.info/docs/#bulk-sample-renaming) +- [[#12](https://github.com/nf-core/fetchngs/issues/12)] - Error when using singularity - /etc/resolv.conf doesn't exist in container +- Added `--sample_mapping_fields` parameter to create a separate `id_mappings.csv` and `multiqc_config.yml` with selected fields that can be used to rename samples in general and in [MultiQC](https://multiqc.info/docs/#bulk-sample-renaming) ## [[1.0](https://github.com/nf-core/fetchngs/releases/tag/1.0)] - 2021-06-08 @@ -85,7 +85,7 @@ Via a single file of ids, provided one-per-line the pipeline performs the follow Currently, the following types of example identifiers are supported: | `SRA` | `ENA` | `GEO` | -|--------------|--------------|------------| +| ------------ | ------------ | ---------- | | SRR11605097 | ERR4007730 | GSM4432381 | | SRX8171613 | ERX4009132 | GSE147507 | | SRS6531847 | ERS4399630 | | diff --git a/CITATIONS.md b/CITATIONS.md index 2590785c..3826bfe7 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -10,31 +10,36 @@ ## Pipeline tools -* [MultiQC](https://pubmed.ncbi.nlm.nih.gov/27312411/) - > Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. +- [MultiQC](https://pubmed.ncbi.nlm.nih.gov/27312411/) -* [Python](http://www.python.org) + > Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. -* [Requests](https://docs.python-requests.org/) +- [Python](http://www.python.org) -* [sra-tools](https://github.com/ncbi/sra-tools) +- [Requests](https://docs.python-requests.org/) + +- [sra-tools](https://github.com/ncbi/sra-tools) ## Pipeline resources -* [ENA](https://pubmed.ncbi.nlm.nih.gov/33175160/) - > Harrison PW, Ahamed A, Aslam R, Alako BTF, Burgin J, Buso N, Courtot M, Fan J, Gupta D, Haseeb M, Holt S, Ibrahim T, Ivanov E, Jayathilaka S, Kadhirvelu VB, Kumar M, Lopez R, Kay S, Leinonen R, Liu X, O'Cathail C, Pakseresht A, Park Y, Pesant S, Rahman N, Rajan J, Sokolov A, Vijayaraja S, Waheed Z, Zyoud A, Burdett T, Cochrane G. The European Nucleotide Archive in 2020. Nucleic Acids Res. 2021 Jan 8;49(D1):D82-D85. doi: 10.1093/nar/gkaa1028. PubMed PMID: 33175160; PubMed Central PMCID: PMC7778925. +- [ENA](https://pubmed.ncbi.nlm.nih.gov/33175160/) + + > Harrison PW, Ahamed A, Aslam R, Alako BTF, Burgin J, Buso N, Courtot M, Fan J, Gupta D, Haseeb M, Holt S, Ibrahim T, Ivanov E, Jayathilaka S, Kadhirvelu VB, Kumar M, Lopez R, Kay S, Leinonen R, Liu X, O'Cathail C, Pakseresht A, Park Y, Pesant S, Rahman N, Rajan J, Sokolov A, Vijayaraja S, Waheed Z, Zyoud A, Burdett T, Cochrane G. The European Nucleotide Archive in 2020. Nucleic Acids Res. 2021 Jan 8;49(D1):D82-D85. doi: 10.1093/nar/gkaa1028. PubMed PMID: 33175160; PubMed Central PMCID: PMC7778925. + +- [SRA](https://pubmed.ncbi.nlm.nih.gov/21062823/) + + > Leinonen R, Sugawara H, Shumway M, International Nucleotide Sequence Database Collaboration. The sequence read archive. Nucleic Acids Res. 2011 Jan;39 (Database issue):D19-21. doi: 10.1093/nar/gkq1019. Epub 2010 Nov 9. PubMed PMID: 21062823; PubMed Central PMCID: PMC3013647. + +- [DDBJ](https://pubmed.ncbi.nlm.nih.gov/33156332/) -* [SRA](https://pubmed.ncbi.nlm.nih.gov/21062823/) - > Leinonen R, Sugawara H, Shumway M, International Nucleotide Sequence Database Collaboration. The sequence read archive. Nucleic Acids Res. 2011 Jan;39 (Database issue):D19-21. doi: 10.1093/nar/gkq1019. Epub 2010 Nov 9. PubMed PMID: 21062823; PubMed Central PMCID: PMC3013647. + > Fukuda A, Kodama Y, Mashima J, Fujisawa T, Ogasawara O. DDBJ update: streamlining submission and access of human data. Nucleic Acids Res. 2021 Jan 8;49(D1):D71-D75. doi: 10.1093/nar/gkaa982. PubMed PMID: 33156332; PubMed Central PMCID: PMC7779041. -* [DDBJ](https://pubmed.ncbi.nlm.nih.gov/33156332/) - > Fukuda A, Kodama Y, Mashima J, Fujisawa T, Ogasawara O. DDBJ update: streamlining submission and access of human data. Nucleic Acids Res. 2021 Jan 8;49(D1):D71-D75. doi: 10.1093/nar/gkaa982. PubMed PMID: 33156332; PubMed Central PMCID: PMC7779041. +- [GEO](https://pubmed.ncbi.nlm.nih.gov/23193258/) -* [GEO](https://pubmed.ncbi.nlm.nih.gov/23193258/) - > Barrett T, Wilhite SE, Ledoux P, Evangelista C, Kim IF, Tomashevsky M, Marshall KA, Phillippy KH, Sherman PM, Holko M, Yefanov A, Lee H, Zhang N, Robertson CL, Serova N, Davis S, Soboleva A. NCBI GEO: archive for functional genomics data sets--update. Nucleic Acids Res. 2013 Jan;41(Database issue):D991-5. doi: 10.1093/nar/gks1193. Epub 2012 Nov 27. PubMed PMID: 23193258; PubMed Central PMCID: PMC3531084. + > Barrett T, Wilhite SE, Ledoux P, Evangelista C, Kim IF, Tomashevsky M, Marshall KA, Phillippy KH, Sherman PM, Holko M, Yefanov A, Lee H, Zhang N, Robertson CL, Serova N, Davis S, Soboleva A. NCBI GEO: archive for functional genomics data sets--update. Nucleic Acids Res. 2013 Jan;41(Database issue):D991-5. doi: 10.1093/nar/gks1193. Epub 2012 Nov 27. PubMed PMID: 23193258; PubMed Central PMCID: PMC3531084. -* [Synapse](https://pubmed.ncbi.nlm.nih.gov/24071850/) - > Omberg L, Ellrott K, Yuan Y, Kandoth C, Wong C, Kellen MR, Friend SH, Stuart J, Liang H, Margolin AA. Enabling transparent and collaborative computational analysis of 12 tumor types within The Cancer Genome Atlas. Nat Genet. 2013 Oct;45(10):1121-6. doi: 10.1038/ng.2761. PMID: 24071850; PMCID: PMC3950337. +- [Synapse](https://pubmed.ncbi.nlm.nih.gov/24071850/) + > Omberg L, Ellrott K, Yuan Y, Kandoth C, Wong C, Kellen MR, Friend SH, Stuart J, Liang H, Margolin AA. Enabling transparent and collaborative computational analysis of 12 tumor types within The Cancer Genome Atlas. Nat Genet. 2013 Oct;45(10):1121-6. doi: 10.1038/ng.2761. PMID: 24071850; PMCID: PMC3950337. ## Software packaging/containerisation tools diff --git a/README.md b/README.md index 7839c848..d1f7d596 100644 --- a/README.md +++ b/README.md @@ -31,8 +31,8 @@ Via a single file of ids, provided one-per-line (see [example input file](https: 1. Resolve database ids back to appropriate experiment-level ids and to be compatible with the [ENA API](https://ena-docs.readthedocs.io/en/latest/retrieval/programmatic-access.html) 2. Fetch extensive id metadata via ENA API 3. Download FastQ files: - - If direct download links are available from the ENA API, fetch in parallel via `curl` and perform `md5sum` check - - Otherwise use [`sra-tools`](https://github.com/ncbi/sra-tools) to download `.sra` files and convert them to FastQ + - If direct download links are available from the ENA API, fetch in parallel via `curl` and perform `md5sum` check + - Otherwise use [`sra-tools`](https://github.com/ncbi/sra-tools) to download `.sra` files and convert them to FastQ 4. Collate id metadata and paths to FastQ files in a single samplesheet ### Synapse ids @@ -67,9 +67,9 @@ The columns in the auto-created samplesheet can be tailored to be accepted out-o 4. Start running your own analysis! - ```bash - nextflow run nf-core/fetchngs --input ids.txt --outdir -profile - ``` + ```bash + nextflow run nf-core/fetchngs --input ids.txt --outdir -profile + ``` ## Documentation @@ -87,7 +87,7 @@ For further information or help, don't hesitate to get in touch on the [Slack `# ## Citations -If you use nf-core/fetchngs for your analysis, please cite it using the following doi: [10.5281/zenodo.5070524](https://doi.org/10.5281/zenodo.5070524) +If you use nf-core/fetchngs for your analysis, please cite it using the following doi: [10.5281/zenodo.5070524](https://doi.org/10.5281/zenodo.5070524) An extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file. diff --git a/assets/schema_input.json b/assets/schema_input.json index 25006d9b..9a800216 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -8,7 +8,7 @@ "type": "array", "items": { "type": "string", - "pattern":"^(((SR|ER|DR)[APRSX])|(SAM(N|EA|D))|(PRJ(NA|EB|DB))|(GS[EM])|(syn))(\\d+)$", + "pattern": "^(((SR|ER|DR)[APRSX])|(SAM(N|EA|D))|(PRJ(NA|EB|DB))|(GS[EM])|(syn))(\\d+)$", "errorMessage": "Please provide a valid SRA, ENA, DDBJ or GEO identifier" } } diff --git a/docs/output.md b/docs/output.md index 897d5cd1..7402976c 100644 --- a/docs/output.md +++ b/docs/output.md @@ -8,10 +8,10 @@ This document describes the output produced by the pipeline. The directories lis The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data depending on the type of ids provided: -* Download FastQ files and create samplesheet from: - 1. [SRA / ENA / DDBJ / GEO ids](#sra--ena--ddbj--geo-ids) - 2. [Synapse ids](#synapse-ids) -* [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution +- Download FastQ files and create samplesheet from: + 1. [SRA / ENA / DDBJ / GEO ids](#sra--ena--ddbj--geo-ids) + 2. [Synapse ids](#synapse-ids) +- [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution Please see the [usage documentation](https://nf-co.re/fetchngs/usage#introduction) for a list of supported public repository identifiers and how to provide them to the pipeline. @@ -20,17 +20,17 @@ Please see the [usage documentation](https://nf-co.re/fetchngs/usage#introductio
Output files -* `fastq/` - * `*.fastq.gz`: Paired-end/single-end reads downloaded from the SRA / ENA / DDBJ / GEO. -* `fastq/md5/` - * `*.md5`: Files containing `md5` sum for FastQ files downloaded from the ENA. -* `samplesheet/` - * `samplesheet.csv`: Auto-created samplesheet with collated metadata and paths to downloaded FastQ files. - * `id_mappings.csv`: File with selected fields that can be used to rename samples to more informative names; see [`--sample_mapping_fields`](https://nf-co.re/fetchngs/parameters#sample_mapping_fields) parameter to customise this behaviour. - * `multiqc_config.yml`: [MultiQC](https://multiqc.info/docs/#bulk-sample-renaming) config file that can be passed to most nf-core pipelines via the `--multiqc_config` parameter for bulk renaming of sample names from database ids; [`--sample_mapping_fields`](https://nf-co.re/fetchngs/parameters#sample_mapping_fields) parameter to customise this behaviour. -* `metadata/` - * `*.runinfo_ftp.tsv`: Re-formatted metadata file downloaded from the ENA. - * `*.runinfo.tsv`: Original metadata file downloaded from the ENA. +- `fastq/` + - `*.fastq.gz`: Paired-end/single-end reads downloaded from the SRA / ENA / DDBJ / GEO. +- `fastq/md5/` + - `*.md5`: Files containing `md5` sum for FastQ files downloaded from the ENA. +- `samplesheet/` + - `samplesheet.csv`: Auto-created samplesheet with collated metadata and paths to downloaded FastQ files. + - `id_mappings.csv`: File with selected fields that can be used to rename samples to more informative names; see [`--sample_mapping_fields`](https://nf-co.re/fetchngs/parameters#sample_mapping_fields) parameter to customise this behaviour. + - `multiqc_config.yml`: [MultiQC](https://multiqc.info/docs/#bulk-sample-renaming) config file that can be passed to most nf-core pipelines via the `--multiqc_config` parameter for bulk renaming of sample names from database ids; [`--sample_mapping_fields`](https://nf-co.re/fetchngs/parameters#sample_mapping_fields) parameter to customise this behaviour. +- `metadata/` + - `*.runinfo_ftp.tsv`: Re-formatted metadata file downloaded from the ENA. + - `*.runinfo.tsv`: Original metadata file downloaded from the ENA.
@@ -41,15 +41,15 @@ The final sample information for all identifiers is obtained from the ENA which
Output files -* `fastq/` - * `*.fastq.gz`: Paired-end/single-end reads downloaded from Synapse. -* `fastq/md5/` - * `*.md5`: Files containing `md5` sum for FastQ files downloaded from the Synapse platform. -* `samplesheet/` - * `samplesheet.csv`: Auto-created samplesheet with collated metadata and paths to downloaded FastQ files. -* `metadata/` - * `*.metadata.txt`: Original metadata file generated using the `synapse show` command. - * `*.list.txt`: Original output of the `synapse list` command, containing the Synapse ids, file version numbers, file names, and other file-specific data for the Synapse directory ID provided. +- `fastq/` + - `*.fastq.gz`: Paired-end/single-end reads downloaded from Synapse. +- `fastq/md5/` + - `*.md5`: Files containing `md5` sum for FastQ files downloaded from the Synapse platform. +- `samplesheet/` + - `samplesheet.csv`: Auto-created samplesheet with collated metadata and paths to downloaded FastQ files. +- `metadata/` + - `*.metadata.txt`: Original metadata file generated using the `synapse show` command. + - `*.list.txt`: Original output of the `synapse list` command, containing the Synapse ids, file version numbers, file names, and other file-specific data for the Synapse directory ID provided.
@@ -62,9 +62,9 @@ The final sample information for the FastQ files downloaded from `Synapse` is ob
Output files -* `pipeline_info/` - * Reports generated by Nextflow: `execution_report.html`, `execution_timeline.html`, `execution_trace.txt` and `pipeline_dag.dot`/`pipeline_dag.svg`. - * Reports generated by the pipeline: `pipeline_report.html`, `pipeline_report.txt` and `software_versions.yml`. The `pipeline_report*` files will only be present if the `--email` / `--email_on_fail` parameter's are used when running the pipeline. +- `pipeline_info/` + - Reports generated by Nextflow: `execution_report.html`, `execution_timeline.html`, `execution_trace.txt` and `pipeline_dag.dot`/`pipeline_dag.svg`. + - Reports generated by the pipeline: `pipeline_report.html`, `pipeline_report.txt` and `software_versions.yml`. The `pipeline_report*` files will only be present if the `--email` / `--email_on_fail` parameter's are used when running the pipeline.
diff --git a/docs/usage.md b/docs/usage.md index 8c827443..2eb38745 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -9,7 +9,7 @@ The pipeline has been set-up to automatically download and process the raw FastQ files from both public and private repositories. Identifiers can be provided in a file, one-per-line via the `--input` parameter. Currently, the following types of example identifiers are supported: | `SRA` | `ENA` | `DDBJ` | `GEO` | `Synapse` | -|--------------|--------------|--------------|------------|-------------| +| ------------ | ------------ | ------------ | ---------- | ----------- | | SRR11605097 | ERR4007730 | DRR171822 | GSM4432381 | syn26240435 | | SRX8171613 | ERX4009132 | DRX162434 | GSE147507 | | | SRS6531847 | ERS4399630 | DRS090921 | | | @@ -28,9 +28,9 @@ All of the sample metadata obtained from the ENA will be appended as additional If you have a GEO accession (found in the data availability section of published papers) you can directly download a text file containing the appropriate SRA ids to pass to the pipeline: -* Search for your GEO accession on [GEO](https://www.ncbi.nlm.nih.gov/geo) -* Click `SRA Run Selector` at the bottom of the GEO accession page -* Select the desired samples in the `SRA Run Selector` and then download the `Accession List` +- Search for your GEO accession on [GEO](https://www.ncbi.nlm.nih.gov/geo) +- Click `SRA Run Selector` at the bottom of the GEO accession page +- Select the desired samples in the `SRA Run Selector` and then download the `Accession List` This downloads a text file called `SRR_Acc_List.txt` that can be directly provided to the pipeline e.g. `--input SRR_Acc_List.txt`. @@ -47,9 +47,9 @@ The final sample information for the FastQ files used for samplesheet generation
Supported File Names -* Files named `SRR493366_1.fastq` and `SRR493366_2.fastq` will have a sample name of `SRR493366` -* Files named `SRR_493_367_1.fastq` and `SRR_493_367_2.fastq` will have a sample name of `SRR_493_367` -* Files named `filename12_1.fastq` and `filename12_2.fastq` will have a sample name of `filename12` +- Files named `SRR493366_1.fastq` and `SRR493366_2.fastq` will have a sample name of `SRR493366` +- Files named `SRR_493_367_1.fastq` and `SRR_493_367_2.fastq` will have a sample name of `SRR_493_367` +- Files named `filename12_1.fastq` and `filename12_2.fastq` will have a sample name of `filename12`
diff --git a/modules.json b/modules.json index 2baafc4f..f39d24ab 100644 --- a/modules.json +++ b/modules.json @@ -8,4 +8,4 @@ } } } -} \ No newline at end of file +} diff --git a/nextflow_schema.json b/nextflow_schema.json index 872360c3..6bb52772 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -26,10 +26,7 @@ "default": "sra", "description": "Specifies the type of identifier provided via `--input` - available options are 'sra' and 'synapse'.", "fa_icon": "fas fa-keyboard", - "enum": [ - "sra", - "synapse" - ] + "enum": ["sra", "synapse"] }, "ena_metadata_fields": { "type": "string", @@ -248,4 +245,4 @@ "$ref": "#/definitions/generic_options" } ] -} \ No newline at end of file +} From 82213da7d16e19c9418dd0cc3bf4e47e9e53a54b Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 31 Mar 2022 22:36:17 +0100 Subject: [PATCH 189/852] Update CHANGELOG after merging template updates --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7bbf0e90..a6b1be4a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Enhancements & fixes -- Updated pipeline template to [nf-core/tools 2.2](https://github.com/nf-core/tools/releases/tag/2.2) +- Updated pipeline template to [nf-core/tools 2.3.2](https://github.com/nf-core/tools/releases/tag/2.3.2) ## [[1.5](https://github.com/nf-core/fetchngs/releases/tag/1.5)] - 2021-12-01 From 56f37b2f395391a616e0ac930e42b51d6f69f37e Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 31 Mar 2022 22:39:32 +0100 Subject: [PATCH 190/852] Add --outdir to CI tests --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f80ae073..7b5cfdbb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -44,7 +44,7 @@ jobs: - name: Run pipeline with test data run: | - nextflow run ${GITHUB_WORKSPACE} -profile test,docker + nextflow run ${GITHUB_WORKSPACE} -profile test,docker --outdir ./results parameters: name: Test workflow parameters @@ -67,6 +67,6 @@ jobs: sudo mv nextflow /usr/local/bin/ - name: Run pipeline with various parameters run: | - nextflow run ${GITHUB_WORKSPACE} -profile test,docker ${{ matrix.parameters }} + nextflow run ${GITHUB_WORKSPACE} -profile test,docker --outdir ./results ${{ matrix.parameters }} # From 456584a6ca9ba18d6f8b73b5977582084d05e2be Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 25 Apr 2022 13:15:58 +0100 Subject: [PATCH 191/852] Replace vanilla Linux Biocontainer with Ubuntu --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a6b1be4a..66753fad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Enhancements & fixes +- [[nf-core/rnaseq#764](https://github.com/nf-core/rnaseq/issues/764)] - Test fails when using GCP due to missing tools in the basic biocontainer - Updated pipeline template to [nf-core/tools 2.3.2](https://github.com/nf-core/tools/releases/tag/2.3.2) ## [[1.5](https://github.com/nf-core/fetchngs/releases/tag/1.5)] - 2021-12-01 From 4bf86f22570c3612e9a69996bbdaea80f2aaad42 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 25 Apr 2022 13:57:43 +0100 Subject: [PATCH 192/852] Actually push updated modules --- modules/local/sra_fastq_ftp.nf | 4 ++-- modules/local/sra_merge_samplesheet.nf | 5 ++--- modules/local/synapse_merge_samplesheet.nf | 4 ++-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/modules/local/sra_fastq_ftp.nf b/modules/local/sra_fastq_ftp.nf index edb5241a..c09f66e0 100644 --- a/modules/local/sra_fastq_ftp.nf +++ b/modules/local/sra_fastq_ftp.nf @@ -6,8 +6,8 @@ process SRA_FASTQ_FTP { conda (params.enable_conda ? "conda-forge::sed=4.7" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img' : - 'biocontainers/biocontainers:v1.2.0_cv1' }" + 'https://depot.galaxyproject.org/singularity/ubuntu:20.04' : + 'ubuntu:20.04' }" input: tuple val(meta), val(fastq) diff --git a/modules/local/sra_merge_samplesheet.nf b/modules/local/sra_merge_samplesheet.nf index 863dfaa7..ca9c0068 100644 --- a/modules/local/sra_merge_samplesheet.nf +++ b/modules/local/sra_merge_samplesheet.nf @@ -1,10 +1,9 @@ - process SRA_MERGE_SAMPLESHEET { conda (params.enable_conda ? "conda-forge::sed=4.7" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img' : - 'biocontainers/biocontainers:v1.2.0_cv1' }" + 'https://depot.galaxyproject.org/singularity/ubuntu:20.04' : + 'ubuntu:20.04' }" input: path ('samplesheets/*') diff --git a/modules/local/synapse_merge_samplesheet.nf b/modules/local/synapse_merge_samplesheet.nf index 01461e14..68bfd68b 100644 --- a/modules/local/synapse_merge_samplesheet.nf +++ b/modules/local/synapse_merge_samplesheet.nf @@ -3,8 +3,8 @@ process SYNAPSE_MERGE_SAMPLESHEET { conda (params.enable_conda ? "conda-forge::sed=4.7" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img' : - 'biocontainers/biocontainers:v1.2.0_cv1' }" + 'https://depot.galaxyproject.org/singularity/ubuntu:20.04' : + 'ubuntu:20.04' }" input: path ('samplesheets/*') From b635257ae753765b7c98f54d2cbc4eaacbad3fbb Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 25 Apr 2022 14:27:03 +0100 Subject: [PATCH 193/852] Use sra-tools container with curl --- modules/local/sra_fastq_ftp.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/local/sra_fastq_ftp.nf b/modules/local/sra_fastq_ftp.nf index c09f66e0..4e8a34aa 100644 --- a/modules/local/sra_fastq_ftp.nf +++ b/modules/local/sra_fastq_ftp.nf @@ -4,10 +4,10 @@ process SRA_FASTQ_FTP { label 'process_low' label 'error_retry' - conda (params.enable_conda ? "conda-forge::sed=4.7" : null) + conda (params.enable_conda ? 'bioconda::sra-tools=2.11.0' : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/ubuntu:20.04' : - 'ubuntu:20.04' }" + 'https://depot.galaxyproject.org/singularity/sra-tools:2.11.0--pl5262h314213e_0' : + 'quay.io/biocontainers/sra-tools:2.11.0--pl5262h314213e_0' }" input: tuple val(meta), val(fastq) From c7351884f0664c59876f2f055380025ec12c00a1 Mon Sep 17 00:00:00 2001 From: "Moritz E. Beber" Date: Thu, 12 May 2022 17:32:28 +0200 Subject: [PATCH 194/852] refactor: remove local modules/subworkflows --- bin/retry_with_backoff.sh | 100 ----------------------- modules/local/sratools_fasterqdump.nf | 68 --------------- modules/local/sratools_prefetch.nf | 41 ---------- subworkflows/local/sra_fastq_sratools.nf | 31 ------- 4 files changed, 240 deletions(-) delete mode 100755 bin/retry_with_backoff.sh delete mode 100644 modules/local/sratools_fasterqdump.nf delete mode 100644 modules/local/sratools_prefetch.nf delete mode 100644 subworkflows/local/sra_fastq_sratools.nf diff --git a/bin/retry_with_backoff.sh b/bin/retry_with_backoff.sh deleted file mode 100755 index 4bdbf1e0..00000000 --- a/bin/retry_with_backoff.sh +++ /dev/null @@ -1,100 +0,0 @@ -#!/usr/bin/env bash - -set -u - -retry_with_backoff() { - local max_attempts=${1} - local delay=${2} - local max_time=${3} - local attempt=1 - local output= - local status= - - shift 3 - - while [ ${attempt} -le ${max_attempts} ]; do - output=$("${@}") - status=${?} - - if [ ${status} -eq 0 ]; then - break - fi - - if [ ${attempt} -lt ${max_attempts} ]; then - echo "Failed attempt ${attempt} of ${max_attempts}. Retrying in ${delay} s." >&2 - sleep ${delay} - elif [ ${attempt} -eq ${max_attempts} ]; then - echo "Failed after ${attempt} attempts." >&2 - return ${status} - fi - - attempt=$(( ${attempt} + 1 )) - delay=$(( ${delay} * 2 )) - if [ ${delay} -ge ${max_time} ]; then - delay=${max_time} - fi - done - - echo "${output}" -} - -RETRY=5 -DELAY=1 -MAX_TIME=60 - -usage() { - echo "Usage:" >&2 - echo "$(basename ${0}) [-h] [-r NUM] [-d NUM] [-m NUM] COMMAND" >&2 - echo "Call the given command with retries and exponential backoff." >&2 - echo "" >&2 - echo " -r NUM Set the number of retry attempts (default ${RETRY})." >&2 - echo " -d NUM Set the base number of seconds to delay (default ${DELAY})." >&2 - echo " -m NUM Set the maximum delay in seconds (default ${MAX_TIME})." >&2 - echo "" >&2 -} - -check_numeric() { - local arg=${1} - if [[ ! ${arg} =~ ^[0-9]+$ ]]; then - echo "Illegal argument: ${arg}" >&2 - echo "Expected a number." >&2 - echo "" >&2 - usage - exit 2 - fi -} - -while getopts ":hr:d:m:" arg; do - case ${arg} in - h) - usage - exit 0 - ;; - r) - check_numeric ${OPTARG} - RETRY=${OPTARG} - ;; - d) - check_numeric ${OPTARG} - DELAY=${OPTARG} - ;; - m) - check_numeric ${OPTARG} - MAX_TIME=${OPTARG} - ;; - ?) - echo "Invalid option: -${OPTARG}" >&2 - echo "" >&2 - usage - exit 2 - ;; - :) - echo "Missing argument for: -${OPTARG}" >&2 - echo "" >&2 - usage - exit 2 - ;; - esac -done - -retry_with_backoff ${RETRY} ${DELAY} ${MAX_TIME} ${@:OPTIND} diff --git a/modules/local/sratools_fasterqdump.nf b/modules/local/sratools_fasterqdump.nf deleted file mode 100644 index 7a75e551..00000000 --- a/modules/local/sratools_fasterqdump.nf +++ /dev/null @@ -1,68 +0,0 @@ - -process SRATOOLS_FASTERQDUMP { - tag "$meta.id" - label 'process_medium' - - conda (params.enable_conda ? 'bioconda::sra-tools=2.11.0 conda-forge::pigz=2.6' : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:6a9ff0e76ec016c3d0d27e0c0d362339f2d787e6-0' : - 'quay.io/biocontainers/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:6a9ff0e76ec016c3d0d27e0c0d362339f2d787e6-0' }" - - input: - tuple val(meta), path(sra) - - output: - tuple val(meta), path(fastq_output), emit: reads - tuple val(meta), path(md5_output) , emit: md5 - path "versions.yml" , emit: versions - - script: - def args = task.ext.args ?: '' - def args2 = task.ext.args2 ?: '' - def config = "/LIBS/GUID = \"${UUID.randomUUID().toString()}\"\\n/libs/cloud/report_instance_identity = \"true\"\\n" - // Paired-end data extracted by fasterq-dump (--split-3 the default) always creates - // *_1.fastq *_2.fastq files but sometimes also an additional *.fastq file - // for unpaired reads which we ignore here. - fastq_output = meta.single_end ? '*.fastq.gz' : '*_{1,2}.fastq.gz' - md5_output = meta.single_end ? '*.fastq.gz.md5' : '*_{1,2}.fastq.gz.md5' - """ - eval "\$(vdb-config -o n NCBI_SETTINGS | sed 's/[" ]//g')" - if [[ ! -f "\${NCBI_SETTINGS}" ]]; then - mkdir -p "\$(dirname "\${NCBI_SETTINGS}")" - printf '${config}' > "\${NCBI_SETTINGS}" - fi - - fasterq-dump \\ - $args \\ - --threads $task.cpus \\ - ${sra.name} - - pigz \\ - $args2 \\ - --no-name \\ - --processes $task.cpus \\ - *.fastq - - ## Rename FastQ files by meta.id - if [ -f ${sra.name}.fastq.gz ]; then - mv ${sra.name}.fastq.gz ${meta.id}.fastq.gz - md5sum ${meta.id}.fastq.gz > ${meta.id}.fastq.gz.md5 - fi - - if [ -f ${sra.name}_1.fastq.gz ]; then - mv ${sra.name}_1.fastq.gz ${meta.id}_1.fastq.gz - md5sum ${meta.id}_1.fastq.gz > ${meta.id}_1.fastq.gz.md5 - fi - - if [ -f ${sra.name}_2.fastq.gz ]; then - mv ${sra.name}_2.fastq.gz ${meta.id}_2.fastq.gz - md5sum ${meta.id}_2.fastq.gz > ${meta.id}_2.fastq.gz.md5 - fi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - sratools: \$(fasterq-dump --version 2>&1 | grep -Eo '[0-9.]+') - pigz: \$( pigz --version 2>&1 | sed 's/pigz //g' ) - END_VERSIONS - """ -} diff --git a/modules/local/sratools_prefetch.nf b/modules/local/sratools_prefetch.nf deleted file mode 100644 index 76679a93..00000000 --- a/modules/local/sratools_prefetch.nf +++ /dev/null @@ -1,41 +0,0 @@ - -process SRATOOLS_PREFETCH { - tag "$id" - label 'process_low' - label 'error_retry' - - conda (params.enable_conda ? 'bioconda::sra-tools=2.11.0' : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/sra-tools:2.11.0--pl5262h314213e_0' : - 'quay.io/biocontainers/sra-tools:2.11.0--pl5262h314213e_0' }" - - input: - tuple val(meta), val(id) - - output: - tuple val(meta), path("$id"), emit: sra - path "versions.yml" , emit: versions - - script: - def args = task.ext.args ?: '' - def config = "/LIBS/GUID = \"${UUID.randomUUID().toString()}\"\\n/libs/cloud/report_instance_identity = \"true\"\\n" - """ - eval "\$(vdb-config -o n NCBI_SETTINGS | sed 's/[" ]//g')" - if [[ ! -f "\${NCBI_SETTINGS}" ]]; then - mkdir -p "\$(dirname "\${NCBI_SETTINGS}")" - printf '${config}' > "\${NCBI_SETTINGS}" - fi - - retry_with_backoff.sh prefetch \\ - $args \\ - --progress \\ - $id - - vdb-validate $id - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - sratools: \$(prefetch --version 2>&1 | grep -Eo '[0-9.]+') - END_VERSIONS - """ -} diff --git a/subworkflows/local/sra_fastq_sratools.nf b/subworkflows/local/sra_fastq_sratools.nf deleted file mode 100644 index 1d59eb61..00000000 --- a/subworkflows/local/sra_fastq_sratools.nf +++ /dev/null @@ -1,31 +0,0 @@ -// -// Download FASTQ sequencing reads from the NCBI's Sequence Read Archive (SRA). -// - -include { SRATOOLS_PREFETCH } from '../../modules/local/sratools_prefetch' -include { SRATOOLS_FASTERQDUMP } from '../../modules/local/sratools_fasterqdump' - -workflow SRA_FASTQ_SRATOOLS { - take: - sra_ids // channel: [ val(meta), val(id) ] - - main: - - ch_versions = Channel.empty() - - // - // Prefetch sequencing reads in SRA format. - // - SRATOOLS_PREFETCH ( sra_ids ) - ch_versions = ch_versions.mix( SRATOOLS_PREFETCH.out.versions.first() ) - - // - // Convert the SRA format into one or more compressed FASTQ files. - // - SRATOOLS_FASTERQDUMP ( SRATOOLS_PREFETCH.out.sra ) - ch_versions = ch_versions.mix( SRATOOLS_FASTERQDUMP.out.versions.first() ) - - emit: - reads = SRATOOLS_FASTERQDUMP.out.reads // channel: [ val(meta), [ reads ] ] - versions = ch_versions // channel: [ versions.yml ] -} From 3de66f289f4186d523a62defc448d5ecfb625fc2 Mon Sep 17 00:00:00 2001 From: "Moritz E. Beber" Date: Thu, 12 May 2022 17:35:44 +0200 Subject: [PATCH 195/852] chore: install nf-core modules for sratools --- modules.json | 9 +++ .../custom/sratoolsncbisettings/main.nf | 20 +++++++ .../custom/sratoolsncbisettings/meta.yml | 28 ++++++++++ .../templates/detect_ncbi_settings.sh | 45 +++++++++++++++ .../modules/sratools/fasterqdump/main.nf | 48 ++++++++++++++++ .../modules/sratools/fasterqdump/meta.yml | 47 ++++++++++++++++ .../nf-core/modules/sratools/prefetch/main.nf | 25 +++++++++ .../modules/sratools/prefetch/meta.yml | 48 ++++++++++++++++ .../prefetch/templates/retry_with_backoff.sh | 55 +++++++++++++++++++ 9 files changed, 325 insertions(+) create mode 100644 modules/nf-core/modules/custom/sratoolsncbisettings/main.nf create mode 100644 modules/nf-core/modules/custom/sratoolsncbisettings/meta.yml create mode 100644 modules/nf-core/modules/custom/sratoolsncbisettings/templates/detect_ncbi_settings.sh create mode 100644 modules/nf-core/modules/sratools/fasterqdump/main.nf create mode 100644 modules/nf-core/modules/sratools/fasterqdump/meta.yml create mode 100644 modules/nf-core/modules/sratools/prefetch/main.nf create mode 100644 modules/nf-core/modules/sratools/prefetch/meta.yml create mode 100644 modules/nf-core/modules/sratools/prefetch/templates/retry_with_backoff.sh diff --git a/modules.json b/modules.json index f39d24ab..fefca2b7 100644 --- a/modules.json +++ b/modules.json @@ -5,6 +5,15 @@ "nf-core/modules": { "custom/dumpsoftwareversions": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + }, + "custom/sratoolsncbisettings": { + "git_sha": "b2dbaa99309a2057efc32ef9d029ed91140068df" + }, + "sratools/fasterqdump": { + "git_sha": "0cdf7767a79faf424645beeff83ecfa5528b6a7c" + }, + "sratools/prefetch": { + "git_sha": "1b228835e9525990db99243cb4f0d07aa6e01bc3" } } } diff --git a/modules/nf-core/modules/custom/sratoolsncbisettings/main.nf b/modules/nf-core/modules/custom/sratoolsncbisettings/main.nf new file mode 100644 index 00000000..21bf3005 --- /dev/null +++ b/modules/nf-core/modules/custom/sratoolsncbisettings/main.nf @@ -0,0 +1,20 @@ +process CUSTOM_SRATOOLSNCBISETTINGS { + tag 'ncbi-settings' + label 'process_low' + + conda (params.enable_conda ? 'bioconda::sra-tools=2.11.0' : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/sra-tools:2.11.0--pl5321ha49a11a_3' : + 'quay.io/biocontainers/sra-tools:2.11.0--pl5321ha49a11a_3' }" + + output: + path('*.mkfg') , emit: ncbi_settings + path 'versions.yml', emit: versions + + when: + task.ext.when == null || task.ext.when + + shell: + config = "/LIBS/GUID = \"${UUID.randomUUID().toString()}\"\\n/libs/cloud/report_instance_identity = \"true\"\\n" + template 'detect_ncbi_settings.sh' +} diff --git a/modules/nf-core/modules/custom/sratoolsncbisettings/meta.yml b/modules/nf-core/modules/custom/sratoolsncbisettings/meta.yml new file mode 100644 index 00000000..01e98856 --- /dev/null +++ b/modules/nf-core/modules/custom/sratoolsncbisettings/meta.yml @@ -0,0 +1,28 @@ +name: "sratoolsncbisettings" +description: Test for the presence of suitable NCBI settings or create them on the fly. +keywords: + - NCBI + - settings + - sra-tools + - prefetch + - fasterq-dump +tools: + - "sratools": + description: "SRA Toolkit and SDK from NCBI" + homepage: https://github.com/ncbi/sra-tools + documentation: https://github.com/ncbi/sra-tools/wiki + tool_dev_url: https://github.com/ncbi/sra-tools + licence: "['Public Domain']" + +output: + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - ncbi_settings: + type: file + description: An NCBI user settings file. + pattern: "*.mkfg" + +authors: + - "@Midnighter" diff --git a/modules/nf-core/modules/custom/sratoolsncbisettings/templates/detect_ncbi_settings.sh b/modules/nf-core/modules/custom/sratoolsncbisettings/templates/detect_ncbi_settings.sh new file mode 100644 index 00000000..cfe3a324 --- /dev/null +++ b/modules/nf-core/modules/custom/sratoolsncbisettings/templates/detect_ncbi_settings.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env bash + +set -u + + +# Get the expected NCBI settings path and define the environment variable +# `NCBI_SETTINGS`. +eval "$(vdb-config -o n NCBI_SETTINGS | sed 's/[" ]//g')" + +# If the user settings do not exist yet, create a file suitable for `prefetch` +# and `fasterq-dump`. If an existing settings file does not contain the required +# values, error out with a helpful message. +if [[ ! -f "${NCBI_SETTINGS}" ]]; then + printf '!{config}' > 'user-settings.mkfg' +else + prefetch --help &> /dev/null + if [[ $? = 78 ]]; then + echo "You have an existing vdb-config at '${NCBI_SETTINGS}' but it is"\ + "missing the required entries for /LIBS/GUID and"\ + "/libs/cloud/report_instance_identity."\ + "Feel free to add the following to your settings file:" >&2 + echo "$(printf '!{config}')" >&2 + exit 1 + fi + fasterq-dump --help &> /dev/null + if [[ $? = 78 ]]; then + echo "You have an existing vdb-config at '${NCBI_SETTINGS}' but it is"\ + "missing the required entries for /LIBS/GUID and"\ + "/libs/cloud/report_instance_identity."\ + "Feel free to add the following to your settings file:" >&2 + echo "$(printf '!{config}')" >&2 + exit 1 + fi + if [[ "${NCBI_SETTINGS}" != *.mkfg ]]; then + echo "The detected settings '${NCBI_SETTINGS}' do not have the required"\ + "file extension '.mkfg'." >&2 + exit 1 + fi + cp "${NCBI_SETTINGS}" ./ +fi + +cat <<-END_VERSIONS > versions.yml +"!{task.process}": + sratools: $(vdb-config --version 2>&1 | grep -Eo '[0-9.]+') +END_VERSIONS diff --git a/modules/nf-core/modules/sratools/fasterqdump/main.nf b/modules/nf-core/modules/sratools/fasterqdump/main.nf new file mode 100644 index 00000000..18f46e51 --- /dev/null +++ b/modules/nf-core/modules/sratools/fasterqdump/main.nf @@ -0,0 +1,48 @@ +process SRATOOLS_FASTERQDUMP { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? 'bioconda::sra-tools=2.11.0 conda-forge::pigz=2.6' : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:6a9ff0e76ec016c3d0d27e0c0d362339f2d787e6-0' : + 'quay.io/biocontainers/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:6a9ff0e76ec016c3d0d27e0c0d362339f2d787e6-0' }" + + input: + tuple val(meta), path(sra) + path ncbi_settings + + output: + tuple val(meta), path(output), emit: reads + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' + // Paired-end data extracted by fasterq-dump (--split-3 the default) always creates + // *_1.fastq *_2.fastq files but sometimes also an additional *.fastq file + // for unpaired reads which we ignore here. + output = meta.single_end ? '*.fastq.gz' : '*_{1,2}.fastq.gz' + """ + export NCBI_SETTINGS="\$PWD/${ncbi_settings}" + + fasterq-dump \\ + $args \\ + --threads $task.cpus \\ + ${sra.name} + + pigz \\ + $args2 \\ + --no-name \\ + --processes $task.cpus \\ + *.fastq + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + sratools: \$(fasterq-dump --version 2>&1 | grep -Eo '[0-9.]+') + pigz: \$( pigz --version 2>&1 | sed 's/pigz //g' ) + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/sratools/fasterqdump/meta.yml b/modules/nf-core/modules/sratools/fasterqdump/meta.yml new file mode 100644 index 00000000..d6fbd444 --- /dev/null +++ b/modules/nf-core/modules/sratools/fasterqdump/meta.yml @@ -0,0 +1,47 @@ +name: sratools_fasterqdump +description: Extract sequencing reads in FASTQ format from a given NCBI Sequence Read Archive (SRA). +keywords: + - sequencing + - FASTQ + - dump +tools: + - sratools: + description: SRA Toolkit and SDK from NCBI + homepage: https://github.com/ncbi/sra-tools + documentation: https://github.com/ncbi/sra-tools/wiki + tool_dev_url: https://github.com/ncbi/sra-tools + licence: ["Public Domain"] + +input: + - meta: + type: map + description: > + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - sra: + type: directory + description: Directory containing ETL data for the given SRA. + pattern: "*/*.sra" + - ncbi_settings: + type: file + description: > + An NCBI user settings file. + pattern: "*.mkfg" + +output: + - meta: + type: map + description: > + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - reads: + type: file + description: Extracted FASTQ file or files if the sequencing reads are paired-end. + pattern: "*.fastq.gz" + +authors: + - "@Midnighter" diff --git a/modules/nf-core/modules/sratools/prefetch/main.nf b/modules/nf-core/modules/sratools/prefetch/main.nf new file mode 100644 index 00000000..3426ae12 --- /dev/null +++ b/modules/nf-core/modules/sratools/prefetch/main.nf @@ -0,0 +1,25 @@ +process SRATOOLS_PREFETCH { + tag "$id" + label 'process_low' + + conda (params.enable_conda ? 'bioconda::sra-tools=2.11.0' : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/sra-tools:2.11.0--pl5321ha49a11a_3' : + 'quay.io/biocontainers/sra-tools:2.11.0--pl5321ha49a11a_3' }" + + input: + tuple val(meta), val(id) + path ncbi_settings + + output: + tuple val(meta), path(id), emit: sra + path 'versions.yml' , emit: versions + + when: + task.ext.when == null || task.ext.when + + shell: + args = task.ext.args ?: '' + args2 = task.ext.args2 ?: '5 1 100' // + template 'retry_with_backoff.sh' +} diff --git a/modules/nf-core/modules/sratools/prefetch/meta.yml b/modules/nf-core/modules/sratools/prefetch/meta.yml new file mode 100644 index 00000000..a3a26522 --- /dev/null +++ b/modules/nf-core/modules/sratools/prefetch/meta.yml @@ -0,0 +1,48 @@ +name: sratools_prefetch +description: Download sequencing data from the NCBI Sequence Read Archive (SRA). +keywords: + - sequencing + - fastq + - prefetch +tools: + - sratools: + description: SRA Toolkit and SDK from NCBI + homepage: https://github.com/ncbi/sra-tools + documentation: https://github.com/ncbi/sra-tools/wiki + tool_dev_url: https://github.com/ncbi/sra-tools + licence: ["Public Domain"] + +input: + - meta: + type: map + description: > + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - id: + type: val + description: > + A string denoting an SRA id. + - ncbi_settings: + type: file + description: > + An NCBI user settings file. + pattern: "*.mkfg" + +output: + - meta: + type: map + description: > + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - sra: + type: directory + description: > + Directory containing the ETL data for the given SRA id. + pattern: "*/*.sra" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@Midnighter" diff --git a/modules/nf-core/modules/sratools/prefetch/templates/retry_with_backoff.sh b/modules/nf-core/modules/sratools/prefetch/templates/retry_with_backoff.sh new file mode 100644 index 00000000..cec0ab43 --- /dev/null +++ b/modules/nf-core/modules/sratools/prefetch/templates/retry_with_backoff.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash + +set -u + +retry_with_backoff() { + local max_attempts=${1} + local delay=${2} + local max_time=${3} + local attempt=1 + local output= + local status= + + # Remove the first three arguments to this function in order to access + # the 'real' command with `${@}`. + shift 3 + + while [ ${attempt} -le ${max_attempts} ]; do + output=$("${@}") + status=${?} + + if [ ${status} -eq 0 ]; then + break + fi + + if [ ${attempt} -lt ${max_attempts} ]; then + echo "Failed attempt ${attempt} of ${max_attempts}. Retrying in ${delay} s." >&2 + sleep ${delay} + elif [ ${attempt} -eq ${max_attempts} ]; then + echo "Failed after ${attempt} attempts." >&2 + return ${status} + fi + + attempt=$(( ${attempt} + 1 )) + delay=$(( ${delay} * 2 )) + if [ ${delay} -ge ${max_time} ]; then + delay=${max_time} + fi + done + + echo "${output}" +} + +export NCBI_SETTINGS="$PWD/!{ncbi_settings}" + +retry_with_backoff !{args2} \ + prefetch \ + !{args} \ + !{id} + +vdb-validate !{id} + +cat <<-END_VERSIONS > versions.yml +"!{task.process}": + sratools: $(prefetch --version 2>&1 | grep -Eo '[0-9.]+') +END_VERSIONS From ad15361b924709cc078fb04b69d0ffa61719d920 Mon Sep 17 00:00:00 2001 From: "Moritz E. Beber" Date: Thu, 12 May 2022 17:53:57 +0200 Subject: [PATCH 196/852] refactor: implement new subworkflow --- subworkflows/nf-core/srafastq/main.nf | 38 ++++++++++++++++++++++++ subworkflows/nf-core/srafastq/meta.yml | 40 ++++++++++++++++++++++++++ workflows/sra.nf | 8 +++--- 3 files changed, 82 insertions(+), 4 deletions(-) create mode 100644 subworkflows/nf-core/srafastq/main.nf create mode 100644 subworkflows/nf-core/srafastq/meta.yml diff --git a/subworkflows/nf-core/srafastq/main.nf b/subworkflows/nf-core/srafastq/main.nf new file mode 100644 index 00000000..f57b6fac --- /dev/null +++ b/subworkflows/nf-core/srafastq/main.nf @@ -0,0 +1,38 @@ +include { CUSTOM_SRATOOLSNCBISETTINGS } from '../../../modules/nf-core/modules/custom/sratoolsncbisettings/main' +include { SRATOOLS_PREFETCH } from '../../../modules/nf-core/modules/sratools/prefetch/main' +include { SRATOOLS_FASTERQDUMP } from '../../../modules/nf-core/modules/sratools/fasterqdump/main' + +/** + * Download FASTQ sequencing reads from the NCBI's Sequence Read Archive (SRA). + */ +workflow SRAFASTQ { + take: + sra_ids // channel: [ val(meta), val(id) ] + + main: + + ch_versions = Channel.empty() + + // + // Detect existing NCBI user settings or create new ones. + // + CUSTOM_SRATOOLSNCBISETTINGS() + def settings = CUSTOM_SRATOOLSNCBISETTINGS.out.ncbi_settings // value channel: path(settings) + ch_versions = ch_versions.mix( CUSTOM_SRATOOLSNCBISETTINGS.out.versions ) + + // + // Prefetch sequencing reads in SRA format. + // + SRATOOLS_PREFETCH ( sra_ids, settings ) + ch_versions = ch_versions.mix( SRATOOLS_PREFETCH.out.versions.first() ) + + // + // Convert the SRA format into one or more compressed FASTQ files. + // + SRATOOLS_FASTERQDUMP ( SRATOOLS_PREFETCH.out.sra, settings ) + ch_versions = ch_versions.mix( SRATOOLS_FASTERQDUMP.out.versions.first() ) + + emit: + reads = SRATOOLS_FASTERQDUMP.out.reads // channel: [ val(meta), [ reads ] ] + versions = ch_versions // channel: [ versions.yml ] +} diff --git a/subworkflows/nf-core/srafastq/meta.yml b/subworkflows/nf-core/srafastq/meta.yml new file mode 100644 index 00000000..873ccaca --- /dev/null +++ b/subworkflows/nf-core/srafastq/meta.yml @@ -0,0 +1,40 @@ +name: sra_fastq +description: Download FASTQ sequencing reads from the NCBI's Sequence Read Archive (SRA). +keywords: + - SRA + - NCBI + - sequencing + - FASTQ + - prefetch + - fasterq-dump +modules: + - custom/sratoolsncbisettings + - sratools/prefetch + - sratools/fasterqdump +input: + - meta: + type: map + description: > + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - id: + type: string + description: > + SRA run identifier. +# TODO Update when we decide on a standard for subworkflow docs +output: + - meta: + type: map + description: > + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - reads: + type: file + description: Extracted FASTQ file or files if the sequencing reads are paired-end. + pattern: "*.fastq.gz" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@Midnighter" diff --git a/workflows/sra.nf b/workflows/sra.nf index 9336fcc1..2b3cb498 100644 --- a/workflows/sra.nf +++ b/workflows/sra.nf @@ -26,7 +26,7 @@ include { SRA_TO_SAMPLESHEET } from '../modules/local/sra_to_samplesheet' include { SRA_MERGE_SAMPLESHEET } from '../modules/local/sra_merge_samplesheet' include { MULTIQC_MAPPINGS_CONFIG } from '../modules/local/multiqc_mappings_config' -include { SRA_FASTQ_SRATOOLS } from '../subworkflows/local/sra_fastq_sratools' +include { SRAFASTQ } from '../subworkflows/nf-core/srafastq/main' /* ======================================================================================== @@ -97,16 +97,16 @@ workflow SRA { // // SUBWORKFLOW: Download sequencing reads without FTP links using sra-tools. // - SRA_FASTQ_SRATOOLS ( + SRAFASTQ ( ch_sra_reads.sra.map { meta, reads -> [ meta, meta.run_accession ] } ) - ch_versions = ch_versions.mix(SRA_FASTQ_SRATOOLS.out.versions.first()) + ch_versions = ch_versions.mix(SRAFASTQ.out.versions.first()) // // MODULE: Stage FastQ files downloaded by SRA together and auto-create a samplesheet // SRA_TO_SAMPLESHEET ( - SRA_FASTQ_FTP.out.fastq.mix(SRA_FASTQ_SRATOOLS.out.reads), + SRA_FASTQ_FTP.out.fastq.mix(SRAFASTQ.out.reads), params.nf_core_pipeline ?: '', params.sample_mapping_fields ) From 3630eb63148c1b40801c288f66f8452343b6f251 Mon Sep 17 00:00:00 2001 From: "Moritz E. Beber" Date: Mon, 16 May 2022 10:46:02 +0200 Subject: [PATCH 197/852] chore: add entry to changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 66753fad..4c614eec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Enhancements & fixes +- [#89](https://github.com/nf-core/fetchngs/pull/89) - Improve detection and usage of the NCBI user settings by using the standardized sra-tools modules from nf-core. + - [[nf-core/rnaseq#764](https://github.com/nf-core/rnaseq/issues/764)] - Test fails when using GCP due to missing tools in the basic biocontainer - Updated pipeline template to [nf-core/tools 2.3.2](https://github.com/nf-core/tools/releases/tag/2.3.2) From 2f260ba4d6d7eb21a8e6bc42e8549c7fe017daca Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 16 May 2022 21:17:47 +0100 Subject: [PATCH 198/852] Follow up fixes to #57 --- CHANGELOG.md | 7 +++++++ docs/usage.md | 10 ++++------ nextflow_schema.json | 2 +- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 987d753a..5f2477fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,10 +5,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [[1.6](https://github.com/nf-core/fetchngs/releases/tag/1.6)] - 2022-05-17 +- [#57](https://github.com/nf-core/fetchngs/pull/57) - fetchngs fails if FTP is blocked - [#89](https://github.com/nf-core/fetchngs/pull/89) - Improve detection and usage of the NCBI user settings by using the standardized sra-tools modules from nf-core. - [[nf-core/rnaseq#764](https://github.com/nf-core/rnaseq/issues/764)] - Test fails when using GCP due to missing tools in the basic biocontainer - Updated pipeline template to [nf-core/tools 2.4.1](https://github.com/nf-core/tools/releases/tag/2.4.1) +### Software dependencies + +| Dependency | Old version | New version | +| --------------- | ----------- | ----------- | +| `synapseclient` | 2.4.0 | 2.6.0 | + ## [[1.5](https://github.com/nf-core/fetchngs/releases/tag/1.5)] - 2021-12-01 - Finish porting the pipeline to the updated Nextflow DSL2 syntax adopted on nf-core/modules diff --git a/docs/usage.md b/docs/usage.md index f9f20346..b6c97e33 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -57,6 +57,10 @@ The final sample information for the FastQ files used for samplesheet generation As a bonus, the columns in the auto-created samplesheet can be tailored to be accepted out-of-the-box by selected nf-core pipelines, these currently include [nf-core/rnaseq](https://nf-co.re/rnaseq/usage#samplesheet-input) and the Illumina processing mode of [nf-core/viralrecon](https://nf-co.re/viralrecon/usage#illumina-samplesheet-format). You can use the `--nf_core_pipeline` parameter to customise this behaviour e.g. `--nf_core_pipeline rnaseq`. More pipelines will be supported in due course as we adopt and standardise samplesheet input across nf-core. It is highly recommended that you double-check that all of the identifiers you defined using `--input` are represented in the samplesheet. Also, public databases don't reliably hold information such as strandedness information so you may need to amend these entries too if for example your samplesheet was created by providing `--nf_core_pipeline rnaseq`. +### Bypass `FTP` data download + +If FTP connections are blocked on your network use the [`--force_sratools_download`](https://nf-co.re/fetchngs/parameters#force_sratools_download) parameter to force the pipeline to download data using sra-tools instead of the ENA FTP. + ## Running the pipeline The typical command for running the pipeline is as follows: @@ -259,9 +263,3 @@ We recommend adding the following line to your environment to limit this (typica ```console NXF_OPTS='-Xms1g -Xmx4g' ``` - -## Troubleshooting - -### `FTP` download is blocked at my workplace/institution, how can I still use _nf-core/fetchngs_ ? - -If downloading data with FTP is blocked on your network connection, you may want to use the [`--force_sratools_download`](https://nf-co.re/fetchngs/1.5/parameters#force_sratools_download) flag to force fetchngs download using [sra-tools](https://github.com/ncbi/sra-tools) instead of the ENA FTP. diff --git a/nextflow_schema.json b/nextflow_schema.json index b476e227..2bc7c52e 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -49,7 +49,7 @@ "type": "boolean", "fa_icon": "fas fa-tools", "description": "Force download FASTQ files via sra-tools instead of via the ENA FTP.", - "help_text": "If downloading data through FTP is blocked on your network connection, you may want to use this flag to force fetchngs to download using sra-tools instead of the ENA FTP. " + "help_text": "If FTP connections are blocked on your network use this flag to force the pipeline to download data using sra-tools instead of the ENA FTP." }, "skip_fastq_download": { "type": "boolean", From 7086977dc2296d648c00b2b26561aa6936d3caf6 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 16 May 2022 21:24:53 +0100 Subject: [PATCH 199/852] Fix nf-core linting --- LICENSE | 2 +- nextflow.config | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/LICENSE b/LICENSE index 515e402d..7a9b6d5a 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) Harshil Patel +Copyright (c) Harshil Patel, Moritz E. Beber and Jose Espinosa-Carrasco Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/nextflow.config b/nextflow.config index 40293d3b..237190ec 100644 --- a/nextflow.config +++ b/nextflow.config @@ -67,7 +67,6 @@ try { // System.err.println("WARNING: Could not load nf-core/config/fetchngs profiles: ${params.custom_config_base}/pipeline/fetchngs.config") // } - profiles { debug { process.beforeScript = 'echo $HOSTNAME' } conda { From d023066e2f7af9fd80e745c058aab49efd97b962 Mon Sep 17 00:00:00 2001 From: "Moritz E. Beber" Date: Tue, 17 May 2022 11:28:31 +0200 Subject: [PATCH 200/852] fix: use parameter for publishing mode refactor: adjust FASTQ pattern --- conf/modules.config | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 1ff70172..82a5f75c 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -24,7 +24,7 @@ process { withName: CUSTOM_DUMPSOFTWAREVERSIONS { publishDir = [ path: { "${params.outdir}/pipeline_info" }, - mode: 'copy', + mode: params.publish_dir_mode, pattern: '*_versions.yml' ] } @@ -48,7 +48,7 @@ if (params.input_type == 'sra') { withName: SRA_RUNINFO_TO_FTP { publishDir = [ path: { "${params.outdir}/metadata" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -58,12 +58,12 @@ if (params.input_type == 'sra') { publishDir = [ [ path: { "${params.outdir}/fastq" }, - mode: 'copy', - pattern: "*gz" + mode: params.publish_dir_mode, + pattern: "*.fastq.gz" ], [ path: { "${params.outdir}/fastq/md5" }, - mode: 'copy', + mode: params.publish_dir_mode, pattern: "*.md5" ] ] @@ -80,12 +80,12 @@ if (params.input_type == 'sra') { publishDir = [ [ path: { "${params.outdir}/fastq" }, - mode: 'copy', - pattern: "*gz" + mode: params.publish_dir_mode, + pattern: "*.fastq.gz" ], [ path: { "${params.outdir}/fastq/md5" }, - mode: 'copy', + mode: params.publish_dir_mode, pattern: "*.md5" ] ] @@ -101,7 +101,7 @@ if (params.input_type == 'sra') { withName: SRA_MERGE_SAMPLESHEET { publishDir = [ path: { "${params.outdir}/samplesheet" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -109,7 +109,7 @@ if (params.input_type == 'sra') { withName: MULTIQC_MAPPINGS_CONFIG { publishDir = [ path: { "${params.outdir}/samplesheet" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -129,7 +129,7 @@ if (params.input_type == 'synapse') { ext.args = '--long' publishDir = [ path: { "${params.outdir}/metadata" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -138,12 +138,12 @@ if (params.input_type == 'synapse') { publishDir = [ [ path: { "${params.outdir}/fastq" }, - mode: 'copy', - pattern: "*gz" + mode: params.publish_dir_mode, + pattern: "*.fastq.gz" ], [ path: { "${params.outdir}/fastq/md5" }, - mode: 'copy', + mode: params.publish_dir_mode, pattern: "*.md5" ] ] @@ -152,7 +152,7 @@ if (params.input_type == 'synapse') { withName: SYNAPSE_SHOW { publishDir = [ path: { "${params.outdir}/metadata" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -167,7 +167,7 @@ if (params.input_type == 'synapse') { withName: SYNAPSE_MERGE_SAMPLESHEET { publishDir = [ path: { "${params.outdir}/samplesheet" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } From 7f6e4928613fb5e0f03f9f70e52ad3431c87e9b1 Mon Sep 17 00:00:00 2001 From: "Moritz E. Beber" Date: Tue, 17 May 2022 11:36:17 +0200 Subject: [PATCH 201/852] chore: describe change --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f2477fd..8d5d7efc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [[1.6](https://github.com/nf-core/fetchngs/releases/tag/1.6)] - 2022-05-17 +- [#93](https://github.com/nf-core/fetchngs/pull/93) - Adjust modules configuration to respect the `publish_dir_mode` parameter. - [#57](https://github.com/nf-core/fetchngs/pull/57) - fetchngs fails if FTP is blocked - [#89](https://github.com/nf-core/fetchngs/pull/89) - Improve detection and usage of the NCBI user settings by using the standardized sra-tools modules from nf-core. - [[nf-core/rnaseq#764](https://github.com/nf-core/rnaseq/issues/764)] - Test fails when using GCP due to missing tools in the basic biocontainer From e697f22fbd5696060fee11505027fa0ed8051b7c Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 17 May 2022 11:54:01 +0100 Subject: [PATCH 202/852] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d5d7efc..9cdb7a0b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,9 +5,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [[1.6](https://github.com/nf-core/fetchngs/releases/tag/1.6)] - 2022-05-17 -- [#93](https://github.com/nf-core/fetchngs/pull/93) - Adjust modules configuration to respect the `publish_dir_mode` parameter. - [#57](https://github.com/nf-core/fetchngs/pull/57) - fetchngs fails if FTP is blocked - [#89](https://github.com/nf-core/fetchngs/pull/89) - Improve detection and usage of the NCBI user settings by using the standardized sra-tools modules from nf-core. +- [#93](https://github.com/nf-core/fetchngs/pull/93) - Adjust modules configuration to respect the `publish_dir_mode` parameter. - [[nf-core/rnaseq#764](https://github.com/nf-core/rnaseq/issues/764)] - Test fails when using GCP due to missing tools in the basic biocontainer - Updated pipeline template to [nf-core/tools 2.4.1](https://github.com/nf-core/tools/releases/tag/2.4.1) From 8460420a11eb965bc7ea11e7584a29a25a9eccb7 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 17 May 2022 13:04:54 +0100 Subject: [PATCH 203/852] Bump pipeline version to 1.7dev --- CHANGELOG.md | 4 ++++ nextflow.config | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9cdb7a0b..8d5b569f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unpublished Version / DEV] + +### Enhancements & fixes + ## [[1.6](https://github.com/nf-core/fetchngs/releases/tag/1.6)] - 2022-05-17 - [#57](https://github.com/nf-core/fetchngs/pull/57) - fetchngs fails if FTP is blocked diff --git a/nextflow.config b/nextflow.config index 237190ec..667f15e1 100644 --- a/nextflow.config +++ b/nextflow.config @@ -158,7 +158,7 @@ manifest { description = 'Pipeline to fetch metadata and raw FastQ files from public databases' mainScript = 'main.nf' nextflowVersion = '!>=21.10.3' - version = '1.6' + version = '1.7dev' } // Load modules.config for DSL2 module specific options From ca314f0e2880f4be89a4514d87b846eaebd8b51e Mon Sep 17 00:00:00 2001 From: James Fellows Yates Date: Sat, 11 Jun 2022 07:15:35 +0200 Subject: [PATCH 204/852] Add taxprofiler to pipeline and add enum for --nf_core_pipeline --- modules/local/sra_to_samplesheet.nf | 2 ++ nextflow_schema.json | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/local/sra_to_samplesheet.nf b/modules/local/sra_to_samplesheet.nf index 465144d7..4b448e89 100644 --- a/modules/local/sra_to_samplesheet.nf +++ b/modules/local/sra_to_samplesheet.nf @@ -39,6 +39,8 @@ process SRA_TO_SAMPLESHEET { if (pipeline) { if (pipeline == 'rnaseq') { pipeline_map << [ strandedness: 'unstranded' ] + } else if (pipeline == 'taxprofiler') { + pipeline_map << [ fasta: '' ] } } pipeline_map << meta_map diff --git a/nextflow_schema.json b/nextflow_schema.json index 2bc7c52e..a31b9396 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -43,7 +43,8 @@ "nf_core_pipeline": { "type": "string", "fa_icon": "fab fa-apple", - "description": "Name of supported nf-core pipeline e.g. 'rnaseq'. A samplesheet for direct use with the pipeline will be created with the appropriate columns." + "description": "Name of supported nf-core pipeline e.g. 'rnaseq'. A samplesheet for direct use with the pipeline will be created with the appropriate columns.", + "enum": ["rnaseq", "viralrecon", "taxprofiler"] }, "force_sratools_download": { "type": "boolean", From 491d3969ffcb846027f1c4aa305edb26217a56eb Mon Sep 17 00:00:00 2001 From: James Fellows Yates Date: Sat, 11 Jun 2022 07:22:51 +0200 Subject: [PATCH 205/852] Update changelog and docs --- CHANGELOG.md | 5 +++++ README.md | 2 +- docs/usage.md | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d5b569f..e101b40d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Enhancements & fixes +- [#97](https://github.com/nf-core/fetchngs/pull/97) - Add support for generating nf-core/taxprofiler compatible samplesheets anda dded improved validation for the --nf_core_pipeline flag to only accept supported pipelines +- + +### Enhancements & fixes + ## [[1.6](https://github.com/nf-core/fetchngs/releases/tag/1.6)] - 2022-05-17 - [#57](https://github.com/nf-core/fetchngs/pull/57) - fetchngs fails if FTP is blocked diff --git a/README.md b/README.md index 18b27ca3..637a373c 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ Via a single file of ids, provided one-per-line (see [example input file](https: ### Samplesheet format -The columns in the auto-created samplesheet can be tailored to be accepted out-of-the-box by selected nf-core pipelines, these currently include [nf-core/rnaseq](https://nf-co.re/rnaseq/usage#samplesheet-input) and the Illumina processing mode of [nf-core/viralrecon](https://nf-co.re/viralrecon/usage#illumina-samplesheet-format). You can use the `--nf_core_pipeline` parameter to customise this behaviour e.g. `--nf_core_pipeline rnaseq`. More pipelines will be supported in due course as we adopt and standardise samplesheet input across nf-core. +The columns in the auto-created samplesheet can be tailored to be accepted out-of-the-box by selected nf-core pipelines, these currently include [nf-core/rnaseq](https://nf-co.re/rnaseq/usage#samplesheet-input) and the Illumina processing mode of [nf-core/viralrecon](https://nf-co.re/viralrecon/usage#illumina-samplesheet-format), as well as [nf-core/taxprofiler](https://nf-co.re/nf-core/taxprofiler). You can use the `--nf_core_pipeline` parameter to customise this behaviour e.g. `--nf_core_pipeline rnaseq`. More pipelines will be supported in due course as we adopt and standardise samplesheet input across nf-core. ## Quick Start diff --git a/docs/usage.md b/docs/usage.md index b6c97e33..f95baa24 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -55,7 +55,7 @@ The final sample information for the FastQ files used for samplesheet generation ### Samplesheet format -As a bonus, the columns in the auto-created samplesheet can be tailored to be accepted out-of-the-box by selected nf-core pipelines, these currently include [nf-core/rnaseq](https://nf-co.re/rnaseq/usage#samplesheet-input) and the Illumina processing mode of [nf-core/viralrecon](https://nf-co.re/viralrecon/usage#illumina-samplesheet-format). You can use the `--nf_core_pipeline` parameter to customise this behaviour e.g. `--nf_core_pipeline rnaseq`. More pipelines will be supported in due course as we adopt and standardise samplesheet input across nf-core. It is highly recommended that you double-check that all of the identifiers you defined using `--input` are represented in the samplesheet. Also, public databases don't reliably hold information such as strandedness information so you may need to amend these entries too if for example your samplesheet was created by providing `--nf_core_pipeline rnaseq`. +As a bonus, the columns in the auto-created samplesheet can be tailored to be accepted out-of-the-box by selected nf-core pipelines, these currently include [nf-core/rnaseq](https://nf-co.re/rnaseq/usage#samplesheet-input) and the Illumina processing mode of [nf-core/viralrecon](https://nf-co.re/viralrecon/usage#illumina-samplesheet-format) as well [nf-core/taxprofiler](https://nf-co.re/taxprofiler/usage#samplesheet-input). You can use the `--nf_core_pipeline` parameter to customise this behaviour e.g. `--nf_core_pipeline rnaseq`. More pipelines will be supported in due course as we adopt and standardise samplesheet input across nf-core. It is highly recommended that you double-check that all of the identifiers you defined using `--input` are represented in the samplesheet. Also, public databases don't reliably hold information such as strandedness information so you may need to amend these entries too if for example your samplesheet was created by providing `--nf_core_pipeline rnaseq`. ### Bypass `FTP` data download From 4bd5ccdd0f650bdf507eaddbff4bf03323e02452 Mon Sep 17 00:00:00 2001 From: "James A. Fellows Yates" Date: Sat, 11 Jun 2022 21:10:01 +0200 Subject: [PATCH 206/852] Apply suggestions from code review Co-authored-by: Harshil Patel --- CHANGELOG.md | 6 ++---- README.md | 8 +++++++- docs/usage.md | 8 +++++++- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e101b40d..9e635ea4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,10 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Enhancements & fixes -- [#97](https://github.com/nf-core/fetchngs/pull/97) - Add support for generating nf-core/taxprofiler compatible samplesheets anda dded improved validation for the --nf_core_pipeline flag to only accept supported pipelines -- - -### Enhancements & fixes +- [#97](https://github.com/nf-core/fetchngs/pull/97) - Add support for generating nf-core/taxprofiler compatible samplesheets. +- Add `enum` field for `--nf_core_pipeline` to parameter schema so only accept supported pipelines are accepted ## [[1.6](https://github.com/nf-core/fetchngs/releases/tag/1.6)] - 2022-05-17 diff --git a/README.md b/README.md index 637a373c..c44ac40f 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,13 @@ Via a single file of ids, provided one-per-line (see [example input file](https: ### Samplesheet format -The columns in the auto-created samplesheet can be tailored to be accepted out-of-the-box by selected nf-core pipelines, these currently include [nf-core/rnaseq](https://nf-co.re/rnaseq/usage#samplesheet-input) and the Illumina processing mode of [nf-core/viralrecon](https://nf-co.re/viralrecon/usage#illumina-samplesheet-format), as well as [nf-core/taxprofiler](https://nf-co.re/nf-core/taxprofiler). You can use the `--nf_core_pipeline` parameter to customise this behaviour e.g. `--nf_core_pipeline rnaseq`. More pipelines will be supported in due course as we adopt and standardise samplesheet input across nf-core. +The columns in the auto-created samplesheet can be tailored to be accepted out-of-the-box by selected nf-core pipelines, these currently include: + +- [nf-core/rnaseq](https://nf-co.re/rnaseq/usage#samplesheet-input) +- Ilumina processing mode of [nf-core/viralrecon](https://nf-co.re/viralrecon/usage#illumina-samplesheet-format) +- [nf-core/taxprofiler](https://nf-co.re/nf-core/taxprofiler) + +You can use the `--nf_core_pipeline` parameter to customise this behaviour e.g. `--nf_core_pipeline rnaseq`. More pipelines will be supported in due course as we adopt and standardise samplesheet input across nf-core. ## Quick Start diff --git a/docs/usage.md b/docs/usage.md index f95baa24..8018760f 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -55,7 +55,13 @@ The final sample information for the FastQ files used for samplesheet generation ### Samplesheet format -As a bonus, the columns in the auto-created samplesheet can be tailored to be accepted out-of-the-box by selected nf-core pipelines, these currently include [nf-core/rnaseq](https://nf-co.re/rnaseq/usage#samplesheet-input) and the Illumina processing mode of [nf-core/viralrecon](https://nf-co.re/viralrecon/usage#illumina-samplesheet-format) as well [nf-core/taxprofiler](https://nf-co.re/taxprofiler/usage#samplesheet-input). You can use the `--nf_core_pipeline` parameter to customise this behaviour e.g. `--nf_core_pipeline rnaseq`. More pipelines will be supported in due course as we adopt and standardise samplesheet input across nf-core. It is highly recommended that you double-check that all of the identifiers you defined using `--input` are represented in the samplesheet. Also, public databases don't reliably hold information such as strandedness information so you may need to amend these entries too if for example your samplesheet was created by providing `--nf_core_pipeline rnaseq`. +As a bonus, the columns in the auto-created samplesheet can be tailored to be accepted out-of-the-box by selected nf-core pipelines, these currently include: + +- [nf-core/rnaseq](https://nf-co.re/rnaseq/usage#samplesheet-input) +- Ilumina processing mode of [nf-core/viralrecon](https://nf-co.re/viralrecon/usage#illumina-samplesheet-format) +- [nf-core/taxprofiler](https://nf-co.re/nf-core/taxprofiler) + +You can use the `--nf_core_pipeline` parameter to customise this behaviour e.g. `--nf_core_pipeline rnaseq`. More pipelines will be supported in due course as we adopt and standardise samplesheet input across nf-core. It is highly recommended that you double-check that all of the identifiers you defined using `--input` are represented in the samplesheet. Also, public databases don't reliably hold information such as strandedness information so you may need to amend these entries too if for example your samplesheet was created by providing `--nf_core_pipeline rnaseq`. ### Bypass `FTP` data download From 920c62f64cf27ae9229f965a843f25d4a4cb86f3 Mon Sep 17 00:00:00 2001 From: James Fellows Yates Date: Sat, 11 Jun 2022 21:13:59 +0200 Subject: [PATCH 207/852] Prettifying --- README.md | 2 +- docs/usage.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c44ac40f..7806362e 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ The columns in the auto-created samplesheet can be tailored to be accepted out-o - [nf-core/rnaseq](https://nf-co.re/rnaseq/usage#samplesheet-input) - Ilumina processing mode of [nf-core/viralrecon](https://nf-co.re/viralrecon/usage#illumina-samplesheet-format) -- [nf-core/taxprofiler](https://nf-co.re/nf-core/taxprofiler) +- [nf-core/taxprofiler](https://nf-co.re/nf-core/taxprofiler) You can use the `--nf_core_pipeline` parameter to customise this behaviour e.g. `--nf_core_pipeline rnaseq`. More pipelines will be supported in due course as we adopt and standardise samplesheet input across nf-core. diff --git a/docs/usage.md b/docs/usage.md index 8018760f..0cb6a976 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -59,8 +59,8 @@ As a bonus, the columns in the auto-created samplesheet can be tailored to be ac - [nf-core/rnaseq](https://nf-co.re/rnaseq/usage#samplesheet-input) - Ilumina processing mode of [nf-core/viralrecon](https://nf-co.re/viralrecon/usage#illumina-samplesheet-format) -- [nf-core/taxprofiler](https://nf-co.re/nf-core/taxprofiler) - +- [nf-core/taxprofiler](https://nf-co.re/nf-core/taxprofiler) + You can use the `--nf_core_pipeline` parameter to customise this behaviour e.g. `--nf_core_pipeline rnaseq`. More pipelines will be supported in due course as we adopt and standardise samplesheet input across nf-core. It is highly recommended that you double-check that all of the identifiers you defined using `--input` are represented in the samplesheet. Also, public databases don't reliably hold information such as strandedness information so you may need to amend these entries too if for example your samplesheet was created by providing `--nf_core_pipeline rnaseq`. ### Bypass `FTP` data download From 7caf7628943480920dc23bd11277804154bc8fd4 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 1 Jul 2022 11:56:37 +0100 Subject: [PATCH 208/852] Fix API call for SRA ids --- bin/sra_ids_to_runinfo.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bin/sra_ids_to_runinfo.py b/bin/sra_ids_to_runinfo.py index bbd1e6f0..f802da9e 100755 --- a/bin/sra_ids_to_runinfo.py +++ b/bin/sra_ids_to_runinfo.py @@ -246,13 +246,13 @@ def _content_check(cls, response, identifier): def _id_to_srx(cls, identifier): """Resolve the identifier to SRA experiments.""" params = { - "save": "efetch", + "id": identifier, "db": "sra", "rettype": "runinfo", - "term": identifier, + "retmode": "text" } response = fetch_url( - f"https://trace.ncbi.nlm.nih.gov/Traces/sra/sra.cgi?{urlencode(params)}" + f"https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?{urlencode(params)}" ) cls._content_check(response, identifier) return [row["Experiment"] for row in open_table(response, delimiter=",")] From a6c11e04c73b842f06febec66d3c7f247741ee5d Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 1 Jul 2022 11:57:37 +0100 Subject: [PATCH 209/852] Update API call for GEO ids - still broken --- bin/sra_ids_to_runinfo.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/bin/sra_ids_to_runinfo.py b/bin/sra_ids_to_runinfo.py index f802da9e..0f85d2fa 100755 --- a/bin/sra_ids_to_runinfo.py +++ b/bin/sra_ids_to_runinfo.py @@ -261,9 +261,14 @@ def _id_to_srx(cls, identifier): def _gse_to_srx(cls, identifier): """Resolve the identifier to SRA experiments.""" ids = [] - params = {"acc": identifier, "targ": "gsm", "view": "data", "form": "text"} + params = { + "id": identifier, + "db": "gds", + "rettype": "runinfo", + "retmode": "text" + } response = fetch_url( - f"https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?{urlencode(params)}" + f"https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?{urlencode(params)}" ) cls._content_check(response, identifier) gsm_ids = [ From 2cb54e3e390049c7d0b7637e2b3636eaff41728b Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 1 Jul 2022 13:21:33 +0100 Subject: [PATCH 210/852] Change default function to resolve GSM ids --- bin/sra_ids_to_runinfo.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/bin/sra_ids_to_runinfo.py b/bin/sra_ids_to_runinfo.py index 0f85d2fa..21c7225d 100755 --- a/bin/sra_ids_to_runinfo.py +++ b/bin/sra_ids_to_runinfo.py @@ -193,9 +193,11 @@ def is_valid(cls, identifier): class DatabaseResolver: """Define a service class for resolving various identifiers to experiments.""" - _GEO_PREFIXES = {"GSE"} + _GEO_PREFIXES = { + "GSE", + "GSM" + } _SRA_PREFIXES = { - "GSM", "PRJNA", "SAMN", "SRR", @@ -207,7 +209,9 @@ class DatabaseResolver: "PRJDB", "SAMD", } - _ENA_PREFIXES = {"ERR"} + _ENA_PREFIXES = { + "ERR" + } @classmethod def expand_identifier(cls, identifier): From edf3dafcc4585d879eca35687b9833bdf2279962 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 1 Jul 2022 16:20:17 +0100 Subject: [PATCH 211/852] Bump pipeline version to 1.7 --- CHANGELOG.md | 7 ++++++- nextflow.config | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e635ea4..dada8a72 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,11 +3,16 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unpublished Version / DEV] +## [[1.7](https://github.com/nf-core/fetchngs/releases/tag/1.7)] - 2022-07-01 + +### :warning: Major enhancements + +Support for GEO ids has been dropped in this release due to breaking changes introduced in the NCBI API. Please see [this PR](https://github.com/nf-core/fetchngs/pull/102). ### Enhancements & fixes - [#97](https://github.com/nf-core/fetchngs/pull/97) - Add support for generating nf-core/taxprofiler compatible samplesheets. +- [#99](https://github.com/nf-core/fetchngs/issues/99) - SRA_IDS_TO_RUNINFO fails due to bad request - Add `enum` field for `--nf_core_pipeline` to parameter schema so only accept supported pipelines are accepted ## [[1.6](https://github.com/nf-core/fetchngs/releases/tag/1.6)] - 2022-05-17 diff --git a/nextflow.config b/nextflow.config index 667f15e1..80ed6507 100644 --- a/nextflow.config +++ b/nextflow.config @@ -158,7 +158,7 @@ manifest { description = 'Pipeline to fetch metadata and raw FastQ files from public databases' mainScript = 'main.nf' nextflowVersion = '!>=21.10.3' - version = '1.7dev' + version = '1.7' } // Load modules.config for DSL2 module specific options From d1e07712666a224b44a5326594d56c5ec31cab48 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 1 Jul 2022 16:28:18 +0100 Subject: [PATCH 212/852] Strip out mention of GEO ids everywhere --- CHANGELOG.md | 10 +++++++++- README.md | 16 ++++++++++++++-- assets/schema_input.json | 2 +- docs/output.md | 6 +++--- docs/usage.md | 18 +++++++++--------- lib/WorkflowMain.groovy | 4 ++-- lib/WorkflowSra.groovy | 17 +++++++++++++++++ main.nf | 4 ++-- nextflow_schema.json | 2 +- workflows/sra.nf | 7 +++++++ 10 files changed, 65 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dada8a72..f3bbf9a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### :warning: Major enhancements -Support for GEO ids has been dropped in this release due to breaking changes introduced in the NCBI API. Please see [this PR](https://github.com/nf-core/fetchngs/pull/102). +Support for GEO ids has been dropped in this release due to breaking changes introduced in the NCBI API. For more detailed information please see [this PR](https://github.com/nf-core/fetchngs/pull/102). + +As a workaround, if you have a GEO accession you can directly download a text file containing the appropriate SRA ids to pass to the pipeline: + +- Search for your GEO accession on [GEO](https://www.ncbi.nlm.nih.gov/geo) +- Click `SRA Run Selector` at the bottom of the GEO accession page +- Select the desired samples in the `SRA Run Selector` and then download the `Accession List` + +This downloads a text file called `SRR_Acc_List.txt` that can be directly provided to the pipeline e.g. `--input SRR_Acc_List.txt`. ### Enhancements & fixes diff --git a/README.md b/README.md index 7806362e..1151db3d 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ ## Introduction -**nf-core/fetchngs** is a bioinformatics pipeline to fetch metadata and raw FastQ files from both public and private databases. At present, the pipeline supports SRA / ENA / DDBJ / GEO / Synapse ids (see [usage docs](https://nf-co.re/fetchngs/usage#introduction)). +**nf-core/fetchngs** is a bioinformatics pipeline to fetch metadata and raw FastQ files from both public and private databases. At present, the pipeline supports SRA / ENA / DDBJ / Synapse ids (see [usage docs](https://nf-co.re/fetchngs/usage#introduction)). The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. @@ -27,7 +27,7 @@ On release, automated continuous integration tests run the pipeline on a full-si Via a single file of ids, provided one-per-line (see [example input file](https://raw.githubusercontent.com/nf-core/test-datasets/fetchngs/sra_ids_test.txt)) the pipeline performs the following steps: -### SRA / ENA / DDBJ / GEO ids +### SRA / ENA / DDBJ ids 1. Resolve database ids back to appropriate experiment-level ids and to be compatible with the [ENA API](https://ena-docs.readthedocs.io/en/latest/retrieval/programmatic-access.html) 2. Fetch extensive id metadata via ENA API @@ -36,6 +36,18 @@ Via a single file of ids, provided one-per-line (see [example input file](https: - Otherwise use [`sra-tools`](https://github.com/ncbi/sra-tools) to download `.sra` files and convert them to FastQ 4. Collate id metadata and paths to FastQ files in a single samplesheet +### GEO ids + +Support for GEO ids was dropped in [[v1.7](https://github.com/nf-core/fetchngs/releases/tag/1.7)] due to breaking changes introduced in the NCBI API. For more detailed information please see [this PR](https://github.com/nf-core/fetchngs/pull/102). + +As a workaround, if you have a GEO accession you can directly download a text file containing the appropriate SRA ids to pass to the pipeline instead: + +- Search for your GEO accession on [GEO](https://www.ncbi.nlm.nih.gov/geo) +- Click `SRA Run Selector` at the bottom of the GEO accession page +- Select the desired samples in the `SRA Run Selector` and then download the `Accession List` + +This downloads a text file called `SRR_Acc_List.txt` that can be directly provided to the pipeline e.g. `--input SRR_Acc_List.txt`. + ### Synapse ids 1. Resolve Synapse directory ids to their corresponding FastQ files ids via the `synapse list` command. diff --git a/assets/schema_input.json b/assets/schema_input.json index 9a800216..8bf05fd8 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -9,7 +9,7 @@ "items": { "type": "string", "pattern": "^(((SR|ER|DR)[APRSX])|(SAM(N|EA|D))|(PRJ(NA|EB|DB))|(GS[EM])|(syn))(\\d+)$", - "errorMessage": "Please provide a valid SRA, ENA, DDBJ or GEO identifier" + "errorMessage": "Please provide a valid SRA, ENA, DDBJ identifier" } } } diff --git a/docs/output.md b/docs/output.md index 7402976c..daaca914 100644 --- a/docs/output.md +++ b/docs/output.md @@ -9,19 +9,19 @@ This document describes the output produced by the pipeline. The directories lis The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data depending on the type of ids provided: - Download FastQ files and create samplesheet from: - 1. [SRA / ENA / DDBJ / GEO ids](#sra--ena--ddbj--geo-ids) + 1. [SRA / ENA / DDBJ ids](#sra--ena--ddbj-ids) 2. [Synapse ids](#synapse-ids) - [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution Please see the [usage documentation](https://nf-co.re/fetchngs/usage#introduction) for a list of supported public repository identifiers and how to provide them to the pipeline. -### SRA / ENA / DDBJ / GEO ids +### SRA / ENA / DDBJ ids
Output files - `fastq/` - - `*.fastq.gz`: Paired-end/single-end reads downloaded from the SRA / ENA / DDBJ / GEO. + - `*.fastq.gz`: Paired-end/single-end reads downloaded from the SRA / ENA / DDBJ. - `fastq/md5/` - `*.md5`: Files containing `md5` sum for FastQ files downloaded from the ENA. - `samplesheet/` diff --git a/docs/usage.md b/docs/usage.md index 0cb6a976..ba4de1b2 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -8,15 +8,15 @@ The pipeline has been set-up to automatically download and process the raw FastQ files from both public and private repositories. Identifiers can be provided in a file, one-per-line via the `--input` parameter. Currently, the following types of example identifiers are supported: -| `SRA` | `ENA` | `DDBJ` | `GEO` | `Synapse` | -| ------------ | ------------ | ------------ | ---------- | ----------- | -| SRR11605097 | ERR4007730 | DRR171822 | GSM4432381 | syn26240435 | -| SRX8171613 | ERX4009132 | DRX162434 | GSE147507 | | -| SRS6531847 | ERS4399630 | DRS090921 | | | -| SAMN14689442 | SAMEA6638373 | SAMD00114846 | | | -| SRP256957 | ERP120836 | DRP004793 | | | -| SRA1068758 | ERA2420837 | DRA008156 | | | -| PRJNA625551 | PRJEB37513 | PRJDB4176 | | | +| `SRA` | `ENA` | `DDBJ` | `Synapse` | +| ------------ | ------------ | ------------ | ----------- | +| SRR11605097 | ERR4007730 | DRR171822 | syn26240435 | +| SRX8171613 | ERX4009132 | DRX162434 | | +| SRS6531847 | ERS4399630 | DRS090921 | | +| SAMN14689442 | SAMEA6638373 | SAMD00114846 | | +| SRP256957 | ERP120836 | DRP004793 | | +| SRA1068758 | ERA2420837 | DRA008156 | | +| PRJNA625551 | PRJEB37513 | PRJDB4176 | | ### SRR / ERR / DRR ids diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index f64fa80f..77b7ffde 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -104,7 +104,7 @@ class WorkflowMain { if (num_match == total_ids) { is_sra = true } else { - log.error "Mixture of ids provided via --input: ${no_match_ids.join(', ')}\nPlease provide either SRA / ENA / DDBJ / GEO or Synapse ids!" + log.error "Mixture of ids provided via --input: ${no_match_ids.join(', ')}\nPlease provide either SRA / ENA / DDBJ or Synapse ids!" System.exit(1) } } @@ -129,7 +129,7 @@ class WorkflowMain { if (num_match == total_ids) { is_synapse = true } else { - log.error "Mixture of ids provided via --input: ${no_match_ids.join(', ')}\nPlease provide either SRA / ENA / DDBJ / GEO or Synapse ids!" + log.error "Mixture of ids provided via --input: ${no_match_ids.join(', ')}\nPlease provide either SRA / ENA / DDBJ or Synapse ids!" System.exit(1) } } diff --git a/lib/WorkflowSra.groovy b/lib/WorkflowSra.groovy index a2c16219..90d86f1c 100755 --- a/lib/WorkflowSra.groovy +++ b/lib/WorkflowSra.groovy @@ -29,4 +29,21 @@ class WorkflowSra { " running nf-core/other pipelines.\n" + "===================================================================================" } + + // Fail pipeline if input ids are from the GEO + public static void isGeoFail(ids, log) { + def pattern = /^(GS[EM])(\d+)$/ + for (id in ids) { + if (id =~ pattern) { + log.error "===================================================================================\n" + + " GEO id detected: ${id}\n" + + " Support for GEO ids was dropped in v1.7 due to breaking changes in the NCBI API.\n" + + " Please remove any GEO ids from the input samplesheet.\n\n" + + " Please see:\n" + + " https://github.com/nf-core/fetchngs/pull/102\n" + + "===================================================================================" + System.exit(1) + } + } + } } diff --git a/main.nf b/main.nf index c6303a41..2c4b52f2 100644 --- a/main.nf +++ b/main.nf @@ -44,7 +44,7 @@ if (WorkflowMain.isSraId(ch_input, log)) { } else if (WorkflowMain.isSynapseId(ch_input, log)) { input_type = 'synapse' } else { - exit 1, 'Ids provided via --input not recognised please make sure they are either SRA / ENA / DDBJ / GEO or Synapse ids!' + exit 1, 'Ids provided via --input not recognised please make sure they are either SRA / ENA / DDBJ or Synapse ids!' } if (params.input_type == input_type) { @@ -63,7 +63,7 @@ if (params.input_type == input_type) { workflow NFCORE_FETCHNGS { // - // WORKFLOW: Download FastQ files for SRA / ENA / DDBJ / GEO ids + // WORKFLOW: Download FastQ files for SRA / ENA / DDBJ ids // if (params.input_type == 'sra') { SRA ( ch_ids ) diff --git a/nextflow_schema.json b/nextflow_schema.json index a31b9396..a51dc45a 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -19,7 +19,7 @@ "pattern": "^\\S+\\.txt$", "schema": "assets/schema_input.json", "fa_icon": "fas fa-file-excel", - "description": "File containing SRA/ENA/DDBJ/GEO identifiers one per line to download their associated metadata and FastQ files." + "description": "File containing SRA/ENA/DDBJ identifiers one per line to download their associated metadata and FastQ files." }, "input_type": { "type": "string", diff --git a/workflows/sra.nf b/workflows/sra.nf index 2b3cb498..0dde4588 100644 --- a/workflows/sra.nf +++ b/workflows/sra.nf @@ -50,6 +50,13 @@ workflow SRA { main: ch_versions = Channel.empty() + // + // Fail the pipeline if GEO ids detected + // + ids + .collect() + .map { WorkflowSra.isGeoFail(it, log) } + // // MODULE: Get SRA run information for public database ids // From 3696f40cf5bcd4ec3266275b4cb77e4359d76c06 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 1 Jul 2022 16:35:45 +0100 Subject: [PATCH 213/852] Strip out regex for GEO from input schema --- assets/schema_input.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/schema_input.json b/assets/schema_input.json index 8bf05fd8..71f0f976 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -8,7 +8,7 @@ "type": "array", "items": { "type": "string", - "pattern": "^(((SR|ER|DR)[APRSX])|(SAM(N|EA|D))|(PRJ(NA|EB|DB))|(GS[EM])|(syn))(\\d+)$", + "pattern": "^(((SR|ER|DR)[APRSX])|(SAM(N|EA|D))|(PRJ(NA|EB|DB))|(syn))(\\d+)$", "errorMessage": "Please provide a valid SRA, ENA, DDBJ identifier" } } From 1715457d75d1b073f5ac2114cacbcf886876bb27 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 1 Jul 2022 17:19:36 +0100 Subject: [PATCH 214/852] Bump pipeline version to 1.8dev --- CHANGELOG.md | 4 ++++ nextflow.config | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f3bbf9a7..8bf55a90 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unpublished Version / DEV] + +### Enhancements & fixes + ## [[1.7](https://github.com/nf-core/fetchngs/releases/tag/1.7)] - 2022-07-01 ### :warning: Major enhancements diff --git a/nextflow.config b/nextflow.config index 80ed6507..eb5a19a0 100644 --- a/nextflow.config +++ b/nextflow.config @@ -158,7 +158,7 @@ manifest { description = 'Pipeline to fetch metadata and raw FastQ files from public databases' mainScript = 'main.nf' nextflowVersion = '!>=21.10.3' - version = '1.7' + version = '1.8dev' } // Load modules.config for DSL2 module specific options From f071b7b8ce83b37ff3cde24b511cc46102eb177b Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 8 Jul 2022 15:55:19 +0100 Subject: [PATCH 215/852] Fetch SRR and DRR id info from ENA API instead of NCBI API --- bin/sra_ids_to_runinfo.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bin/sra_ids_to_runinfo.py b/bin/sra_ids_to_runinfo.py index 21c7225d..d85b0996 100755 --- a/bin/sra_ids_to_runinfo.py +++ b/bin/sra_ids_to_runinfo.py @@ -200,17 +200,17 @@ class DatabaseResolver: _SRA_PREFIXES = { "PRJNA", "SAMN", - "SRR", "DRA", "DRP", - "DRR", "DRS", "DRX", "PRJDB", "SAMD", } _ENA_PREFIXES = { - "ERR" + "ERR", + "SRR", + "DRR" } @classmethod From b4f05430b6d055cd5d745b9dd35d574d0b99a9e2 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 8 Jul 2022 15:58:39 +0100 Subject: [PATCH 216/852] Update CHANGELOG --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8bf55a90..59d123ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Enhancements & fixes +- Fetch `SRR` and `DRR` metadata from ENA API instead of NCBI API to bypass frequent breaking changes + ## [[1.7](https://github.com/nf-core/fetchngs/releases/tag/1.7)] - 2022-07-01 ### :warning: Major enhancements From 91ce8905e078b18139136b6ef82a18e351a6263f Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Tue, 1 Nov 2022 16:09:59 +0000 Subject: [PATCH 217/852] add a tower.yml --- tower.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 tower.yml diff --git a/tower.yml b/tower.yml new file mode 100644 index 00000000..ec0609cc --- /dev/null +++ b/tower.yml @@ -0,0 +1,15 @@ +reports: + "samplesheet/samplesheet.csv": + display: "Auto-created samplesheet with collated metadata and FASTQ paths" + "samplesheet/id_mappings.csv": + display: "File with selected fields that can be used to rename samples" + "samplesheet/multiqc_config.yml": + display: "MultiQC config file that can be passed to most nf-core pipelines" + "metadata/*.runinfo_ftp.tsv": + display: "Re-formatted metadata file downloaded from the ENA" + "metadata/*.runinfo.tsv": + display: "Original metadata file downloaded from the ENA" + "metadata/*.metadata.txt": + display: "Original metadata file generated using the synapse show command" + "metadata/*.list.txt": + display: "Original output of the synapse list command" From 2c06e2eac4e24474932128a79dc5967364940510 Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Tue, 1 Nov 2022 16:18:35 +0000 Subject: [PATCH 218/852] update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 59d123ab..cc9af791 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ This downloads a text file called `SRR_Acc_List.txt` that can be directly provid ### Enhancements & fixes +- [#121](https://github.com/nf-core/fetchngs/pull/123) - Add Tower reporting - [#97](https://github.com/nf-core/fetchngs/pull/97) - Add support for generating nf-core/taxprofiler compatible samplesheets. - [#99](https://github.com/nf-core/fetchngs/issues/99) - SRA_IDS_TO_RUNINFO fails due to bad request - Add `enum` field for `--nf_core_pipeline` to parameter schema so only accept supported pipelines are accepted From a927872ba0f7b482304cdd20b1b11865442feb75 Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Wed, 2 Nov 2022 10:47:09 +0000 Subject: [PATCH 219/852] Keep to main outputs Co-authored-by: Harshil Patel --- tower.yml | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/tower.yml b/tower.yml index ec0609cc..7b7fd106 100644 --- a/tower.yml +++ b/tower.yml @@ -1,15 +1,7 @@ reports: - "samplesheet/samplesheet.csv": + samplesheet.csv: display: "Auto-created samplesheet with collated metadata and FASTQ paths" - "samplesheet/id_mappings.csv": - display: "File with selected fields that can be used to rename samples" - "samplesheet/multiqc_config.yml": - display: "MultiQC config file that can be passed to most nf-core pipelines" - "metadata/*.runinfo_ftp.tsv": - display: "Re-formatted metadata file downloaded from the ENA" - "metadata/*.runinfo.tsv": - display: "Original metadata file downloaded from the ENA" - "metadata/*.metadata.txt": - display: "Original metadata file generated using the synapse show command" - "metadata/*.list.txt": - display: "Original output of the synapse list command" + id_mappings.csv: + display: "File with database identifier mappings that can be used to rename samples" + multiqc_config.yml: + display: "MultiQC config file for bulk renaming of sample names from database ids" From e3906f5440bb05bd2bb3f782c6d6ab64373940e6 Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Wed, 2 Nov 2022 10:47:27 +0000 Subject: [PATCH 220/852] Improve changelog Co-authored-by: Harshil Patel --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cc9af791..b16a252a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,7 +25,7 @@ This downloads a text file called `SRR_Acc_List.txt` that can be directly provid ### Enhancements & fixes -- [#121](https://github.com/nf-core/fetchngs/pull/123) - Add Tower reporting +- [#121](https://github.com/nf-core/fetchngs/pull/123) - Add `tower.yml` to render Reports in Tower - [#97](https://github.com/nf-core/fetchngs/pull/97) - Add support for generating nf-core/taxprofiler compatible samplesheets. - [#99](https://github.com/nf-core/fetchngs/issues/99) - SRA_IDS_TO_RUNINFO fails due to bad request - Add `enum` field for `--nf_core_pipeline` to parameter schema so only accept supported pipelines are accepted From c4d365833b109a3587d8621427f5eae3aafd2714 Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Wed, 2 Nov 2022 10:52:42 +0000 Subject: [PATCH 221/852] Set input file type to Tower-compatible one (CSV) --- nextflow_schema.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index a51dc45a..bde6337d 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -15,8 +15,8 @@ "input": { "type": "string", "format": "file-path", - "mimetype": "text/plain", - "pattern": "^\\S+\\.txt$", + "mimetype": "text/csv", + "pattern": "^\\S+\\.csv$", "schema": "assets/schema_input.json", "fa_icon": "fas fa-file-excel", "description": "File containing SRA/ENA/DDBJ identifiers one per line to download their associated metadata and FastQ files." From 95bd0569910eb103d7d88d210a48f0dee96b438e Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Thu, 3 Nov 2022 14:16:26 +0000 Subject: [PATCH 222/852] Fix tests for csv --- conf/test.config | 2 +- conf/test_full.config | 2 +- conf/test_synapse.config | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/test.config b/conf/test.config index 39a4ffdb..3c58e9cf 100644 --- a/conf/test.config +++ b/conf/test.config @@ -20,5 +20,5 @@ params { max_time = '6.h' // Input data - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/fetchngs/sra_ids_test.txt' + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/fetchngs/sra_ids_test.csv' } diff --git a/conf/test_full.config b/conf/test_full.config index 0887326a..2f0303ea 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -15,5 +15,5 @@ params { config_profile_description = 'Full test dataset to check pipeline function' // Input data for full size test - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/fetchngs/sra_ids_test.txt' + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/fetchngs/sra_ids_test.csv' } diff --git a/conf/test_synapse.config b/conf/test_synapse.config index b49f2463..1ac1388a 100644 --- a/conf/test_synapse.config +++ b/conf/test_synapse.config @@ -20,6 +20,6 @@ params { max_time = '6.h' // Input data - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/fetchngs/synapse_ids_test.txt' + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/fetchngs/synapse_ids_test.csv' input_type = 'synapse' } From 484e8185507c11b99763cb4fd45a716c8544e835 Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Thu, 3 Nov 2022 14:19:23 +0000 Subject: [PATCH 223/852] Update docs for csv --- README.md | 6 +++--- docs/usage.md | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 1151db3d..24d77103 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ On release, automated continuous integration tests run the pipeline on a full-si ## Pipeline summary -Via a single file of ids, provided one-per-line (see [example input file](https://raw.githubusercontent.com/nf-core/test-datasets/fetchngs/sra_ids_test.txt)) the pipeline performs the following steps: +Via a single file of ids, provided one-per-line (see [example input file](https://raw.githubusercontent.com/nf-core/test-datasets/fetchngs/sra_ids_test.csv)) the pipeline performs the following steps: ### SRA / ENA / DDBJ ids @@ -46,7 +46,7 @@ As a workaround, if you have a GEO accession you can directly download a text fi - Click `SRA Run Selector` at the bottom of the GEO accession page - Select the desired samples in the `SRA Run Selector` and then download the `Accession List` -This downloads a text file called `SRR_Acc_List.txt` that can be directly provided to the pipeline e.g. `--input SRR_Acc_List.txt`. +This downloads a text file called `SRR_Acc_List.csv` that can be directly provided to the pipeline once renamed with a .csv extension e.g. `--input SRR_Acc_List.csv`. ### Synapse ids @@ -87,7 +87,7 @@ You can use the `--nf_core_pipeline` parameter to customise this behaviour e.g. 4. Start running your own analysis! ```bash - nextflow run nf-core/fetchngs --input ids.txt --outdir -profile + nextflow run nf-core/fetchngs --input ids.csv --outdir -profile ``` ## Documentation diff --git a/docs/usage.md b/docs/usage.md index ba4de1b2..b7fbe8f6 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -32,7 +32,7 @@ If you have a GEO accession (found in the data availability section of published - Click `SRA Run Selector` at the bottom of the GEO accession page - Select the desired samples in the `SRA Run Selector` and then download the `Accession List` -This downloads a text file called `SRR_Acc_List.txt` that can be directly provided to the pipeline e.g. `--input SRR_Acc_List.txt`. +This downloads a text file called `SRR_Acc_List.csv` that can be directly provided to the pipeline once renamed with a .csv extension e.g. `--input SRR_Acc_List.csv`. ### Synapse ids @@ -72,7 +72,7 @@ If FTP connections are blocked on your network use the [`--force_sratools_downlo The typical command for running the pipeline is as follows: ```bash -nextflow run nf-core/fetchngs --input ids.txt --outdir -profile docker +nextflow run nf-core/fetchngs --input ids.csv --outdir -profile docker ``` This will launch the pipeline with the `docker` configuration profile. See below for more information about profiles. From 70f0038a52c89859fc8cb2df1e0f55425eb8c427 Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Thu, 3 Nov 2022 14:22:17 +0000 Subject: [PATCH 224/852] update WorkflowMain.groovy for CSV --- lib/WorkflowMain.groovy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index 77b7ffde..ef9131b7 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -21,7 +21,7 @@ class WorkflowMain { // Print help to screen if required // public static String help(workflow, params, log) { - def command = "nextflow run ${workflow.manifest.name} --input ids.txt -profile docker" + def command = "nextflow run ${workflow.manifest.name} --input ids.csv -profile docker" def help_string = '' help_string += NfcoreTemplate.logo(workflow, params.monochrome_logs) help_string += NfcoreSchema.paramsHelp(workflow, params, command) @@ -74,7 +74,7 @@ class WorkflowMain { // Check input has been provided if (!params.input) { - log.error "Please provide an input file containing ids to the pipeline - one per line e.g. '--input ids.txt'" + log.error "Please provide an input file containing ids to the pipeline - one per line e.g. '--input ids.csv'" System.exit(1) } From 5c340b0b501e03f7fd59bc2d623f233ad3f2dc49 Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Thu, 3 Nov 2022 14:32:39 +0000 Subject: [PATCH 225/852] Undo bad txt -> csv --- README.md | 2 +- docs/usage.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 24d77103..fe68e6b2 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ As a workaround, if you have a GEO accession you can directly download a text fi - Click `SRA Run Selector` at the bottom of the GEO accession page - Select the desired samples in the `SRA Run Selector` and then download the `Accession List` -This downloads a text file called `SRR_Acc_List.csv` that can be directly provided to the pipeline once renamed with a .csv extension e.g. `--input SRR_Acc_List.csv`. +This downloads a text file called `SRR_Acc_List.txt` that can be directly provided to the pipeline once renamed with a .csv extension e.g. `--input SRR_Acc_List.csv`. ### Synapse ids diff --git a/docs/usage.md b/docs/usage.md index b7fbe8f6..9d78a37b 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -32,7 +32,7 @@ If you have a GEO accession (found in the data availability section of published - Click `SRA Run Selector` at the bottom of the GEO accession page - Select the desired samples in the `SRA Run Selector` and then download the `Accession List` -This downloads a text file called `SRR_Acc_List.csv` that can be directly provided to the pipeline once renamed with a .csv extension e.g. `--input SRR_Acc_List.csv`. +This downloads a text file called `SRR_Acc_List.txt` that can be directly provided to the pipeline once renamed with a .csv extension e.g. `--input SRR_Acc_List.csv`. ### Synapse ids From cabff52754f5da2e0973f72af0ab06a46cc0654c Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 4 Nov 2022 09:55:09 +0000 Subject: [PATCH 226/852] Fix relative paths after module restructuring --- subworkflows/nf-core/srafastq/main.nf | 6 +++--- workflows/sra.nf | 2 +- workflows/synapse.nf | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/subworkflows/nf-core/srafastq/main.nf b/subworkflows/nf-core/srafastq/main.nf index f57b6fac..580fef18 100644 --- a/subworkflows/nf-core/srafastq/main.nf +++ b/subworkflows/nf-core/srafastq/main.nf @@ -1,6 +1,6 @@ -include { CUSTOM_SRATOOLSNCBISETTINGS } from '../../../modules/nf-core/modules/custom/sratoolsncbisettings/main' -include { SRATOOLS_PREFETCH } from '../../../modules/nf-core/modules/sratools/prefetch/main' -include { SRATOOLS_FASTERQDUMP } from '../../../modules/nf-core/modules/sratools/fasterqdump/main' +include { CUSTOM_SRATOOLSNCBISETTINGS } from '../../../modules/nf-core/custom/sratoolsncbisettings/main' +include { SRATOOLS_PREFETCH } from '../../../modules/nf-core/sratools/prefetch/main' +include { SRATOOLS_FASTERQDUMP } from '../../../modules/nf-core/sratools/fasterqdump/main' /** * Download FASTQ sequencing reads from the NCBI's Sequence Read Archive (SRA). diff --git a/workflows/sra.nf b/workflows/sra.nf index 0dde4588..ef654b2d 100644 --- a/workflows/sra.nf +++ b/workflows/sra.nf @@ -34,7 +34,7 @@ include { SRAFASTQ } from '../subworkflows/nf-core/srafastq/main' ======================================================================================== */ -include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' +include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/custom/dumpsoftwareversions/main' /* ======================================================================================== diff --git a/workflows/synapse.nf b/workflows/synapse.nf index 2a673623..1203056a 100644 --- a/workflows/synapse.nf +++ b/workflows/synapse.nf @@ -31,7 +31,7 @@ include { SYNAPSE_MERGE_SAMPLESHEET } from '../modules/local/synapse_merge_sampl ======================================================================================== */ -include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' +include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/custom/dumpsoftwareversions/main' /* ======================================================================================== From 2b22ab6b92417ae5efd61b1a2a657fa1fe91b77e Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 4 Nov 2022 09:57:46 +0000 Subject: [PATCH 227/852] Fix PythonBlack --- bin/multiqc_mappings_config.py | 5 +-- bin/sra_ids_to_runinfo.py | 80 ++++++++-------------------------- bin/sra_runinfo_to_ftp.py | 36 ++++----------- 3 files changed, 29 insertions(+), 92 deletions(-) diff --git a/bin/multiqc_mappings_config.py b/bin/multiqc_mappings_config.py index a7fc92ba..2fcdb49a 100755 --- a/bin/multiqc_mappings_config.py +++ b/bin/multiqc_mappings_config.py @@ -3,11 +3,10 @@ import sys with open(sys.argv[1], "r") as fin, open(sys.argv[2], "w") as fout: - header = fin.readline().split(',') + header = fin.readline().split(",") config = "sample_names_rename_buttons:\n" - config += "\n".join([' - ' + x.strip('"') for x in header]) + config += "\n".join([" - " + x.strip('"') for x in header]) config += "sample_names_rename:\n" for line in fin: config += f" - [{', '.join(line.strip().split(','))}]\n" fout.write(config) - diff --git a/bin/sra_ids_to_runinfo.py b/bin/sra_ids_to_runinfo.py index d85b0996..70627791 100755 --- a/bin/sra_ids_to_runinfo.py +++ b/bin/sra_ids_to_runinfo.py @@ -49,9 +49,7 @@ ) GEO_IDS = ("GSE18729", "GSM465244") ID_REGEX = re.compile(r"^([A-Z]+)([0-9]+)$") -PREFIX_LIST = sorted( - {ID_REGEX.match(id).group(1) for id in SRA_IDS + ENA_IDS + DDBJ_IDS + GEO_IDS} -) +PREFIX_LIST = sorted({ID_REGEX.match(id).group(1) for id in SRA_IDS + ENA_IDS + DDBJ_IDS + GEO_IDS}) # List of metadata fields fetched from the ENA API - can be overriden by options @@ -193,10 +191,7 @@ def is_valid(cls, identifier): class DatabaseResolver: """Define a service class for resolving various identifiers to experiments.""" - _GEO_PREFIXES = { - "GSE", - "GSM" - } + _GEO_PREFIXES = {"GSE", "GSM"} _SRA_PREFIXES = { "PRJNA", "SAMN", @@ -207,11 +202,7 @@ class DatabaseResolver: "PRJDB", "SAMD", } - _ENA_PREFIXES = { - "ERR", - "SRR", - "DRR" - } + _ENA_PREFIXES = {"ERR", "SRR", "DRR"} @classmethod def expand_identifier(cls, identifier): @@ -240,24 +231,14 @@ def expand_identifier(cls, identifier): def _content_check(cls, response, identifier): """Check that the response has content or terminate.""" if response.status == 204: - logger.error( - f"There is no content for id {identifier}. Maybe you lack the right " - f"permissions?" - ) + logger.error(f"There is no content for id {identifier}. Maybe you lack the right " f"permissions?") sys.exit(1) @classmethod def _id_to_srx(cls, identifier): """Resolve the identifier to SRA experiments.""" - params = { - "id": identifier, - "db": "sra", - "rettype": "runinfo", - "retmode": "text" - } - response = fetch_url( - f"https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?{urlencode(params)}" - ) + params = {"id": identifier, "db": "sra", "rettype": "runinfo", "retmode": "text"} + response = fetch_url(f"https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?{urlencode(params)}") cls._content_check(response, identifier) return [row["Experiment"] for row in open_table(response, delimiter=",")] @@ -265,20 +246,13 @@ def _id_to_srx(cls, identifier): def _gse_to_srx(cls, identifier): """Resolve the identifier to SRA experiments.""" ids = [] - params = { - "id": identifier, - "db": "gds", - "rettype": "runinfo", - "retmode": "text" - } - response = fetch_url( - f"https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?{urlencode(params)}" - ) + params = {"id": identifier, "db": "gds", "rettype": "runinfo", "retmode": "text"} + response = fetch_url(f"https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?{urlencode(params)}") cls._content_check(response, identifier) gsm_ids = [ line.split("=")[1].strip() for line in response.text().splitlines() - if line.split('=')[1].strip().startswith('GSM') + if line.split("=")[1].strip().startswith("GSM") ] for gsm_id in gsm_ids: ids += cls._id_to_srx(gsm_id) @@ -293,13 +267,9 @@ def _id_to_erx(cls, identifier): "result": "read_run", "fields": ",".join(fields), } - response = fetch_url( - f"https://www.ebi.ac.uk/ena/portal/api/filereport?{urlencode(params)}" - ) + response = fetch_url(f"https://www.ebi.ac.uk/ena/portal/api/filereport?{urlencode(params)}") cls._content_check(response, identifier) - return [ - row["experiment_accession"] for row in open_table(response, delimiter="\t") - ] + return [row["experiment_accession"] for row in open_table(response, delimiter="\t")] class ENAMetadataFetcher: @@ -328,9 +298,7 @@ def open_experiment_table(self, accession): """ params = {**self._params, "accession": accession} - response = fetch_url( - f"https://www.ebi.ac.uk/ena/portal/api/filereport?{urlencode(params)}" - ) + response = fetch_url(f"https://www.ebi.ac.uk/ena/portal/api/filereport?{urlencode(params)}") self._content_check(response, accession) return open_table(response, delimiter="\t") @@ -338,10 +306,7 @@ def open_experiment_table(self, accession): def _content_check(cls, response, identifier): """Check that the response has content or terminate.""" if response.status == 204: - logger.error( - f"There is no content for id {identifier}. Maybe you lack the right " - f"permissions?" - ) + logger.error(f"There is no content for id {identifier}. Maybe you lack the right " f"permissions?") sys.exit(1) @@ -362,8 +327,7 @@ def open_table(response, delimiter=","): def parse_args(args=None): parser = argparse.ArgumentParser( - description="Download and create a run information metadata file from SRA / " - "ENA / DDBJ / GEO identifiers.", + description="Download and create a run information metadata file from SRA / " "ENA / DDBJ / GEO identifiers.", epilog="Example usage: python fetch_sra_runinfo.py ", ) parser.add_argument( @@ -383,8 +347,7 @@ def parse_args(args=None): "--ena_metadata_fields", type=str, default=",".join(ENA_METADATA_FIELDS), - help=f"Comma-separated list of ENA metadata fields to fetch " - f"(default: {','.join(ENA_METADATA_FIELDS)}).", + help=f"Comma-separated list of ENA metadata fields to fetch " f"(default: {','.join(ENA_METADATA_FIELDS)}).", ) parser.add_argument( "-l", @@ -431,9 +394,7 @@ def get_ena_fields(): return [ row["columnId"] for row in open_table( - fetch_url( - f"https://www.ebi.ac.uk/ena/portal/api/returnFields?{urlencode(params)}" - ), + fetch_url(f"https://www.ebi.ac.uk/ena/portal/api/returnFields?{urlencode(params)}"), delimiter="\t", ) ] @@ -453,16 +414,11 @@ def fetch_sra_runinfo(file_in, file_out, ena_metadata_fields): seen_ids.add(db_id) if not DatabaseIdentifierChecker.is_valid(db_id): id_str = ", ".join([x + "*" for x in PREFIX_LIST]) - logger.error( - f"Please provide a valid database id starting with {id_str}!\n" - f"Line: '{line.strip()}'" - ) + logger.error(f"Please provide a valid database id starting with {id_str}!\n" f"Line: '{line.strip()}'") sys.exit(1) ids = DatabaseResolver.expand_identifier(db_id) if not ids: - logger.error( - f"No matches found for database id {db_id}!\nLine: '{line.strip()}'" - ) + logger.error(f"No matches found for database id {db_id}!\nLine: '{line.strip()}'") sys.exit(1) for accession in ids: for row in ena_fetcher.open_experiment_table(accession): diff --git a/bin/sra_runinfo_to_ftp.py b/bin/sra_runinfo_to_ftp.py index d9400b2f..ef80ec80 100755 --- a/bin/sra_runinfo_to_ftp.py +++ b/bin/sra_runinfo_to_ftp.py @@ -62,10 +62,7 @@ def parse_sra_runinfo(file_in): reader = csv.DictReader(fin, delimiter="\t", skipinitialspace=True) header = list(reader.fieldnames) if missing := frozenset(columns).difference(frozenset(header)): - logger.critical( - f"The following expected columns are missing from {file_in}: " - f"{', '.join(missing)}." - ) + logger.critical(f"The following expected columns are missing from {file_in}: " f"{', '.join(missing)}.") sys.exit(1) for row in reader: db_id = row["experiment_accession"] @@ -73,14 +70,9 @@ def parse_sra_runinfo(file_in): fq_files = row["fastq_ftp"].split(";")[-2:] fq_md5 = row["fastq_md5"].split(";")[-2:] if len(fq_files) == 1: - assert fq_files[0].endswith( - ".fastq.gz" - ), f"Unexpected FastQ file format {file_in.name}." + assert fq_files[0].endswith(".fastq.gz"), f"Unexpected FastQ file format {file_in.name}." if row["library_layout"] != "SINGLE": - logger.warning( - f"The library layout '{row['library_layout']}' should be " - f"'SINGLE'." - ) + logger.warning(f"The library layout '{row['library_layout']}' should be " f"'SINGLE'.") sample = { "fastq_1": fq_files[0], "fastq_2": None, @@ -89,17 +81,10 @@ def parse_sra_runinfo(file_in): "single_end": "true", } elif len(fq_files) == 2: - assert fq_files[0].endswith( - "_1.fastq.gz" - ), f"Unexpected FastQ file format {file_in.name}." - assert fq_files[1].endswith( - "_2.fastq.gz" - ), f"Unexpected FastQ file format {file_in.name}." + assert fq_files[0].endswith("_1.fastq.gz"), f"Unexpected FastQ file format {file_in.name}." + assert fq_files[1].endswith("_2.fastq.gz"), f"Unexpected FastQ file format {file_in.name}." if row["library_layout"] != "PAIRED": - logger.warning( - f"The library layout '{row['library_layout']}' should be " - f"'PAIRED'." - ) + logger.warning(f"The library layout '{row['library_layout']}' should be " f"'PAIRED'.") sample = { "fastq_1": fq_files[0], "fastq_2": fq_files[1], @@ -124,8 +109,7 @@ def parse_sra_runinfo(file_in): else: if sample in runinfo[db_id]: logger.error( - f"Input run info file contains duplicate rows!\n" - f"{', '.join([row[col] for col in header])}" + f"Input run info file contains duplicate rows!\n" f"{', '.join([row[col] for col in header])}" ) else: runinfo[db_id].append(sample) @@ -146,9 +130,7 @@ def sra_runinfo_to_ftp(files_in, file_out): logger.warning(f"Duplicate sample identifier found!\nID: '{db_id}'") # Create a combined header from all input files. - combined_header = header[0] + list( - set().union(chain.from_iterable(header)).difference(header[0]) - ) + combined_header = header[0] + list(set().union(chain.from_iterable(header)).difference(header[0])) combined_header.insert(0, "id") # Write samplesheet with paths to FastQ files and md5 sums. @@ -159,7 +141,7 @@ def sra_runinfo_to_ftp(files_in, file_out): for db_id in sorted(samplesheet): for idx, row in enumerate(samplesheet[db_id], start=1): row["id"] = f"{db_id}" - if 'run_accession' in row: + if "run_accession" in row: row["id"] = f"{db_id}_{row['run_accession']}" writer.writerow(row) From d67b3ef6eaf437c7a22da800fcb0d26f19d0a9a7 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 4 Nov 2022 10:19:08 +0000 Subject: [PATCH 228/852] Update regex for --input file extension --- nextflow_schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 4d02b3c5..435079b3 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -16,7 +16,7 @@ "type": "string", "format": "file-path", "mimetype": "text/csv", - "pattern": "^\\S+\\.csv$", + "pattern": "^\\S+\\.(csv|tsv|txt)$", "schema": "assets/schema_input.json", "fa_icon": "fas fa-file-excel", "description": "File containing SRA/ENA/DDBJ identifiers one per line to download their associated metadata and FastQ files." From 4747774e31434ac9688e668730f3517bab30d675 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 4 Nov 2022 10:59:03 +0000 Subject: [PATCH 229/852] Enable conda explicilty in profiles block --- nextflow.config | 1 + 1 file changed, 1 insertion(+) diff --git a/nextflow.config b/nextflow.config index 3f07ba06..f8f97ca3 100644 --- a/nextflow.config +++ b/nextflow.config @@ -72,6 +72,7 @@ profiles { debug { process.beforeScript = 'echo $HOSTNAME' } conda { params.enable_conda = true + conda.enabled = true docker.enabled = false singularity.enabled = false podman.enabled = false From 12e8b857b29bfeb37ff7d3841762190166832ef9 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 7 Nov 2022 11:48:22 +0000 Subject: [PATCH 230/852] Fix #114 --- CHANGELOG.md | 5 +- modules/local/sra_to_samplesheet.nf | 26 ++++----- workflows/sra.nf | 86 ++++++++++++++++++----------- 3 files changed, 71 insertions(+), 46 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 993bc934..679644f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Enhancements & fixes +- [#111](https://github.com/nf-core/fetchngs/issues/111) - Change input mimetype to csv +- [#114](https://github.com/nf-core/fetchngs/issues/114) - Final samplesheet is not created when `--skip_fastq_download` is provided +- [#118](https://github.com/nf-core/fetchngs/issues/118) - Allow input pattern validation for csv/tsv/txt +- [#121](https://github.com/nf-core/fetchngs/issues/121) - Add `tower.yml` to render samplesheet as Report in Tower - Fetch `SRR` and `DRR` metadata from ENA API instead of NCBI API to bypass frequent breaking changes - Updated pipeline template to [nf-core/tools 2.6](https://github.com/nf-core/tools/releases/tag/2.6) @@ -26,7 +30,6 @@ This downloads a text file called `SRR_Acc_List.txt` that can be directly provid ### Enhancements & fixes -- [#121](https://github.com/nf-core/fetchngs/pull/123) - Add `tower.yml` to render Reports in Tower - [#97](https://github.com/nf-core/fetchngs/pull/97) - Add support for generating nf-core/taxprofiler compatible samplesheets. - [#99](https://github.com/nf-core/fetchngs/issues/99) - SRA_IDS_TO_RUNINFO fails due to bad request - Add `enum` field for `--nf_core_pipeline` to parameter schema so only accept supported pipelines are accepted diff --git a/modules/local/sra_to_samplesheet.nf b/modules/local/sra_to_samplesheet.nf index 4b448e89..6dce588b 100644 --- a/modules/local/sra_to_samplesheet.nf +++ b/modules/local/sra_to_samplesheet.nf @@ -6,9 +6,9 @@ process SRA_TO_SAMPLESHEET { memory 100.MB input: - tuple val(meta), path(fastq) - val pipeline - val mapping_fields + val meta + val pipeline + val mapping_fields output: tuple val(meta), path("*samplesheet.csv"), emit: samplesheet @@ -20,19 +20,19 @@ process SRA_TO_SAMPLESHEET { // // Remove custom keys needed to download the data - def meta_map = meta.clone() - meta_map.remove("id") - meta_map.remove("fastq_1") - meta_map.remove("fastq_2") - meta_map.remove("md5_1") - meta_map.remove("md5_2") - meta_map.remove("single_end") + def meta_clone = meta.clone() + meta_clone.remove("id") + meta_clone.remove("fastq_1") + meta_clone.remove("fastq_2") + meta_clone.remove("md5_1") + meta_clone.remove("md5_2") + meta_clone.remove("single_end") // Add relevant fields to the beginning of the map pipeline_map = [ sample : "${meta.id.split('_')[0..-2].join('_')}", - fastq_1 : "${params.outdir}/fastq/${fastq[0]}", - fastq_2 : meta.single_end ? '' : "${params.outdir}/fastq/${fastq[1]}" + fastq_1 : meta.fastq_1, + fastq_2 : meta.fastq_2 ] // Add nf-core pipeline specific entries @@ -43,7 +43,7 @@ process SRA_TO_SAMPLESHEET { pipeline_map << [ fasta: '' ] } } - pipeline_map << meta_map + pipeline_map << meta_clone // Create a samplesheet samplesheet = pipeline_map.keySet().collect{ '"' + it + '"'}.join(",") + '\n' diff --git a/workflows/sra.nf b/workflows/sra.nf index ef654b2d..ebb15602 100644 --- a/workflows/sra.nf +++ b/workflows/sra.nf @@ -80,19 +80,27 @@ workflow SRA { .splitCsv(header:true, sep:'\t') .map { meta -> - meta.single_end = meta.single_end.toBoolean() - [ meta, [ meta.fastq_1, meta.fastq_2 ] ] + def meta_clone = meta.clone() + meta_clone.single_end = meta_clone.single_end.toBoolean() + return meta_clone } .unique() - .branch { - ftp: it[0].fastq_1 && !params.force_sratools_download - sra: !it[0].fastq_1 || params.force_sratools_download - } - .set { ch_sra_reads } + .set { ch_sra_metadata } ch_versions = ch_versions.mix(SRA_RUNINFO_TO_FTP.out.versions.first()) if (!params.skip_fastq_download) { + ch_sra_metadata + .map { + meta -> + [ meta, [ meta.fastq_1, meta.fastq_2 ] ] + } + .branch { + ftp: it[0].fastq_1 && !params.force_sratools_download + sra: !it[0].fastq_1 || params.force_sratools_download + } + .set { ch_sra_reads } + // // MODULE: If FTP link is provided in run information then download FastQ directly via FTP and validate with md5sums // @@ -109,33 +117,47 @@ workflow SRA { ) ch_versions = ch_versions.mix(SRAFASTQ.out.versions.first()) - // - // MODULE: Stage FastQ files downloaded by SRA together and auto-create a samplesheet - // - SRA_TO_SAMPLESHEET ( - SRA_FASTQ_FTP.out.fastq.mix(SRAFASTQ.out.reads), - params.nf_core_pipeline ?: '', - params.sample_mapping_fields - ) + SRA_FASTQ_FTP + .out + .fastq + .mix(SRAFASTQ.out.reads) + .map { + meta, fastq -> + def reads = meta.single_end ? [ fastq ] : fastq + def meta_clone = meta.clone() + meta_clone.fastq_1 = reads[0] ? "${params.outdir}/fastq/${reads[0].getName()}" : '' + meta_clone.fastq_2 = reads[1] && !meta.single_end ? "${params.outdir}/fastq/${reads[1].getName()}" : '' + return meta_clone + } + .set { ch_sra_metadata } + } - // - // MODULE: Create a merged samplesheet across all samples for the pipeline - // - SRA_MERGE_SAMPLESHEET ( - SRA_TO_SAMPLESHEET.out.samplesheet.collect{it[1]}, - SRA_TO_SAMPLESHEET.out.mappings.collect{it[1]} - ) - ch_versions = ch_versions.mix(SRA_MERGE_SAMPLESHEET.out.versions) + // + // MODULE: Stage FastQ files downloaded by SRA together and auto-create a samplesheet + // + SRA_TO_SAMPLESHEET ( + ch_sra_metadata, + params.nf_core_pipeline ?: '', + params.sample_mapping_fields + ) - // - // MODULE: Create a MutiQC config file with sample name mappings - // - if (params.sample_mapping_fields) { - MULTIQC_MAPPINGS_CONFIG ( - SRA_MERGE_SAMPLESHEET.out.mappings - ) - ch_versions = ch_versions.mix(MULTIQC_MAPPINGS_CONFIG.out.versions) - } + // + // MODULE: Create a merged samplesheet across all samples for the pipeline + // + SRA_MERGE_SAMPLESHEET ( + SRA_TO_SAMPLESHEET.out.samplesheet.collect{it[1]}, + SRA_TO_SAMPLESHEET.out.mappings.collect{it[1]} + ) + ch_versions = ch_versions.mix(SRA_MERGE_SAMPLESHEET.out.versions) + + // + // MODULE: Create a MutiQC config file with sample name mappings + // + if (params.sample_mapping_fields) { + MULTIQC_MAPPINGS_CONFIG ( + SRA_MERGE_SAMPLESHEET.out.mappings + ) + ch_versions = ch_versions.mix(MULTIQC_MAPPINGS_CONFIG.out.versions) } // From 317262243aa5e120441ec05dadac0636cf8c86bc Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 7 Nov 2022 19:30:29 +0000 Subject: [PATCH 231/852] Fix #119 --- CHANGELOG.md | 3 ++- conf/modules.config | 13 +++---------- modules/nf-core/sratools/fasterqdump/main.nf | 16 ++++++++++------ .../main.nf | 2 +- .../meta.yml | 3 ++- workflows/sra.nf | 10 +++++----- 6 files changed, 23 insertions(+), 24 deletions(-) rename subworkflows/nf-core/{srafastq => fastq_download_prefetch_fasterqdump_sratools}/main.nf (96%) rename subworkflows/nf-core/{srafastq => fastq_download_prefetch_fasterqdump_sratools}/meta.yml (93%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 679644f1..e12fa79a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,13 +3,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [[1.8](https://github.com/nf-core/fetchngs/releases/tag/1.8)] - 2022-11-07 +## [[1.8](https://github.com/nf-core/fetchngs/releases/tag/1.8)] - 2022-11-08 ### Enhancements & fixes - [#111](https://github.com/nf-core/fetchngs/issues/111) - Change input mimetype to csv - [#114](https://github.com/nf-core/fetchngs/issues/114) - Final samplesheet is not created when `--skip_fastq_download` is provided - [#118](https://github.com/nf-core/fetchngs/issues/118) - Allow input pattern validation for csv/tsv/txt +- [#119](https://github.com/nf-core/fetchngs/issues/119) - `--force_sratools_download` results in different fastq names compared to FTP download - [#121](https://github.com/nf-core/fetchngs/issues/121) - Add `tower.yml` to render samplesheet as Report in Tower - Fetch `SRR` and `DRR` metadata from ENA API instead of NCBI API to bypass frequent breaking changes - Updated pipeline template to [nf-core/tools 2.6](https://github.com/nf-core/tools/releases/tag/2.6) diff --git a/conf/modules.config b/conf/modules.config index 82a5f75c..c42f4d60 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -78,16 +78,9 @@ if (params.input_type == 'sra') { withName: SRATOOLS_FASTERQDUMP { publishDir = [ - [ - path: { "${params.outdir}/fastq" }, - mode: params.publish_dir_mode, - pattern: "*.fastq.gz" - ], - [ - path: { "${params.outdir}/fastq/md5" }, - mode: params.publish_dir_mode, - pattern: "*.md5" - ] + path: { "${params.outdir}/fastq" }, + mode: params.publish_dir_mode, + pattern: "*.fastq.gz" ] } diff --git a/modules/nf-core/sratools/fasterqdump/main.nf b/modules/nf-core/sratools/fasterqdump/main.nf index 18f46e51..16454a54 100644 --- a/modules/nf-core/sratools/fasterqdump/main.nf +++ b/modules/nf-core/sratools/fasterqdump/main.nf @@ -12,8 +12,8 @@ process SRATOOLS_FASTERQDUMP { path ncbi_settings output: - tuple val(meta), path(output), emit: reads - path "versions.yml" , emit: versions + tuple val(meta), path(fastq), emit: reads + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -21,16 +21,20 @@ process SRATOOLS_FASTERQDUMP { script: def args = task.ext.args ?: '' def args2 = task.ext.args2 ?: '' - // Paired-end data extracted by fasterq-dump (--split-3 the default) always creates - // *_1.fastq *_2.fastq files but sometimes also an additional *.fastq file - // for unpaired reads which we ignore here. - output = meta.single_end ? '*.fastq.gz' : '*_{1,2}.fastq.gz' + def prefix = task.ext.prefix ?: "${meta.id}" + + // WARNING: Paired-end data extracted by fasterq-dump (--split-3 the default) + // always creates *_1.fastq *_2.fastq files but sometimes also + // an additional *.fastq file for unpaired reads which we ignore here. + fastq = meta.single_end ? '*.fastq.gz' : '*_{1,2}.fastq.gz' + def outfile = meta.single_end ? "${prefix}.fastq" : prefix """ export NCBI_SETTINGS="\$PWD/${ncbi_settings}" fasterq-dump \\ $args \\ --threads $task.cpus \\ + --outfile $outfile \\ ${sra.name} pigz \\ diff --git a/subworkflows/nf-core/srafastq/main.nf b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/main.nf similarity index 96% rename from subworkflows/nf-core/srafastq/main.nf rename to subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/main.nf index 580fef18..cacde6f5 100644 --- a/subworkflows/nf-core/srafastq/main.nf +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/main.nf @@ -5,7 +5,7 @@ include { SRATOOLS_FASTERQDUMP } from '../../../modules/nf-core/sratools/ /** * Download FASTQ sequencing reads from the NCBI's Sequence Read Archive (SRA). */ -workflow SRAFASTQ { +workflow FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS { take: sra_ids // channel: [ val(meta), val(id) ] diff --git a/subworkflows/nf-core/srafastq/meta.yml b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/meta.yml similarity index 93% rename from subworkflows/nf-core/srafastq/meta.yml rename to subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/meta.yml index 873ccaca..f032628b 100644 --- a/subworkflows/nf-core/srafastq/meta.yml +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/meta.yml @@ -1,4 +1,4 @@ -name: sra_fastq +name: fastq_download_prefetch_fasterqdump_sratools description: Download FASTQ sequencing reads from the NCBI's Sequence Read Archive (SRA). keywords: - SRA @@ -38,3 +38,4 @@ output: pattern: "versions.yml" authors: - "@Midnighter" + - "@drpatelh" diff --git a/workflows/sra.nf b/workflows/sra.nf index ebb15602..9f38e7f8 100644 --- a/workflows/sra.nf +++ b/workflows/sra.nf @@ -26,8 +26,6 @@ include { SRA_TO_SAMPLESHEET } from '../modules/local/sra_to_samplesheet' include { SRA_MERGE_SAMPLESHEET } from '../modules/local/sra_merge_samplesheet' include { MULTIQC_MAPPINGS_CONFIG } from '../modules/local/multiqc_mappings_config' -include { SRAFASTQ } from '../subworkflows/nf-core/srafastq/main' - /* ======================================================================================== IMPORT NF-CORE MODULES/SUBWORKFLOWS @@ -36,6 +34,8 @@ include { SRAFASTQ } from '../subworkflows/nf-core/srafastq/main' include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/custom/dumpsoftwareversions/main' +include { FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS } from '../subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/main' + /* ======================================================================================== RUN MAIN WORKFLOW @@ -112,15 +112,15 @@ workflow SRA { // // SUBWORKFLOW: Download sequencing reads without FTP links using sra-tools. // - SRAFASTQ ( + FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS ( ch_sra_reads.sra.map { meta, reads -> [ meta, meta.run_accession ] } ) - ch_versions = ch_versions.mix(SRAFASTQ.out.versions.first()) + ch_versions = ch_versions.mix(FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS.out.versions.first()) SRA_FASTQ_FTP .out .fastq - .mix(SRAFASTQ.out.reads) + .mix(FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS.out.reads) .map { meta, fastq -> def reads = meta.single_end ? [ fastq ] : fastq From 0ff28b46c324397ab3013ca41053310b626535ff Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 7 Nov 2022 19:31:02 +0000 Subject: [PATCH 232/852] Bump pipeline version to 1.8 --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index f8f97ca3..633a0fb2 100644 --- a/nextflow.config +++ b/nextflow.config @@ -174,7 +174,7 @@ manifest { description = 'Pipeline to fetch metadata and raw FastQ files from public databases' mainScript = 'main.nf' nextflowVersion = '!>=21.10.3' - version = '1.8dev' + version = '1.8' doi = 'https://doi.org/10.5281/zenodo.5070524' } From 53858ba59dee0bc79ff146aa1382d2b2e5433e24 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 7 Nov 2022 21:20:11 +0000 Subject: [PATCH 233/852] Re-install subworkflow from nf-core/modules --- modules.json | 8 ++++++++ .../main.nf | 16 ++++++++-------- .../meta.yml | 2 +- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/modules.json b/modules.json index c687eccd..fc957282 100644 --- a/modules.json +++ b/modules.json @@ -22,6 +22,14 @@ "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" } } + }, + "subworkflows": { + "nf-core": { + "fastq_download_prefetch_fasterqdump_sratools": { + "branch": "master", + "git_sha": "03711bcb7fa2a7088eb54abb1fca326d30e602c2" + } + } } } } diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/main.nf b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/main.nf index cacde6f5..1e1d0d7b 100644 --- a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/main.nf +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/main.nf @@ -2,12 +2,12 @@ include { CUSTOM_SRATOOLSNCBISETTINGS } from '../../../modules/nf-core/custom/sr include { SRATOOLS_PREFETCH } from '../../../modules/nf-core/sratools/prefetch/main' include { SRATOOLS_FASTERQDUMP } from '../../../modules/nf-core/sratools/fasterqdump/main' -/** - * Download FASTQ sequencing reads from the NCBI's Sequence Read Archive (SRA). - */ +// +// Download FASTQ sequencing reads from the NCBI's Sequence Read Archive (SRA). +// workflow FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS { take: - sra_ids // channel: [ val(meta), val(id) ] + ch_sra_ids // channel: [ val(meta), val(id) ] main: @@ -18,19 +18,19 @@ workflow FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS { // CUSTOM_SRATOOLSNCBISETTINGS() def settings = CUSTOM_SRATOOLSNCBISETTINGS.out.ncbi_settings // value channel: path(settings) - ch_versions = ch_versions.mix( CUSTOM_SRATOOLSNCBISETTINGS.out.versions ) + ch_versions = ch_versions.mix(CUSTOM_SRATOOLSNCBISETTINGS.out.versions) // // Prefetch sequencing reads in SRA format. // - SRATOOLS_PREFETCH ( sra_ids, settings ) - ch_versions = ch_versions.mix( SRATOOLS_PREFETCH.out.versions.first() ) + SRATOOLS_PREFETCH ( ch_sra_ids, settings ) + ch_versions = ch_versions.mix(SRATOOLS_PREFETCH.out.versions.first()) // // Convert the SRA format into one or more compressed FASTQ files. // SRATOOLS_FASTERQDUMP ( SRATOOLS_PREFETCH.out.sra, settings ) - ch_versions = ch_versions.mix( SRATOOLS_FASTERQDUMP.out.versions.first() ) + ch_versions = ch_versions.mix(SRATOOLS_FASTERQDUMP.out.versions.first()) emit: reads = SRATOOLS_FASTERQDUMP.out.reads // channel: [ val(meta), [ reads ] ] diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/meta.yml b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/meta.yml index f032628b..c385ca21 100644 --- a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/meta.yml +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/meta.yml @@ -4,7 +4,7 @@ keywords: - SRA - NCBI - sequencing - - FASTQ + - fastq - prefetch - fasterq-dump modules: From c791a37cd0fed39703394e652eb3a5c602654a7d Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 7 Nov 2022 21:24:53 +0000 Subject: [PATCH 234/852] Update sratools/fasterqdump manually --- CHANGELOG.md | 2 +- modules.json | 2 +- modules/nf-core/sratools/fasterqdump/main.nf | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e12fa79a..b57bfefc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#111](https://github.com/nf-core/fetchngs/issues/111) - Change input mimetype to csv - [#114](https://github.com/nf-core/fetchngs/issues/114) - Final samplesheet is not created when `--skip_fastq_download` is provided - [#118](https://github.com/nf-core/fetchngs/issues/118) - Allow input pattern validation for csv/tsv/txt -- [#119](https://github.com/nf-core/fetchngs/issues/119) - `--force_sratools_download` results in different fastq names compared to FTP download +- [#119](https://github.com/nf-core/fetchngs/issues/119) - `--force_sratools_download` results in different fastq names compared to FTP download - [#121](https://github.com/nf-core/fetchngs/issues/121) - Add `tower.yml` to render samplesheet as Report in Tower - Fetch `SRR` and `DRR` metadata from ENA API instead of NCBI API to bypass frequent breaking changes - Updated pipeline template to [nf-core/tools 2.6](https://github.com/nf-core/tools/releases/tag/2.6) diff --git a/modules.json b/modules.json index fc957282..512b3fea 100644 --- a/modules.json +++ b/modules.json @@ -15,7 +15,7 @@ }, "sratools/fasterqdump": { "branch": "master", - "git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905" + "git_sha": "03711bcb7fa2a7088eb54abb1fca326d30e602c2" }, "sratools/prefetch": { "branch": "master", diff --git a/modules/nf-core/sratools/fasterqdump/main.nf b/modules/nf-core/sratools/fasterqdump/main.nf index 16454a54..1ffb21f0 100644 --- a/modules/nf-core/sratools/fasterqdump/main.nf +++ b/modules/nf-core/sratools/fasterqdump/main.nf @@ -23,9 +23,9 @@ process SRATOOLS_FASTERQDUMP { def args2 = task.ext.args2 ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - // WARNING: Paired-end data extracted by fasterq-dump (--split-3 the default) - // always creates *_1.fastq *_2.fastq files but sometimes also - // an additional *.fastq file for unpaired reads which we ignore here. + // WARNING: Paired-end data extracted by fasterq-dump (--split-3 the default) + // always creates *_1.fastq *_2.fastq files but sometimes also + // an additional *.fastq file for unpaired reads which we ignore here. fastq = meta.single_end ? '*.fastq.gz' : '*_{1,2}.fastq.gz' def outfile = meta.single_end ? "${prefix}.fastq" : prefix """ From fa869e98f7c6fdc38fabc96ac52bac30904c0b3a Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 8 Nov 2022 09:51:22 +0000 Subject: [PATCH 235/852] Bump pipeline version to 1.9dev --- CHANGELOG.md | 4 ++++ nextflow.config | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b57bfefc..5fd50bd1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unpublished Version / DEV] + +### Enhancements & fixes + ## [[1.8](https://github.com/nf-core/fetchngs/releases/tag/1.8)] - 2022-11-08 ### Enhancements & fixes diff --git a/nextflow.config b/nextflow.config index 633a0fb2..94cc7de4 100644 --- a/nextflow.config +++ b/nextflow.config @@ -174,7 +174,7 @@ manifest { description = 'Pipeline to fetch metadata and raw FastQ files from public databases' mainScript = 'main.nf' nextflowVersion = '!>=21.10.3' - version = '1.8' + version = '1.9dev' doi = 'https://doi.org/10.5281/zenodo.5070524' } From afd22a4581d52f513db355e4f61b5e1e918e0721 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 20 Dec 2022 17:58:18 +0000 Subject: [PATCH 236/852] Update all modules and subworkflows --- modules.json | 10 ++++++---- modules/local/multiqc_mappings_config.nf | 2 +- modules/local/sra_fastq_ftp.nf | 2 +- modules/local/sra_ids_to_runinfo.nf | 2 +- modules/local/sra_merge_samplesheet.nf | 2 +- modules/local/sra_runinfo_to_ftp.nf | 2 +- modules/local/synapse_get.nf | 2 +- modules/local/synapse_list.nf | 2 +- modules/local/synapse_merge_samplesheet.nf | 2 +- modules/local/synapse_show.nf | 2 +- .../templates/dumpsoftwareversions.py | 3 +-- modules/nf-core/custom/sratoolsncbisettings/main.nf | 2 +- modules/nf-core/sratools/fasterqdump/main.nf | 2 +- modules/nf-core/sratools/prefetch/main.nf | 2 +- 14 files changed, 19 insertions(+), 18 deletions(-) diff --git a/modules.json b/modules.json index e125fc48..c8cd187a 100644 --- a/modules.json +++ b/modules.json @@ -13,16 +13,17 @@ "custom/sratoolsncbisettings": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] }, "sratools/fasterqdump": { "branch": "master", - "git_sha": "03711bcb7fa2a7088eb54abb1fca326d30e602c2" + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] }, "sratools/prefetch": { "branch": "master", "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] } } }, @@ -30,7 +31,8 @@ "nf-core": { "fastq_download_prefetch_fasterqdump_sratools": { "branch": "master", - "git_sha": "03711bcb7fa2a7088eb54abb1fca326d30e602c2" + "git_sha": "03711bcb7fa2a7088eb54abb1fca326d30e602c2", + "installed_by": ["subworkflows"] } } } diff --git a/modules/local/multiqc_mappings_config.nf b/modules/local/multiqc_mappings_config.nf index 31f06dae..4f6c95bd 100644 --- a/modules/local/multiqc_mappings_config.nf +++ b/modules/local/multiqc_mappings_config.nf @@ -1,7 +1,7 @@ process MULTIQC_MAPPINGS_CONFIG { - conda (params.enable_conda ? "conda-forge::python=3.9.5" : null) + conda "conda-forge::python=3.9.5" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/python:3.9--1' : 'quay.io/biocontainers/python:3.9--1' }" diff --git a/modules/local/sra_fastq_ftp.nf b/modules/local/sra_fastq_ftp.nf index 5e4f6a05..464a327e 100644 --- a/modules/local/sra_fastq_ftp.nf +++ b/modules/local/sra_fastq_ftp.nf @@ -4,7 +4,7 @@ process SRA_FASTQ_FTP { label 'process_low' label 'error_retry' - conda (params.enable_conda ? 'bioconda::sra-tools=2.11.0' : null) + conda "bioconda::sra-tools=2.11.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/sra-tools:2.11.0--pl5321ha49a11a_3' : 'quay.io/biocontainers/sra-tools:2.11.0--pl5321ha49a11a_3' }" diff --git a/modules/local/sra_ids_to_runinfo.nf b/modules/local/sra_ids_to_runinfo.nf index 57fdb10e..49c83554 100644 --- a/modules/local/sra_ids_to_runinfo.nf +++ b/modules/local/sra_ids_to_runinfo.nf @@ -3,7 +3,7 @@ process SRA_IDS_TO_RUNINFO { tag "$id" label 'error_retry' - conda (params.enable_conda ? "conda-forge::python=3.9.5" : null) + conda "conda-forge::python=3.9.5" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/python:3.9--1' : 'quay.io/biocontainers/python:3.9--1' }" diff --git a/modules/local/sra_merge_samplesheet.nf b/modules/local/sra_merge_samplesheet.nf index ca9c0068..4b94a823 100644 --- a/modules/local/sra_merge_samplesheet.nf +++ b/modules/local/sra_merge_samplesheet.nf @@ -1,6 +1,6 @@ process SRA_MERGE_SAMPLESHEET { - conda (params.enable_conda ? "conda-forge::sed=4.7" : null) + conda "conda-forge::sed=4.7" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/ubuntu:20.04' : 'ubuntu:20.04' }" diff --git a/modules/local/sra_runinfo_to_ftp.nf b/modules/local/sra_runinfo_to_ftp.nf index 13fa6c3e..3a060f7b 100644 --- a/modules/local/sra_runinfo_to_ftp.nf +++ b/modules/local/sra_runinfo_to_ftp.nf @@ -1,7 +1,7 @@ process SRA_RUNINFO_TO_FTP { - conda (params.enable_conda ? "conda-forge::python=3.9.5" : null) + conda "conda-forge::python=3.9.5" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/python:3.9--1' : 'quay.io/biocontainers/python:3.9--1' }" diff --git a/modules/local/synapse_get.nf b/modules/local/synapse_get.nf index b494bafd..f43e4d5e 100644 --- a/modules/local/synapse_get.nf +++ b/modules/local/synapse_get.nf @@ -4,7 +4,7 @@ process SYNAPSE_GET { label 'process_low' label 'error_retry' - conda (params.enable_conda ? "bioconda::synapseclient=2.6.0" : null) + conda "bioconda::synapseclient=2.6.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/synapseclient:2.6.0--pyh5e36f6f_0' : 'quay.io/biocontainers/synapseclient:2.6.0--pyh5e36f6f_0' }" diff --git a/modules/local/synapse_list.nf b/modules/local/synapse_list.nf index c3861bff..f42357ab 100644 --- a/modules/local/synapse_list.nf +++ b/modules/local/synapse_list.nf @@ -3,7 +3,7 @@ process SYNAPSE_LIST { tag "$id" label 'process_low' - conda (params.enable_conda ? "bioconda::synapseclient=2.6.0" : null) + conda "bioconda::synapseclient=2.6.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/synapseclient:2.6.0--pyh5e36f6f_0' : 'quay.io/biocontainers/synapseclient:2.6.0--pyh5e36f6f_0' }" diff --git a/modules/local/synapse_merge_samplesheet.nf b/modules/local/synapse_merge_samplesheet.nf index 68bfd68b..f46a1fbf 100644 --- a/modules/local/synapse_merge_samplesheet.nf +++ b/modules/local/synapse_merge_samplesheet.nf @@ -1,7 +1,7 @@ process SYNAPSE_MERGE_SAMPLESHEET { - conda (params.enable_conda ? "conda-forge::sed=4.7" : null) + conda "conda-forge::sed=4.7" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/ubuntu:20.04' : 'ubuntu:20.04' }" diff --git a/modules/local/synapse_show.nf b/modules/local/synapse_show.nf index a7a12767..0bd6cc12 100644 --- a/modules/local/synapse_show.nf +++ b/modules/local/synapse_show.nf @@ -3,7 +3,7 @@ process SYNAPSE_SHOW { tag "$id" label 'process_low' - conda (params.enable_conda ? "bioconda::synapseclient=2.6.0" : null) + conda "bioconda::synapseclient=2.6.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/synapseclient:2.6.0--pyh5e36f6f_0' : 'quay.io/biocontainers/synapseclient:2.6.0--pyh5e36f6f_0' }" diff --git a/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py index e55b8d43..da033408 100755 --- a/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py +++ b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py @@ -4,11 +4,10 @@ """Provide functions to merge multiple versions.yml files.""" +import yaml import platform from textwrap import dedent -import yaml - def _make_versions_html(versions): """Generate a tabular HTML output of all versions for MultiQC.""" diff --git a/modules/nf-core/custom/sratoolsncbisettings/main.nf b/modules/nf-core/custom/sratoolsncbisettings/main.nf index 21bf3005..36be10d3 100644 --- a/modules/nf-core/custom/sratoolsncbisettings/main.nf +++ b/modules/nf-core/custom/sratoolsncbisettings/main.nf @@ -2,7 +2,7 @@ process CUSTOM_SRATOOLSNCBISETTINGS { tag 'ncbi-settings' label 'process_low' - conda (params.enable_conda ? 'bioconda::sra-tools=2.11.0' : null) + conda "bioconda::sra-tools=2.11.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/sra-tools:2.11.0--pl5321ha49a11a_3' : 'quay.io/biocontainers/sra-tools:2.11.0--pl5321ha49a11a_3' }" diff --git a/modules/nf-core/sratools/fasterqdump/main.nf b/modules/nf-core/sratools/fasterqdump/main.nf index 1ffb21f0..ca5ee763 100644 --- a/modules/nf-core/sratools/fasterqdump/main.nf +++ b/modules/nf-core/sratools/fasterqdump/main.nf @@ -2,7 +2,7 @@ process SRATOOLS_FASTERQDUMP { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? 'bioconda::sra-tools=2.11.0 conda-forge::pigz=2.6' : null) + conda "bioconda::sra-tools=2.11.0 conda-forge::pigz=2.6" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:6a9ff0e76ec016c3d0d27e0c0d362339f2d787e6-0' : 'quay.io/biocontainers/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:6a9ff0e76ec016c3d0d27e0c0d362339f2d787e6-0' }" diff --git a/modules/nf-core/sratools/prefetch/main.nf b/modules/nf-core/sratools/prefetch/main.nf index 3426ae12..57e8a3c9 100644 --- a/modules/nf-core/sratools/prefetch/main.nf +++ b/modules/nf-core/sratools/prefetch/main.nf @@ -2,7 +2,7 @@ process SRATOOLS_PREFETCH { tag "$id" label 'process_low' - conda (params.enable_conda ? 'bioconda::sra-tools=2.11.0' : null) + conda "bioconda::sra-tools=2.11.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/sra-tools:2.11.0--pl5321ha49a11a_3' : 'quay.io/biocontainers/sra-tools:2.11.0--pl5321ha49a11a_3' }" From e4a30d2a4c0160f70e2b5f6e1bf9fc93e703ff66 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 20 Dec 2022 20:01:33 +0000 Subject: [PATCH 237/852] Add --nf_core_rnaseq_strandedness and support for nf-core/atacseq --- CHANGELOG.md | 3 ++ README.md | 3 +- docs/usage.md | 5 +- modules/local/sra_to_samplesheet.nf | 5 +- modules/local/synapse_to_samplesheet.nf | 7 ++- nextflow.config | 61 +++++++++++++------------ nextflow_schema.json | 35 ++++++++++++-- workflows/sra.nf | 1 + workflows/synapse.nf | 3 +- 9 files changed, 83 insertions(+), 40 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c80fbebf..04968c93 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Enhancements & fixes +- Bumped minimum Nextflow version from `21.10.3` -> `22.10.1` - Updated pipeline template to [nf-core/tools 2.7.2](https://github.com/nf-core/tools/releases/tag/2.7.2) +- Added support for generating nf-core/atacseq compatible samplesheets +- Added `--nf_core_rnaseq_strandedness` parameter to specify value for `strandedness` entry added to samplesheet created when using `--nf_core_pipeline rnaseq`. The default is `auto` which can be used with nf-core/rnaseq v3.10 onwards to auto-detect strandedness during the pipeline execution. ## [[1.8](https://github.com/nf-core/fetchngs/releases/tag/1.8)] - 2022-11-08 diff --git a/README.md b/README.md index 161d0218..fdc60a60 100644 --- a/README.md +++ b/README.md @@ -55,10 +55,11 @@ This downloads a text file called `SRR_Acc_List.txt` that can be directly provid The columns in the auto-created samplesheet can be tailored to be accepted out-of-the-box by selected nf-core pipelines, these currently include: - [nf-core/rnaseq](https://nf-co.re/rnaseq/usage#samplesheet-input) +- [nf-core/atacseq](https://nf-co.re/atacseq/usage#samplesheet-input) - Ilumina processing mode of [nf-core/viralrecon](https://nf-co.re/viralrecon/usage#illumina-samplesheet-format) - [nf-core/taxprofiler](https://nf-co.re/nf-core/taxprofiler) -You can use the `--nf_core_pipeline` parameter to customise this behaviour e.g. `--nf_core_pipeline rnaseq`. More pipelines will be supported in due course as we adopt and standardise samplesheet input across nf-core. +See [usage docs](https://nf-co.re/fetchngs/1.8/usage#samplesheet-format) for more details. ## Quick Start diff --git a/docs/usage.md b/docs/usage.md index f78879d4..9172b403 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -58,10 +58,13 @@ The final sample information for the FastQ files used for samplesheet generation As a bonus, the columns in the auto-created samplesheet can be tailored to be accepted out-of-the-box by selected nf-core pipelines, these currently include: - [nf-core/rnaseq](https://nf-co.re/rnaseq/usage#samplesheet-input) +- [nf-core/atacseq](https://nf-co.re/atacseq/usage#samplesheet-input) - Ilumina processing mode of [nf-core/viralrecon](https://nf-co.re/viralrecon/usage#illumina-samplesheet-format) - [nf-core/taxprofiler](https://nf-co.re/nf-core/taxprofiler) -You can use the `--nf_core_pipeline` parameter to customise this behaviour e.g. `--nf_core_pipeline rnaseq`. More pipelines will be supported in due course as we adopt and standardise samplesheet input across nf-core. It is highly recommended that you double-check that all of the identifiers you defined using `--input` are represented in the samplesheet. Also, public databases don't reliably hold information such as strandedness information so you may need to amend these entries too if for example your samplesheet was created by providing `--nf_core_pipeline rnaseq`. +You can use the `--nf_core_pipeline` parameter to customise this behaviour e.g. `--nf_core_pipeline rnaseq`. More pipelines will be supported in due course as we adopt and standardise samplesheet input across nf-core. It is highly recommended that you double-check that all of the identifiers required by the downstream nf-core pipeline are accurately represented in the samplesheet. For example, the nf-core/atacseq pipeline requires a `replicate` column to be provided in it's input samplehsheet, however, public databases don't reliably hold information regarding replicates so you may need to amend these entries if your samplesheet was created by providing `--nf_core_pipeline atacseq`. + +From v1.9 of this pipeline the default `strandedness` in the output samplesheet will be set to `auto` when using `--nf_core_pipeline rnaseq`. This will only work with v3.10 onwards of nf-core/rnaseq which permits the auto-detection of strandedness during the pipeline execution. You can change this behaviour with the `--nf_core_rnaseq_strandedness` parameter which is set to `auto` by default. ### Bypass `FTP` data download diff --git a/modules/local/sra_to_samplesheet.nf b/modules/local/sra_to_samplesheet.nf index 6dce588b..92edf5df 100644 --- a/modules/local/sra_to_samplesheet.nf +++ b/modules/local/sra_to_samplesheet.nf @@ -8,6 +8,7 @@ process SRA_TO_SAMPLESHEET { input: val meta val pipeline + val strandedness val mapping_fields output: @@ -38,7 +39,9 @@ process SRA_TO_SAMPLESHEET { // Add nf-core pipeline specific entries if (pipeline) { if (pipeline == 'rnaseq') { - pipeline_map << [ strandedness: 'unstranded' ] + pipeline_map << [ strandedness: strandedness ] + } else if (pipeline == 'atacseq') { + pipeline_map << [ replicate: 1 ] } else if (pipeline == 'taxprofiler') { pipeline_map << [ fasta: '' ] } diff --git a/modules/local/synapse_to_samplesheet.nf b/modules/local/synapse_to_samplesheet.nf index 2e7945ed..393203de 100644 --- a/modules/local/synapse_to_samplesheet.nf +++ b/modules/local/synapse_to_samplesheet.nf @@ -8,6 +8,7 @@ process SYNAPSE_TO_SAMPLESHEET { input: tuple val(meta), path(fastq) val pipeline + val strandedness output: tuple val(meta), path("*.csv"), emit: samplesheet @@ -35,7 +36,11 @@ process SYNAPSE_TO_SAMPLESHEET { // Add nf-core pipeline specific entries if (pipeline) { if (pipeline == 'rnaseq') { - pipeline_map << [ strandedness: 'unstranded' ] + pipeline_map << [ strandedness: strandedness ] + } else if (pipeline == 'atacseq') { + pipeline_map << [ replicate: 1 ] + } else if (pipeline == 'taxprofiler') { + pipeline_map << [ fasta: '' ] } } pipeline_map << meta_map diff --git a/nextflow.config b/nextflow.config index 0dfff0e4..c212bcd3 100644 --- a/nextflow.config +++ b/nextflow.config @@ -10,43 +10,44 @@ params { // Input options - input = null - input_type = 'sra' - nf_core_pipeline = null - ena_metadata_fields = null - sample_mapping_fields = 'experiment_accession,run_accession,sample_accession,experiment_alias,run_alias,sample_alias,experiment_title,sample_title,sample_description,description' - synapse_config = null - force_sratools_download = false - skip_fastq_download = false + input = null + input_type = 'sra' + nf_core_pipeline = null + nf_core_rnaseq_strandedness = 'auto' + ena_metadata_fields = null + sample_mapping_fields = 'experiment_accession,run_accession,sample_accession,experiment_alias,run_alias,sample_alias,experiment_title,sample_title,sample_description,description' + synapse_config = null + force_sratools_download = false + skip_fastq_download = false // Boilerplate options - outdir = null - tracedir = "${params.outdir}/pipeline_info" - publish_dir_mode = 'copy' - email = null - email_on_fail = null - plaintext_email = false - monochrome_logs = false - hook_url = null - help = false - version = false - validate_params = true - show_hidden_params = false - schema_ignore_params = 'genomes,igenomes_base' + outdir = null + tracedir = "${params.outdir}/pipeline_info" + publish_dir_mode = 'copy' + email = null + email_on_fail = null + plaintext_email = false + monochrome_logs = false + hook_url = null + help = false + version = false + validate_params = true + show_hidden_params = false + schema_ignore_params = 'genomes,igenomes_base' // Config options - custom_config_version = 'master' - custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" - config_profile_description = null - config_profile_contact = null - config_profile_url = null - config_profile_name = null + custom_config_version = 'master' + custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" + config_profile_description = null + config_profile_contact = null + config_profile_url = null + config_profile_name = null // Max resource options // Defaults only, expecting to be overwritten - max_memory = '128.GB' - max_cpus = 16 - max_time = '240.h' + max_memory = '128.GB' + max_cpus = 16 + max_time = '240.h' } diff --git a/nextflow_schema.json b/nextflow_schema.json index c7e223bc..278a58a1 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -10,7 +10,10 @@ "type": "object", "fa_icon": "fas fa-terminal", "description": "Define where the pipeline should find input data and save output data.", - "required": ["input", "outdir"], + "required": [ + "input", + "outdir" + ], "properties": { "input": { "type": "string", @@ -26,7 +29,10 @@ "default": "sra", "description": "Specifies the type of identifier provided via `--input` - available options are 'sra' and 'synapse'.", "fa_icon": "fas fa-keyboard", - "enum": ["sra", "synapse"] + "enum": [ + "sra", + "synapse" + ] }, "ena_metadata_fields": { "type": "string", @@ -43,8 +49,20 @@ "nf_core_pipeline": { "type": "string", "fa_icon": "fab fa-apple", - "description": "Name of supported nf-core pipeline e.g. 'rnaseq'. A samplesheet for direct use with the pipeline will be created with the appropriate columns.", - "enum": ["rnaseq", "viralrecon", "taxprofiler"] + "description": "Name of supported nf-core pipeline e.g. 'rnaseq'. A samplesheet for direct use with the pipeline will be created with the appropriate columns.", + "enum": [ + "rnaseq", + "atacseq", + "viralrecon", + "taxprofiler" + ] + }, + "nf_core_rnaseq_strandedness": { + "type": "string", + "fa_icon": "fas fa-car", + "description": "Value for 'strandedness' entry added to samplesheet created when using '--nf_core_pipeline rnaseq'.", + "help_text": "The default is 'auto' which can be used with nf-core/rnaseq v3.10 onwards to auto-detect strandedness during the pipeline execution.", + "default": "auto" }, "force_sratools_download": { "type": "boolean", @@ -186,7 +204,14 @@ "description": "Method used to save pipeline results to output directory.", "help_text": "The Nextflow `publishDir` option specifies which intermediate files should be saved to the output directory. This option tells the pipeline what method should be used to move these files. See [Nextflow docs](https://www.nextflow.io/docs/latest/process.html#publishdir) for details.", "fa_icon": "fas fa-copy", - "enum": ["symlink", "rellink", "link", "copy", "copyNoFollow", "move"], + "enum": [ + "symlink", + "rellink", + "link", + "copy", + "copyNoFollow", + "move" + ], "hidden": true }, "email_on_fail": { diff --git a/workflows/sra.nf b/workflows/sra.nf index 9f38e7f8..1085598b 100644 --- a/workflows/sra.nf +++ b/workflows/sra.nf @@ -138,6 +138,7 @@ workflow SRA { SRA_TO_SAMPLESHEET ( ch_sra_metadata, params.nf_core_pipeline ?: '', + params.nf_core_rnaseq_strandedness ?: 'auto', params.sample_mapping_fields ) diff --git a/workflows/synapse.nf b/workflows/synapse.nf index 1203056a..f2138a60 100644 --- a/workflows/synapse.nf +++ b/workflows/synapse.nf @@ -115,7 +115,8 @@ workflow SYNAPSE { // SYNAPSE_TO_SAMPLESHEET ( ch_fastq, - params.nf_core_pipeline ?: '' + params.nf_core_pipeline ?: '', + params.nf_core_rnaseq_strandedness ?: 'auto' ) // From b50e1f64728f51a7a1d12c6f6ce2a00db8bef99f Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 20 Dec 2022 20:02:46 +0000 Subject: [PATCH 238/852] Bump pipeline version to 1.9 --- CHANGELOG.md | 2 +- nextflow.config | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 04968c93..37f9ea6d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unpublished Version / DEV] +## [[1.9](https://github.com/nf-core/rnaseq/releases/tag/1.9)] - 2022-12-21 ### Enhancements & fixes diff --git a/nextflow.config b/nextflow.config index c212bcd3..d6686ae4 100644 --- a/nextflow.config +++ b/nextflow.config @@ -177,7 +177,7 @@ manifest { description = """Pipeline to fetch metadata and raw FastQ files from public databases""" mainScript = 'main.nf' nextflowVersion = '!>=22.10.1' - version = '1.9dev' + version = '1.9' doi = 'https://doi.org/10.5281/zenodo.5070524' } From 4f84832800e7c8ca1819d47efbddff8d7248e682 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 20 Dec 2022 21:52:58 +0000 Subject: [PATCH 239/852] Fix prettier --- nextflow_schema.json | 26 ++++---------------------- 1 file changed, 4 insertions(+), 22 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 278a58a1..696914e4 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -10,10 +10,7 @@ "type": "object", "fa_icon": "fas fa-terminal", "description": "Define where the pipeline should find input data and save output data.", - "required": [ - "input", - "outdir" - ], + "required": ["input", "outdir"], "properties": { "input": { "type": "string", @@ -29,10 +26,7 @@ "default": "sra", "description": "Specifies the type of identifier provided via `--input` - available options are 'sra' and 'synapse'.", "fa_icon": "fas fa-keyboard", - "enum": [ - "sra", - "synapse" - ] + "enum": ["sra", "synapse"] }, "ena_metadata_fields": { "type": "string", @@ -50,12 +44,7 @@ "type": "string", "fa_icon": "fab fa-apple", "description": "Name of supported nf-core pipeline e.g. 'rnaseq'. A samplesheet for direct use with the pipeline will be created with the appropriate columns.", - "enum": [ - "rnaseq", - "atacseq", - "viralrecon", - "taxprofiler" - ] + "enum": ["rnaseq", "atacseq", "viralrecon", "taxprofiler"] }, "nf_core_rnaseq_strandedness": { "type": "string", @@ -204,14 +193,7 @@ "description": "Method used to save pipeline results to output directory.", "help_text": "The Nextflow `publishDir` option specifies which intermediate files should be saved to the output directory. This option tells the pipeline what method should be used to move these files. See [Nextflow docs](https://www.nextflow.io/docs/latest/process.html#publishdir) for details.", "fa_icon": "fas fa-copy", - "enum": [ - "symlink", - "rellink", - "link", - "copy", - "copyNoFollow", - "move" - ], + "enum": ["symlink", "rellink", "link", "copy", "copyNoFollow", "move"], "hidden": true }, "email_on_fail": { From 4f516556abd9af888eb9e747d16c39ed451c1153 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 21 Dec 2022 12:15:14 +0000 Subject: [PATCH 240/852] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 37f9ea6d..54242118 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [[1.9](https://github.com/nf-core/rnaseq/releases/tag/1.9)] - 2022-12-21 +## [[1.9](https://github.com/nf-core/fetchngs/releases/tag/1.9)] - 2022-12-21 ### Enhancements & fixes From d47b62035b0e8ae0d43c21436de82dbf53ebfec0 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 21 Dec 2022 15:41:03 +0000 Subject: [PATCH 241/852] Bump pipeline version to 1.10dev --- CHANGELOG.md | 4 ++++ nextflow.config | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 54242118..6765ac12 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unpublished Version / DEV] + +### Enhancements & fixes + ## [[1.9](https://github.com/nf-core/fetchngs/releases/tag/1.9)] - 2022-12-21 ### Enhancements & fixes diff --git a/nextflow.config b/nextflow.config index d6686ae4..1ead02d0 100644 --- a/nextflow.config +++ b/nextflow.config @@ -177,7 +177,7 @@ manifest { description = """Pipeline to fetch metadata and raw FastQ files from public databases""" mainScript = 'main.nf' nextflowVersion = '!>=22.10.1' - version = '1.9' + version = '1.10dev' doi = 'https://doi.org/10.5281/zenodo.5070524' } From 9a88c5ca48afc5a6d9af4283736a1ad0c455419c Mon Sep 17 00:00:00 2001 From: Rob Syme Date: Mon, 3 Apr 2023 15:44:44 +0100 Subject: [PATCH 242/852] Update module versions Changelog update --- CHANGELOG.md | 1 + modules.json | 4 ++-- modules/nf-core/custom/dumpsoftwareversions/main.nf | 6 +++--- .../dumpsoftwareversions/templates/dumpsoftwareversions.py | 0 .../sratools/prefetch/templates/retry_with_backoff.sh | 2 ++ 5 files changed, 8 insertions(+), 5 deletions(-) mode change 100755 => 100644 modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 6765ac12..cadb21a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unpublished Version / DEV] +- Bumped modules version to allow for sratools download of sralite format files. ### Enhancements & fixes diff --git a/modules.json b/modules.json index c8cd187a..bd085eba 100644 --- a/modules.json +++ b/modules.json @@ -7,7 +7,7 @@ "nf-core": { "custom/dumpsoftwareversions": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "7101db4432d3268b7fcb5b8f75fa0a022dc5561b", "installed_by": ["modules"] }, "custom/sratoolsncbisettings": { @@ -22,7 +22,7 @@ }, "sratools/prefetch": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "cded1570b7cb0ea128a5c89dd6ec3a62035c1526", "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] } } diff --git a/modules/nf-core/custom/dumpsoftwareversions/main.nf b/modules/nf-core/custom/dumpsoftwareversions/main.nf index 3df21765..800a6099 100644 --- a/modules/nf-core/custom/dumpsoftwareversions/main.nf +++ b/modules/nf-core/custom/dumpsoftwareversions/main.nf @@ -2,10 +2,10 @@ process CUSTOM_DUMPSOFTWAREVERSIONS { label 'process_single' // Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container - conda "bioconda::multiqc=1.13" + conda "bioconda::multiqc=1.14" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.13--pyhdfd78af_0' : - 'quay.io/biocontainers/multiqc:1.13--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.14--pyhdfd78af_0' : + 'quay.io/biocontainers/multiqc:1.14--pyhdfd78af_0' }" input: path versions diff --git a/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py old mode 100755 new mode 100644 diff --git a/modules/nf-core/sratools/prefetch/templates/retry_with_backoff.sh b/modules/nf-core/sratools/prefetch/templates/retry_with_backoff.sh index cec0ab43..e08dbb6a 100755 --- a/modules/nf-core/sratools/prefetch/templates/retry_with_backoff.sh +++ b/modules/nf-core/sratools/prefetch/templates/retry_with_backoff.sh @@ -47,6 +47,8 @@ retry_with_backoff !{args2} \ !{args} \ !{id} +[ -f !{id}.sralite ] && { mkdir -p !{id}; mv "!{id}.sralite" !{id}/; } + vdb-validate !{id} cat <<-END_VERSIONS > versions.yml From ef7effc9beb884ba7e1aff6d05f4b8f69c71ecdb Mon Sep 17 00:00:00 2001 From: Rob Syme Date: Mon, 3 Apr 2023 16:46:19 +0100 Subject: [PATCH 243/852] Prettier fix --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cadb21a6..05e123b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unpublished Version / DEV] + - Bumped modules version to allow for sratools download of sralite format files. ### Enhancements & fixes From 7885fcd294f3ff2134a73599e5e131d1731fbee2 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 25 Apr 2023 11:09:17 +0100 Subject: [PATCH 244/852] Update all nf-core subworkflows --- modules.json | 2 +- .../fastq_download_prefetch_fasterqdump_sratools/meta.yml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/modules.json b/modules.json index bd085eba..6a0c61a8 100644 --- a/modules.json +++ b/modules.json @@ -31,7 +31,7 @@ "nf-core": { "fastq_download_prefetch_fasterqdump_sratools": { "branch": "master", - "git_sha": "03711bcb7fa2a7088eb54abb1fca326d30e602c2", + "git_sha": "ca2bf9212707e83717934ec6c5d4cab42b39ca69", "installed_by": ["subworkflows"] } } diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/meta.yml b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/meta.yml index c385ca21..ed93a54a 100644 --- a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/meta.yml +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/meta.yml @@ -1,3 +1,4 @@ +# yaml-language-server: $schema=https://github.com/nf-core/modules/tree/master/subworkflows/yaml-schema.json name: fastq_download_prefetch_fasterqdump_sratools description: Download FASTQ sequencing reads from the NCBI's Sequence Read Archive (SRA). keywords: From aba1d0bdac2cb906b7d6f54579fcfb73f51cdb63 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 25 Apr 2023 23:04:08 +0100 Subject: [PATCH 245/852] Add fasterq-dump options to --split-files --- conf/modules.config | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/modules.config b/conf/modules.config index c42f4d60..f5cb1c77 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -77,6 +77,7 @@ if (params.input_type == 'sra') { } withName: SRATOOLS_FASTERQDUMP { + ext.args = '--split-files --include-technical' publishDir = [ path: { "${params.outdir}/fastq" }, mode: params.publish_dir_mode, From fff5da74cd08870fc08388ad086b388366afd6f0 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 25 Apr 2023 23:50:05 +0100 Subject: [PATCH 246/852] Use generic glob for output fastq files from fasterq-dump --- modules/nf-core/sratools/fasterqdump/main.nf | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/modules/nf-core/sratools/fasterqdump/main.nf b/modules/nf-core/sratools/fasterqdump/main.nf index ca5ee763..2336c318 100644 --- a/modules/nf-core/sratools/fasterqdump/main.nf +++ b/modules/nf-core/sratools/fasterqdump/main.nf @@ -12,8 +12,8 @@ process SRATOOLS_FASTERQDUMP { path ncbi_settings output: - tuple val(meta), path(fastq), emit: reads - path "versions.yml" , emit: versions + tuple val(meta), path('*.fastq.gz'), emit: reads + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -22,11 +22,6 @@ process SRATOOLS_FASTERQDUMP { def args = task.ext.args ?: '' def args2 = task.ext.args2 ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - - // WARNING: Paired-end data extracted by fasterq-dump (--split-3 the default) - // always creates *_1.fastq *_2.fastq files but sometimes also - // an additional *.fastq file for unpaired reads which we ignore here. - fastq = meta.single_end ? '*.fastq.gz' : '*_{1,2}.fastq.gz' def outfile = meta.single_end ? "${prefix}.fastq" : prefix """ export NCBI_SETTINGS="\$PWD/${ncbi_settings}" From 37f0a785bc2d7d2c40ba4b3173cbc5bcd57305bb Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 25 Apr 2023 23:57:32 +0100 Subject: [PATCH 247/852] Update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 05e123b6..3a443a96 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unpublished Version / DEV] +- [#144](https://github.com/nf-core/fetchngs/issues/144) - Add support to download 10X Genomics data - Bumped modules version to allow for sratools download of sralite format files. ### Enhancements & fixes From 0dcc5f37f0968a9784da03047b645d0bdfc53a6e Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 26 Apr 2023 00:29:00 +0100 Subject: [PATCH 248/852] Log contents of reads variable --- workflows/sra.nf | 1 + 1 file changed, 1 insertion(+) diff --git a/workflows/sra.nf b/workflows/sra.nf index 1085598b..ba39d233 100644 --- a/workflows/sra.nf +++ b/workflows/sra.nf @@ -124,6 +124,7 @@ workflow SRA { .map { meta, fastq -> def reads = meta.single_end ? [ fastq ] : fastq + log.info "$meta.id: $reads" def meta_clone = meta.clone() meta_clone.fastq_1 = reads[0] ? "${params.outdir}/fastq/${reads[0].getName()}" : '' meta_clone.fastq_2 = reads[1] && !meta.single_end ? "${params.outdir}/fastq/${reads[1].getName()}" : '' From 2d653037d127f03d8a4228833a8ac3041babe818 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 26 Apr 2023 00:35:43 +0100 Subject: [PATCH 249/852] Add more logging --- workflows/sra.nf | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/workflows/sra.nf b/workflows/sra.nf index ba39d233..2a704395 100644 --- a/workflows/sra.nf +++ b/workflows/sra.nf @@ -116,6 +116,8 @@ workflow SRA { ch_sra_reads.sra.map { meta, reads -> [ meta, meta.run_accession ] } ) ch_versions = ch_versions.mix(FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS.out.versions.first()) + + FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS.out.reads.view() SRA_FASTQ_FTP .out @@ -124,7 +126,7 @@ workflow SRA { .map { meta, fastq -> def reads = meta.single_end ? [ fastq ] : fastq - log.info "$meta.id: $reads" + log.info "$meta.id: $meta.single_end: $reads" def meta_clone = meta.clone() meta_clone.fastq_1 = reads[0] ? "${params.outdir}/fastq/${reads[0].getName()}" : '' meta_clone.fastq_2 = reads[1] && !meta.single_end ? "${params.outdir}/fastq/${reads[1].getName()}" : '' From 1867a80f45c5bd58f28bdb00ed5ffc94ef5a2082 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 26 Apr 2023 01:02:44 +0100 Subject: [PATCH 250/852] Fix logic to factor for reads being a nested list --- workflows/sra.nf | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/workflows/sra.nf b/workflows/sra.nf index 2a704395..38915944 100644 --- a/workflows/sra.nf +++ b/workflows/sra.nf @@ -116,8 +116,6 @@ workflow SRA { ch_sra_reads.sra.map { meta, reads -> [ meta, meta.run_accession ] } ) ch_versions = ch_versions.mix(FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS.out.versions.first()) - - FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS.out.reads.view() SRA_FASTQ_FTP .out @@ -125,12 +123,10 @@ workflow SRA { .mix(FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS.out.reads) .map { meta, fastq -> - def reads = meta.single_end ? [ fastq ] : fastq - log.info "$meta.id: $meta.single_end: $reads" - def meta_clone = meta.clone() - meta_clone.fastq_1 = reads[0] ? "${params.outdir}/fastq/${reads[0].getName()}" : '' - meta_clone.fastq_2 = reads[1] && !meta.single_end ? "${params.outdir}/fastq/${reads[1].getName()}" : '' - return meta_clone + def reads = fastq instanceof List ? fastq.flatten() : [ fastq ] + def fastq_1 = reads[0] ? "${params.outdir}/fastq/${reads[0].getName()}" : '' + def fastq_2 = reads[1] && !meta.single_end ? "${params.outdir}/fastq/${reads[1].getName()}" : '' + return [ meta + [ fastq_1: fastq_1, fastq_2: fastq_2 ], fastq ] } .set { ch_sra_metadata } } From 399081edcf83af28a137a29344f7c5b4a6f9e78b Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 26 Apr 2023 01:11:41 +0100 Subject: [PATCH 251/852] Remove fastq files from channel --- workflows/sra.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/sra.nf b/workflows/sra.nf index 38915944..d2ce0c2b 100644 --- a/workflows/sra.nf +++ b/workflows/sra.nf @@ -126,7 +126,7 @@ workflow SRA { def reads = fastq instanceof List ? fastq.flatten() : [ fastq ] def fastq_1 = reads[0] ? "${params.outdir}/fastq/${reads[0].getName()}" : '' def fastq_2 = reads[1] && !meta.single_end ? "${params.outdir}/fastq/${reads[1].getName()}" : '' - return [ meta + [ fastq_1: fastq_1, fastq_2: fastq_2 ], fastq ] + return [ meta + [ fastq_1: fastq_1, fastq_2: fastq_2 ] ] } .set { ch_sra_metadata } } From 935de8cf64c67b3542b4c2a233ca3c1392119ea1 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 26 Apr 2023 01:35:19 +0100 Subject: [PATCH 252/852] Revert to cloning map because adding entries returns a list --- workflows/sra.nf | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/workflows/sra.nf b/workflows/sra.nf index d2ce0c2b..52479771 100644 --- a/workflows/sra.nf +++ b/workflows/sra.nf @@ -124,9 +124,10 @@ workflow SRA { .map { meta, fastq -> def reads = fastq instanceof List ? fastq.flatten() : [ fastq ] - def fastq_1 = reads[0] ? "${params.outdir}/fastq/${reads[0].getName()}" : '' - def fastq_2 = reads[1] && !meta.single_end ? "${params.outdir}/fastq/${reads[1].getName()}" : '' - return [ meta + [ fastq_1: fastq_1, fastq_2: fastq_2 ] ] + def meta_clone = meta.clone() + meta_clone.fastq_1 = reads[0] ? "${params.outdir}/fastq/${reads[0].getName()}" : '' + meta_clone.fastq_2 = reads[1] && !meta.single_end ? "${params.outdir}/fastq/${reads[1].getName()}" : '' + return meta_clone } .set { ch_sra_metadata } } From aa82d896b7a7f70700d23df8bb964f64ba388c3e Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 26 Apr 2023 10:54:54 +0100 Subject: [PATCH 253/852] Add full-sized data for 10x to test_full --- conf/test_full.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/test_full.config b/conf/test_full.config index 2f0303ea..c16fda7f 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -15,5 +15,5 @@ params { config_profile_description = 'Full test dataset to check pipeline function' // Input data for full size test - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/fetchngs/sra_ids_test.csv' + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/fetchngs/sra_ids_test_full.csv' } From b47cab18718eaebe8b592d53a39e87653d12b727 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 26 Apr 2023 12:33:05 +0100 Subject: [PATCH 254/852] Re-install sratools/fasterqdump from nf-core/modules --- modules.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules.json b/modules.json index 6a0c61a8..f6d1001c 100644 --- a/modules.json +++ b/modules.json @@ -17,7 +17,7 @@ }, "sratools/fasterqdump": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "10cb20f6a130d104fef335a8290f3ffce650f28d", "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] }, "sratools/prefetch": { From d6125e1f0722a65e5e6dce95ff9381713c2f0447 Mon Sep 17 00:00:00 2001 From: Esha Joshi Date: Tue, 2 May 2023 19:51:10 -0400 Subject: [PATCH 255/852] fix: remove default ena meta fields to match api spec v2.0 --- bin/sra_ids_to_runinfo.py | 2 -- nextflow.config | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/bin/sra_ids_to_runinfo.py b/bin/sra_ids_to_runinfo.py index 70627791..5da7c708 100755 --- a/bin/sra_ids_to_runinfo.py +++ b/bin/sra_ids_to_runinfo.py @@ -64,7 +64,6 @@ "secondary_sample_accession", "study_accession", "secondary_study_accession", - "parent_study", "submission_accession", "run_alias", "experiment_alias", @@ -84,7 +83,6 @@ "sample_title", "experiment_title", "study_title", - "description", "sample_description", "fastq_md5", "fastq_bytes", diff --git a/nextflow.config b/nextflow.config index d6686ae4..d3a1f3f0 100644 --- a/nextflow.config +++ b/nextflow.config @@ -15,7 +15,7 @@ params { nf_core_pipeline = null nf_core_rnaseq_strandedness = 'auto' ena_metadata_fields = null - sample_mapping_fields = 'experiment_accession,run_accession,sample_accession,experiment_alias,run_alias,sample_alias,experiment_title,sample_title,sample_description,description' + sample_mapping_fields = 'experiment_accession,run_accession,sample_accession,experiment_alias,run_alias,sample_alias,experiment_title,sample_title,sample_description' synapse_config = null force_sratools_download = false skip_fastq_download = false From 24ff80b4e01e75de776fb3d585c5cacf5bbc2bc1 Mon Sep 17 00:00:00 2001 From: Esha Joshi Date: Tue, 2 May 2023 21:01:44 -0400 Subject: [PATCH 256/852] feat: improve error handling for meta field validation --- bin/sra_ids_to_runinfo.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/bin/sra_ids_to_runinfo.py b/bin/sra_ids_to_runinfo.py index 5da7c708..a0f6fcb3 100755 --- a/bin/sra_ids_to_runinfo.py +++ b/bin/sra_ids_to_runinfo.py @@ -57,7 +57,6 @@ # Full list of accepted fields can be obtained here: # https://www.ebi.ac.uk/ena/portal/api/returnFields?dataPortal=ena&format=tsv&result=read_run ENA_METADATA_FIELDS = ( - "accession", "run_accession", "experiment_accession", "sample_accession", @@ -364,10 +363,12 @@ def validate_fields_parameter(param, valid_vals, param_desc): if len(set(user_vals) & set(valid_vals)) == len(user_vals): return user_vals else: + invalid_vals = [x for x in user_vals if x not in valid_vals] logger.error( f"Please provide a valid value for {param_desc}!\n" f"Provided values = {param}\n" - f"Accepted values = {','.join(valid_vals)}" + f"Accepted values = {','.join(valid_vals)}\n" + f"The following values are invalid: {','.join(invalid_vals)}\n" ) sys.exit(1) From 9e454f2ee24215b16505ac4487b26f85898896b1 Mon Sep 17 00:00:00 2001 From: Esha Joshi Date: Tue, 2 May 2023 21:10:05 -0400 Subject: [PATCH 257/852] fix: update default mapping fields in schema and specify API version --- nextflow_schema.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 696914e4..563c5e7b 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -32,13 +32,13 @@ "type": "string", "fa_icon": "fas fa-columns", "description": "Comma-separated list of ENA metadata fields to fetch before downloading data.", - "help_text": "The default list of fields used by the pipeline can be found at the top of the [`bin/sra_ids_to_runinfo.py`](https://github.com/nf-core/fetchngs/blob/master/bin/sra_ids_to_runinfo.py) script within the pipeline repo. This pipeline requires a minimal set of fields to download FastQ files i.e. `'run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5'`. Full list of accepted metadata fields can be obtained from the [ENA API](https://www.ebi.ac.uk/ena/portal/api/returnFields?dataPortal=ena&format=tsv&result=read_run])." + "help_text": "The default list of fields used by the pipeline can be found at the top of the [`bin/sra_ids_to_runinfo.py`](https://github.com/nf-core/fetchngs/blob/master/bin/sra_ids_to_runinfo.py) script within the pipeline repo. This pipeline requires a minimal set of fields to download FastQ files i.e. `'run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5'`. Full list of accepted metadata fields can be obtained from the [ENA API v2.0](https://www.ebi.ac.uk/ena/portal/api/returnFields?dataPortal=ena&format=tsv&result=read_run])." }, "sample_mapping_fields": { "type": "string", "fa_icon": "fas fa-globe-americas", "description": "Comma-separated list of ENA metadata fields used to create a separate 'id_mappings.csv' and 'multiqc_config.yml' with selected fields that can be used to rename samples in general and in MultiQC.", - "default": "experiment_accession,run_accession,sample_accession,experiment_alias,run_alias,sample_alias,experiment_title,sample_title,sample_description,description" + "default": "experiment_accession,run_accession,sample_accession,experiment_alias,run_alias,sample_alias,experiment_title,sample_title,sample_description" }, "nf_core_pipeline": { "type": "string", From b1019a595181db0db77b766eb85f050642be6e9e Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 4 May 2023 22:24:11 +0100 Subject: [PATCH 258/852] Remove Sys.exit calls and quay.io in Docker definition from local modules --- docs/usage.md | 11 +++++------ lib/WorkflowMain.groovy | 10 ++++------ lib/WorkflowSra.groovy | 13 +++++++------ main.nf | 4 ++-- modules/local/multiqc_mappings_config.nf | 2 +- modules/local/sra_fastq_ftp.nf | 2 +- modules/local/sra_ids_to_runinfo.nf | 2 +- modules/local/sra_merge_samplesheet.nf | 2 +- modules/local/sra_runinfo_to_ftp.nf | 2 +- modules/local/synapse_get.nf | 6 +++--- modules/local/synapse_list.nf | 6 +++--- modules/local/synapse_merge_samplesheet.nf | 2 +- modules/local/synapse_show.nf | 6 +++--- nextflow.config | 2 +- workflows/sra.nf | 4 ++-- 15 files changed, 36 insertions(+), 38 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 807abb75..55e47133 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -75,7 +75,7 @@ If FTP connections are blocked on your network use the [`--force_sratools_downlo The typical command for running the pipeline is as follows: ```bash -nextflow run nf-core/fetchngs --input ids.csv --outdir -profile docker +nextflow run nf-core/fetchngs --input ./ids.csv --outdir ./results -profile docker ``` This will launch the pipeline with the `docker` configuration profile. See below for more information about profiles. @@ -94,7 +94,8 @@ If you wish to repeatedly use the same parameters for multiple runs, rather than Pipeline settings can be provided in a `yaml` or `json` file via `-params-file `. > ⚠️ Do not use `-c ` to specify parameters as this will result in errors. Custom config files specified with `-c` must only be used for [tuning process resource specifications](https://nf-co.re/docs/usage/configuration#tuning-workflow-resources), other infrastructural tweaks (such as output directories), or module arguments (args). -> The above pipeline run specified with a params file in yaml format: + +The above pipeline run specified with a params file in yaml format: ```bash nextflow run nf-core/fetchngs -profile docker -params-file params.yaml @@ -103,10 +104,8 @@ nextflow run nf-core/fetchngs -profile docker -params-file params.yaml with `params.yaml` containing: ```yaml -input: './samplesheet.csv' +input: './ids.csv' outdir: './results/' -genome: 'GRCh37' -input: 'data' <...> ``` @@ -189,7 +188,7 @@ To change the resource requests, please see the [max resources](https://nf-co.re ### Custom Containers -In some cases you may wish to change which container or conda environment a step of the pipeline uses for a particular tool. By default nf-core pipelines use containers and software from the [biocontainers](https://biocontainers.pro/) or [bioconda](https://bioconda.github.io/) projects. However in some cases the pipeline specified version maybe out of date. +In some cases you may wish to change which container or conda environment a step of the pipeline uses for a particular tool. By default nf-core pipelines use containers and software from the [biocontainers](https://biocontainers.pro/) or [bioconda](https://bioconda.github.io/) projects. However in some cases the pipeline specified version may be out of date. To use a different container from the default container or conda environment specified in a pipeline, please see the [updating tool versions](https://nf-co.re/docs/usage/configuration#updating-tool-versions) section of the nf-core website. diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index 24d82c4e..13fd6d82 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -94,7 +94,7 @@ class WorkflowMain { } // Check if input ids are from the SRA - public static Boolean isSraId(input, log) { + public static Boolean isSraId(input) { def is_sra = false def total_ids = 0 def no_match_ids = [] @@ -111,15 +111,14 @@ class WorkflowMain { if (num_match == total_ids) { is_sra = true } else { - log.error "Mixture of ids provided via --input: ${no_match_ids.join(', ')}\nPlease provide either SRA / ENA / DDBJ or Synapse ids!" - System.exit(1) + Nextflow.error("Mixture of ids provided via --input: ${no_match_ids.join(', ')}\nPlease provide either SRA / ENA / DDBJ or Synapse ids!") } } return is_sra } // Check if input ids are from the Synapse platform - public static Boolean isSynapseId(input, log) { + public static Boolean isSynapseId(input) { def is_synapse = false def total_ids = 0 def no_match_ids = [] @@ -136,8 +135,7 @@ class WorkflowMain { if (num_match == total_ids) { is_synapse = true } else { - log.error "Mixture of ids provided via --input: ${no_match_ids.join(', ')}\nPlease provide either SRA / ENA / DDBJ or Synapse ids!" - System.exit(1) + Nextflow.error("Mixture of ids provided via --input: ${no_match_ids.join(', ')}\nPlease provide either SRA / ENA / DDBJ or Synapse ids!") } } return is_synapse diff --git a/lib/WorkflowSra.groovy b/lib/WorkflowSra.groovy index 90d86f1c..061f7ffb 100755 --- a/lib/WorkflowSra.groovy +++ b/lib/WorkflowSra.groovy @@ -2,17 +2,18 @@ // This file holds several functions specific to the workflow/sra.nf in the nf-core/fetchngs pipeline // +import nextflow.Nextflow + class WorkflowSra { // // Check and validate parameters // - public static void initialise(params, log, valid_params) { + public static void initialise(params, valid_params) { // Check minimal ENA fields are provided to download FastQ files def ena_metadata_fields = params.ena_metadata_fields ? params.ena_metadata_fields.split(',').collect{ it.trim().toLowerCase() } : valid_params['ena_metadata_fields'] if (!ena_metadata_fields.containsAll(valid_params['ena_metadata_fields'])) { - log.error "Invalid option: '${params.ena_metadata_fields}'. Minimally required fields for '--ena_metadata_fields': '${valid_params['ena_metadata_fields'].join(',')}'" - System.exit(1) + Nextflow.error("Invalid option: '${params.ena_metadata_fields}'. Minimally required fields for '--ena_metadata_fields': '${valid_params['ena_metadata_fields'].join(',')}'") } } @@ -31,18 +32,18 @@ class WorkflowSra { } // Fail pipeline if input ids are from the GEO - public static void isGeoFail(ids, log) { + public static void isGeoFail(ids) { def pattern = /^(GS[EM])(\d+)$/ for (id in ids) { if (id =~ pattern) { - log.error "===================================================================================\n" + + def error_string = "===================================================================================\n" + " GEO id detected: ${id}\n" + " Support for GEO ids was dropped in v1.7 due to breaking changes in the NCBI API.\n" + " Please remove any GEO ids from the input samplesheet.\n\n" + " Please see:\n" + " https://github.com/nf-core/fetchngs/pull/102\n" + "===================================================================================" - System.exit(1) + Nextflow.error(error_string) } } } diff --git a/main.nf b/main.nf index 2c4b52f2..e7d67165 100644 --- a/main.nf +++ b/main.nf @@ -39,9 +39,9 @@ Channel // Auto-detect input id type def input_type = '' -if (WorkflowMain.isSraId(ch_input, log)) { +if (WorkflowMain.isSraId(ch_input)) { input_type = 'sra' -} else if (WorkflowMain.isSynapseId(ch_input, log)) { +} else if (WorkflowMain.isSynapseId(ch_input)) { input_type = 'synapse' } else { exit 1, 'Ids provided via --input not recognised please make sure they are either SRA / ENA / DDBJ or Synapse ids!' diff --git a/modules/local/multiqc_mappings_config.nf b/modules/local/multiqc_mappings_config.nf index 4f6c95bd..8efe1caa 100644 --- a/modules/local/multiqc_mappings_config.nf +++ b/modules/local/multiqc_mappings_config.nf @@ -4,7 +4,7 @@ process MULTIQC_MAPPINGS_CONFIG { conda "conda-forge::python=3.9.5" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/python:3.9--1' : - 'quay.io/biocontainers/python:3.9--1' }" + 'biocontainers/python:3.9--1' }" input: path csv diff --git a/modules/local/sra_fastq_ftp.nf b/modules/local/sra_fastq_ftp.nf index 464a327e..2b7769ff 100644 --- a/modules/local/sra_fastq_ftp.nf +++ b/modules/local/sra_fastq_ftp.nf @@ -7,7 +7,7 @@ process SRA_FASTQ_FTP { conda "bioconda::sra-tools=2.11.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/sra-tools:2.11.0--pl5321ha49a11a_3' : - 'quay.io/biocontainers/sra-tools:2.11.0--pl5321ha49a11a_3' }" + 'biocontainers/sra-tools:2.11.0--pl5321ha49a11a_3' }" input: tuple val(meta), val(fastq) diff --git a/modules/local/sra_ids_to_runinfo.nf b/modules/local/sra_ids_to_runinfo.nf index 49c83554..7d47f5e3 100644 --- a/modules/local/sra_ids_to_runinfo.nf +++ b/modules/local/sra_ids_to_runinfo.nf @@ -6,7 +6,7 @@ process SRA_IDS_TO_RUNINFO { conda "conda-forge::python=3.9.5" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/python:3.9--1' : - 'quay.io/biocontainers/python:3.9--1' }" + 'biocontainers/python:3.9--1' }" input: val id diff --git a/modules/local/sra_merge_samplesheet.nf b/modules/local/sra_merge_samplesheet.nf index 4b94a823..66d697aa 100644 --- a/modules/local/sra_merge_samplesheet.nf +++ b/modules/local/sra_merge_samplesheet.nf @@ -3,7 +3,7 @@ process SRA_MERGE_SAMPLESHEET { conda "conda-forge::sed=4.7" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/ubuntu:20.04' : - 'ubuntu:20.04' }" + 'docker.io/library/ubuntu:20.04' }" input: path ('samplesheets/*') diff --git a/modules/local/sra_runinfo_to_ftp.nf b/modules/local/sra_runinfo_to_ftp.nf index 3a060f7b..9c83cf53 100644 --- a/modules/local/sra_runinfo_to_ftp.nf +++ b/modules/local/sra_runinfo_to_ftp.nf @@ -4,7 +4,7 @@ process SRA_RUNINFO_TO_FTP { conda "conda-forge::python=3.9.5" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/python:3.9--1' : - 'quay.io/biocontainers/python:3.9--1' }" + 'biocontainers/python:3.9--1' }" input: path runinfo diff --git a/modules/local/synapse_get.nf b/modules/local/synapse_get.nf index f43e4d5e..c8a6d7a4 100644 --- a/modules/local/synapse_get.nf +++ b/modules/local/synapse_get.nf @@ -4,10 +4,10 @@ process SYNAPSE_GET { label 'process_low' label 'error_retry' - conda "bioconda::synapseclient=2.6.0" + conda "bioconda::synapseclient=2.7.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/synapseclient:2.6.0--pyh5e36f6f_0' : - 'quay.io/biocontainers/synapseclient:2.6.0--pyh5e36f6f_0' }" + 'https://depot.galaxyproject.org/singularity/synapseclient:2.7.1--pyh7cba7a3_0' : + 'biocontainers/synapseclient:2.7.1--pyh7cba7a3_0' }" input: val meta diff --git a/modules/local/synapse_list.nf b/modules/local/synapse_list.nf index f42357ab..0c03f8b2 100644 --- a/modules/local/synapse_list.nf +++ b/modules/local/synapse_list.nf @@ -3,10 +3,10 @@ process SYNAPSE_LIST { tag "$id" label 'process_low' - conda "bioconda::synapseclient=2.6.0" + conda "bioconda::synapseclient=2.7.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/synapseclient:2.6.0--pyh5e36f6f_0' : - 'quay.io/biocontainers/synapseclient:2.6.0--pyh5e36f6f_0' }" + 'https://depot.galaxyproject.org/singularity/synapseclient:2.7.1--pyh7cba7a3_0' : + 'biocontainers/synapseclient:2.7.1--pyh7cba7a3_0' }" input: val id diff --git a/modules/local/synapse_merge_samplesheet.nf b/modules/local/synapse_merge_samplesheet.nf index f46a1fbf..bfe89693 100644 --- a/modules/local/synapse_merge_samplesheet.nf +++ b/modules/local/synapse_merge_samplesheet.nf @@ -4,7 +4,7 @@ process SYNAPSE_MERGE_SAMPLESHEET { conda "conda-forge::sed=4.7" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/ubuntu:20.04' : - 'ubuntu:20.04' }" + 'docker.io/library/ubuntu:20.04' }" input: path ('samplesheets/*') diff --git a/modules/local/synapse_show.nf b/modules/local/synapse_show.nf index 0bd6cc12..e1f756a5 100644 --- a/modules/local/synapse_show.nf +++ b/modules/local/synapse_show.nf @@ -3,10 +3,10 @@ process SYNAPSE_SHOW { tag "$id" label 'process_low' - conda "bioconda::synapseclient=2.6.0" + conda "bioconda::synapseclient=2.7.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/synapseclient:2.6.0--pyh5e36f6f_0' : - 'quay.io/biocontainers/synapseclient:2.6.0--pyh5e36f6f_0' }" + 'https://depot.galaxyproject.org/singularity/synapseclient:2.7.1--pyh7cba7a3_0' : + 'biocontainers/synapseclient:2.7.1--pyh7cba7a3_0' }" input: val id diff --git a/nextflow.config b/nextflow.config index 6731df72..74ae84d6 100644 --- a/nextflow.config +++ b/nextflow.config @@ -73,7 +73,7 @@ profiles { debug { dumpHashes = true process.beforeScript = 'echo $HOSTNAME' - cleanup = false + cleanup = false } conda { conda.enabled = true diff --git a/workflows/sra.nf b/workflows/sra.nf index 52479771..e3ac447f 100644 --- a/workflows/sra.nf +++ b/workflows/sra.nf @@ -11,7 +11,7 @@ def valid_params = [ def summary_params = NfcoreSchema.paramsSummaryMap(workflow, params) // Validate input parameters -WorkflowSra.initialise(params, log, valid_params) +WorkflowSra.initialise(params, valid_params) /* ======================================================================================== @@ -55,7 +55,7 @@ workflow SRA { // ids .collect() - .map { WorkflowSra.isGeoFail(it, log) } + .map { WorkflowSra.isGeoFail(it) } // // MODULE: Get SRA run information for public database ids From e7623943f86fa8131da3b3de9c1848ce65249fe7 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 4 May 2023 22:37:18 +0100 Subject: [PATCH 259/852] Run nf-core modules update to fix quay.io container definitions --- modules.json | 8 ++++---- modules/nf-core/custom/dumpsoftwareversions/main.nf | 2 +- modules/nf-core/custom/sratoolsncbisettings/main.nf | 2 +- modules/nf-core/sratools/prefetch/main.nf | 2 +- .../fastq_download_prefetch_fasterqdump_sratools/meta.yml | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/modules.json b/modules.json index 02ca48e7..dea81e71 100644 --- a/modules.json +++ b/modules.json @@ -7,12 +7,12 @@ "nf-core": { "custom/dumpsoftwareversions": { "branch": "master", - "git_sha": "76cc4938c1f6ea5c7d83fed1eeffc146787f9543", + "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", "installed_by": ["modules"] }, "custom/sratoolsncbisettings": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] }, "sratools/fasterqdump": { @@ -22,7 +22,7 @@ }, "sratools/prefetch": { "branch": "master", - "git_sha": "cded1570b7cb0ea128a5c89dd6ec3a62035c1526", + "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] } } @@ -31,7 +31,7 @@ "nf-core": { "fastq_download_prefetch_fasterqdump_sratools": { "branch": "master", - "git_sha": "ca2bf9212707e83717934ec6c5d4cab42b39ca69", + "git_sha": "a9784afdd5dcda23b84e64db75dc591065d64653", "installed_by": ["subworkflows"] } } diff --git a/modules/nf-core/custom/dumpsoftwareversions/main.nf b/modules/nf-core/custom/dumpsoftwareversions/main.nf index 800a6099..ebc87273 100644 --- a/modules/nf-core/custom/dumpsoftwareversions/main.nf +++ b/modules/nf-core/custom/dumpsoftwareversions/main.nf @@ -5,7 +5,7 @@ process CUSTOM_DUMPSOFTWAREVERSIONS { conda "bioconda::multiqc=1.14" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/multiqc:1.14--pyhdfd78af_0' : - 'quay.io/biocontainers/multiqc:1.14--pyhdfd78af_0' }" + 'biocontainers/multiqc:1.14--pyhdfd78af_0' }" input: path versions diff --git a/modules/nf-core/custom/sratoolsncbisettings/main.nf b/modules/nf-core/custom/sratoolsncbisettings/main.nf index 36be10d3..5deb8892 100644 --- a/modules/nf-core/custom/sratoolsncbisettings/main.nf +++ b/modules/nf-core/custom/sratoolsncbisettings/main.nf @@ -5,7 +5,7 @@ process CUSTOM_SRATOOLSNCBISETTINGS { conda "bioconda::sra-tools=2.11.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/sra-tools:2.11.0--pl5321ha49a11a_3' : - 'quay.io/biocontainers/sra-tools:2.11.0--pl5321ha49a11a_3' }" + 'biocontainers/sra-tools:2.11.0--pl5321ha49a11a_3' }" output: path('*.mkfg') , emit: ncbi_settings diff --git a/modules/nf-core/sratools/prefetch/main.nf b/modules/nf-core/sratools/prefetch/main.nf index 57e8a3c9..91b8aec2 100644 --- a/modules/nf-core/sratools/prefetch/main.nf +++ b/modules/nf-core/sratools/prefetch/main.nf @@ -5,7 +5,7 @@ process SRATOOLS_PREFETCH { conda "bioconda::sra-tools=2.11.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/sra-tools:2.11.0--pl5321ha49a11a_3' : - 'quay.io/biocontainers/sra-tools:2.11.0--pl5321ha49a11a_3' }" + 'biocontainers/sra-tools:2.11.0--pl5321ha49a11a_3' }" input: tuple val(meta), val(id) diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/meta.yml b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/meta.yml index ed93a54a..4599bbd2 100644 --- a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/meta.yml +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/meta.yml @@ -1,4 +1,4 @@ -# yaml-language-server: $schema=https://github.com/nf-core/modules/tree/master/subworkflows/yaml-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/subworkflows/yaml-schema.json name: fastq_download_prefetch_fasterqdump_sratools description: Download FASTQ sequencing reads from the NCBI's Sequence Read Archive (SRA). keywords: From e39a54ad3ab9cebf2b1686afa215e521d4aa397f Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 5 May 2023 10:01:44 +0100 Subject: [PATCH 260/852] Make CHANGELOG more templaty --- CHANGELOG.md | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 533488b3..d959887c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,12 +5,36 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [[1.10.0](https://github.com/nf-core/fetchngs/releases/tag/1.10.0)] - 2023-05-12 +### Credits + +Special thanks to the following for their contributions to the release: + +- [Adam Talbot](https://github.com/adamrtalbot) +- [Esha Joshi](https://github.com/ejseqera) +- [Maxime Garcia](https://github.com/maxulysse) +- [Moritz E. Beber](https://github.com/Midnighter) +- [Rob Syme](https://github.com/robsyme) + +Thank you to everyone else that has contributed by reporting bugs, enhancements or in any other way, shape or form. + +### Enhancements & fixes + - [#144](https://github.com/nf-core/fetchngs/issues/144) - Add support to download 10X Genomics data - [#148](https://github.com/nf-core/fetchngs/pull/148) - Fix default metadata fields for ENA API v2.0 - Bumped modules version to allow for sratools download of sralite format files. - Updated pipeline template to [nf-core/tools 2.8](https://github.com/nf-core/tools/releases/tag/2.8) -### Enhancements & fixes +### Software dependencies + +| Dependency | Old version | New version | +| --------------- | ----------- | ----------- | +| `synapseclient` | 2.6.0 | 2.7.1 | + +> **NB:** Dependency has been **updated** if both old and new version information is present. +> +> **NB:** Dependency has been **added** if just the new version information is present. +> +> **NB:** Dependency has been **removed** if new version information isn't present. ## [[1.9](https://github.com/nf-core/fetchngs/releases/tag/1.9)] - 2022-12-21 From b9888eafb65469ed99ae3313e7fe8cfbb4d78f3e Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 5 May 2023 12:32:30 +0100 Subject: [PATCH 261/852] Use ubuntu image from quay.io nf-core account --- modules/local/sra_merge_samplesheet.nf | 2 +- modules/local/synapse_merge_samplesheet.nf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/local/sra_merge_samplesheet.nf b/modules/local/sra_merge_samplesheet.nf index 66d697aa..1c2ee7df 100644 --- a/modules/local/sra_merge_samplesheet.nf +++ b/modules/local/sra_merge_samplesheet.nf @@ -3,7 +3,7 @@ process SRA_MERGE_SAMPLESHEET { conda "conda-forge::sed=4.7" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/ubuntu:20.04' : - 'docker.io/library/ubuntu:20.04' }" + 'nf-core/ubuntu:20.04' }" input: path ('samplesheets/*') diff --git a/modules/local/synapse_merge_samplesheet.nf b/modules/local/synapse_merge_samplesheet.nf index bfe89693..4cb2abc3 100644 --- a/modules/local/synapse_merge_samplesheet.nf +++ b/modules/local/synapse_merge_samplesheet.nf @@ -4,7 +4,7 @@ process SYNAPSE_MERGE_SAMPLESHEET { conda "conda-forge::sed=4.7" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/ubuntu:20.04' : - 'docker.io/library/ubuntu:20.04' }" + 'nf-core/ubuntu:20.04' }" input: path ('samplesheets/*') From c0afa084e3d353bf6a315c14a54ecae983d6e0bc Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sat, 6 May 2023 15:24:26 +0100 Subject: [PATCH 262/852] Add #85 to CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d959887c..b5b1a287 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements ### Enhancements & fixes +- [#85](https://github.com/nf-core/fetchngs/issues/85) - Not able to fetch metadata for ERR* ids associated with ArrayExpress - [#144](https://github.com/nf-core/fetchngs/issues/144) - Add support to download 10X Genomics data - [#148](https://github.com/nf-core/fetchngs/pull/148) - Fix default metadata fields for ENA API v2.0 - Bumped modules version to allow for sratools download of sralite format files. From 2aca881c5466590c74f8b36452ac788be10b5757 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sat, 6 May 2023 16:12:00 +0100 Subject: [PATCH 263/852] Fix #129 --- CHANGELOG.md | 1 + bin/sra_ids_to_runinfo.py | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b5b1a287..1b3efa85 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements ### Enhancements & fixes - [#85](https://github.com/nf-core/fetchngs/issues/85) - Not able to fetch metadata for ERR* ids associated with ArrayExpress +- [#129](https://github.com/nf-core/fetchngs/issues/129) - Pipeline is working with SRA run IDs, but failing with corresponding Biosample IDs - [#144](https://github.com/nf-core/fetchngs/issues/144) - Add support to download 10X Genomics data - [#148](https://github.com/nf-core/fetchngs/pull/148) - Fix default metadata fields for ENA API v2.0 - Bumped modules version to allow for sratools download of sralite format files. diff --git a/bin/sra_ids_to_runinfo.py b/bin/sra_ids_to_runinfo.py index a0f6fcb3..6cf16800 100755 --- a/bin/sra_ids_to_runinfo.py +++ b/bin/sra_ids_to_runinfo.py @@ -191,7 +191,6 @@ class DatabaseResolver: _GEO_PREFIXES = {"GSE", "GSM"} _SRA_PREFIXES = { "PRJNA", - "SAMN", "DRA", "DRP", "DRS", @@ -199,7 +198,7 @@ class DatabaseResolver: "PRJDB", "SAMD", } - _ENA_PREFIXES = {"ERR", "SRR", "DRR"} + _ENA_PREFIXES = {"ERR", "SRR", "SAMN", "DRR"} @classmethod def expand_identifier(cls, identifier): From bc4edf654c7df6f2edaf8654870f6617e4f73c55 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sat, 6 May 2023 16:18:47 +0100 Subject: [PATCH 264/852] Fix prettier --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b3efa85..c1bf6a64 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,7 +19,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements ### Enhancements & fixes -- [#85](https://github.com/nf-core/fetchngs/issues/85) - Not able to fetch metadata for ERR* ids associated with ArrayExpress +- [#85](https://github.com/nf-core/fetchngs/issues/85) - Not able to fetch metadata for ERR\* ids associated with ArrayExpress - [#129](https://github.com/nf-core/fetchngs/issues/129) - Pipeline is working with SRA run IDs, but failing with corresponding Biosample IDs - [#144](https://github.com/nf-core/fetchngs/issues/144) - Add support to download 10X Genomics data - [#148](https://github.com/nf-core/fetchngs/pull/148) - Fix default metadata fields for ENA API v2.0 From b6b43947bee5f776090081b0ba1291bfc8b4603a Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sat, 6 May 2023 20:20:19 +0100 Subject: [PATCH 265/852] Add multi-cloud CI for full-sized tests --- .github/workflows/cloud_tests_full.yml | 81 +++++++++++++++++++++++++ .github/workflows/cloud_tests_small.yml | 76 +++++++++++++++++++++++ 2 files changed, 157 insertions(+) create mode 100644 .github/workflows/cloud_tests_full.yml create mode 100644 .github/workflows/cloud_tests_small.yml diff --git a/.github/workflows/cloud_tests_full.yml b/.github/workflows/cloud_tests_full.yml new file mode 100644 index 00000000..d0ed0552 --- /dev/null +++ b/.github/workflows/cloud_tests_full.yml @@ -0,0 +1,81 @@ +name: full-sized tests on cloud providers +run-name: Submitting workflow to all cloud providers using full sized data +on: + release: + types: [published] + workflow_dispatch: + inputs: + platform: + description: "Platform to run test" + required: true + default: "all" + type: choice + options: + - all + - aws + - azure + - gcp +jobs: + run-full-tests-on-aws: + if: ${{ github.event.inputs.platform == 'all' || github.event.inputs.platform == 'aws' || !github.event.inputs }} + runs-on: ubuntu-latest + steps: + - uses: seqeralabs/action-tower-launch@v1 + with: + workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} + access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} + compute_env: ${{ secrets.TOWER_CE_AWS_CPU }} + workdir: "${{ secrets.TOWER_BUCKET_AWS }}/work/fetchngs/work-${{ github.sha }}" + run_name: "aws_fetchngs_full" + profiles: test_full + parameters: | + { + "hook_url": "${{ secrets.MEGATESTS_ALERTS_SLACK_HOOK_URL }}", + "outdir": "${{ secrets.TOWER_BUCKET_AWS }}/fetchngs/results-${{ github.sha }}" + } + - uses: actions/upload-artifact@v3 + with: + name: Tower debug log file + path: tower_action_*.log + run-full-tests-on-gcp: + if: ${{ github.event.inputs.platform == 'all' || github.event.inputs.platform == 'gcp' || !github.event.inputs }} + runs-on: ubuntu-latest + steps: + - uses: seqeralabs/action-tower-launch@v1 + with: + workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} + access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} + compute_env: ${{ secrets.TOWER_CE_GCP_CPU }} + workdir: "${{ secrets.TOWER_BUCKET_GCP }}/work/fetchngs/work-${{ github.sha }}" + run_name: "gcp_fetchngs_full" + profiles: test_full + parameters: | + { + "hook_url": "${{ secrets.MEGATESTS_ALERTS_SLACK_HOOK_URL }}", + "outdir": "${{ secrets.TOWER_BUCKET_GCP }}/fetchngs/results-${{ github.sha }}" + } + - uses: actions/upload-artifact@v3 + with: + name: Tower debug log file + path: tower_action_*.log + run-full-tests-on-azure: + if: ${{ github.event.inputs.platform == 'all' || github.event.inputs.platform == 'azure' || !github.event.inputs }} + runs-on: ubuntu-latest + steps: + - uses: seqeralabs/action-tower-launch@v1 + with: + workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} + access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} + compute_env: ${{ secrets.TOWER_CE_AZURE_CPU }} + workdir: "${{ secrets.TOWER_BUCKET_AZURE }}/work/fetchngs/work-${{ github.sha }}" + run_name: "azure_fetchngs_full" + profiles: test_full + parameters: | + { + "hook_url": "${{ secrets.MEGATESTS_ALERTS_SLACK_HOOK_URL }}", + "outdir": "${{ secrets.TOWER_BUCKET_AZURE }}/fetchngs/results-${{ github.sha }}" + } + - uses: actions/upload-artifact@v3 + with: + name: Tower debug log file + path: tower_action_*.log diff --git a/.github/workflows/cloud_tests_small.yml b/.github/workflows/cloud_tests_small.yml new file mode 100644 index 00000000..12b8daab --- /dev/null +++ b/.github/workflows/cloud_tests_small.yml @@ -0,0 +1,76 @@ +name: small-sized tests on cloud providers +run-name: Submitting workflow to all cloud providers using small sized data +on: + workflow_dispatch: + inputs: + platform: + description: "Platform to run test" + required: true + default: "all" + type: choice + options: + - all + - aws + - azure + - gcp +jobs: + run-small-tests-on-aws: + if: ${{ github.event.inputs.platform == 'all' || github.event.inputs.platform == 'aws' }} + runs-on: ubuntu-latest + steps: + - uses: seqeralabs/action-tower-launch@v1 + with: + workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} + access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} + compute_env: ${{ secrets.TOWER_CE_AWS_CPU }} + workdir: "${{ secrets.TOWER_BUCKET_AWS }}/work/fetchngs/work-${{ github.sha }}" + run_name: "aws_fetchngs_small" + profiles: test + parameters: | + { + "outdir": "${{ secrets.TOWER_BUCKET_AWS }}/fetchngs/results-test-${{ github.sha }}" + } + - uses: actions/upload-artifact@v3 + with: + name: Tower debug log file + path: tower_action_*.log + run-small-tests-on-gcp: + if: ${{ github.event.inputs.platform == 'all' || github.event.inputs.platform == 'gcp' }} + runs-on: ubuntu-latest + steps: + - uses: seqeralabs/action-tower-launch@v1 + with: + workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} + access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} + compute_env: ${{ secrets.TOWER_CE_GCP_CPU }} + workdir: "${{ secrets.TOWER_BUCKET_GCP }}/work/fetchngs/work-${{ github.sha }}" + run_name: "gcp_fetchngs_small" + profiles: test + parameters: | + { + "outdir": "${{ secrets.TOWER_BUCKET_GCP }}/fetchngs/results-test-${{ github.sha }}" + } + - uses: actions/upload-artifact@v3 + with: + name: Tower debug log file + path: tower_action_*.log + run-small-tests-on-azure: + if: ${{ github.event.inputs.platform == 'all' || github.event.inputs.platform == 'azure' }} + runs-on: ubuntu-latest + steps: + - uses: seqeralabs/action-tower-launch@v1 + with: + workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} + access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} + compute_env: ${{ secrets.TOWER_CE_AZURE_CPU }} + workdir: "${{ secrets.TOWER_BUCKET_AZURE }}/work/fetchngs/work-${{ github.sha }}" + run_name: "azure_fetchngs_small" + profiles: test + parameters: | + { + "outdir": "${{ secrets.TOWER_BUCKET_AZURE }}/fetchngs/results-test-${{ github.sha }}" + } + - uses: actions/upload-artifact@v3 + with: + name: Tower debug log file + path: tower_action_*.log From 9e112c1f3a761b2c39ef0151b937895ff2db92e8 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sat, 6 May 2023 20:28:41 +0100 Subject: [PATCH 266/852] Remove old AWS CI tests --- .github/workflows/awsfulltest.yml | 31 ------------------------------- .github/workflows/awstest.yml | 29 ----------------------------- 2 files changed, 60 deletions(-) delete mode 100644 .github/workflows/awsfulltest.yml delete mode 100644 .github/workflows/awstest.yml diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml deleted file mode 100644 index 773c3a7e..00000000 --- a/.github/workflows/awsfulltest.yml +++ /dev/null @@ -1,31 +0,0 @@ -name: nf-core AWS full size tests -# This workflow is triggered on published releases. -# It can be additionally triggered manually with GitHub actions workflow dispatch button. -# It runs the -profile 'test_full' on AWS batch - -on: - release: - types: [published] - workflow_dispatch: -jobs: - run-tower: - name: Run AWS full tests - if: github.repository == 'nf-core/fetchngs' - runs-on: ubuntu-latest - steps: - - name: Launch workflow via tower - uses: seqeralabs/action-tower-launch@v1 - with: - workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} - access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} - compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} - workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/fetchngs/work-${{ github.sha }} - parameters: | - { - "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/fetchngs/results-${{ github.sha }}" - } - profiles: test_full,aws_tower - - uses: actions/upload-artifact@v3 - with: - name: Tower debug log file - path: tower_action_*.log diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml deleted file mode 100644 index cdfba2f0..00000000 --- a/.github/workflows/awstest.yml +++ /dev/null @@ -1,29 +0,0 @@ -name: nf-core AWS test -# This workflow can be triggered manually with the GitHub actions workflow dispatch button. -# It runs the -profile 'test' on AWS batch - -on: - workflow_dispatch: -jobs: - run-tower: - name: Run AWS tests - if: github.repository == 'nf-core/fetchngs' - runs-on: ubuntu-latest - steps: - # Launch workflow using Tower CLI tool action - - name: Launch workflow via tower - uses: seqeralabs/action-tower-launch@v1 - with: - workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} - access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} - compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} - workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/fetchngs/work-${{ github.sha }} - parameters: | - { - "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/fetchngs/results-test-${{ github.sha }}" - } - profiles: test,aws_tower - - uses: actions/upload-artifact@v3 - with: - name: Tower debug log file - path: tower_action_*.log From 7d858a3aed5800a743e13051069fab741987cd91 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sat, 6 May 2023 20:36:41 +0100 Subject: [PATCH 267/852] Update CHANGELOG --- CHANGELOG.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c1bf6a64..4bb46ddb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,12 +19,13 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements ### Enhancements & fixes -- [#85](https://github.com/nf-core/fetchngs/issues/85) - Not able to fetch metadata for ERR\* ids associated with ArrayExpress -- [#129](https://github.com/nf-core/fetchngs/issues/129) - Pipeline is working with SRA run IDs, but failing with corresponding Biosample IDs +- [#85](https://github.com/nf-core/fetchngs/issues/85) - Not able to fetch metadata for ERR ids associated with ArrayExpress +- [#129](https://github.com/nf-core/fetchngs/issues/129) - Pipeline is working with SRA run ids but failing with corresponding Biosample ids - [#144](https://github.com/nf-core/fetchngs/issues/144) - Add support to download 10X Genomics data -- [#148](https://github.com/nf-core/fetchngs/pull/148) - Fix default metadata fields for ENA API v2.0 -- Bumped modules version to allow for sratools download of sralite format files. -- Updated pipeline template to [nf-core/tools 2.8](https://github.com/nf-core/tools/releases/tag/2.8) +- [PR #140](https://github.com/nf-core/fetchngs/pull/140) - Bumped modules version to allow for sratools download of sralite format files +- [PR #147](https://github.com/nf-core/fetchngs/pull/147) - Updated pipeline template to [nf-core/tools 2.8](https://github.com/nf-core/tools/releases/tag/2.8) +- [PR #148](https://github.com/nf-core/fetchngs/pull/148) - Fix default metadata fields for ENA API v2.0 +- [PR #150](https://github.com/nf-core/fetchngs/pull/150) - Add infrastructure and CI for multi-cloud full-sized tests run via Nextflow Tower ### Software dependencies From eaecac87ca7a50b3a74ee16d1ac03f1ecc46be92 Mon Sep 17 00:00:00 2001 From: ejseqera Date: Mon, 8 May 2023 02:02:48 -0400 Subject: [PATCH 268/852] feat: add support for jwt as input file --- modules/nf-core/sratools/fasterqdump/main.nf | 3 +++ modules/nf-core/sratools/prefetch/main.nf | 2 ++ nextflow.config | 1 + .../main.nf | 12 ++++++++++-- 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/modules/nf-core/sratools/fasterqdump/main.nf b/modules/nf-core/sratools/fasterqdump/main.nf index 2336c318..4ed92814 100644 --- a/modules/nf-core/sratools/fasterqdump/main.nf +++ b/modules/nf-core/sratools/fasterqdump/main.nf @@ -10,6 +10,7 @@ process SRATOOLS_FASTERQDUMP { input: tuple val(meta), path(sra) path ncbi_settings + path certificate output: tuple val(meta), path('*.fastq.gz'), emit: reads @@ -23,6 +24,7 @@ process SRATOOLS_FASTERQDUMP { def args2 = task.ext.args2 ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def outfile = meta.single_end ? "${prefix}.fastq" : prefix + def key_file = certificate ? "--perm ${certificate}" : '' """ export NCBI_SETTINGS="\$PWD/${ncbi_settings}" @@ -30,6 +32,7 @@ process SRATOOLS_FASTERQDUMP { $args \\ --threads $task.cpus \\ --outfile $outfile \\ + ${key_file} \\ ${sra.name} pigz \\ diff --git a/modules/nf-core/sratools/prefetch/main.nf b/modules/nf-core/sratools/prefetch/main.nf index 91b8aec2..5d894b88 100644 --- a/modules/nf-core/sratools/prefetch/main.nf +++ b/modules/nf-core/sratools/prefetch/main.nf @@ -10,6 +10,7 @@ process SRATOOLS_PREFETCH { input: tuple val(meta), val(id) path ncbi_settings + path certificate output: tuple val(meta), path(id), emit: sra @@ -20,6 +21,7 @@ process SRATOOLS_PREFETCH { shell: args = task.ext.args ?: '' + args += certificate ? " --perm ${certificate}" : '' args2 = task.ext.args2 ?: '5 1 100' // template 'retry_with_backoff.sh' } diff --git a/nextflow.config b/nextflow.config index 74ae84d6..61f89783 100644 --- a/nextflow.config +++ b/nextflow.config @@ -19,6 +19,7 @@ params { synapse_config = null force_sratools_download = false skip_fastq_download = false + dbgap_key = null // Boilerplate options outdir = null diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/main.nf b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/main.nf index 1e1d0d7b..22b756ca 100644 --- a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/main.nf +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/main.nf @@ -23,13 +23,21 @@ workflow FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS { // // Prefetch sequencing reads in SRA format. // - SRATOOLS_PREFETCH ( ch_sra_ids, settings ) + if (!params.dbgap_key) { + SRATOOLS_PREFETCH ( ch_sra_ids, settings, [] ) + } else { + SRATOOLS_PREFETCH ( ch_sra_ids, settings, certificate = file(params.dbgap_key, checkIfExists: true) ) + } ch_versions = ch_versions.mix(SRATOOLS_PREFETCH.out.versions.first()) // // Convert the SRA format into one or more compressed FASTQ files. // - SRATOOLS_FASTERQDUMP ( SRATOOLS_PREFETCH.out.sra, settings ) + if (!params.dbgap_key) { + SRATOOLS_FASTERQDUMP ( SRATOOLS_PREFETCH.out.sra, settings, [] ) + } else { + SRATOOLS_FASTERQDUMP ( SRATOOLS_PREFETCH.out.sra, settings, certificate = file(params.dbgap_key, checkIfExists: true) ) + } ch_versions = ch_versions.mix(SRATOOLS_FASTERQDUMP.out.versions.first()) emit: From b71105020bfc4cef617ebb2c609fe52e756ca41e Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Mon, 8 May 2023 18:08:45 +0000 Subject: [PATCH 269/852] refactor: simplify logic for params.dbgap_key --- .../main.nf | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/main.nf b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/main.nf index 22b756ca..965d8779 100644 --- a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/main.nf +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/main.nf @@ -21,23 +21,26 @@ workflow FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS { ch_versions = ch_versions.mix(CUSTOM_SRATOOLSNCBISETTINGS.out.versions) // - // Prefetch sequencing reads in SRA format. + // Prefetch sequencing reads in SRA format and convert into one or more compressed FASTQ files. + // If specified in params, use the provided JWT file for pulling protected SRA runs, else provide + // an empty list. // + if (!params.dbgap_key) { - SRATOOLS_PREFETCH ( ch_sra_ids, settings, [] ) - } else { - SRATOOLS_PREFETCH ( ch_sra_ids, settings, certificate = file(params.dbgap_key, checkIfExists: true) ) - } - ch_versions = ch_versions.mix(SRATOOLS_PREFETCH.out.versions.first()) + + SRATOOLS_PREFETCH ( ch_sra_ids, settings, [] ) + SRATOOLS_FASTERQDUMP ( SRATOOLS_PREFETCH.out.sra, settings, [] ) - // - // Convert the SRA format into one or more compressed FASTQ files. - // - if (!params.dbgap_key) { - SRATOOLS_FASTERQDUMP ( SRATOOLS_PREFETCH.out.sra, settings, [] ) } else { - SRATOOLS_FASTERQDUMP ( SRATOOLS_PREFETCH.out.sra, settings, certificate = file(params.dbgap_key, checkIfExists: true) ) + + certificate = file(params.dbgap_key, checkIfExists: true) // optional input channel for JWT + + SRATOOLS_PREFETCH ( ch_sra_ids, settings, certificate ) + SRATOOLS_FASTERQDUMP ( SRATOOLS_PREFETCH.out.sra, settings, certificate ) + } + + ch_versions = ch_versions.mix(SRATOOLS_PREFETCH.out.versions.first()) ch_versions = ch_versions.mix(SRATOOLS_FASTERQDUMP.out.versions.first()) emit: From acf5ed960574e41de5f13e9cea1bda73a2d50b8b Mon Sep 17 00:00:00 2001 From: ejseqera Date: Mon, 8 May 2023 14:23:24 -0400 Subject: [PATCH 270/852] chore(nextflow_schema.json): update schema with dbgap_key param --- nextflow_schema.json | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/nextflow_schema.json b/nextflow_schema.json index 563c5e7b..487de1e6 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -64,6 +64,13 @@ "fa_icon": "fas fa-fast-forward", "description": "Only download metadata for public data database ids and don't download the FastQ files." }, + "dbgap_key": { + "type": "string", + "default": null, + "fa_icon": "fas fa-address-card", + "help_text": "Path to a JWT cart file used to access protected dbGAP data on SRA using the sra-toolkit. Users with granted access to controlled data can download the JWT cart file for the study from the SRA Run Selector upon logging in. The JWT file can only be used on cloud platforms and is valid for 1 hour upon creation.", + "format": "file-path" + }, "outdir": { "type": "string", "format": "directory-path", From a56363538ff1c1d901e8d88d5643bd531e8f204d Mon Sep 17 00:00:00 2001 From: ejseqera Date: Mon, 8 May 2023 14:39:03 -0400 Subject: [PATCH 271/852] docs(usage.md): add usage detail on providing jwt file --- docs/usage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/usage.md b/docs/usage.md index 55e47133..0f47198f 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -22,7 +22,7 @@ The pipeline has been set-up to automatically download and process the raw FastQ If `SRR`/`ERR`/`DRR` run ids are provided then these will be resolved back to their appropriate `SRX`/`ERX`/`DRX` ids to be able to merge multiple runs from the same experiment. This is conceptually the same as merging multiple libraries sequenced from the same sample. -The final sample information for all identifiers is obtained from the ENA which provides direct download links for FastQ files as well as their associated md5 sums. If download links exist, the files will be downloaded in parallel by FTP. Otherwise they are downloaded using sra-tools. +The final sample information for all identifiers is obtained from the ENA which provides direct download links for FastQ files as well as their associated md5 sums. If download links exist, the files will be downloaded in parallel by FTP. Otherwise they are downloaded using sra-tools. To download protected dbGAP data using sra-tools, a JWT cart file can be specified with `--dbgap_key /path/to/cart.jwt`. All of the sample metadata obtained from the ENA will be appended as additional columns to help you manually curate the generated samplesheet before you run the pipeline. You can customise the metadata fields that are appended to the samplesheet via the `--ena_metadata_fields` parameter. The default list of fields used by the pipeline can be found at the top of the [`bin/sra_ids_to_runinfo.py`](https://github.com/nf-core/fetchngs/blob/master/bin/sra_ids_to_runinfo.py) script within the pipeline repo. However, this pipeline requires a minimal set of fields to download FastQ files i.e. `'run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5'`. A comprehensive list of accepted metadata fields can be obtained from the [ENA API](https://www.ebi.ac.uk/ena/portal/api/returnFields?dataPortal=ena&format=tsv&result=read_run). From 87b2bd8ea3d0dd87113a2318f68f991dd22477bf Mon Sep 17 00:00:00 2001 From: ejseqera Date: Mon, 8 May 2023 21:45:19 -0400 Subject: [PATCH 272/852] chore: update changelog --- CHANGELOG.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c1bf6a64..066e3d71 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,12 +19,14 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements ### Enhancements & fixes -- [#85](https://github.com/nf-core/fetchngs/issues/85) - Not able to fetch metadata for ERR\* ids associated with ArrayExpress -- [#129](https://github.com/nf-core/fetchngs/issues/129) - Pipeline is working with SRA run IDs, but failing with corresponding Biosample IDs +- [#85](https://github.com/nf-core/fetchngs/issues/85) - Not able to fetch metadata for ERR ids associated with ArrayExpress +- [#129](https://github.com/nf-core/fetchngs/issues/129) - Pipeline is working with SRA run ids but failing with corresponding Biosample ids - [#144](https://github.com/nf-core/fetchngs/issues/144) - Add support to download 10X Genomics data -- [#148](https://github.com/nf-core/fetchngs/pull/148) - Fix default metadata fields for ENA API v2.0 -- Bumped modules version to allow for sratools download of sralite format files. -- Updated pipeline template to [nf-core/tools 2.8](https://github.com/nf-core/tools/releases/tag/2.8) +- [PR #140](https://github.com/nf-core/fetchngs/pull/140) - Bumped modules version to allow for sratools download of sralite format files +- [PR #147](https://github.com/nf-core/fetchngs/pull/147) - Updated pipeline template to [nf-core/tools 2.8](https://github.com/nf-core/tools/releases/tag/2.8) +- [PR #148](https://github.com/nf-core/fetchngs/pull/148) - Fix default metadata fields for ENA API v2.0 +- [PR #150](https://github.com/nf-core/fetchngs/pull/150) - Add infrastructure and CI for multi-cloud full-sized tests run via Nextflow Tower +- [PR #152](https://github.com/nf-core/fetchngs/pull/152) - Add support for downloading protected dbGAP data using a JWT file ### Software dependencies From 1265a8fb9e55c6139bfb139205fb50b0ccd74356 Mon Sep 17 00:00:00 2001 From: ejseqera Date: Tue, 9 May 2023 23:38:12 -0400 Subject: [PATCH 273/852] fix: update gse resolver to use esearch api endpoint --- bin/sra_ids_to_runinfo.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/bin/sra_ids_to_runinfo.py b/bin/sra_ids_to_runinfo.py index 6cf16800..4297590f 100755 --- a/bin/sra_ids_to_runinfo.py +++ b/bin/sra_ids_to_runinfo.py @@ -14,7 +14,7 @@ from urllib.error import HTTPError, URLError from urllib.parse import urlencode from urllib.request import urlopen - +import json logger = logging.getLogger() @@ -240,16 +240,13 @@ def _id_to_srx(cls, identifier): @classmethod def _gse_to_srx(cls, identifier): - """Resolve the identifier to SRA experiments.""" + """Resolve the GEO identifier to SRA experiments.""" ids = [] - params = {"id": identifier, "db": "gds", "rettype": "runinfo", "retmode": "text"} - response = fetch_url(f"https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?{urlencode(params)}") + params = {"term": identifier, "db": "sra", "retmode": "json"} + response = fetch_url(f"https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?{urlencode(params)}") cls._content_check(response, identifier) - gsm_ids = [ - line.split("=")[1].strip() - for line in response.text().splitlines() - if line.split("=")[1].strip().startswith("GSM") - ] + r_json = json.loads(response.text()) + gsm_ids = r_json['esearchresult']['idlist'] for gsm_id in gsm_ids: ids += cls._id_to_srx(gsm_id) return ids From 0bdeac4b44d311f03e095355ef4a57e83e758a8d Mon Sep 17 00:00:00 2001 From: ejseqera Date: Wed, 10 May 2023 01:29:04 -0400 Subject: [PATCH 274/852] feat: add support for GSE/GDS IDs and resolver to GSM then SRA --- bin/sra_ids_to_runinfo.py | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/bin/sra_ids_to_runinfo.py b/bin/sra_ids_to_runinfo.py index 4297590f..fc8942d1 100755 --- a/bin/sra_ids_to_runinfo.py +++ b/bin/sra_ids_to_runinfo.py @@ -188,7 +188,8 @@ def is_valid(cls, identifier): class DatabaseResolver: """Define a service class for resolving various identifiers to experiments.""" - _GEO_PREFIXES = {"GSE", "GSM"} + _GEO_GSM_PREFIXES = {"GSM"} + _GEO_GSE_PREFIXES = {"GDS", "GSE"} _SRA_PREFIXES = { "PRJNA", "DRA", @@ -214,7 +215,9 @@ def expand_identifier(cls, identifier): """ prefix = ID_REGEX.match(identifier).group(1) - if prefix in cls._GEO_PREFIXES: + if prefix in cls._GEO_GSM_PREFIXES: + return cls._gsm_to_srx(identifier) + elif prefix in cls._GEO_GSE_PREFIXES: return cls._gse_to_srx(identifier) elif prefix in cls._SRA_PREFIXES: return cls._id_to_srx(identifier) @@ -239,7 +242,7 @@ def _id_to_srx(cls, identifier): return [row["Experiment"] for row in open_table(response, delimiter=",")] @classmethod - def _gse_to_srx(cls, identifier): + def _gsm_to_srx(cls, identifier): """Resolve the GEO identifier to SRA experiments.""" ids = [] params = {"term": identifier, "db": "sra", "retmode": "json"} @@ -250,6 +253,32 @@ def _gse_to_srx(cls, identifier): for gsm_id in gsm_ids: ids += cls._id_to_srx(gsm_id) return ids + + @classmethod + def _gds_to_gsm(cls, identifier): + """Resolve the GEO UIDs to GSM IDs to then resolve to SRA IDs.""" + ids = [] + params = {"id": identifier, "db": "gds", "retmode": "json", "retmax": 10} + response = fetch_url(f"https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?{urlencode(params)}") + cls._content_check(response, identifier) + r_json = json.loads(response.text()) + + for each in r_json['result'][identifier]['samples'][0:]: + ids += cls._gsm_to_srx(each['accession']) + return ids + + @classmethod + def _gse_to_srx(cls, identifier): + """Resolve the GSE identifier to GEO UIDs.""" + ids = [] + params = {"term": identifier, "db": "gds", "retmode": "json"} + response = fetch_url(f"https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?{urlencode(params)}") + cls._content_check(response, identifier) + r_json = json.loads(response.text()) + gds_uids = r_json['esearchresult']['idlist'] + for gds_uid in gds_uids: + ids += cls._gds_to_gsm(gds_uid) + return ids @classmethod def _id_to_erx(cls, identifier): From 0c226d2aaf2a539ef428974f78c7585f98b797f6 Mon Sep 17 00:00:00 2001 From: ejseqera Date: Wed, 10 May 2023 01:29:53 -0400 Subject: [PATCH 275/852] fix: remove support for bioproject ID (doesn't work) --- bin/sra_ids_to_runinfo.py | 1 - 1 file changed, 1 deletion(-) diff --git a/bin/sra_ids_to_runinfo.py b/bin/sra_ids_to_runinfo.py index fc8942d1..84a6623d 100755 --- a/bin/sra_ids_to_runinfo.py +++ b/bin/sra_ids_to_runinfo.py @@ -191,7 +191,6 @@ class DatabaseResolver: _GEO_GSM_PREFIXES = {"GSM"} _GEO_GSE_PREFIXES = {"GDS", "GSE"} _SRA_PREFIXES = { - "PRJNA", "DRA", "DRP", "DRS", From bd540c0b1dd4f5cc2e3bc9a7cef19d92ecb52857 Mon Sep 17 00:00:00 2001 From: sirclockalot Date: Wed, 10 May 2023 13:59:37 +0200 Subject: [PATCH 276/852] Update nextflow_schema.json Corrected the url for ena metadata --- nextflow_schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 696914e4..fc0e83ee 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -32,7 +32,7 @@ "type": "string", "fa_icon": "fas fa-columns", "description": "Comma-separated list of ENA metadata fields to fetch before downloading data.", - "help_text": "The default list of fields used by the pipeline can be found at the top of the [`bin/sra_ids_to_runinfo.py`](https://github.com/nf-core/fetchngs/blob/master/bin/sra_ids_to_runinfo.py) script within the pipeline repo. This pipeline requires a minimal set of fields to download FastQ files i.e. `'run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5'`. Full list of accepted metadata fields can be obtained from the [ENA API](https://www.ebi.ac.uk/ena/portal/api/returnFields?dataPortal=ena&format=tsv&result=read_run])." + "help_text": "The default list of fields used by the pipeline can be found at the top of the [`bin/sra_ids_to_runinfo.py`](https://github.com/nf-core/fetchngs/blob/master/bin/sra_ids_to_runinfo.py) script within the pipeline repo. This pipeline requires a minimal set of fields to download FastQ files i.e. `'run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5'`. Full list of accepted metadata fields can be obtained from the [ENA API](https://www.ebi.ac.uk/ena/portal/api/returnFields?dataPortal=ena&format=tsv&result=read_run)." }, "sample_mapping_fields": { "type": "string", From a17861a2e04541b69ce4eda4e482a82ff7113aa6 Mon Sep 17 00:00:00 2001 From: Robert Syme Date: Wed, 10 May 2023 22:51:42 +0000 Subject: [PATCH 277/852] Set a default docker registry outside of profile scope. The `docker.registry` configuration should always be set, as running on cloud executors will need to pull docker images but will not necessarily use the `docker` profile. --- nextflow.config | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 74ae84d6..3f336ca7 100644 --- a/nextflow.config +++ b/nextflow.config @@ -96,7 +96,6 @@ profiles { } docker { docker.enabled = true - docker.registry = 'quay.io' docker.userEmulation = true conda.enabled = false singularity.enabled = false @@ -179,6 +178,9 @@ env { // Capture exit codes from upstream processes when piping process.shell = ['/bin/bash', '-euo', 'pipefail'] +// Set default docker registry (will be unused unless pulling docker images) +docker.registry = 'quay.io' + def trace_timestamp = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss') timeline { enabled = true From 3fdb87991fa6172bf444343c6022dd22ed251fbc Mon Sep 17 00:00:00 2001 From: ejseqera Date: Wed, 10 May 2023 19:03:57 -0400 Subject: [PATCH 278/852] chore: update docs to support GEO IDs, remove error handling for GEO --- README.md | 15 ++------------- assets/schema_input.json | 4 ++-- docs/output.md | 6 +++--- docs/usage.md | 18 +++++++++--------- lib/WorkflowMain.groovy | 4 ++-- lib/WorkflowSra.groovy | 19 +------------------ main.nf | 4 ++-- nextflow_schema.json | 2 +- workflows/sra.nf | 7 ------- 9 files changed, 22 insertions(+), 57 deletions(-) diff --git a/README.md b/README.md index 94e6a5ba..a14f7fb1 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ ## Introduction -**nf-core/fetchngs** is a bioinformatics pipeline to fetch metadata and raw FastQ files from both public and private databases. At present, the pipeline supports SRA / ENA / DDBJ / Synapse ids (see [usage docs](https://nf-co.re/fetchngs/usage#introduction)). +**nf-core/fetchngs** is a bioinformatics pipeline to fetch metadata and raw FastQ files from both public and private databases. At present, the pipeline supports SRA / ENA / DDBJ / GEO / Synapse ids (see [usage docs](https://nf-co.re/fetchngs/usage#introduction)). ## Usage @@ -56,7 +56,7 @@ For more details, please refer to the [usage documentation](https://nf-co.re/fet Via a single file of ids, provided one-per-line (see [example input file](https://raw.githubusercontent.com/nf-core/test-datasets/fetchngs/sra_ids_test.csv)) the pipeline performs the following steps: -### SRA / ENA / DDBJ ids +### SRA / ENA / DDBJ / GEO ids 1. Resolve database ids back to appropriate experiment-level ids and to be compatible with the [ENA API](https://ena-docs.readthedocs.io/en/latest/retrieval/programmatic-access.html) 2. Fetch extensive id metadata via ENA API @@ -65,17 +65,6 @@ Via a single file of ids, provided one-per-line (see [example input file](https: - Otherwise use [`sra-tools`](https://github.com/ncbi/sra-tools) to download `.sra` files and convert them to FastQ 4. Collate id metadata and paths to FastQ files in a single samplesheet -### GEO ids - -Support for GEO ids was dropped in [[v1.7](https://github.com/nf-core/fetchngs/releases/tag/1.7)] due to breaking changes introduced in the NCBI API. For more detailed information please see [this PR](https://github.com/nf-core/fetchngs/pull/102). - -As a workaround, if you have a GEO accession you can directly download a text file containing the appropriate SRA ids to pass to the pipeline instead: - -- Search for your GEO accession on [GEO](https://www.ncbi.nlm.nih.gov/geo) -- Click `SRA Run Selector` at the bottom of the GEO accession page -- Select the desired samples in the `SRA Run Selector` and then download the `Accession List` - -This downloads a text file called `SRR_Acc_List.txt` that can be directly provided to the pipeline once renamed with a .csv extension e.g. `--input SRR_Acc_List.csv`. ### Synapse ids diff --git a/assets/schema_input.json b/assets/schema_input.json index 71f0f976..9a800216 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -8,8 +8,8 @@ "type": "array", "items": { "type": "string", - "pattern": "^(((SR|ER|DR)[APRSX])|(SAM(N|EA|D))|(PRJ(NA|EB|DB))|(syn))(\\d+)$", - "errorMessage": "Please provide a valid SRA, ENA, DDBJ identifier" + "pattern": "^(((SR|ER|DR)[APRSX])|(SAM(N|EA|D))|(PRJ(NA|EB|DB))|(GS[EM])|(syn))(\\d+)$", + "errorMessage": "Please provide a valid SRA, ENA, DDBJ or GEO identifier" } } } diff --git a/docs/output.md b/docs/output.md index daaca914..7402976c 100644 --- a/docs/output.md +++ b/docs/output.md @@ -9,19 +9,19 @@ This document describes the output produced by the pipeline. The directories lis The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data depending on the type of ids provided: - Download FastQ files and create samplesheet from: - 1. [SRA / ENA / DDBJ ids](#sra--ena--ddbj-ids) + 1. [SRA / ENA / DDBJ / GEO ids](#sra--ena--ddbj--geo-ids) 2. [Synapse ids](#synapse-ids) - [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution Please see the [usage documentation](https://nf-co.re/fetchngs/usage#introduction) for a list of supported public repository identifiers and how to provide them to the pipeline. -### SRA / ENA / DDBJ ids +### SRA / ENA / DDBJ / GEO ids
Output files - `fastq/` - - `*.fastq.gz`: Paired-end/single-end reads downloaded from the SRA / ENA / DDBJ. + - `*.fastq.gz`: Paired-end/single-end reads downloaded from the SRA / ENA / DDBJ / GEO. - `fastq/md5/` - `*.md5`: Files containing `md5` sum for FastQ files downloaded from the ENA. - `samplesheet/` diff --git a/docs/usage.md b/docs/usage.md index 55e47133..c2e32fa0 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -8,15 +8,15 @@ The pipeline has been set-up to automatically download and process the raw FastQ files from both public and private repositories. Identifiers can be provided in a file, one-per-line via the `--input` parameter. Currently, the following types of example identifiers are supported: -| `SRA` | `ENA` | `DDBJ` | `Synapse` | -| ------------ | ------------ | ------------ | ----------- | -| SRR11605097 | ERR4007730 | DRR171822 | syn26240435 | -| SRX8171613 | ERX4009132 | DRX162434 | | -| SRS6531847 | ERS4399630 | DRS090921 | | -| SAMN14689442 | SAMEA6638373 | SAMD00114846 | | -| SRP256957 | ERP120836 | DRP004793 | | -| SRA1068758 | ERA2420837 | DRA008156 | | -| PRJNA625551 | PRJEB37513 | PRJDB4176 | | +| `SRA` | `ENA` | `DDBJ` | `GEO` | `Synapse` | +| ------------ | ------------ | ------------ | ----------- | ----------- | +| SRR11605097 | ERR4007730 | DRR171822 | GSM4432381 | syn26240435 | +| SRX8171613 | ERX4009132 | DRX162434 | GSE147507 | | +| SRS6531847 | ERS4399630 | DRS090921 | | | +| SAMN14689442 | SAMEA6638373 | SAMD00114846 | | | +| SRP256957 | ERP120836 | DRP004793 | | | +| SRA1068758 | ERA2420837 | DRA008156 | | | +| PRJNA625551 | PRJEB37513 | PRJDB4176 | | | ### SRR / ERR / DRR ids diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index 13fd6d82..99858d2a 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -111,7 +111,7 @@ class WorkflowMain { if (num_match == total_ids) { is_sra = true } else { - Nextflow.error("Mixture of ids provided via --input: ${no_match_ids.join(', ')}\nPlease provide either SRA / ENA / DDBJ or Synapse ids!") + Nextflow.error("Mixture of ids provided via --input: ${no_match_ids.join(', ')}\nPlease provide either SRA / ENA / GEO / DDBJ or Synapse ids!") } } return is_sra @@ -135,7 +135,7 @@ class WorkflowMain { if (num_match == total_ids) { is_synapse = true } else { - Nextflow.error("Mixture of ids provided via --input: ${no_match_ids.join(', ')}\nPlease provide either SRA / ENA / DDBJ or Synapse ids!") + Nextflow.error("Mixture of ids provided via --input: ${no_match_ids.join(', ')}\nPlease provide either SRA / ENA / GEO / DDBJ or Synapse ids!") } } return is_synapse diff --git a/lib/WorkflowSra.groovy b/lib/WorkflowSra.groovy index 061f7ffb..2cd5ab75 100755 --- a/lib/WorkflowSra.groovy +++ b/lib/WorkflowSra.groovy @@ -30,21 +30,4 @@ class WorkflowSra { " running nf-core/other pipelines.\n" + "===================================================================================" } - - // Fail pipeline if input ids are from the GEO - public static void isGeoFail(ids) { - def pattern = /^(GS[EM])(\d+)$/ - for (id in ids) { - if (id =~ pattern) { - def error_string = "===================================================================================\n" + - " GEO id detected: ${id}\n" + - " Support for GEO ids was dropped in v1.7 due to breaking changes in the NCBI API.\n" + - " Please remove any GEO ids from the input samplesheet.\n\n" + - " Please see:\n" + - " https://github.com/nf-core/fetchngs/pull/102\n" + - "===================================================================================" - Nextflow.error(error_string) - } - } - } -} +} \ No newline at end of file diff --git a/main.nf b/main.nf index e7d67165..6da732be 100644 --- a/main.nf +++ b/main.nf @@ -44,7 +44,7 @@ if (WorkflowMain.isSraId(ch_input)) { } else if (WorkflowMain.isSynapseId(ch_input)) { input_type = 'synapse' } else { - exit 1, 'Ids provided via --input not recognised please make sure they are either SRA / ENA / DDBJ or Synapse ids!' + exit 1, 'Ids provided via --input not recognised please make sure they are either SRA / ENA / GEO / DDBJ or Synapse ids!' } if (params.input_type == input_type) { @@ -63,7 +63,7 @@ if (params.input_type == input_type) { workflow NFCORE_FETCHNGS { // - // WORKFLOW: Download FastQ files for SRA / ENA / DDBJ ids + // WORKFLOW: Download FastQ files for SRA / ENA / GEO / DDBJ ids // if (params.input_type == 'sra') { SRA ( ch_ids ) diff --git a/nextflow_schema.json b/nextflow_schema.json index 563c5e7b..3f72c2f1 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -19,7 +19,7 @@ "pattern": "^\\S+\\.(csv|tsv|txt)$", "schema": "assets/schema_input.json", "fa_icon": "fas fa-file-excel", - "description": "File containing SRA/ENA/DDBJ identifiers one per line to download their associated metadata and FastQ files." + "description": "File containing SRA/ENA/GEO/DDBJ identifiers one per line to download their associated metadata and FastQ files." }, "input_type": { "type": "string", diff --git a/workflows/sra.nf b/workflows/sra.nf index e3ac447f..ae891aab 100644 --- a/workflows/sra.nf +++ b/workflows/sra.nf @@ -50,13 +50,6 @@ workflow SRA { main: ch_versions = Channel.empty() - // - // Fail the pipeline if GEO ids detected - // - ids - .collect() - .map { WorkflowSra.isGeoFail(it) } - // // MODULE: Get SRA run information for public database ids // From d19e7f41f6609d03d3814df65930d176a0a97e38 Mon Sep 17 00:00:00 2001 From: ejseqera Date: Wed, 10 May 2023 19:26:08 -0400 Subject: [PATCH 279/852] chore: update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4bb46ddb..5fe8e99a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements - [PR #147](https://github.com/nf-core/fetchngs/pull/147) - Updated pipeline template to [nf-core/tools 2.8](https://github.com/nf-core/tools/releases/tag/2.8) - [PR #148](https://github.com/nf-core/fetchngs/pull/148) - Fix default metadata fields for ENA API v2.0 - [PR #150](https://github.com/nf-core/fetchngs/pull/150) - Add infrastructure and CI for multi-cloud full-sized tests run via Nextflow Tower +- [PR #155](https://github.com/nf-core/fetchngs/pull/155) - Add support back in for [GEO IDs](https://www.ncbi.nlm.nih.gov/geo) (removed in v1.7) ### Software dependencies From 2db65cc1e6f6fb09877888b341516d75181b79ed Mon Sep 17 00:00:00 2001 From: ejseqera Date: Wed, 10 May 2023 23:24:26 -0400 Subject: [PATCH 280/852] docs: update usage.md with dbGAP download details --- docs/usage.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/docs/usage.md b/docs/usage.md index 0f47198f..231da022 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -22,7 +22,7 @@ The pipeline has been set-up to automatically download and process the raw FastQ If `SRR`/`ERR`/`DRR` run ids are provided then these will be resolved back to their appropriate `SRX`/`ERX`/`DRX` ids to be able to merge multiple runs from the same experiment. This is conceptually the same as merging multiple libraries sequenced from the same sample. -The final sample information for all identifiers is obtained from the ENA which provides direct download links for FastQ files as well as their associated md5 sums. If download links exist, the files will be downloaded in parallel by FTP. Otherwise they are downloaded using sra-tools. To download protected dbGAP data using sra-tools, a JWT cart file can be specified with `--dbgap_key /path/to/cart.jwt`. +The final sample information for all identifiers is obtained from the ENA which provides direct download links for FastQ files as well as their associated md5 sums. If download links exist, the files will be downloaded in parallel by FTP. Otherwise they are downloaded using sra-tools. All of the sample metadata obtained from the ENA will be appended as additional columns to help you manually curate the generated samplesheet before you run the pipeline. You can customise the metadata fields that are appended to the samplesheet via the `--ena_metadata_fields` parameter. The default list of fields used by the pipeline can be found at the top of the [`bin/sra_ids_to_runinfo.py`](https://github.com/nf-core/fetchngs/blob/master/bin/sra_ids_to_runinfo.py) script within the pipeline repo. However, this pipeline requires a minimal set of fields to download FastQ files i.e. `'run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5'`. A comprehensive list of accepted metadata fields can be obtained from the [ENA API](https://www.ebi.ac.uk/ena/portal/api/returnFields?dataPortal=ena&format=tsv&result=read_run). @@ -70,6 +70,15 @@ From v1.9 of this pipeline the default `strandedness` in the output samplesheet If FTP connections are blocked on your network use the [`--force_sratools_download`](https://nf-co.re/fetchngs/parameters#force_sratools_download) parameter to force the pipeline to download data using sra-tools instead of the ENA FTP. +### Downloading dbGAP data with JWT + +As of v1.10, the SRA Toolkit used in this pipeline can be configured to access protected data from dbGAP using a [JWT cart file](https://www.ncbi.nlm.nih.gov/sra/docs/sra-dbGAP-cloud-download/). The JWT cart file can be specified with `--dbgap_key /path/to/cart.jwt`. + + +Note that due to the way the pipeline resolves SRA IDs down to the experiment to be able to merge multiple runs, your JWT cart file must be generated for *all* runs in an experiment. Otherwise, upon running `prefetch` and `fasterq-dump`, the pipeline will return a `403 Error` when trying to download data for other runs under an experiment that are not authenticated for with the provided JWT cart file. + +Users can log into the [SRA Run Selector](https://www.ncbi.nlm.nih.gov/Traces/study/), search for the dbGAP study they have been granted access to using the phs identifier, and select all available runs to activate the `JWT Cart` button to download the file. + ## Running the pipeline The typical command for running the pipeline is as follows: From b2c3d5ba69c43005fa285576b7d709904f5d219a Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 11 May 2023 08:25:47 +0100 Subject: [PATCH 281/852] Update nextflow.config --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 3f336ca7..fe374cae 100644 --- a/nextflow.config +++ b/nextflow.config @@ -178,7 +178,7 @@ env { // Capture exit codes from upstream processes when piping process.shell = ['/bin/bash', '-euo', 'pipefail'] -// Set default docker registry (will be unused unless pulling docker images) +// Set default docker registry (will not be used unless pulling docker images) docker.registry = 'quay.io' def trace_timestamp = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss') From b80afbb4160b4c727f1337b13be4f33fa401220a Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Thu, 11 May 2023 11:07:39 +0200 Subject: [PATCH 282/852] Update nextflow.config --- nextflow.config | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/nextflow.config b/nextflow.config index fe374cae..b554f445 100644 --- a/nextflow.config +++ b/nextflow.config @@ -119,7 +119,6 @@ profiles { } podman { podman.enabled = true - podman.registry = 'quay.io' conda.enabled = false docker.enabled = false singularity.enabled = false @@ -178,8 +177,11 @@ env { // Capture exit codes from upstream processes when piping process.shell = ['/bin/bash', '-euo', 'pipefail'] -// Set default docker registry (will not be used unless pulling docker images) +// Set default registry for Docker and Podman independent of -profile +// Will not be used unless Docker / Podman are enabled +// Set to your registry if you have a mirror of containers docker.registry = 'quay.io' +podman.registry = 'quay.io' def trace_timestamp = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss') timeline { From 37d0a033a7dd7a2175107af36aca5c577a778087 Mon Sep 17 00:00:00 2001 From: ejseqera Date: Thu, 11 May 2023 14:07:26 -0400 Subject: [PATCH 283/852] chore: apply linting for black and prettier --- bin/sra_ids_to_runinfo.py | 12 ++++++------ lib/WorkflowSra.groovy | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/bin/sra_ids_to_runinfo.py b/bin/sra_ids_to_runinfo.py index 84a6623d..414d32a7 100755 --- a/bin/sra_ids_to_runinfo.py +++ b/bin/sra_ids_to_runinfo.py @@ -248,11 +248,11 @@ def _gsm_to_srx(cls, identifier): response = fetch_url(f"https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?{urlencode(params)}") cls._content_check(response, identifier) r_json = json.loads(response.text()) - gsm_ids = r_json['esearchresult']['idlist'] + gsm_ids = r_json["esearchresult"]["idlist"] for gsm_id in gsm_ids: ids += cls._id_to_srx(gsm_id) return ids - + @classmethod def _gds_to_gsm(cls, identifier): """Resolve the GEO UIDs to GSM IDs to then resolve to SRA IDs.""" @@ -261,9 +261,9 @@ def _gds_to_gsm(cls, identifier): response = fetch_url(f"https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?{urlencode(params)}") cls._content_check(response, identifier) r_json = json.loads(response.text()) - - for each in r_json['result'][identifier]['samples'][0:]: - ids += cls._gsm_to_srx(each['accession']) + + for each in r_json["result"][identifier]["samples"][0:]: + ids += cls._gsm_to_srx(each["accession"]) return ids @classmethod @@ -274,7 +274,7 @@ def _gse_to_srx(cls, identifier): response = fetch_url(f"https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?{urlencode(params)}") cls._content_check(response, identifier) r_json = json.loads(response.text()) - gds_uids = r_json['esearchresult']['idlist'] + gds_uids = r_json["esearchresult"]["idlist"] for gds_uid in gds_uids: ids += cls._gds_to_gsm(gds_uid) return ids diff --git a/lib/WorkflowSra.groovy b/lib/WorkflowSra.groovy index 2cd5ab75..3c092a6f 100755 --- a/lib/WorkflowSra.groovy +++ b/lib/WorkflowSra.groovy @@ -30,4 +30,4 @@ class WorkflowSra { " running nf-core/other pipelines.\n" + "===================================================================================" } -} \ No newline at end of file +} From 92af4687833ee77874bf3431b7236551a1356d58 Mon Sep 17 00:00:00 2001 From: ejseqera Date: Thu, 11 May 2023 14:13:48 -0400 Subject: [PATCH 284/852] chore: prettier linting --- docs/usage.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 231da022..52eaf63d 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -22,7 +22,7 @@ The pipeline has been set-up to automatically download and process the raw FastQ If `SRR`/`ERR`/`DRR` run ids are provided then these will be resolved back to their appropriate `SRX`/`ERX`/`DRX` ids to be able to merge multiple runs from the same experiment. This is conceptually the same as merging multiple libraries sequenced from the same sample. -The final sample information for all identifiers is obtained from the ENA which provides direct download links for FastQ files as well as their associated md5 sums. If download links exist, the files will be downloaded in parallel by FTP. Otherwise they are downloaded using sra-tools. +The final sample information for all identifiers is obtained from the ENA which provides direct download links for FastQ files as well as their associated md5 sums. If download links exist, the files will be downloaded in parallel by FTP. Otherwise they are downloaded using sra-tools. All of the sample metadata obtained from the ENA will be appended as additional columns to help you manually curate the generated samplesheet before you run the pipeline. You can customise the metadata fields that are appended to the samplesheet via the `--ena_metadata_fields` parameter. The default list of fields used by the pipeline can be found at the top of the [`bin/sra_ids_to_runinfo.py`](https://github.com/nf-core/fetchngs/blob/master/bin/sra_ids_to_runinfo.py) script within the pipeline repo. However, this pipeline requires a minimal set of fields to download FastQ files i.e. `'run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5'`. A comprehensive list of accepted metadata fields can be obtained from the [ENA API](https://www.ebi.ac.uk/ena/portal/api/returnFields?dataPortal=ena&format=tsv&result=read_run). @@ -72,12 +72,11 @@ If FTP connections are blocked on your network use the [`--force_sratools_downlo ### Downloading dbGAP data with JWT -As of v1.10, the SRA Toolkit used in this pipeline can be configured to access protected data from dbGAP using a [JWT cart file](https://www.ncbi.nlm.nih.gov/sra/docs/sra-dbGAP-cloud-download/). The JWT cart file can be specified with `--dbgap_key /path/to/cart.jwt`. - +As of v1.10, the SRA Toolkit used in this pipeline can be configured to access protected data from dbGAP using a [JWT cart file](https://www.ncbi.nlm.nih.gov/sra/docs/sra-dbGAP-cloud-download/). The JWT cart file can be specified with `--dbgap_key /path/to/cart.jwt`. -Note that due to the way the pipeline resolves SRA IDs down to the experiment to be able to merge multiple runs, your JWT cart file must be generated for *all* runs in an experiment. Otherwise, upon running `prefetch` and `fasterq-dump`, the pipeline will return a `403 Error` when trying to download data for other runs under an experiment that are not authenticated for with the provided JWT cart file. +Note that due to the way the pipeline resolves SRA IDs down to the experiment to be able to merge multiple runs, your JWT cart file must be generated for _all_ runs in an experiment. Otherwise, upon running `prefetch` and `fasterq-dump`, the pipeline will return a `403 Error` when trying to download data for other runs under an experiment that are not authenticated for with the provided JWT cart file. -Users can log into the [SRA Run Selector](https://www.ncbi.nlm.nih.gov/Traces/study/), search for the dbGAP study they have been granted access to using the phs identifier, and select all available runs to activate the `JWT Cart` button to download the file. +Users can log into the [SRA Run Selector](https://www.ncbi.nlm.nih.gov/Traces/study/), search for the dbGAP study they have been granted access to using the phs identifier, and select all available runs to activate the `JWT Cart` button to download the file. ## Running the pipeline From 21f37073e8f0041fb036905ddefc90e57cd5afad Mon Sep 17 00:00:00 2001 From: ejseqera Date: Thu, 11 May 2023 14:16:29 -0400 Subject: [PATCH 285/852] chore: lint docs and usage --- README.md | 5 ++--- docs/usage.md | 18 +++++++++--------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index a14f7fb1..4d6c2d35 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ ## Introduction -**nf-core/fetchngs** is a bioinformatics pipeline to fetch metadata and raw FastQ files from both public and private databases. At present, the pipeline supports SRA / ENA / DDBJ / GEO / Synapse ids (see [usage docs](https://nf-co.re/fetchngs/usage#introduction)). +**nf-core/fetchngs** is a bioinformatics pipeline to fetch metadata and raw FastQ files from both public and private databases. At present, the pipeline supports SRA / ENA / DDBJ / GEO / Synapse ids (see [usage docs](https://nf-co.re/fetchngs/usage#introduction)). ## Usage @@ -56,7 +56,7 @@ For more details, please refer to the [usage documentation](https://nf-co.re/fet Via a single file of ids, provided one-per-line (see [example input file](https://raw.githubusercontent.com/nf-core/test-datasets/fetchngs/sra_ids_test.csv)) the pipeline performs the following steps: -### SRA / ENA / DDBJ / GEO ids +### SRA / ENA / DDBJ / GEO ids 1. Resolve database ids back to appropriate experiment-level ids and to be compatible with the [ENA API](https://ena-docs.readthedocs.io/en/latest/retrieval/programmatic-access.html) 2. Fetch extensive id metadata via ENA API @@ -65,7 +65,6 @@ Via a single file of ids, provided one-per-line (see [example input file](https: - Otherwise use [`sra-tools`](https://github.com/ncbi/sra-tools) to download `.sra` files and convert them to FastQ 4. Collate id metadata and paths to FastQ files in a single samplesheet - ### Synapse ids 1. Resolve Synapse directory ids to their corresponding FastQ files ids via the `synapse list` command. diff --git a/docs/usage.md b/docs/usage.md index c2e32fa0..963d9229 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -8,15 +8,15 @@ The pipeline has been set-up to automatically download and process the raw FastQ files from both public and private repositories. Identifiers can be provided in a file, one-per-line via the `--input` parameter. Currently, the following types of example identifiers are supported: -| `SRA` | `ENA` | `DDBJ` | `GEO` | `Synapse` | -| ------------ | ------------ | ------------ | ----------- | ----------- | -| SRR11605097 | ERR4007730 | DRR171822 | GSM4432381 | syn26240435 | -| SRX8171613 | ERX4009132 | DRX162434 | GSE147507 | | -| SRS6531847 | ERS4399630 | DRS090921 | | | -| SAMN14689442 | SAMEA6638373 | SAMD00114846 | | | -| SRP256957 | ERP120836 | DRP004793 | | | -| SRA1068758 | ERA2420837 | DRA008156 | | | -| PRJNA625551 | PRJEB37513 | PRJDB4176 | | | +| `SRA` | `ENA` | `DDBJ` | `GEO` | `Synapse` | +| ------------ | ------------ | ------------ | ---------- | ----------- | +| SRR11605097 | ERR4007730 | DRR171822 | GSM4432381 | syn26240435 | +| SRX8171613 | ERX4009132 | DRX162434 | GSE147507 | | +| SRS6531847 | ERS4399630 | DRS090921 | | | +| SAMN14689442 | SAMEA6638373 | SAMD00114846 | | | +| SRP256957 | ERP120836 | DRP004793 | | | +| SRA1068758 | ERA2420837 | DRA008156 | | | +| PRJNA625551 | PRJEB37513 | PRJDB4176 | | | ### SRR / ERR / DRR ids From 0cb79229dc5d82bb4601ccfb8de87e5a22df3b7d Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sat, 13 May 2023 20:27:31 +0100 Subject: [PATCH 286/852] Remove quay.io prefix from mulled containers --- modules/nf-core/sratools/fasterqdump/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/nf-core/sratools/fasterqdump/main.nf b/modules/nf-core/sratools/fasterqdump/main.nf index 2336c318..57a3dc9c 100644 --- a/modules/nf-core/sratools/fasterqdump/main.nf +++ b/modules/nf-core/sratools/fasterqdump/main.nf @@ -5,7 +5,7 @@ process SRATOOLS_FASTERQDUMP { conda "bioconda::sra-tools=2.11.0 conda-forge::pigz=2.6" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:6a9ff0e76ec016c3d0d27e0c0d362339f2d787e6-0' : - 'quay.io/biocontainers/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:6a9ff0e76ec016c3d0d27e0c0d362339f2d787e6-0' }" + 'biocontainers/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:6a9ff0e76ec016c3d0d27e0c0d362339f2d787e6-0' }" input: tuple val(meta), path(sra) From c5839cafa06732333faa7474397dacba6ba25d9d Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sat, 13 May 2023 20:43:22 +0100 Subject: [PATCH 287/852] Add public_aws_ecr.config and use in CI tests --- .github/workflows/cloud_tests_full.yml | 2 +- .github/workflows/cloud_tests_small.yml | 2 +- conf/public_aws_ecr.config | 18 ++++++++++++++++++ nextflow.config | 3 +++ 4 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 conf/public_aws_ecr.config diff --git a/.github/workflows/cloud_tests_full.yml b/.github/workflows/cloud_tests_full.yml index d0ed0552..e25a97aa 100644 --- a/.github/workflows/cloud_tests_full.yml +++ b/.github/workflows/cloud_tests_full.yml @@ -27,7 +27,7 @@ jobs: compute_env: ${{ secrets.TOWER_CE_AWS_CPU }} workdir: "${{ secrets.TOWER_BUCKET_AWS }}/work/fetchngs/work-${{ github.sha }}" run_name: "aws_fetchngs_full" - profiles: test_full + profiles: test_full,public_aws_ecr parameters: | { "hook_url": "${{ secrets.MEGATESTS_ALERTS_SLACK_HOOK_URL }}", diff --git a/.github/workflows/cloud_tests_small.yml b/.github/workflows/cloud_tests_small.yml index 12b8daab..e7636fdc 100644 --- a/.github/workflows/cloud_tests_small.yml +++ b/.github/workflows/cloud_tests_small.yml @@ -25,7 +25,7 @@ jobs: compute_env: ${{ secrets.TOWER_CE_AWS_CPU }} workdir: "${{ secrets.TOWER_BUCKET_AWS }}/work/fetchngs/work-${{ github.sha }}" run_name: "aws_fetchngs_small" - profiles: test + profiles: test,public_aws_ecr parameters: | { "outdir": "${{ secrets.TOWER_BUCKET_AWS }}/fetchngs/results-test-${{ github.sha }}" diff --git a/conf/public_aws_ecr.config b/conf/public_aws_ecr.config new file mode 100644 index 00000000..59ac8c01 --- /dev/null +++ b/conf/public_aws_ecr.config @@ -0,0 +1,18 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + AWS ECR Config +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Config to set public AWS ECR images wherever possible + This improves speed when running on AWS infrastructure. + Use this as an example template when using your own private registry. +---------------------------------------------------------------------------------------- +*/ + +docker.registry = 'public.ecr.aws' +podman.registry = 'public.ecr.aws' + +process { + withName: '.*:SRATOOLS_FASTERQDUMP' { + container = 'quay.io/biocontainers/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:6a9ff0e76ec016c3d0d27e0c0d362339f2d787e6-0' + } +} \ No newline at end of file diff --git a/nextflow.config b/nextflow.config index b554f445..18e065d0 100644 --- a/nextflow.config +++ b/nextflow.config @@ -158,6 +158,9 @@ profiles { executor.cpus = 16 executor.memory = 60.GB } + public_aws_ecr { + includeConfig 'conf/public_aws_ecr.config' + } test { includeConfig 'conf/test.config' } test_synapse { includeConfig 'conf/test_synapse.config' } test_full { includeConfig 'conf/test_full.config' } From 6a47ccd3c7e8e0e3450e52062fc159f7dbaf8687 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sat, 13 May 2023 20:44:59 +0100 Subject: [PATCH 288/852] Update CHANGELOG --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4bb46ddb..297d1941 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ Special thanks to the following for their contributions to the release: - [Maxime Garcia](https://github.com/maxulysse) - [Moritz E. Beber](https://github.com/Midnighter) - [Rob Syme](https://github.com/robsyme) +- [sirclockalot](https://github.com/sirclockalot) Thank you to everyone else that has contributed by reporting bugs, enhancements or in any other way, shape or form. @@ -26,6 +27,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements - [PR #147](https://github.com/nf-core/fetchngs/pull/147) - Updated pipeline template to [nf-core/tools 2.8](https://github.com/nf-core/tools/releases/tag/2.8) - [PR #148](https://github.com/nf-core/fetchngs/pull/148) - Fix default metadata fields for ENA API v2.0 - [PR #150](https://github.com/nf-core/fetchngs/pull/150) - Add infrastructure and CI for multi-cloud full-sized tests run via Nextflow Tower +- [PR #157](https://github.com/nf-core/fetchngs/pull/157) - Add `public_aws_ecr.config` to source mulled containers when using `public.ecr.aws` Docker Biocontainer registry ### Software dependencies From 3e558a68195f4fccbe8c6af89caad3840e2d0211 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sat, 13 May 2023 20:46:09 +0100 Subject: [PATCH 289/852] Run nf-core modules update to fix quay.io container definitions --- modules.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules.json b/modules.json index dea81e71..ccf017da 100644 --- a/modules.json +++ b/modules.json @@ -17,7 +17,7 @@ }, "sratools/fasterqdump": { "branch": "master", - "git_sha": "10cb20f6a130d104fef335a8290f3ffce650f28d", + "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] }, "sratools/prefetch": { From c9afc5cff2c80bd664e55420beb65e65540c2dc1 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sat, 13 May 2023 20:47:37 +0100 Subject: [PATCH 290/852] Fix ECLint --- conf/public_aws_ecr.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/public_aws_ecr.config b/conf/public_aws_ecr.config index 59ac8c01..b9129571 100644 --- a/conf/public_aws_ecr.config +++ b/conf/public_aws_ecr.config @@ -15,4 +15,4 @@ process { withName: '.*:SRATOOLS_FASTERQDUMP' { container = 'quay.io/biocontainers/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:6a9ff0e76ec016c3d0d27e0c0d362339f2d787e6-0' } -} \ No newline at end of file +} From 64a4971bea976940950d6cf24572d5ce3e730b19 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 14 May 2023 20:09:43 +0100 Subject: [PATCH 291/852] Update CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 297d1941..d62cfdde 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [[1.10.0](https://github.com/nf-core/fetchngs/releases/tag/1.10.0)] - 2023-05-12 +## [[1.10.0](https://github.com/nf-core/fetchngs/releases/tag/1.10.0)] - 2023-05-15 ### Credits From 740b2ce06d6e0b997432eac1c7d63f923436e2cc Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 14 May 2023 20:10:07 +0100 Subject: [PATCH 292/852] Bump pipeline version to 1.10.0 --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 18e065d0..c1c66b07 100644 --- a/nextflow.config +++ b/nextflow.config @@ -211,7 +211,7 @@ manifest { description = """Pipeline to fetch metadata and raw FastQ files from public databases""" mainScript = 'main.nf' nextflowVersion = '!>=22.10.1' - version = '1.10.0dev' + version = '1.10.0' doi = 'https://doi.org/10.5281/zenodo.5070524' } From f510057968bc205cf5f8cccf488440da2a6d9365 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 14 May 2023 20:58:05 +0100 Subject: [PATCH 293/852] Add ubuntu containers to public_aws_ecr.config --- conf/public_aws_ecr.config | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/conf/public_aws_ecr.config b/conf/public_aws_ecr.config index b9129571..abbe0fe4 100644 --- a/conf/public_aws_ecr.config +++ b/conf/public_aws_ecr.config @@ -15,4 +15,10 @@ process { withName: '.*:SRATOOLS_FASTERQDUMP' { container = 'quay.io/biocontainers/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:6a9ff0e76ec016c3d0d27e0c0d362339f2d787e6-0' } + withName: '.*:SRA_MERGE_SAMPLESHEET' { + container = 'quay.io/nf-core/ubuntu:20.04' + } + withName: '.*:SYNAPSE_MERGE_SAMPLESHEET' { + container = 'quay.io/nf-core/ubuntu:20.04' + } } From 3eb8afbdf39b6eaf299a866a0a6c3562fa970203 Mon Sep 17 00:00:00 2001 From: Esha Joshi <128735622+ejseqera@users.noreply.github.com> Date: Mon, 15 May 2023 15:06:19 +0100 Subject: [PATCH 294/852] Update nextflow_schema.json Co-authored-by: Harshil Patel --- nextflow_schema.json | 1 - 1 file changed, 1 deletion(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 87d5024c..0abb1e39 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -66,7 +66,6 @@ }, "dbgap_key": { "type": "string", - "default": null, "fa_icon": "fas fa-address-card", "help_text": "Path to a JWT cart file used to access protected dbGAP data on SRA using the sra-toolkit. Users with granted access to controlled data can download the JWT cart file for the study from the SRA Run Selector upon logging in. The JWT file can only be used on cloud platforms and is valid for 1 hour upon creation.", "format": "file-path" From fb7b6054c5c2d1a84fd553aa8df9c257fb07462e Mon Sep 17 00:00:00 2001 From: ejseqera Date: Mon, 15 May 2023 10:36:59 -0400 Subject: [PATCH 295/852] feat: move dbgap key param as input into parent workflow --- workflows/sra.nf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/workflows/sra.nf b/workflows/sra.nf index e3ac447f..abf23dc3 100644 --- a/workflows/sra.nf +++ b/workflows/sra.nf @@ -113,7 +113,8 @@ workflow SRA { // SUBWORKFLOW: Download sequencing reads without FTP links using sra-tools. // FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS ( - ch_sra_reads.sra.map { meta, reads -> [ meta, meta.run_accession ] } + ch_sra_reads.sra.map { meta, reads -> [ meta, meta.run_accession ] }, + params.dbgap_key ?: [] ) ch_versions = ch_versions.mix(FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS.out.versions.first()) From 43400b10746d79b5a502659358187dfbad294337 Mon Sep 17 00:00:00 2001 From: Esha Joshi <128735622+ejseqera@users.noreply.github.com> Date: Mon, 15 May 2023 15:37:19 +0100 Subject: [PATCH 296/852] Update docs/usage.md Co-authored-by: Harshil Patel --- docs/usage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/usage.md b/docs/usage.md index 231da022..c9882467 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -22,7 +22,7 @@ The pipeline has been set-up to automatically download and process the raw FastQ If `SRR`/`ERR`/`DRR` run ids are provided then these will be resolved back to their appropriate `SRX`/`ERX`/`DRX` ids to be able to merge multiple runs from the same experiment. This is conceptually the same as merging multiple libraries sequenced from the same sample. -The final sample information for all identifiers is obtained from the ENA which provides direct download links for FastQ files as well as their associated md5 sums. If download links exist, the files will be downloaded in parallel by FTP. Otherwise they are downloaded using sra-tools. +The final sample information for all identifiers is obtained from the ENA which provides direct download links for FastQ files as well as their associated md5 sums. If download links exist, the files will be downloaded in parallel by FTP. Otherwise they are downloaded using sra-tools. All of the sample metadata obtained from the ENA will be appended as additional columns to help you manually curate the generated samplesheet before you run the pipeline. You can customise the metadata fields that are appended to the samplesheet via the `--ena_metadata_fields` parameter. The default list of fields used by the pipeline can be found at the top of the [`bin/sra_ids_to_runinfo.py`](https://github.com/nf-core/fetchngs/blob/master/bin/sra_ids_to_runinfo.py) script within the pipeline repo. However, this pipeline requires a minimal set of fields to download FastQ files i.e. `'run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5'`. A comprehensive list of accepted metadata fields can be obtained from the [ENA API](https://www.ebi.ac.uk/ena/portal/api/returnFields?dataPortal=ena&format=tsv&result=read_run). From d74d0561b4dd46c2f6d570a868245412d71c4c32 Mon Sep 17 00:00:00 2001 From: ejseqera Date: Mon, 15 May 2023 10:44:36 -0400 Subject: [PATCH 297/852] docs: update changelog to reference dbgap issue and not PR --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 066e3d71..73666bbe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,7 +26,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements - [PR #147](https://github.com/nf-core/fetchngs/pull/147) - Updated pipeline template to [nf-core/tools 2.8](https://github.com/nf-core/tools/releases/tag/2.8) - [PR #148](https://github.com/nf-core/fetchngs/pull/148) - Fix default metadata fields for ENA API v2.0 - [PR #150](https://github.com/nf-core/fetchngs/pull/150) - Add infrastructure and CI for multi-cloud full-sized tests run via Nextflow Tower -- [PR #152](https://github.com/nf-core/fetchngs/pull/152) - Add support for downloading protected dbGAP data using a JWT file +- [#138](https://github.com/nf-core/fetchngs/issues/138) - Add support for downloading protected dbGAP data using a JWT file ### Software dependencies From b07ca4290d6177e9c67c4fc0b444bd904072f72b Mon Sep 17 00:00:00 2001 From: ejseqera Date: Mon, 15 May 2023 11:50:06 -0400 Subject: [PATCH 298/852] refactor: fix changelog to reference geo issue --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5fe8e99a..1478af9f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,11 +22,11 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements - [#85](https://github.com/nf-core/fetchngs/issues/85) - Not able to fetch metadata for ERR ids associated with ArrayExpress - [#129](https://github.com/nf-core/fetchngs/issues/129) - Pipeline is working with SRA run ids but failing with corresponding Biosample ids - [#144](https://github.com/nf-core/fetchngs/issues/144) - Add support to download 10X Genomics data +- [#104](https://github.com/nf-core/fetchngs/issues/104) - Add support back in for [GEO IDs](https://www.ncbi.nlm.nih.gov/geo) (removed in v1.7) - [PR #140](https://github.com/nf-core/fetchngs/pull/140) - Bumped modules version to allow for sratools download of sralite format files - [PR #147](https://github.com/nf-core/fetchngs/pull/147) - Updated pipeline template to [nf-core/tools 2.8](https://github.com/nf-core/tools/releases/tag/2.8) - [PR #148](https://github.com/nf-core/fetchngs/pull/148) - Fix default metadata fields for ENA API v2.0 - [PR #150](https://github.com/nf-core/fetchngs/pull/150) - Add infrastructure and CI for multi-cloud full-sized tests run via Nextflow Tower -- [PR #155](https://github.com/nf-core/fetchngs/pull/155) - Add support back in for [GEO IDs](https://www.ncbi.nlm.nih.gov/geo) (removed in v1.7) ### Software dependencies From b3681617524b9cd4a4e6e8d4be792b4c1d02bd2b Mon Sep 17 00:00:00 2001 From: ejseqera Date: Mon, 15 May 2023 12:10:22 -0400 Subject: [PATCH 299/852] refactor: move up issue reference for dbgap --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 73666bbe..235f5c41 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,11 +22,11 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements - [#85](https://github.com/nf-core/fetchngs/issues/85) - Not able to fetch metadata for ERR ids associated with ArrayExpress - [#129](https://github.com/nf-core/fetchngs/issues/129) - Pipeline is working with SRA run ids but failing with corresponding Biosample ids - [#144](https://github.com/nf-core/fetchngs/issues/144) - Add support to download 10X Genomics data +- [#138](https://github.com/nf-core/fetchngs/issues/138) - Add support for downloading protected dbGAP data using a JWT file - [PR #140](https://github.com/nf-core/fetchngs/pull/140) - Bumped modules version to allow for sratools download of sralite format files - [PR #147](https://github.com/nf-core/fetchngs/pull/147) - Updated pipeline template to [nf-core/tools 2.8](https://github.com/nf-core/tools/releases/tag/2.8) - [PR #148](https://github.com/nf-core/fetchngs/pull/148) - Fix default metadata fields for ENA API v2.0 - [PR #150](https://github.com/nf-core/fetchngs/pull/150) - Add infrastructure and CI for multi-cloud full-sized tests run via Nextflow Tower -- [#138](https://github.com/nf-core/fetchngs/issues/138) - Add support for downloading protected dbGAP data using a JWT file ### Software dependencies From 32796feccc16b094411257b83e8fc78f5554f3b0 Mon Sep 17 00:00:00 2001 From: ejseqera Date: Mon, 15 May 2023 12:30:58 -0400 Subject: [PATCH 300/852] fix: modules update for sratools prefetch and fasterqdump --- CHANGELOG.md | 1 + modules.json | 6 ++-- modules/nf-core/sratools/fasterqdump/main.nf | 2 +- modules/nf-core/sratools/fasterqdump/meta.yml | 6 +++- modules/nf-core/sratools/prefetch/main.nf | 2 +- modules/nf-core/sratools/prefetch/meta.yml | 8 +++-- .../main.nf | 34 +++++++------------ .../meta.yml | 5 +++ 8 files changed, 34 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 235f5c41..4b950fae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements - [PR #147](https://github.com/nf-core/fetchngs/pull/147) - Updated pipeline template to [nf-core/tools 2.8](https://github.com/nf-core/tools/releases/tag/2.8) - [PR #148](https://github.com/nf-core/fetchngs/pull/148) - Fix default metadata fields for ENA API v2.0 - [PR #150](https://github.com/nf-core/fetchngs/pull/150) - Add infrastructure and CI for multi-cloud full-sized tests run via Nextflow Tower +- [nf-core/modules#3417](https://github.com/nf-core/modules/pull/3417) - Update sratools modules to optionally take a JWT file as input ### Software dependencies diff --git a/modules.json b/modules.json index dea81e71..3137b88b 100644 --- a/modules.json +++ b/modules.json @@ -17,12 +17,12 @@ }, "sratools/fasterqdump": { "branch": "master", - "git_sha": "10cb20f6a130d104fef335a8290f3ffce650f28d", + "git_sha": "6712754854ae2832abfff3f0800cdb4a6a60bfca", "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] }, "sratools/prefetch": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "git_sha": "6712754854ae2832abfff3f0800cdb4a6a60bfca", "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] } } @@ -31,7 +31,7 @@ "nf-core": { "fastq_download_prefetch_fasterqdump_sratools": { "branch": "master", - "git_sha": "a9784afdd5dcda23b84e64db75dc591065d64653", + "git_sha": "6712754854ae2832abfff3f0800cdb4a6a60bfca", "installed_by": ["subworkflows"] } } diff --git a/modules/nf-core/sratools/fasterqdump/main.nf b/modules/nf-core/sratools/fasterqdump/main.nf index 4ed92814..2d9090e2 100644 --- a/modules/nf-core/sratools/fasterqdump/main.nf +++ b/modules/nf-core/sratools/fasterqdump/main.nf @@ -5,7 +5,7 @@ process SRATOOLS_FASTERQDUMP { conda "bioconda::sra-tools=2.11.0 conda-forge::pigz=2.6" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:6a9ff0e76ec016c3d0d27e0c0d362339f2d787e6-0' : - 'quay.io/biocontainers/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:6a9ff0e76ec016c3d0d27e0c0d362339f2d787e6-0' }" + 'biocontainers/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:6a9ff0e76ec016c3d0d27e0c0d362339f2d787e6-0' }" input: tuple val(meta), path(sra) diff --git a/modules/nf-core/sratools/fasterqdump/meta.yml b/modules/nf-core/sratools/fasterqdump/meta.yml index d6fbd444..629bdca5 100644 --- a/modules/nf-core/sratools/fasterqdump/meta.yml +++ b/modules/nf-core/sratools/fasterqdump/meta.yml @@ -27,7 +27,11 @@ input: description: > An NCBI user settings file. pattern: "*.mkfg" - + - certificate: + type: file + description: > + Path to a JWT cart file used to access protected dbGAP data on SRA using the sra-toolkit + pattern: "*.cart" output: - meta: type: map diff --git a/modules/nf-core/sratools/prefetch/main.nf b/modules/nf-core/sratools/prefetch/main.nf index 5d894b88..ba7be4bd 100644 --- a/modules/nf-core/sratools/prefetch/main.nf +++ b/modules/nf-core/sratools/prefetch/main.nf @@ -10,7 +10,7 @@ process SRATOOLS_PREFETCH { input: tuple val(meta), val(id) path ncbi_settings - path certificate + path certificate output: tuple val(meta), path(id), emit: sra diff --git a/modules/nf-core/sratools/prefetch/meta.yml b/modules/nf-core/sratools/prefetch/meta.yml index a3a26522..9817b0b2 100644 --- a/modules/nf-core/sratools/prefetch/meta.yml +++ b/modules/nf-core/sratools/prefetch/meta.yml @@ -19,7 +19,7 @@ input: Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - id: - type: val + type: string description: > A string denoting an SRA id. - ncbi_settings: @@ -27,7 +27,11 @@ input: description: > An NCBI user settings file. pattern: "*.mkfg" - + - certificate: + type: file + description: > + Path to a JWT cart file used to access protected dbGAP data on SRA using the sra-toolkit + pattern: "*.cart" output: - meta: type: map diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/main.nf b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/main.nf index 965d8779..de31637e 100644 --- a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/main.nf +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/main.nf @@ -7,7 +7,8 @@ include { SRATOOLS_FASTERQDUMP } from '../../../modules/nf-core/sratools/ // workflow FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS { take: - ch_sra_ids // channel: [ val(meta), val(id) ] + ch_sra_ids // channel: [ val(meta), val(id) ] + ch_dbgap_key // channel: [ path(dbgap_key) ] main: @@ -17,33 +18,22 @@ workflow FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS { // Detect existing NCBI user settings or create new ones. // CUSTOM_SRATOOLSNCBISETTINGS() - def settings = CUSTOM_SRATOOLSNCBISETTINGS.out.ncbi_settings // value channel: path(settings) + ch_ncbi_settings = CUSTOM_SRATOOLSNCBISETTINGS.out.ncbi_settings ch_versions = ch_versions.mix(CUSTOM_SRATOOLSNCBISETTINGS.out.versions) // - // Prefetch sequencing reads in SRA format and convert into one or more compressed FASTQ files. - // If specified in params, use the provided JWT file for pulling protected SRA runs, else provide - // an empty list. + // Prefetch sequencing reads in SRA format. // - - if (!params.dbgap_key) { - - SRATOOLS_PREFETCH ( ch_sra_ids, settings, [] ) - SRATOOLS_FASTERQDUMP ( SRATOOLS_PREFETCH.out.sra, settings, [] ) - - } else { - - certificate = file(params.dbgap_key, checkIfExists: true) // optional input channel for JWT - - SRATOOLS_PREFETCH ( ch_sra_ids, settings, certificate ) - SRATOOLS_FASTERQDUMP ( SRATOOLS_PREFETCH.out.sra, settings, certificate ) - - } - + SRATOOLS_PREFETCH ( ch_sra_ids, ch_ncbi_settings, ch_dbgap_key ) ch_versions = ch_versions.mix(SRATOOLS_PREFETCH.out.versions.first()) + + // + // Convert the SRA format into one or more compressed FASTQ files. + // + SRATOOLS_FASTERQDUMP ( SRATOOLS_PREFETCH.out.sra, ch_ncbi_settings, ch_dbgap_key ) ch_versions = ch_versions.mix(SRATOOLS_FASTERQDUMP.out.versions.first()) emit: - reads = SRATOOLS_FASTERQDUMP.out.reads // channel: [ val(meta), [ reads ] ] - versions = ch_versions // channel: [ versions.yml ] + reads = SRATOOLS_FASTERQDUMP.out.reads // channel: [ val(meta), [ reads ] ] + versions = ch_versions // channel: [ versions.yml ] } diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/meta.yml b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/meta.yml index 4599bbd2..6ff9442b 100644 --- a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/meta.yml +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/meta.yml @@ -22,6 +22,11 @@ input: type: string description: > SRA run identifier. + - certificate: + type: file + description: > + Path to a JWT cart file used to access protected dbGAP data on SRA using the sra-toolkit + pattern: "*.cart" # TODO Update when we decide on a standard for subworkflow docs output: - meta: From 1d75d1867c35411f0476b46c5c073a072303b617 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 15 May 2023 18:14:44 +0100 Subject: [PATCH 301/852] Apply suggestions from code review --- CHANGELOG.md | 2 +- docs/usage.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c653e7d1..6eda7411 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,8 +22,8 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements - [#85](https://github.com/nf-core/fetchngs/issues/85) - Not able to fetch metadata for ERR ids associated with ArrayExpress - [#129](https://github.com/nf-core/fetchngs/issues/129) - Pipeline is working with SRA run ids but failing with corresponding Biosample ids -- [#144](https://github.com/nf-core/fetchngs/issues/144) - Add support to download 10X Genomics data - [#138](https://github.com/nf-core/fetchngs/issues/138) - Add support for downloading protected dbGAP data using a JWT file +- [#144](https://github.com/nf-core/fetchngs/issues/144) - Add support to download 10X Genomics data - [PR #140](https://github.com/nf-core/fetchngs/pull/140) - Bumped modules version to allow for sratools download of sralite format files - [PR #147](https://github.com/nf-core/fetchngs/pull/147) - Updated pipeline template to [nf-core/tools 2.8](https://github.com/nf-core/tools/releases/tag/2.8) - [PR #148](https://github.com/nf-core/fetchngs/pull/148) - Fix default metadata fields for ENA API v2.0 diff --git a/docs/usage.md b/docs/usage.md index 52eaf63d..f0371eb3 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -72,7 +72,7 @@ If FTP connections are blocked on your network use the [`--force_sratools_downlo ### Downloading dbGAP data with JWT -As of v1.10, the SRA Toolkit used in this pipeline can be configured to access protected data from dbGAP using a [JWT cart file](https://www.ncbi.nlm.nih.gov/sra/docs/sra-dbGAP-cloud-download/). The JWT cart file can be specified with `--dbgap_key /path/to/cart.jwt`. +As of v1.10.0, the SRA Toolkit used in this pipeline can be configured to access protected data from dbGAP using a [JWT cart file](https://www.ncbi.nlm.nih.gov/sra/docs/sra-dbGAP-cloud-download/). The JWT cart file can be specified with `--dbgap_key /path/to/cart.jwt`. Note that due to the way the pipeline resolves SRA IDs down to the experiment to be able to merge multiple runs, your JWT cart file must be generated for _all_ runs in an experiment. Otherwise, upon running `prefetch` and `fasterq-dump`, the pipeline will return a `403 Error` when trying to download data for other runs under an experiment that are not authenticated for with the provided JWT cart file. From b641a7adb80d1623ce6f58d67ee9fdd364ef2d36 Mon Sep 17 00:00:00 2001 From: ejseqera Date: Mon, 15 May 2023 14:56:55 -0400 Subject: [PATCH 302/852] docs: add SRA example for dbgap data download with jwt --- docs/usage.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/usage.md b/docs/usage.md index f0371eb3..e7a83805 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -72,12 +72,17 @@ If FTP connections are blocked on your network use the [`--force_sratools_downlo ### Downloading dbGAP data with JWT -As of v1.10.0, the SRA Toolkit used in this pipeline can be configured to access protected data from dbGAP using a [JWT cart file](https://www.ncbi.nlm.nih.gov/sra/docs/sra-dbGAP-cloud-download/). The JWT cart file can be specified with `--dbgap_key /path/to/cart.jwt`. +As of v1.10.0, the SRA Toolkit used in this pipeline can be configured to access protected data from dbGAP using a [JWT cart file](https://www.ncbi.nlm.nih.gov/sra/docs/sra-dbGAP-cloud-download/) on a supported cloud computing environment (Amazon Web Services or Google Cloud Platform). The JWT cart file can be specified with `--dbgap_key /path/to/cart.jwt`. Note that due to the way the pipeline resolves SRA IDs down to the experiment to be able to merge multiple runs, your JWT cart file must be generated for _all_ runs in an experiment. Otherwise, upon running `prefetch` and `fasterq-dump`, the pipeline will return a `403 Error` when trying to download data for other runs under an experiment that are not authenticated for with the provided JWT cart file. Users can log into the [SRA Run Selector](https://www.ncbi.nlm.nih.gov/Traces/study/), search for the dbGAP study they have been granted access to using the phs identifier, and select all available runs to activate the `JWT Cart` button to download the file. +To test this functionality in your cloud computing environment, you can use the protected dbGAP cloud testing study with accession `SRR1219902`: + +- On the [SRA Run Selector page for `SRR1219902`](https://www.ncbi.nlm.nih.gov/Traces/study/?acc=SRR1219902&o=acc_s%3Aa&s=SRR1219902), select the available run and click on `JWT Cart` to download a key file called `jwt.cart` that can be directly provided to the pipeline with `--dbgap_key jwt.cart` +- Click on `Accession List` to download a text file called `SRR_Acc_List.txt` that can be directly provided to the pipeline with `--input SRR_Acc_List.txt` + ## Running the pipeline The typical command for running the pipeline is as follows: From 76ad4b723ed7dd9a225b407c67a2d5695c55ebac Mon Sep 17 00:00:00 2001 From: ejseqera Date: Mon, 15 May 2023 15:30:45 -0400 Subject: [PATCH 303/852] docs: update test JWT sra accession ID to experiment ID --- docs/usage.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index e7a83805..b3f215f3 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -78,10 +78,10 @@ Note that due to the way the pipeline resolves SRA IDs down to the experiment to Users can log into the [SRA Run Selector](https://www.ncbi.nlm.nih.gov/Traces/study/), search for the dbGAP study they have been granted access to using the phs identifier, and select all available runs to activate the `JWT Cart` button to download the file. -To test this functionality in your cloud computing environment, you can use the protected dbGAP cloud testing study with accession `SRR1219902`: +To test this functionality in your cloud computing environment, you can use the protected dbGAP cloud testing study with experiment accession `SRX512039`: -- On the [SRA Run Selector page for `SRR1219902`](https://www.ncbi.nlm.nih.gov/Traces/study/?acc=SRR1219902&o=acc_s%3Aa&s=SRR1219902), select the available run and click on `JWT Cart` to download a key file called `jwt.cart` that can be directly provided to the pipeline with `--dbgap_key jwt.cart` -- Click on `Accession List` to download a text file called `SRR_Acc_List.txt` that can be directly provided to the pipeline with `--input SRR_Acc_List.txt` +- On the [SRA Run Selector page for `SRX512039`](https://www.ncbi.nlm.nih.gov/Traces/study/?acc=SRX512039&o=acc_s%3Aa), select the two available runs (`SRR1219865` and `SRR1219902`) and click on `JWT Cart` to download a key file called `cart.jwt` that can be directly provided to the pipeline with `--dbgap_key cart.jwt` +- Click on `Accession List` to download a text file called `SRR_Acc_List.txt` with the SRR IDs that can be directly provided to the pipeline with `--input SRR_Acc_List.txt` ## Running the pipeline From b0d32c2abc84a7cc508c16d69875f3a06b90601a Mon Sep 17 00:00:00 2001 From: Esha Joshi <128735622+ejseqera@users.noreply.github.com> Date: Mon, 15 May 2023 20:34:22 +0100 Subject: [PATCH 304/852] Update workflows/sra.nf Co-authored-by: Harshil Patel --- workflows/sra.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/sra.nf b/workflows/sra.nf index abf23dc3..82120249 100644 --- a/workflows/sra.nf +++ b/workflows/sra.nf @@ -114,7 +114,7 @@ workflow SRA { // FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS ( ch_sra_reads.sra.map { meta, reads -> [ meta, meta.run_accession ] }, - params.dbgap_key ?: [] + params.dbgap_key ? file(params.dbgap_key, checkIfExists: true) : [] ) ch_versions = ch_versions.mix(FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS.out.versions.first()) From e84521daba5998e5307489e3b2bcc38a1e4fbd3b Mon Sep 17 00:00:00 2001 From: ejseqera Date: Mon, 15 May 2023 22:10:52 -0400 Subject: [PATCH 305/852] feat: add backoff strategy and handling for API responses --- bin/sra_ids_to_runinfo.py | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/bin/sra_ids_to_runinfo.py b/bin/sra_ids_to_runinfo.py index 414d32a7..0ffafba8 100755 --- a/bin/sra_ids_to_runinfo.py +++ b/bin/sra_ids_to_runinfo.py @@ -15,6 +15,7 @@ from urllib.parse import urlencode from urllib.request import urlopen import json +import time logger = logging.getLogger() @@ -399,13 +400,40 @@ def validate_fields_parameter(param, valid_vals, param_desc): def fetch_url(url): """Return a response object for the given URL and handle errors appropriately.""" + sleep_time = 5 # Hardcode sleep duration in seconds + max_num_attempts = 3 # Hardcode max number of request attempts + attempt = 0 + try: with urlopen(url) as response: return Response(response=response) + except HTTPError as e: - logger.error("The server couldn't fulfill the request.") - logger.error(f"Status: {e.code} {e.reason}") - sys.exit(1) + if e.status == 429: + # If the response is 429, sleep and retry + if "Retry-After" in e.headers: + retry_after = int(e.headers["Retry-After"]) + logging.warning(f"Received 429 response from server. Retrying after {retry_after} seconds...") + time.sleep(retry_after) + else: + logging.warning(f"Received 429 response from server. Retrying in {sleep_time} seconds...") + time.sleep(sleep_time) + sleep_time *= 2 # Increment sleep time + attempt += 1 + return fetch_url(url) # Recursive call to retry request + + elif e.status == 500: + # If the response is 500, sleep and retry max 3 times + if attempt <= max_num_attempts: + logging.warning(f"Received 500 response from server. Retrying in {sleep_time} seconds...") + time.sleep(sleep_time) + sleep_time *= 2 + attempt += 1 + return fetch_url(url) + else: + logging.error("Exceeded max request attempts. Exiting.") + sys.exit(1) + except URLError as e: logger.error("We failed to reach a server.") logger.error(f"Reason: {e.reason}") From 945d87029a5acece603e22d6d66145a2675396ee Mon Sep 17 00:00:00 2001 From: ejseqera Date: Mon, 15 May 2023 22:14:39 -0400 Subject: [PATCH 306/852] docs: update changelog --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1478af9f..0f936ef0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [[1.10.0](https://github.com/nf-core/fetchngs/releases/tag/1.10.0)] - 2023-05-12 +## [[1.10.0](https://github.com/nf-core/fetchngs/releases/tag/1.10.0)] - 2023-05-16 ### Credits @@ -20,9 +20,9 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements ### Enhancements & fixes - [#85](https://github.com/nf-core/fetchngs/issues/85) - Not able to fetch metadata for ERR ids associated with ArrayExpress +- [#104](https://github.com/nf-core/fetchngs/issues/104) - Add support back in for [GEO IDs](https://www.ncbi.nlm.nih.gov/geo) (removed in v1.7) - [#129](https://github.com/nf-core/fetchngs/issues/129) - Pipeline is working with SRA run ids but failing with corresponding Biosample ids - [#144](https://github.com/nf-core/fetchngs/issues/144) - Add support to download 10X Genomics data -- [#104](https://github.com/nf-core/fetchngs/issues/104) - Add support back in for [GEO IDs](https://www.ncbi.nlm.nih.gov/geo) (removed in v1.7) - [PR #140](https://github.com/nf-core/fetchngs/pull/140) - Bumped modules version to allow for sratools download of sralite format files - [PR #147](https://github.com/nf-core/fetchngs/pull/147) - Updated pipeline template to [nf-core/tools 2.8](https://github.com/nf-core/tools/releases/tag/2.8) - [PR #148](https://github.com/nf-core/fetchngs/pull/148) - Fix default metadata fields for ENA API v2.0 From 6eeddaea28826db53f02853bfefa9cef62e7d4c8 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Tue, 16 May 2023 10:30:54 +0000 Subject: [PATCH 307/852] fix: --- conf/public_aws_ecr.config | 3 +++ 1 file changed, 3 insertions(+) diff --git a/conf/public_aws_ecr.config b/conf/public_aws_ecr.config index abbe0fe4..b6711a54 100644 --- a/conf/public_aws_ecr.config +++ b/conf/public_aws_ecr.config @@ -12,6 +12,9 @@ docker.registry = 'public.ecr.aws' podman.registry = 'public.ecr.aws' process { + withName: 'SRA_IDS_TO_RUNINFO|SRA_RUNINFO_TO_FTP' { + container = 'quay.io/biocontainers/python:3.8.3' + } withName: '.*:SRATOOLS_FASTERQDUMP' { container = 'quay.io/biocontainers/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:6a9ff0e76ec016c3d0d27e0c0d362339f2d787e6-0' } From 751828548ff8d9eed7cb89ce75e321349e810b60 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Tue, 16 May 2023 10:35:47 +0000 Subject: [PATCH 308/852] Additional container image --- conf/public_aws_ecr.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/public_aws_ecr.config b/conf/public_aws_ecr.config index b6711a54..184d8c18 100644 --- a/conf/public_aws_ecr.config +++ b/conf/public_aws_ecr.config @@ -12,7 +12,7 @@ docker.registry = 'public.ecr.aws' podman.registry = 'public.ecr.aws' process { - withName: 'SRA_IDS_TO_RUNINFO|SRA_RUNINFO_TO_FTP' { + withName: 'SRA_IDS_TO_RUNINFO|SRA_RUNINFO_TO_FTP|MULTIQC_MAPPINGS_CONFIG' { container = 'quay.io/biocontainers/python:3.8.3' } withName: '.*:SRATOOLS_FASTERQDUMP' { From c1bb2148a268e7947616247a644e651d425e917d Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Tue, 16 May 2023 10:50:20 +0000 Subject: [PATCH 309/852] Explicit container images per process --- conf/public_aws_ecr.config | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/conf/public_aws_ecr.config b/conf/public_aws_ecr.config index 184d8c18..71180374 100644 --- a/conf/public_aws_ecr.config +++ b/conf/public_aws_ecr.config @@ -12,8 +12,14 @@ docker.registry = 'public.ecr.aws' podman.registry = 'public.ecr.aws' process { - withName: 'SRA_IDS_TO_RUNINFO|SRA_RUNINFO_TO_FTP|MULTIQC_MAPPINGS_CONFIG' { - container = 'quay.io/biocontainers/python:3.8.3' + withName: '.*:SRA_IDS_TO_RUNINFO' { + container = 'quay.io/biocontainers/python:3.9--1' + } + withName: '.*:SRA_RUNINFO_TO_FTP' { + container = 'quay.io/biocontainers/python:3.9--1' + } + withName: '.*:MULTIQC_MAPPINGS_CONFIG' { + container = 'quay.io/biocontainers/python:3.9--1' } withName: '.*:SRATOOLS_FASTERQDUMP' { container = 'quay.io/biocontainers/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:6a9ff0e76ec016c3d0d27e0c0d362339f2d787e6-0' From 255190ef0b634d09cf0bc92b7658986ed9f96031 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Tue, 16 May 2023 10:53:40 +0000 Subject: [PATCH 310/852] fixup --- conf/public_aws_ecr.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/public_aws_ecr.config b/conf/public_aws_ecr.config index 71180374..14b577d7 100644 --- a/conf/public_aws_ecr.config +++ b/conf/public_aws_ecr.config @@ -16,7 +16,7 @@ process { container = 'quay.io/biocontainers/python:3.9--1' } withName: '.*:SRA_RUNINFO_TO_FTP' { - container = 'quay.io/biocontainers/python:3.9--1' + container = 'quay.io/biocontainers/python:3.9--1' } withName: '.*:MULTIQC_MAPPINGS_CONFIG' { container = 'quay.io/biocontainers/python:3.9--1' From e4efe564fc24aab09f4affe2f8d247c85b22d368 Mon Sep 17 00:00:00 2001 From: ejseqera Date: Tue, 16 May 2023 13:00:31 -0400 Subject: [PATCH 311/852] Bump version to 1.11.0dev --- CHANGELOG.md | 4 ++++ nextflow.config | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 12ef2d50..2bd283e9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unpublished Version / DEV] + +### Enhancements & fixes + ## [[1.10.0](https://github.com/nf-core/fetchngs/releases/tag/1.10.0)] - 2023-05-16 ### Credits diff --git a/nextflow.config b/nextflow.config index 1e9aaed0..0e0886e4 100644 --- a/nextflow.config +++ b/nextflow.config @@ -212,7 +212,7 @@ manifest { description = """Pipeline to fetch metadata and raw FastQ files from public databases""" mainScript = 'main.nf' nextflowVersion = '!>=22.10.1' - version = '1.10.0' + version = '1.11.0dev' doi = 'https://doi.org/10.5281/zenodo.5070524' } From ed05c7bc49f02317717b8811c7987fc57b6cca0e Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Mon, 8 May 2023 19:45:39 -0400 Subject: [PATCH 312/852] init-nf-tests --- nf-test.config | 8 + tests/config/tags.yml | 14 ++ tests/modules/sra_ids_to_runinfo/main.nf.test | 43 +++++ .../sra_ids_to_runinfo/main.nf.test.snap | 28 ++++ tests/nextflow.config | 5 + tests/pipeline/sra.nf.test | 28 ++++ tests/pipeline/sra.nf.test.snap | 60 +++++++ tests/pipeline/sra_skip_fastq.nf.test | 42 +++++ tests/pipeline/sra_skip_fastq.nf.test.snap | 30 ++++ .../sra_with_nf_core_pipeline.nf.test | 110 ++++++++++++ .../sra_with_nf_core_pipeline.nf.test.snap | 156 ++++++++++++++++++ tests/pipeline/sra_with_sratools.nf.test | 29 ++++ tests/pipeline/sra_with_sratools.nf.test.snap | 49 ++++++ tests/pipeline/synapse.test | 26 +++ 14 files changed, 628 insertions(+) create mode 100644 nf-test.config create mode 100644 tests/config/tags.yml create mode 100644 tests/modules/sra_ids_to_runinfo/main.nf.test create mode 100644 tests/modules/sra_ids_to_runinfo/main.nf.test.snap create mode 100644 tests/nextflow.config create mode 100644 tests/pipeline/sra.nf.test create mode 100644 tests/pipeline/sra.nf.test.snap create mode 100644 tests/pipeline/sra_skip_fastq.nf.test create mode 100644 tests/pipeline/sra_skip_fastq.nf.test.snap create mode 100644 tests/pipeline/sra_with_nf_core_pipeline.nf.test create mode 100644 tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap create mode 100644 tests/pipeline/sra_with_sratools.nf.test create mode 100644 tests/pipeline/sra_with_sratools.nf.test.snap create mode 100644 tests/pipeline/synapse.test diff --git a/nf-test.config b/nf-test.config new file mode 100644 index 00000000..9d4198ff --- /dev/null +++ b/nf-test.config @@ -0,0 +1,8 @@ +config { + + testsDir "tests" + workDir ".nf-test" + configFile "nextflow.config" + profile "" + +} diff --git a/tests/config/tags.yml b/tests/config/tags.yml new file mode 100644 index 00000000..9214c834 --- /dev/null +++ b/tests/config/tags.yml @@ -0,0 +1,14 @@ +default: + - bin/** + - conf/** + - lib/** + - modules/** + - subworkflows/** + - tests/** + - workflows/** + - nextflow.config + - main.nf + +sra_ids_to_runinfo: + - modules/local/sra_ids_to_runinfo.nf + - tests/modules/sra_ids_to_runinfo/** diff --git a/tests/modules/sra_ids_to_runinfo/main.nf.test b/tests/modules/sra_ids_to_runinfo/main.nf.test new file mode 100644 index 00000000..f5467e75 --- /dev/null +++ b/tests/modules/sra_ids_to_runinfo/main.nf.test @@ -0,0 +1,43 @@ +nextflow_process { + + name "Test Process SRA_IDS_TO_RUNINFO" + script "modules/local/sra_ids_to_runinfo.nf" + process "SRA_IDS_TO_RUNINFO" + + test("Should run without failures without fields") { + + when { + process { + """ + input[0] = 'SRR9984183' + input[1] = '' + """ + } + } + + then { + assert process.success + assert snapshot(process.out).match() + } + + } + + test("Should run without failures with fields") { + + when { + process { + """ + input[0] = 'SRR9984183' + input[1] = 'run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5' + """ + } + } + + then { + assert process.success + assert snapshot(process.out).match() + } + + } + +} diff --git a/tests/modules/sra_ids_to_runinfo/main.nf.test.snap b/tests/modules/sra_ids_to_runinfo/main.nf.test.snap new file mode 100644 index 00000000..5a9ed62b --- /dev/null +++ b/tests/modules/sra_ids_to_runinfo/main.nf.test.snap @@ -0,0 +1,28 @@ +{ + "Should run without failures without fields": { + "content": [ + { + "versions": [ + "versions.yml:md5,cd1056ca246a1ab3486fb6800f3012fb" + ], + "tsv": [ + "SRR9984183.runinfo.tsv:md5,a69083928f4b856d428a681c291b7ad6" + ] + } + ], + "timestamp": "2022-11-11T04:23:34+0000" + }, + "Should run without failures with fields": { + "content": [ + { + "versions": [ + "versions.yml:md5,cd1056ca246a1ab3486fb6800f3012fb" + ], + "tsv": [ + "SRR9984183.runinfo.tsv:md5,6419f18c29ab09634b3dd97a6b2acd06" + ] + } + ], + "timestamp": "2022-11-11T04:23:34+0000" + } +} diff --git a/tests/nextflow.config b/tests/nextflow.config new file mode 100644 index 00000000..c19b1ad0 --- /dev/null +++ b/tests/nextflow.config @@ -0,0 +1,5 @@ +/* +======================================================================================== + Nextflow config file for running tests +======================================================================================== +*/ diff --git a/tests/pipeline/sra.nf.test b/tests/pipeline/sra.nf.test new file mode 100644 index 00000000..217eeaa1 --- /dev/null +++ b/tests/pipeline/sra.nf.test @@ -0,0 +1,28 @@ +nextflow_pipeline { + + name "Test Workflow main.nf" + script "main.nf" + options "-profile test,docker" + tag "pipeline" + + test("SRA FASTQ & Metadata") { + + when { + params { + outdir = "$outputDir" + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(path("$outputDir/pipeline_info/software_versions.yml")).match("software_versions") }, + { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, + { assert snapshot(path("$outputDir/metadata/").list()).match("metadata") }, + { assert snapshot(path("$outputDir/samplesheet/").list()).match("samplesheet") } + ) + } + + } + +} diff --git a/tests/pipeline/sra.nf.test.snap b/tests/pipeline/sra.nf.test.snap new file mode 100644 index 00000000..8ed35844 --- /dev/null +++ b/tests/pipeline/sra.nf.test.snap @@ -0,0 +1,60 @@ +{ + "metadata": { + "content": [ + "DRR026872.runinfo_ftp.tsv:md5,5620768b65ecb4067b7547a49e07b67b", + "DRR028935.runinfo_ftp.tsv:md5,7f248072a55d5f729c4827937625a05b", + "ERR1109373.runinfo_ftp.tsv:md5,f7cd42805764f783388c2686fe2a3f95", + "ERR1160846.runinfo_ftp.tsv:md5,36257a2c851d10d61a97581f3496529d", + "SRR12848126.runinfo_ftp.tsv:md5,ce5380eceefba1210df0cefe321be62a", + "SRR13191702.runinfo_ftp.tsv:md5,37f87c5665e65cece1bc5e2b529e3b3b", + "SRR14593545.runinfo_ftp.tsv:md5,36a0fe8c5d3917f105e4cbbb7a720d7d", + "SRR14709033.runinfo_ftp.tsv:md5,8f06fa2e4708318dbe8e9505000ea919", + "SRR9984183.runinfo_ftp.tsv:md5,72047c09c02782932672862e8adf3fa5" + ], + "timestamp": "2023-04-27T17:03:41+0000" + }, + "samplesheet": { + "content": [ + "id_mappings.csv:md5,660db7a31a1c775cabad5f9b21addc06", + "multiqc_config.yml:md5,d01bd71fb5b9901c80166fba0637e430", + "samplesheet.csv:md5,90a48cdcc3773bd06586675a82571103" + ], + "timestamp": "2023-04-27T17:03:41+0000" + }, + "software_versions": { + "content": [ + "software_versions.yml:md5,015626dc3a0ea64e135bab19243e1586" + ], + "timestamp": "2023-04-27T17:03:41+0000" + }, + "fastq": { + "content": [ + "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791", + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30", + "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9", + "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6", + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2", + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda", + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544", + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79", + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98", + [ + "DRX024467_DRR026872.fastq.gz.md5:md5,dacaeba3498fb8f405411a22cdb4b40d", + "DRX026011_DRR028935_1.fastq.gz.md5:md5,a47018c5972ba4c11539d0d6bc25eda9", + "DRX026011_DRR028935_2.fastq.gz.md5:md5,f477bbef548fbed665734ebf084eea2f", + "ERX1188904_ERR1109373_1.fastq.gz.md5:md5,50c1c3108631dc32a3151b67e0260d86", + "ERX1188904_ERR1109373_2.fastq.gz.md5:md5,1f22463d410e91a288c83d43654b2499", + "ERX1234253_ERR1160846.fastq.gz.md5:md5,513a8437ad331fc512b088b3750aa1ff", + "SRX6725035_SRR9984183.fastq.gz.md5:md5,84f59dbb76c9b5eab7e14d90ced352c4", + "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", + "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" + ] + ], + "timestamp": "2023-04-27T17:03:41+0000" + } +} \ No newline at end of file diff --git a/tests/pipeline/sra_skip_fastq.nf.test b/tests/pipeline/sra_skip_fastq.nf.test new file mode 100644 index 00000000..851099c3 --- /dev/null +++ b/tests/pipeline/sra_skip_fastq.nf.test @@ -0,0 +1,42 @@ +nextflow_pipeline { + + name "Test Workflow main.nf" + script "main.nf" + options "-profile test,docker" + tag "pipeline" + + test("SRA Skip FASTQ") { + + when { + params { + outdir = "$outputDir" + skip_fastq_download = true + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(path("$outputDir/pipeline_info/software_versions.yml")).match("software_versions") }, + { assert snapshot(path("$outputDir/metadata/").list()).match("metadata") }, + { assert snapshot(path("$outputDir/samplesheet/").list()).match("samplesheet") }, + { assert !new File("$outputDir/fastq/DRX024467_DRR026872.fastq.gz").exists() }, + { assert !new File("$outputDir/fastq/DRX026011_DRR028935_1.fastq.gz").exists() }, + { assert !new File("$outputDir/fastq/DRX026011_DRR028935_2.fastq.gz").exists() }, + { assert !new File("$outputDir/fastq/ERX1188904_ERR1109373_1.fastq.gz").exists() }, + { assert !new File("$outputDir/fastq/ERX1188904_ERR1109373_2.fastq.gz").exists() }, + { assert !new File("$outputDir/fastq/ERX1234253_ERR1160846.fastq.gz").exists() }, + { assert !new File("$outputDir/fastq/SRX10940790_SRR14593545_1.fastq.gz").exists() }, + { assert !new File("$outputDir/fastq/SRX10940790_SRR14593545_2.fastq.gz").exists() }, + { assert !new File("$outputDir/fastq/SRX11047067_SRR14709033.fastq.gz").exists() }, + { assert !new File("$outputDir/fastq/SRX6725035_SRR9984183.fastq.gz").exists() }, + { assert !new File("$outputDir/fastq/SRX9315476_SRR12848126_1.fastq.gz").exists() }, + { assert !new File("$outputDir/fastq/SRX9315476_SRR12848126_2.fastq.gz").exists() }, + { assert !new File("$outputDir/fastq/SRX9626017_SRR13191702_1.fastq.gz").exists() }, + { assert !new File("$outputDir/fastq/SRX9626017_SRR13191702_2.fastq.gz").exists() } + ) + } + + } + +} diff --git a/tests/pipeline/sra_skip_fastq.nf.test.snap b/tests/pipeline/sra_skip_fastq.nf.test.snap new file mode 100644 index 00000000..e04be0e0 --- /dev/null +++ b/tests/pipeline/sra_skip_fastq.nf.test.snap @@ -0,0 +1,30 @@ +{ + "metadata": { + "content": [ + "DRR026872.runinfo_ftp.tsv:md5,5620768b65ecb4067b7547a49e07b67b", + "DRR028935.runinfo_ftp.tsv:md5,7f248072a55d5f729c4827937625a05b", + "ERR1109373.runinfo_ftp.tsv:md5,f7cd42805764f783388c2686fe2a3f95", + "ERR1160846.runinfo_ftp.tsv:md5,36257a2c851d10d61a97581f3496529d", + "SRR12848126.runinfo_ftp.tsv:md5,ce5380eceefba1210df0cefe321be62a", + "SRR13191702.runinfo_ftp.tsv:md5,37f87c5665e65cece1bc5e2b529e3b3b", + "SRR14593545.runinfo_ftp.tsv:md5,36a0fe8c5d3917f105e4cbbb7a720d7d", + "SRR14709033.runinfo_ftp.tsv:md5,8f06fa2e4708318dbe8e9505000ea919", + "SRR9984183.runinfo_ftp.tsv:md5,72047c09c02782932672862e8adf3fa5" + ], + "timestamp": "2023-04-27T16:46:30+0000" + }, + "samplesheet": { + "content": [ + "id_mappings.csv:md5,660db7a31a1c775cabad5f9b21addc06", + "multiqc_config.yml:md5,d01bd71fb5b9901c80166fba0637e430", + "samplesheet.csv:md5,6b59e47a9fffdde864907419d0c4ad04" + ], + "timestamp": "2023-04-27T16:46:30+0000" + }, + "software_versions": { + "content": [ + "software_versions.yml:md5,d9a2185a464cbd9c0f576dad2ccea2cc" + ], + "timestamp": "2023-04-27T16:46:30+0000" + } +} \ No newline at end of file diff --git a/tests/pipeline/sra_with_nf_core_pipeline.nf.test b/tests/pipeline/sra_with_nf_core_pipeline.nf.test new file mode 100644 index 00000000..a31c1fbb --- /dev/null +++ b/tests/pipeline/sra_with_nf_core_pipeline.nf.test @@ -0,0 +1,110 @@ +nextflow_pipeline { + + name "Test Workflow main.nf" + script "main.nf" + options "-profile test,docker" + tag "pipeline" + + test("SRA NF-CORE/RNASEQ Samplesheet") { + + when { + params { + outdir = "$outputDir" + nf_core_pipeline = "rnaseq" + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(path("$outputDir/pipeline_info/software_versions.yml")).match("software_versions") }, + { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, + { assert snapshot(path("$outputDir/metadata/").list()).match("rnaseq_metadata") }, + { assert snapshot(path("$outputDir/samplesheet/").list()).match("rnaseq_samplesheet") } + ) + } + } + + test("SRA NF-CORE/RNASEQ Samplesheet With ENA metadata") { + + when { + params { + outdir = "$outputDir" + nf_core_pipeline = "rnaseq" + ena_metadata_fields = "run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5" + sample_mapping_fields = "run_accession,library_layout" + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(path("$outputDir/pipeline_info/software_versions.yml")).match("software_versions") }, + { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, + { assert snapshot(path("$outputDir/metadata/").list()).match("rnaseq_ena_metadata") }, + { assert snapshot(path("$outputDir/samplesheet/").list()).match("rnaseq_specific_ena_samplesheet") } + ) + } + } + + test("SRA NF-CORE/ATACSEQ Samplesheet") { + + when { + params { + outdir = "$outputDir" + nf_core_pipeline = "atacseq" + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(path("$outputDir/pipeline_info/software_versions.yml")).match("software_versions") }, + { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, + { assert snapshot(path("$outputDir/metadata/").list()).match("atacseq_metadata") }, + { assert snapshot(path("$outputDir/samplesheet/").list()).match("atacseq_samplesheet") } + ) + } + } + + test("SRA NF-CORE/VIRALRECON Samplesheet") { + + when { + params { + outdir = "$outputDir" + nf_core_pipeline = "viralrecon" + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(path("$outputDir/pipeline_info/software_versions.yml")).match("software_versions") }, + { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, + { assert snapshot(path("$outputDir/metadata/").list()).match("viralrecon_metadata") }, + { assert snapshot(path("$outputDir/samplesheet/").list()).match("viralrecon_samplesheet") } + ) + } + } + + test("SRA NF-CORE/TAXPROFILER Samplesheet") { + + when { + params { + outdir = "$outputDir" + nf_core_pipeline = "taxprofiler" + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(path("$outputDir/pipeline_info/software_versions.yml")).match("software_versions") }, + { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, + { assert snapshot(path("$outputDir/metadata/").list()).match("taxprofiler_metadata") }, + { assert snapshot(path("$outputDir/samplesheet/").list()).match("taxprofiler_samplesheet") } + ) + } + } + +} diff --git a/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap b/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap new file mode 100644 index 00000000..75d6ae55 --- /dev/null +++ b/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap @@ -0,0 +1,156 @@ +{ + "taxprofiler_metadata": { + "content": [ + "DRR026872.runinfo_ftp.tsv:md5,5620768b65ecb4067b7547a49e07b67b", + "DRR028935.runinfo_ftp.tsv:md5,7f248072a55d5f729c4827937625a05b", + "ERR1109373.runinfo_ftp.tsv:md5,f7cd42805764f783388c2686fe2a3f95", + "ERR1160846.runinfo_ftp.tsv:md5,36257a2c851d10d61a97581f3496529d", + "SRR12848126.runinfo_ftp.tsv:md5,ce5380eceefba1210df0cefe321be62a", + "SRR13191702.runinfo_ftp.tsv:md5,37f87c5665e65cece1bc5e2b529e3b3b", + "SRR14593545.runinfo_ftp.tsv:md5,36a0fe8c5d3917f105e4cbbb7a720d7d", + "SRR14709033.runinfo_ftp.tsv:md5,8f06fa2e4708318dbe8e9505000ea919", + "SRR9984183.runinfo_ftp.tsv:md5,72047c09c02782932672862e8adf3fa5" + ], + "timestamp": "2023-04-27T16:34:28+0000" + }, + "software_versions": { + "content": [ + "software_versions.yml:md5,015626dc3a0ea64e135bab19243e1586" + ], + "timestamp": "2023-04-27T16:34:28+0000" + }, + "viralrecon_metadata": { + "content": [ + "DRR026872.runinfo_ftp.tsv:md5,5620768b65ecb4067b7547a49e07b67b", + "DRR028935.runinfo_ftp.tsv:md5,7f248072a55d5f729c4827937625a05b", + "ERR1109373.runinfo_ftp.tsv:md5,f7cd42805764f783388c2686fe2a3f95", + "ERR1160846.runinfo_ftp.tsv:md5,36257a2c851d10d61a97581f3496529d", + "SRR12848126.runinfo_ftp.tsv:md5,ce5380eceefba1210df0cefe321be62a", + "SRR13191702.runinfo_ftp.tsv:md5,37f87c5665e65cece1bc5e2b529e3b3b", + "SRR14593545.runinfo_ftp.tsv:md5,36a0fe8c5d3917f105e4cbbb7a720d7d", + "SRR14709033.runinfo_ftp.tsv:md5,8f06fa2e4708318dbe8e9505000ea919", + "SRR9984183.runinfo_ftp.tsv:md5,72047c09c02782932672862e8adf3fa5" + ], + "timestamp": "2023-04-27T16:34:28+0000" + }, + "viralrecon_samplesheet": { + "content": [ + "id_mappings.csv:md5,660db7a31a1c775cabad5f9b21addc06", + "multiqc_config.yml:md5,d01bd71fb5b9901c80166fba0637e430", + "samplesheet.csv:md5,68c882e413afec7fec5aaa3f83aa7d22" + ], + "timestamp": "2023-04-27T16:34:28+0000" + }, + "atacseq_metadata": { + "content": [ + "DRR026872.runinfo_ftp.tsv:md5,5620768b65ecb4067b7547a49e07b67b", + "DRR028935.runinfo_ftp.tsv:md5,7f248072a55d5f729c4827937625a05b", + "ERR1109373.runinfo_ftp.tsv:md5,f7cd42805764f783388c2686fe2a3f95", + "ERR1160846.runinfo_ftp.tsv:md5,36257a2c851d10d61a97581f3496529d", + "SRR12848126.runinfo_ftp.tsv:md5,ce5380eceefba1210df0cefe321be62a", + "SRR13191702.runinfo_ftp.tsv:md5,37f87c5665e65cece1bc5e2b529e3b3b", + "SRR14593545.runinfo_ftp.tsv:md5,36a0fe8c5d3917f105e4cbbb7a720d7d", + "SRR14709033.runinfo_ftp.tsv:md5,8f06fa2e4708318dbe8e9505000ea919", + "SRR9984183.runinfo_ftp.tsv:md5,72047c09c02782932672862e8adf3fa5" + ], + "timestamp": "2023-04-27T16:34:28+0000" + }, + "rnaseq_ena_metadata": { + "content": [ + "DRR026872.runinfo_ftp.tsv:md5,74a5f7058f27a565ce59db481355ca54", + "DRR028935.runinfo_ftp.tsv:md5,07a98fdcec207686a4ea2c9a3997edf3", + "ERR1109373.runinfo_ftp.tsv:md5,868897310855c50b1d5fc77d1195a1f9", + "ERR1160846.runinfo_ftp.tsv:md5,146d7f2ec778b32b7da7ad040e554114", + "SRR12848126.runinfo_ftp.tsv:md5,cf8827612a76645824e83418d7d76cbf", + "SRR13191702.runinfo_ftp.tsv:md5,2031ca9b7ab736dbde37d05b10cdb0ad", + "SRR14593545.runinfo_ftp.tsv:md5,3a1ac14d71744224a61ab542f869e180", + "SRR14709033.runinfo_ftp.tsv:md5,2385a9cc5e320e78b02743c45d1338f1", + "SRR9984183.runinfo_ftp.tsv:md5,f1ed9fc572d2e0d145be7f547f6d1236" + ], + "timestamp": "2023-04-27T16:34:28+0000" + }, + "rnaseq_samplesheet": { + "content": [ + "id_mappings.csv:md5,660db7a31a1c775cabad5f9b21addc06", + "multiqc_config.yml:md5,d01bd71fb5b9901c80166fba0637e430", + "samplesheet.csv:md5,83a47dad4e4a78390d8ed5492c20f2a1" + ], + "timestamp": "2023-04-27T16:34:28+0000" + }, + "rnaseq_samplesheet_specific_ena": { + "content": [ + "id_mappings.csv:md5,0efde324e1818c0827390a17449a6e8a", + "multiqc_config.yml:md5,6af65b0ae40e1bba60a25361771624bd", + "samplesheet.csv:md5,dc7371849e112d0e95646ef1c34339d0" + ], + "timestamp": "2023-04-27T16:34:28+0000" + }, + "rnaseq_metadata": { + "content": [ + "DRR026872.runinfo_ftp.tsv:md5,5620768b65ecb4067b7547a49e07b67b", + "DRR028935.runinfo_ftp.tsv:md5,7f248072a55d5f729c4827937625a05b", + "ERR1109373.runinfo_ftp.tsv:md5,f7cd42805764f783388c2686fe2a3f95", + "ERR1160846.runinfo_ftp.tsv:md5,36257a2c851d10d61a97581f3496529d", + "SRR12848126.runinfo_ftp.tsv:md5,ce5380eceefba1210df0cefe321be62a", + "SRR13191702.runinfo_ftp.tsv:md5,37f87c5665e65cece1bc5e2b529e3b3b", + "SRR14593545.runinfo_ftp.tsv:md5,36a0fe8c5d3917f105e4cbbb7a720d7d", + "SRR14709033.runinfo_ftp.tsv:md5,8f06fa2e4708318dbe8e9505000ea919", + "SRR9984183.runinfo_ftp.tsv:md5,72047c09c02782932672862e8adf3fa5" + ], + "timestamp": "2023-04-27T16:34:28+0000" + }, + "rnaseq_specific_ena_samplesheet": { + "content": [ + "id_mappings.csv:md5,0efde324e1818c0827390a17449a6e8a", + "multiqc_config.yml:md5,6af65b0ae40e1bba60a25361771624bd", + "samplesheet.csv:md5,dc7371849e112d0e95646ef1c34339d0" + ], + "timestamp": "2023-04-27T16:34:28+0000" + }, + "atacseq_samplesheet": { + "content": [ + "id_mappings.csv:md5,660db7a31a1c775cabad5f9b21addc06", + "multiqc_config.yml:md5,d01bd71fb5b9901c80166fba0637e430", + "samplesheet.csv:md5,0c5df4b98006b33257d444eacbdcbfbe" + ], + "timestamp": "2023-04-27T16:34:28+0000" + }, + "taxprofiler_samplesheet": { + "content": [ + "id_mappings.csv:md5,660db7a31a1c775cabad5f9b21addc06", + "multiqc_config.yml:md5,d01bd71fb5b9901c80166fba0637e430", + "samplesheet.csv:md5,56f9b2713f8923a4bca194ca4fbbf245" + ], + "timestamp": "2023-04-27T16:34:28+0000" + }, + "fastq": { + "content": [ + "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791", + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30", + "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9", + "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6", + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2", + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda", + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544", + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79", + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98", + [ + "DRX024467_DRR026872.fastq.gz.md5:md5,dacaeba3498fb8f405411a22cdb4b40d", + "DRX026011_DRR028935_1.fastq.gz.md5:md5,a47018c5972ba4c11539d0d6bc25eda9", + "DRX026011_DRR028935_2.fastq.gz.md5:md5,f477bbef548fbed665734ebf084eea2f", + "ERX1188904_ERR1109373_1.fastq.gz.md5:md5,50c1c3108631dc32a3151b67e0260d86", + "ERX1188904_ERR1109373_2.fastq.gz.md5:md5,1f22463d410e91a288c83d43654b2499", + "ERX1234253_ERR1160846.fastq.gz.md5:md5,513a8437ad331fc512b088b3750aa1ff", + "SRX6725035_SRR9984183.fastq.gz.md5:md5,84f59dbb76c9b5eab7e14d90ced352c4", + "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", + "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" + ] + ], + "timestamp": "2023-04-27T16:34:28+0000" + } +} \ No newline at end of file diff --git a/tests/pipeline/sra_with_sratools.nf.test b/tests/pipeline/sra_with_sratools.nf.test new file mode 100644 index 00000000..97602440 --- /dev/null +++ b/tests/pipeline/sra_with_sratools.nf.test @@ -0,0 +1,29 @@ +nextflow_pipeline { + + name "Test Workflow main.nf" + script "main.nf" + options "-profile test,docker" + tag "pipeline" + + test("SRA Force SRAtools Download") { + + when { + params { + outdir = "$outputDir" + force_sratools_download = true + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(path("$outputDir/pipeline_info/software_versions.yml")).match("software_versions") }, + { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, + { assert snapshot(path("$outputDir/metadata/").list()).match("metadata") }, + { assert snapshot(path("$outputDir/samplesheet/").list()).match("samplesheet") } + ) + } + + } + +} diff --git a/tests/pipeline/sra_with_sratools.nf.test.snap b/tests/pipeline/sra_with_sratools.nf.test.snap new file mode 100644 index 00000000..87af9987 --- /dev/null +++ b/tests/pipeline/sra_with_sratools.nf.test.snap @@ -0,0 +1,49 @@ +{ + "metadata": { + "content": [ + "DRR026872.runinfo_ftp.tsv:md5,5620768b65ecb4067b7547a49e07b67b", + "DRR028935.runinfo_ftp.tsv:md5,7f248072a55d5f729c4827937625a05b", + "ERR1109373.runinfo_ftp.tsv:md5,f7cd42805764f783388c2686fe2a3f95", + "ERR1160846.runinfo_ftp.tsv:md5,36257a2c851d10d61a97581f3496529d", + "SRR12848126.runinfo_ftp.tsv:md5,ce5380eceefba1210df0cefe321be62a", + "SRR13191702.runinfo_ftp.tsv:md5,37f87c5665e65cece1bc5e2b529e3b3b", + "SRR14593545.runinfo_ftp.tsv:md5,36a0fe8c5d3917f105e4cbbb7a720d7d", + "SRR14709033.runinfo_ftp.tsv:md5,8f06fa2e4708318dbe8e9505000ea919", + "SRR9984183.runinfo_ftp.tsv:md5,72047c09c02782932672862e8adf3fa5" + ], + "timestamp": "2023-04-27T16:51:33+0000" + }, + "samplesheet": { + "content": [ + "id_mappings.csv:md5,660db7a31a1c775cabad5f9b21addc06", + "multiqc_config.yml:md5,d01bd71fb5b9901c80166fba0637e430", + "samplesheet.csv:md5,2087763d7cdce58c331ae379b2e1dc27" + ], + "timestamp": "2023-04-27T16:51:33+0000" + }, + "software_versions": { + "content": [ + "software_versions.yml:md5,029defc466fd9a709cf95d2d903e1324" + ], + "timestamp": "2023-04-27T16:51:33+0000" + }, + "fastq": { + "content": [ + "DRX024467_DRR026872.fastq.gz:md5,bd3f113c3b06cf4499fa0e00c634ec85", + "DRX026011_DRR028935_1.fastq.gz:md5,0f96fb60e903c8cbd55a6977e66f7c93", + "DRX026011_DRR028935_2.fastq.gz:md5,b97b1e0e806bcae10a7443e2f22d6ca2", + "ERX1188904_ERR1109373_1.fastq.gz:md5,e7edae2715dfaf4c318d37959fd9ae22", + "ERX1188904_ERR1109373_2.fastq.gz:md5,34ab048c92201a5ec4ab36d8dc1c5732", + "ERX1234253_ERR1160846.fastq.gz:md5,22683b24b2467494e430643423f1e275", + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2", + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda", + "SRX6725035_SRR9984183.fastq.gz:md5,7a70e678c400366869601c8be41fe74b", + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79", + "SRX9626017_SRR13191702_1.fastq.gz:md5,627a90afcd9f3cfc7f5f91074f9a2df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,3d9b2c68a8ad1547105b17de81b2d9af" + ], + "timestamp": "2023-04-27T16:51:33+0000" + } +} \ No newline at end of file diff --git a/tests/pipeline/synapse.test b/tests/pipeline/synapse.test new file mode 100644 index 00000000..91f865dc --- /dev/null +++ b/tests/pipeline/synapse.test @@ -0,0 +1,26 @@ +nextflow_pipeline { + + name "Test Workflow main.nf" + script "main.nf" + options "-profile test_synapse,docker" + tag "pipeline" + + test("Synapse Input Type") { + + when { + params { + outdir = "$outputDir" + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(path("$outputDir/pipeline_info/software_versions.yml")).match("software_versions") }, + { assert snapshot(path("$outputDir/samplesheet/").list()).match("samplesheet") } + ) + } + + } + +} From 028584dca40ea3c14073a82402e588c902ccd2d0 Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Mon, 8 May 2023 19:46:02 -0400 Subject: [PATCH 313/852] update-ci-for-nf-tests --- .github/workflows/ci.yml | 80 +++++++++++++++++++++++++--------------- .nf-core.yml | 1 + 2 files changed, 51 insertions(+), 30 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5bef3edd..1b1f6b73 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,63 +1,83 @@ +# This is the nf-core CI workflow configuration for GitHub Actions name: nf-core CI -# This workflow runs the pipeline with the minimal test dataset to check that it completes without any syntax errors + +# This workflow is triggered when a pull request is made to the 'dev' branch or when a new release is published on: - push: + pull_request: branches: - dev - pull_request: release: types: [published] +# Setting environment variable for Nextflow logs env: NXF_ANSI_LOG: false +# Cancel if a newer run is started concurrency: - group: "${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}" + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true + # Define the jobs to be run in parallel jobs: test: - name: Run pipeline with test data - # Only run on push if this is the nf-core dev branch (merged PRs) - if: "${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/fetchngs') }}" + # Name the job with the corresponding profile, Nextflow version and aligner + name: Run ${{ matrix.profile }}-${{ matrix.NXF_VER }} pipeline test + + # Set the condition for running the job + if: "${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/rnaseq') }}" + + # Specify the runner for the job runs-on: ubuntu-latest + + # Define the matrix for different Nextflow versions, profiles and aligners strategy: matrix: NXF_VER: - - "22.10.1" - "latest-everything" + profile: ["docker"] + + # Define the steps for the job steps: + # Checkout the pipeline code from the repository - name: Check out pipeline code uses: actions/checkout@v3 + # Cache Test Data + - name: Cache test data + uses: actions/cache@v2 + with: + path: /usr/local/bin/nextflow + key: ${{ runner.os }} + restore-keys: | + ${{ runner.os }}-nextflow- + + # Install the specified version of Nextflow - name: Install Nextflow uses: nf-core/setup-nextflow@v1 with: version: "${{ matrix.NXF_VER }}" - - name: Run pipeline with test data + # Install nf-test + - name: Install nf-test run: | - nextflow run ${GITHUB_WORKSPACE} -profile test,docker --outdir ./results + wget -qO- https://code.askimed.com/install/nf-test | bash + sudo mv nf-test /usr/local/bin/ - parameters: - name: Test workflow parameters - if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/fetchngs') }} - runs-on: ubuntu-latest - strategy: - matrix: - parameters: - - "--nf_core_pipeline rnaseq" - - "--ena_metadata_fields run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5 --sample_mapping_fields run_accession,library_layout" - - "--skip_fastq_download" - - "--force_sratools_download" - steps: - - name: Check out pipeline code - uses: actions/checkout@v2 - - - name: Install Nextflow + # Run nf-test with the specified aligner and output test results in TAP format + - name: Run nf-test run: | - wget -qO- get.nextflow.io | bash - sudo mv nextflow /usr/local/bin/ - - name: Run pipeline with various parameters + nf-test test tests/pipeline/ --tap=test.tap + + # If the test fails, output the software_versions.yml using the 'batcat' utility + - name: Output log on failure + if: failure() run: | - nextflow run ${GITHUB_WORKSPACE} -profile test,docker --outdir ./results ${{ matrix.parameters }} + sudo apt install bat > /dev/null + batcat --decorations=always --color=always /home/runner/work/fetchngs/fetchngs/.nf-test/tests/*/output/pipeline_info/software_versions.yml + + # Use TAP summary to display test results + - uses: pcolby/tap-summary@v1 + with: + path: >- + test.tap diff --git a/.nf-core.yml b/.nf-core.yml index cafd671c..0d8fc46d 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -3,3 +3,4 @@ lint: files_unchanged: - assets/sendmail_template.txt - lib/NfcoreTemplate.groovy + actions_ci: False \ No newline at end of file From e5ed5a53555eb652535d40241b3506bfde89a9a5 Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Mon, 8 May 2023 19:47:36 -0400 Subject: [PATCH 314/852] prettier-fix-nf-core-yml --- .nf-core.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.nf-core.yml b/.nf-core.yml index 0d8fc46d..402025a7 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -3,4 +3,4 @@ lint: files_unchanged: - assets/sendmail_template.txt - lib/NfcoreTemplate.groovy - actions_ci: False \ No newline at end of file + actions_ci: False From 0136187a1105985cfa612b5ed90e3af7b60202fe Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Mon, 8 May 2023 20:41:06 -0400 Subject: [PATCH 315/852] rebase-and-update-snapshots --- .gitignore | 2 + tests/pipeline/sra.nf.test.snap | 34 ++--- tests/pipeline/sra_skip_fastq.nf.test.snap | 32 ++--- .../sra_with_nf_core_pipeline.nf.test.snap | 126 +++++++++--------- tests/pipeline/sra_with_sratools.nf.test.snap | 34 ++--- 5 files changed, 115 insertions(+), 113 deletions(-) diff --git a/.gitignore b/.gitignore index 5124c9ac..935326a7 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,5 @@ results/ testing/ testing* *.pyc +.nf-test/ +nf-test diff --git a/tests/pipeline/sra.nf.test.snap b/tests/pipeline/sra.nf.test.snap index 8ed35844..3ce84e64 100644 --- a/tests/pipeline/sra.nf.test.snap +++ b/tests/pipeline/sra.nf.test.snap @@ -1,31 +1,31 @@ { "metadata": { "content": [ - "DRR026872.runinfo_ftp.tsv:md5,5620768b65ecb4067b7547a49e07b67b", - "DRR028935.runinfo_ftp.tsv:md5,7f248072a55d5f729c4827937625a05b", - "ERR1109373.runinfo_ftp.tsv:md5,f7cd42805764f783388c2686fe2a3f95", - "ERR1160846.runinfo_ftp.tsv:md5,36257a2c851d10d61a97581f3496529d", - "SRR12848126.runinfo_ftp.tsv:md5,ce5380eceefba1210df0cefe321be62a", - "SRR13191702.runinfo_ftp.tsv:md5,37f87c5665e65cece1bc5e2b529e3b3b", - "SRR14593545.runinfo_ftp.tsv:md5,36a0fe8c5d3917f105e4cbbb7a720d7d", - "SRR14709033.runinfo_ftp.tsv:md5,8f06fa2e4708318dbe8e9505000ea919", - "SRR9984183.runinfo_ftp.tsv:md5,72047c09c02782932672862e8adf3fa5" + "DRR026872.runinfo_ftp.tsv:md5,f46819ed848d0d28dff80fd0f5a4cd34", + "DRR028935.runinfo_ftp.tsv:md5,ef08c3756034e6705b0e13d1f37bfea5", + "ERR1109373.runinfo_ftp.tsv:md5,6e7960f43046c6080435a024e9c426c9", + "ERR1160846.runinfo_ftp.tsv:md5,db8b7bc5877a62b90e719d7cf3c0d25f", + "SRR12848126.runinfo_ftp.tsv:md5,b8ac151eb85a001e9aa3d7319156c016", + "SRR13191702.runinfo_ftp.tsv:md5,7188ac3b1d73ec297a900450e73bf751", + "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", + "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", + "SRR9984183.runinfo_ftp.tsv:md5,827751e211294eeecbb7239f70ead9a5" ], - "timestamp": "2023-04-27T17:03:41+0000" + "timestamp": "2023-05-09T00:33:33+0000" }, "samplesheet": { "content": [ - "id_mappings.csv:md5,660db7a31a1c775cabad5f9b21addc06", - "multiqc_config.yml:md5,d01bd71fb5b9901c80166fba0637e430", - "samplesheet.csv:md5,90a48cdcc3773bd06586675a82571103" + "id_mappings.csv:md5,40c6daa8d668b4930bfd9045248e16ec", + "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d", + "samplesheet.csv:md5,a12fd27d7741f1aa687049eb6ce9ed9a" ], - "timestamp": "2023-04-27T17:03:41+0000" + "timestamp": "2023-05-09T00:33:33+0000" }, "software_versions": { "content": [ - "software_versions.yml:md5,015626dc3a0ea64e135bab19243e1586" + "software_versions.yml:md5,c8ccda032b4de8e103eace767442fcf4" ], - "timestamp": "2023-04-27T17:03:41+0000" + "timestamp": "2023-05-09T00:33:33+0000" }, "fastq": { "content": [ @@ -55,6 +55,6 @@ "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" ] ], - "timestamp": "2023-04-27T17:03:41+0000" + "timestamp": "2023-05-09T00:33:33+0000" } } \ No newline at end of file diff --git a/tests/pipeline/sra_skip_fastq.nf.test.snap b/tests/pipeline/sra_skip_fastq.nf.test.snap index e04be0e0..4c208a29 100644 --- a/tests/pipeline/sra_skip_fastq.nf.test.snap +++ b/tests/pipeline/sra_skip_fastq.nf.test.snap @@ -1,30 +1,30 @@ { "metadata": { "content": [ - "DRR026872.runinfo_ftp.tsv:md5,5620768b65ecb4067b7547a49e07b67b", - "DRR028935.runinfo_ftp.tsv:md5,7f248072a55d5f729c4827937625a05b", - "ERR1109373.runinfo_ftp.tsv:md5,f7cd42805764f783388c2686fe2a3f95", - "ERR1160846.runinfo_ftp.tsv:md5,36257a2c851d10d61a97581f3496529d", - "SRR12848126.runinfo_ftp.tsv:md5,ce5380eceefba1210df0cefe321be62a", - "SRR13191702.runinfo_ftp.tsv:md5,37f87c5665e65cece1bc5e2b529e3b3b", - "SRR14593545.runinfo_ftp.tsv:md5,36a0fe8c5d3917f105e4cbbb7a720d7d", - "SRR14709033.runinfo_ftp.tsv:md5,8f06fa2e4708318dbe8e9505000ea919", - "SRR9984183.runinfo_ftp.tsv:md5,72047c09c02782932672862e8adf3fa5" + "DRR026872.runinfo_ftp.tsv:md5,f46819ed848d0d28dff80fd0f5a4cd34", + "DRR028935.runinfo_ftp.tsv:md5,ef08c3756034e6705b0e13d1f37bfea5", + "ERR1109373.runinfo_ftp.tsv:md5,6e7960f43046c6080435a024e9c426c9", + "ERR1160846.runinfo_ftp.tsv:md5,db8b7bc5877a62b90e719d7cf3c0d25f", + "SRR12848126.runinfo_ftp.tsv:md5,b8ac151eb85a001e9aa3d7319156c016", + "SRR13191702.runinfo_ftp.tsv:md5,7188ac3b1d73ec297a900450e73bf751", + "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", + "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", + "SRR9984183.runinfo_ftp.tsv:md5,827751e211294eeecbb7239f70ead9a5" ], - "timestamp": "2023-04-27T16:46:30+0000" + "timestamp": "2023-05-09T00:28:56+0000" }, "samplesheet": { "content": [ - "id_mappings.csv:md5,660db7a31a1c775cabad5f9b21addc06", - "multiqc_config.yml:md5,d01bd71fb5b9901c80166fba0637e430", - "samplesheet.csv:md5,6b59e47a9fffdde864907419d0c4ad04" + "id_mappings.csv:md5,40c6daa8d668b4930bfd9045248e16ec", + "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d", + "samplesheet.csv:md5,2006cc16ca44e947b5244528310c03e0" ], - "timestamp": "2023-04-27T16:46:30+0000" + "timestamp": "2023-05-09T00:28:56+0000" }, "software_versions": { "content": [ - "software_versions.yml:md5,d9a2185a464cbd9c0f576dad2ccea2cc" + "software_versions.yml:md5,8b5ec8d90481271f6584ceff4d990caa" ], - "timestamp": "2023-04-27T16:46:30+0000" + "timestamp": "2023-05-09T00:28:56+0000" } } \ No newline at end of file diff --git a/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap b/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap index 75d6ae55..df54719e 100644 --- a/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap +++ b/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap @@ -1,59 +1,59 @@ { "taxprofiler_metadata": { "content": [ - "DRR026872.runinfo_ftp.tsv:md5,5620768b65ecb4067b7547a49e07b67b", - "DRR028935.runinfo_ftp.tsv:md5,7f248072a55d5f729c4827937625a05b", - "ERR1109373.runinfo_ftp.tsv:md5,f7cd42805764f783388c2686fe2a3f95", - "ERR1160846.runinfo_ftp.tsv:md5,36257a2c851d10d61a97581f3496529d", - "SRR12848126.runinfo_ftp.tsv:md5,ce5380eceefba1210df0cefe321be62a", - "SRR13191702.runinfo_ftp.tsv:md5,37f87c5665e65cece1bc5e2b529e3b3b", - "SRR14593545.runinfo_ftp.tsv:md5,36a0fe8c5d3917f105e4cbbb7a720d7d", - "SRR14709033.runinfo_ftp.tsv:md5,8f06fa2e4708318dbe8e9505000ea919", - "SRR9984183.runinfo_ftp.tsv:md5,72047c09c02782932672862e8adf3fa5" + "DRR026872.runinfo_ftp.tsv:md5,f46819ed848d0d28dff80fd0f5a4cd34", + "DRR028935.runinfo_ftp.tsv:md5,ef08c3756034e6705b0e13d1f37bfea5", + "ERR1109373.runinfo_ftp.tsv:md5,6e7960f43046c6080435a024e9c426c9", + "ERR1160846.runinfo_ftp.tsv:md5,db8b7bc5877a62b90e719d7cf3c0d25f", + "SRR12848126.runinfo_ftp.tsv:md5,b8ac151eb85a001e9aa3d7319156c016", + "SRR13191702.runinfo_ftp.tsv:md5,7188ac3b1d73ec297a900450e73bf751", + "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", + "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", + "SRR9984183.runinfo_ftp.tsv:md5,827751e211294eeecbb7239f70ead9a5" ], - "timestamp": "2023-04-27T16:34:28+0000" + "timestamp": "2023-05-09T00:32:47+0000" }, "software_versions": { "content": [ - "software_versions.yml:md5,015626dc3a0ea64e135bab19243e1586" + "software_versions.yml:md5,c8ccda032b4de8e103eace767442fcf4" ], - "timestamp": "2023-04-27T16:34:28+0000" + "timestamp": "2023-05-09T00:32:47+0000" }, "viralrecon_metadata": { "content": [ - "DRR026872.runinfo_ftp.tsv:md5,5620768b65ecb4067b7547a49e07b67b", - "DRR028935.runinfo_ftp.tsv:md5,7f248072a55d5f729c4827937625a05b", - "ERR1109373.runinfo_ftp.tsv:md5,f7cd42805764f783388c2686fe2a3f95", - "ERR1160846.runinfo_ftp.tsv:md5,36257a2c851d10d61a97581f3496529d", - "SRR12848126.runinfo_ftp.tsv:md5,ce5380eceefba1210df0cefe321be62a", - "SRR13191702.runinfo_ftp.tsv:md5,37f87c5665e65cece1bc5e2b529e3b3b", - "SRR14593545.runinfo_ftp.tsv:md5,36a0fe8c5d3917f105e4cbbb7a720d7d", - "SRR14709033.runinfo_ftp.tsv:md5,8f06fa2e4708318dbe8e9505000ea919", - "SRR9984183.runinfo_ftp.tsv:md5,72047c09c02782932672862e8adf3fa5" + "DRR026872.runinfo_ftp.tsv:md5,f46819ed848d0d28dff80fd0f5a4cd34", + "DRR028935.runinfo_ftp.tsv:md5,ef08c3756034e6705b0e13d1f37bfea5", + "ERR1109373.runinfo_ftp.tsv:md5,6e7960f43046c6080435a024e9c426c9", + "ERR1160846.runinfo_ftp.tsv:md5,db8b7bc5877a62b90e719d7cf3c0d25f", + "SRR12848126.runinfo_ftp.tsv:md5,b8ac151eb85a001e9aa3d7319156c016", + "SRR13191702.runinfo_ftp.tsv:md5,7188ac3b1d73ec297a900450e73bf751", + "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", + "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", + "SRR9984183.runinfo_ftp.tsv:md5,827751e211294eeecbb7239f70ead9a5" ], - "timestamp": "2023-04-27T16:34:28+0000" + "timestamp": "2023-05-09T00:32:47+0000" }, "viralrecon_samplesheet": { "content": [ - "id_mappings.csv:md5,660db7a31a1c775cabad5f9b21addc06", - "multiqc_config.yml:md5,d01bd71fb5b9901c80166fba0637e430", - "samplesheet.csv:md5,68c882e413afec7fec5aaa3f83aa7d22" + "id_mappings.csv:md5,40c6daa8d668b4930bfd9045248e16ec", + "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d", + "samplesheet.csv:md5,b3063b7ccd5713c903f20c61ca59db00" ], - "timestamp": "2023-04-27T16:34:28+0000" + "timestamp": "2023-05-09T00:32:47+0000" }, "atacseq_metadata": { "content": [ - "DRR026872.runinfo_ftp.tsv:md5,5620768b65ecb4067b7547a49e07b67b", - "DRR028935.runinfo_ftp.tsv:md5,7f248072a55d5f729c4827937625a05b", - "ERR1109373.runinfo_ftp.tsv:md5,f7cd42805764f783388c2686fe2a3f95", - "ERR1160846.runinfo_ftp.tsv:md5,36257a2c851d10d61a97581f3496529d", - "SRR12848126.runinfo_ftp.tsv:md5,ce5380eceefba1210df0cefe321be62a", - "SRR13191702.runinfo_ftp.tsv:md5,37f87c5665e65cece1bc5e2b529e3b3b", - "SRR14593545.runinfo_ftp.tsv:md5,36a0fe8c5d3917f105e4cbbb7a720d7d", - "SRR14709033.runinfo_ftp.tsv:md5,8f06fa2e4708318dbe8e9505000ea919", - "SRR9984183.runinfo_ftp.tsv:md5,72047c09c02782932672862e8adf3fa5" + "DRR026872.runinfo_ftp.tsv:md5,f46819ed848d0d28dff80fd0f5a4cd34", + "DRR028935.runinfo_ftp.tsv:md5,ef08c3756034e6705b0e13d1f37bfea5", + "ERR1109373.runinfo_ftp.tsv:md5,6e7960f43046c6080435a024e9c426c9", + "ERR1160846.runinfo_ftp.tsv:md5,db8b7bc5877a62b90e719d7cf3c0d25f", + "SRR12848126.runinfo_ftp.tsv:md5,b8ac151eb85a001e9aa3d7319156c016", + "SRR13191702.runinfo_ftp.tsv:md5,7188ac3b1d73ec297a900450e73bf751", + "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", + "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", + "SRR9984183.runinfo_ftp.tsv:md5,827751e211294eeecbb7239f70ead9a5" ], - "timestamp": "2023-04-27T16:34:28+0000" + "timestamp": "2023-05-09T00:32:47+0000" }, "rnaseq_ena_metadata": { "content": [ @@ -67,15 +67,15 @@ "SRR14709033.runinfo_ftp.tsv:md5,2385a9cc5e320e78b02743c45d1338f1", "SRR9984183.runinfo_ftp.tsv:md5,f1ed9fc572d2e0d145be7f547f6d1236" ], - "timestamp": "2023-04-27T16:34:28+0000" + "timestamp": "2023-05-09T00:32:47+0000" }, "rnaseq_samplesheet": { "content": [ - "id_mappings.csv:md5,660db7a31a1c775cabad5f9b21addc06", - "multiqc_config.yml:md5,d01bd71fb5b9901c80166fba0637e430", - "samplesheet.csv:md5,83a47dad4e4a78390d8ed5492c20f2a1" + "id_mappings.csv:md5,40c6daa8d668b4930bfd9045248e16ec", + "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d", + "samplesheet.csv:md5,f0c8636a26f811f9f0e4aa8046496148" ], - "timestamp": "2023-04-27T16:34:28+0000" + "timestamp": "2023-05-09T00:32:47+0000" }, "rnaseq_samplesheet_specific_ena": { "content": [ @@ -83,45 +83,45 @@ "multiqc_config.yml:md5,6af65b0ae40e1bba60a25361771624bd", "samplesheet.csv:md5,dc7371849e112d0e95646ef1c34339d0" ], - "timestamp": "2023-04-27T16:34:28+0000" + "timestamp": "2023-05-09T00:32:47+0000" }, "rnaseq_metadata": { "content": [ - "DRR026872.runinfo_ftp.tsv:md5,5620768b65ecb4067b7547a49e07b67b", - "DRR028935.runinfo_ftp.tsv:md5,7f248072a55d5f729c4827937625a05b", - "ERR1109373.runinfo_ftp.tsv:md5,f7cd42805764f783388c2686fe2a3f95", - "ERR1160846.runinfo_ftp.tsv:md5,36257a2c851d10d61a97581f3496529d", - "SRR12848126.runinfo_ftp.tsv:md5,ce5380eceefba1210df0cefe321be62a", - "SRR13191702.runinfo_ftp.tsv:md5,37f87c5665e65cece1bc5e2b529e3b3b", - "SRR14593545.runinfo_ftp.tsv:md5,36a0fe8c5d3917f105e4cbbb7a720d7d", - "SRR14709033.runinfo_ftp.tsv:md5,8f06fa2e4708318dbe8e9505000ea919", - "SRR9984183.runinfo_ftp.tsv:md5,72047c09c02782932672862e8adf3fa5" + "DRR026872.runinfo_ftp.tsv:md5,f46819ed848d0d28dff80fd0f5a4cd34", + "DRR028935.runinfo_ftp.tsv:md5,ef08c3756034e6705b0e13d1f37bfea5", + "ERR1109373.runinfo_ftp.tsv:md5,6e7960f43046c6080435a024e9c426c9", + "ERR1160846.runinfo_ftp.tsv:md5,db8b7bc5877a62b90e719d7cf3c0d25f", + "SRR12848126.runinfo_ftp.tsv:md5,b8ac151eb85a001e9aa3d7319156c016", + "SRR13191702.runinfo_ftp.tsv:md5,7188ac3b1d73ec297a900450e73bf751", + "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", + "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", + "SRR9984183.runinfo_ftp.tsv:md5,827751e211294eeecbb7239f70ead9a5" ], - "timestamp": "2023-04-27T16:34:28+0000" + "timestamp": "2023-05-09T00:32:47+0000" }, "rnaseq_specific_ena_samplesheet": { "content": [ "id_mappings.csv:md5,0efde324e1818c0827390a17449a6e8a", "multiqc_config.yml:md5,6af65b0ae40e1bba60a25361771624bd", - "samplesheet.csv:md5,dc7371849e112d0e95646ef1c34339d0" + "samplesheet.csv:md5,f6348f24c001ab15872ca73b493cbd79" ], - "timestamp": "2023-04-27T16:34:28+0000" + "timestamp": "2023-05-09T00:32:47+0000" }, "atacseq_samplesheet": { "content": [ - "id_mappings.csv:md5,660db7a31a1c775cabad5f9b21addc06", - "multiqc_config.yml:md5,d01bd71fb5b9901c80166fba0637e430", - "samplesheet.csv:md5,0c5df4b98006b33257d444eacbdcbfbe" + "id_mappings.csv:md5,40c6daa8d668b4930bfd9045248e16ec", + "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d", + "samplesheet.csv:md5,522e4a3fed3f69cee16bae0709bf4e61" ], - "timestamp": "2023-04-27T16:34:28+0000" + "timestamp": "2023-05-09T00:32:47+0000" }, "taxprofiler_samplesheet": { "content": [ - "id_mappings.csv:md5,660db7a31a1c775cabad5f9b21addc06", - "multiqc_config.yml:md5,d01bd71fb5b9901c80166fba0637e430", - "samplesheet.csv:md5,56f9b2713f8923a4bca194ca4fbbf245" + "id_mappings.csv:md5,40c6daa8d668b4930bfd9045248e16ec", + "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d", + "samplesheet.csv:md5,3f1776eed364e1568fb47e37435db20b" ], - "timestamp": "2023-04-27T16:34:28+0000" + "timestamp": "2023-05-09T00:32:47+0000" }, "fastq": { "content": [ @@ -151,6 +151,6 @@ "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" ] ], - "timestamp": "2023-04-27T16:34:28+0000" + "timestamp": "2023-05-09T00:32:47+0000" } } \ No newline at end of file diff --git a/tests/pipeline/sra_with_sratools.nf.test.snap b/tests/pipeline/sra_with_sratools.nf.test.snap index 87af9987..ad2ebaf0 100644 --- a/tests/pipeline/sra_with_sratools.nf.test.snap +++ b/tests/pipeline/sra_with_sratools.nf.test.snap @@ -1,31 +1,31 @@ { "metadata": { "content": [ - "DRR026872.runinfo_ftp.tsv:md5,5620768b65ecb4067b7547a49e07b67b", - "DRR028935.runinfo_ftp.tsv:md5,7f248072a55d5f729c4827937625a05b", - "ERR1109373.runinfo_ftp.tsv:md5,f7cd42805764f783388c2686fe2a3f95", - "ERR1160846.runinfo_ftp.tsv:md5,36257a2c851d10d61a97581f3496529d", - "SRR12848126.runinfo_ftp.tsv:md5,ce5380eceefba1210df0cefe321be62a", - "SRR13191702.runinfo_ftp.tsv:md5,37f87c5665e65cece1bc5e2b529e3b3b", - "SRR14593545.runinfo_ftp.tsv:md5,36a0fe8c5d3917f105e4cbbb7a720d7d", - "SRR14709033.runinfo_ftp.tsv:md5,8f06fa2e4708318dbe8e9505000ea919", - "SRR9984183.runinfo_ftp.tsv:md5,72047c09c02782932672862e8adf3fa5" + "DRR026872.runinfo_ftp.tsv:md5,f46819ed848d0d28dff80fd0f5a4cd34", + "DRR028935.runinfo_ftp.tsv:md5,ef08c3756034e6705b0e13d1f37bfea5", + "ERR1109373.runinfo_ftp.tsv:md5,6e7960f43046c6080435a024e9c426c9", + "ERR1160846.runinfo_ftp.tsv:md5,db8b7bc5877a62b90e719d7cf3c0d25f", + "SRR12848126.runinfo_ftp.tsv:md5,b8ac151eb85a001e9aa3d7319156c016", + "SRR13191702.runinfo_ftp.tsv:md5,7188ac3b1d73ec297a900450e73bf751", + "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", + "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", + "SRR9984183.runinfo_ftp.tsv:md5,827751e211294eeecbb7239f70ead9a5" ], - "timestamp": "2023-04-27T16:51:33+0000" + "timestamp": "2023-05-09T00:28:30+0000" }, "samplesheet": { "content": [ - "id_mappings.csv:md5,660db7a31a1c775cabad5f9b21addc06", - "multiqc_config.yml:md5,d01bd71fb5b9901c80166fba0637e430", - "samplesheet.csv:md5,2087763d7cdce58c331ae379b2e1dc27" + "id_mappings.csv:md5,40c6daa8d668b4930bfd9045248e16ec", + "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d", + "samplesheet.csv:md5,f8c7dff22f06a380e987049d7f04f096" ], - "timestamp": "2023-04-27T16:51:33+0000" + "timestamp": "2023-05-09T00:28:30+0000" }, "software_versions": { "content": [ - "software_versions.yml:md5,029defc466fd9a709cf95d2d903e1324" + "software_versions.yml:md5,ec1f5ee8c99879c3b8f04e7e683f540f" ], - "timestamp": "2023-04-27T16:51:33+0000" + "timestamp": "2023-05-09T00:28:30+0000" }, "fastq": { "content": [ @@ -44,6 +44,6 @@ "SRX9626017_SRR13191702_1.fastq.gz:md5,627a90afcd9f3cfc7f5f91074f9a2df7", "SRX9626017_SRR13191702_2.fastq.gz:md5,3d9b2c68a8ad1547105b17de81b2d9af" ], - "timestamp": "2023-04-27T16:51:33+0000" + "timestamp": "2023-05-09T00:28:30+0000" } } \ No newline at end of file From a58f46f6986df04fbf382e54b669407ddd305569 Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Mon, 8 May 2023 20:58:18 -0400 Subject: [PATCH 316/852] update-ci-yml --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1b1f6b73..22e8274e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,7 +25,7 @@ jobs: name: Run ${{ matrix.profile }}-${{ matrix.NXF_VER }} pipeline test # Set the condition for running the job - if: "${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/rnaseq') }}" + if: "${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/fetchngs') }}" # Specify the runner for the job runs-on: ubuntu-latest From 7a6af979623d8575782f712a730ec9345ebb817b Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Mon, 8 May 2023 22:27:20 -0400 Subject: [PATCH 317/852] update-snapshots --- .../sra_ids_to_runinfo/main.nf.test.snap | 28 ++++++++++----- tests/pipeline/sra.nf.test.snap | 10 +++--- .../sra_with_nf_core_pipeline.nf.test.snap | 36 +++++++++---------- tests/pipeline/sra_with_sratools.nf.test.snap | 10 +++--- 4 files changed, 48 insertions(+), 36 deletions(-) diff --git a/tests/modules/sra_ids_to_runinfo/main.nf.test.snap b/tests/modules/sra_ids_to_runinfo/main.nf.test.snap index 5a9ed62b..e13c470f 100644 --- a/tests/modules/sra_ids_to_runinfo/main.nf.test.snap +++ b/tests/modules/sra_ids_to_runinfo/main.nf.test.snap @@ -2,27 +2,39 @@ "Should run without failures without fields": { "content": [ { - "versions": [ - "versions.yml:md5,cd1056ca246a1ab3486fb6800f3012fb" + "0": [ + "SRR9984183.runinfo.tsv:md5,6bc8bfb7058412e5a54b83e08d3d1673" + ], + "1": [ + "versions.yml:md5,61ebf47bc00075513ff16295beddb197" ], "tsv": [ - "SRR9984183.runinfo.tsv:md5,a69083928f4b856d428a681c291b7ad6" + "SRR9984183.runinfo.tsv:md5,6bc8bfb7058412e5a54b83e08d3d1673" + ], + "versions": [ + "versions.yml:md5,61ebf47bc00075513ff16295beddb197" ] } ], - "timestamp": "2022-11-11T04:23:34+0000" + "timestamp": "2023-05-09T02:22:52+0000" }, "Should run without failures with fields": { "content": [ { - "versions": [ - "versions.yml:md5,cd1056ca246a1ab3486fb6800f3012fb" + "0": [ + "SRR9984183.runinfo.tsv:md5,6419f18c29ab09634b3dd97a6b2acd06" + ], + "1": [ + "versions.yml:md5,61ebf47bc00075513ff16295beddb197" ], "tsv": [ "SRR9984183.runinfo.tsv:md5,6419f18c29ab09634b3dd97a6b2acd06" + ], + "versions": [ + "versions.yml:md5,61ebf47bc00075513ff16295beddb197" ] } ], - "timestamp": "2022-11-11T04:23:34+0000" + "timestamp": "2023-05-09T02:22:52+0000" } -} +} \ No newline at end of file diff --git a/tests/pipeline/sra.nf.test.snap b/tests/pipeline/sra.nf.test.snap index 3ce84e64..3e53c207 100644 --- a/tests/pipeline/sra.nf.test.snap +++ b/tests/pipeline/sra.nf.test.snap @@ -11,21 +11,21 @@ "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,827751e211294eeecbb7239f70ead9a5" ], - "timestamp": "2023-05-09T00:33:33+0000" + "timestamp": "2023-05-09T02:22:08+0000" }, "samplesheet": { "content": [ "id_mappings.csv:md5,40c6daa8d668b4930bfd9045248e16ec", "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d", - "samplesheet.csv:md5,a12fd27d7741f1aa687049eb6ce9ed9a" + "samplesheet.csv:md5,22cd8487e80f23686f54779a0b55c54d" ], - "timestamp": "2023-05-09T00:33:33+0000" + "timestamp": "2023-05-09T02:22:08+0000" }, "software_versions": { "content": [ "software_versions.yml:md5,c8ccda032b4de8e103eace767442fcf4" ], - "timestamp": "2023-05-09T00:33:33+0000" + "timestamp": "2023-05-09T02:22:08+0000" }, "fastq": { "content": [ @@ -55,6 +55,6 @@ "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" ] ], - "timestamp": "2023-05-09T00:33:33+0000" + "timestamp": "2023-05-09T02:22:08+0000" } } \ No newline at end of file diff --git a/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap b/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap index df54719e..8cbf7bfa 100644 --- a/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap +++ b/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap @@ -11,13 +11,13 @@ "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,827751e211294eeecbb7239f70ead9a5" ], - "timestamp": "2023-05-09T00:32:47+0000" + "timestamp": "2023-05-09T02:19:58+0000" }, "software_versions": { "content": [ "software_versions.yml:md5,c8ccda032b4de8e103eace767442fcf4" ], - "timestamp": "2023-05-09T00:32:47+0000" + "timestamp": "2023-05-09T02:19:58+0000" }, "viralrecon_metadata": { "content": [ @@ -31,15 +31,15 @@ "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,827751e211294eeecbb7239f70ead9a5" ], - "timestamp": "2023-05-09T00:32:47+0000" + "timestamp": "2023-05-09T02:19:58+0000" }, "viralrecon_samplesheet": { "content": [ "id_mappings.csv:md5,40c6daa8d668b4930bfd9045248e16ec", "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d", - "samplesheet.csv:md5,b3063b7ccd5713c903f20c61ca59db00" + "samplesheet.csv:md5,9bdd606909eb08fcb6a4b10a5c1fea7a" ], - "timestamp": "2023-05-09T00:32:47+0000" + "timestamp": "2023-05-09T02:19:58+0000" }, "atacseq_metadata": { "content": [ @@ -53,7 +53,7 @@ "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,827751e211294eeecbb7239f70ead9a5" ], - "timestamp": "2023-05-09T00:32:47+0000" + "timestamp": "2023-05-09T02:19:58+0000" }, "rnaseq_ena_metadata": { "content": [ @@ -67,15 +67,15 @@ "SRR14709033.runinfo_ftp.tsv:md5,2385a9cc5e320e78b02743c45d1338f1", "SRR9984183.runinfo_ftp.tsv:md5,f1ed9fc572d2e0d145be7f547f6d1236" ], - "timestamp": "2023-05-09T00:32:47+0000" + "timestamp": "2023-05-09T02:19:58+0000" }, "rnaseq_samplesheet": { "content": [ "id_mappings.csv:md5,40c6daa8d668b4930bfd9045248e16ec", "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d", - "samplesheet.csv:md5,f0c8636a26f811f9f0e4aa8046496148" + "samplesheet.csv:md5,d6f1c7e9cc6f8e531fc92a9a4ae9993f" ], - "timestamp": "2023-05-09T00:32:47+0000" + "timestamp": "2023-05-09T02:19:58+0000" }, "rnaseq_samplesheet_specific_ena": { "content": [ @@ -83,7 +83,7 @@ "multiqc_config.yml:md5,6af65b0ae40e1bba60a25361771624bd", "samplesheet.csv:md5,dc7371849e112d0e95646ef1c34339d0" ], - "timestamp": "2023-05-09T00:32:47+0000" + "timestamp": "2023-05-09T02:19:58+0000" }, "rnaseq_metadata": { "content": [ @@ -97,31 +97,31 @@ "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,827751e211294eeecbb7239f70ead9a5" ], - "timestamp": "2023-05-09T00:32:47+0000" + "timestamp": "2023-05-09T02:19:58+0000" }, "rnaseq_specific_ena_samplesheet": { "content": [ "id_mappings.csv:md5,0efde324e1818c0827390a17449a6e8a", "multiqc_config.yml:md5,6af65b0ae40e1bba60a25361771624bd", - "samplesheet.csv:md5,f6348f24c001ab15872ca73b493cbd79" + "samplesheet.csv:md5,6a08c28af1ed2629e18f0014f4d72ed6" ], - "timestamp": "2023-05-09T00:32:47+0000" + "timestamp": "2023-05-09T02:19:58+0000" }, "atacseq_samplesheet": { "content": [ "id_mappings.csv:md5,40c6daa8d668b4930bfd9045248e16ec", "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d", - "samplesheet.csv:md5,522e4a3fed3f69cee16bae0709bf4e61" + "samplesheet.csv:md5,65e8d7f0f4174271205e777689fe8491" ], - "timestamp": "2023-05-09T00:32:47+0000" + "timestamp": "2023-05-09T02:19:58+0000" }, "taxprofiler_samplesheet": { "content": [ "id_mappings.csv:md5,40c6daa8d668b4930bfd9045248e16ec", "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d", - "samplesheet.csv:md5,3f1776eed364e1568fb47e37435db20b" + "samplesheet.csv:md5,c00d9e0b7c6222a8f31cd22a265c33fe" ], - "timestamp": "2023-05-09T00:32:47+0000" + "timestamp": "2023-05-09T02:19:58+0000" }, "fastq": { "content": [ @@ -151,6 +151,6 @@ "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" ] ], - "timestamp": "2023-05-09T00:32:47+0000" + "timestamp": "2023-05-09T02:19:58+0000" } } \ No newline at end of file diff --git a/tests/pipeline/sra_with_sratools.nf.test.snap b/tests/pipeline/sra_with_sratools.nf.test.snap index ad2ebaf0..5bc9b9bf 100644 --- a/tests/pipeline/sra_with_sratools.nf.test.snap +++ b/tests/pipeline/sra_with_sratools.nf.test.snap @@ -11,21 +11,21 @@ "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,827751e211294eeecbb7239f70ead9a5" ], - "timestamp": "2023-05-09T00:28:30+0000" + "timestamp": "2023-05-09T02:12:04+0000" }, "samplesheet": { "content": [ "id_mappings.csv:md5,40c6daa8d668b4930bfd9045248e16ec", "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d", - "samplesheet.csv:md5,f8c7dff22f06a380e987049d7f04f096" + "samplesheet.csv:md5,24d51c3c83f25902d1841096b12e2d67" ], - "timestamp": "2023-05-09T00:28:30+0000" + "timestamp": "2023-05-09T02:12:04+0000" }, "software_versions": { "content": [ "software_versions.yml:md5,ec1f5ee8c99879c3b8f04e7e683f540f" ], - "timestamp": "2023-05-09T00:28:30+0000" + "timestamp": "2023-05-09T02:12:04+0000" }, "fastq": { "content": [ @@ -44,6 +44,6 @@ "SRX9626017_SRR13191702_1.fastq.gz:md5,627a90afcd9f3cfc7f5f91074f9a2df7", "SRX9626017_SRR13191702_2.fastq.gz:md5,3d9b2c68a8ad1547105b17de81b2d9af" ], - "timestamp": "2023-05-09T00:28:30+0000" + "timestamp": "2023-05-09T02:12:04+0000" } } \ No newline at end of file From 5a160bdc5e8994b44a1a87dc8849dbb25f8d8a9d Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Tue, 9 May 2023 10:17:49 -0400 Subject: [PATCH 318/852] update-snapshots --- tests/pipeline/sra.nf.test.snap | 24 ++--- tests/pipeline/sra_skip_fastq.nf.test.snap | 22 ++--- .../sra_with_nf_core_pipeline.nf.test | 2 +- .../sra_with_nf_core_pipeline.nf.test.snap | 90 +++++++++---------- tests/pipeline/sra_with_sratools.nf.test | 2 +- tests/pipeline/sra_with_sratools.nf.test.snap | 24 ++--- 6 files changed, 82 insertions(+), 82 deletions(-) diff --git a/tests/pipeline/sra.nf.test.snap b/tests/pipeline/sra.nf.test.snap index 3e53c207..26e56065 100644 --- a/tests/pipeline/sra.nf.test.snap +++ b/tests/pipeline/sra.nf.test.snap @@ -1,31 +1,31 @@ { "metadata": { "content": [ - "DRR026872.runinfo_ftp.tsv:md5,f46819ed848d0d28dff80fd0f5a4cd34", - "DRR028935.runinfo_ftp.tsv:md5,ef08c3756034e6705b0e13d1f37bfea5", - "ERR1109373.runinfo_ftp.tsv:md5,6e7960f43046c6080435a024e9c426c9", - "ERR1160846.runinfo_ftp.tsv:md5,db8b7bc5877a62b90e719d7cf3c0d25f", - "SRR12848126.runinfo_ftp.tsv:md5,b8ac151eb85a001e9aa3d7319156c016", - "SRR13191702.runinfo_ftp.tsv:md5,7188ac3b1d73ec297a900450e73bf751", + "DRR026872.runinfo_ftp.tsv:md5,c5ab92f6f50717b8163580b642b37aec", + "DRR028935.runinfo_ftp.tsv:md5,9db5d6cba5ce2cccd9b2cc3faaa092e2", + "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", + "ERR1160846.runinfo_ftp.tsv:md5,5611622d583e6bc6d45d8f934696ff1e", + "SRR12848126.runinfo_ftp.tsv:md5,9563f91d4cc6aa58d2ed5fba2eb30baf", + "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e", "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", - "SRR9984183.runinfo_ftp.tsv:md5,827751e211294eeecbb7239f70ead9a5" + "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-09T02:22:08+0000" + "timestamp": "2023-05-09T14:15:30+0000" }, "samplesheet": { "content": [ "id_mappings.csv:md5,40c6daa8d668b4930bfd9045248e16ec", "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d", - "samplesheet.csv:md5,22cd8487e80f23686f54779a0b55c54d" + "samplesheet.csv:md5,254be0ca1de8071d22c7e6d6e67fc95e" ], - "timestamp": "2023-05-09T02:22:08+0000" + "timestamp": "2023-05-09T14:15:30+0000" }, "software_versions": { "content": [ "software_versions.yml:md5,c8ccda032b4de8e103eace767442fcf4" ], - "timestamp": "2023-05-09T02:22:08+0000" + "timestamp": "2023-05-09T14:15:30+0000" }, "fastq": { "content": [ @@ -55,6 +55,6 @@ "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" ] ], - "timestamp": "2023-05-09T02:22:08+0000" + "timestamp": "2023-05-09T14:15:30+0000" } } \ No newline at end of file diff --git a/tests/pipeline/sra_skip_fastq.nf.test.snap b/tests/pipeline/sra_skip_fastq.nf.test.snap index 4c208a29..4116e888 100644 --- a/tests/pipeline/sra_skip_fastq.nf.test.snap +++ b/tests/pipeline/sra_skip_fastq.nf.test.snap @@ -1,30 +1,30 @@ { "metadata": { "content": [ - "DRR026872.runinfo_ftp.tsv:md5,f46819ed848d0d28dff80fd0f5a4cd34", - "DRR028935.runinfo_ftp.tsv:md5,ef08c3756034e6705b0e13d1f37bfea5", - "ERR1109373.runinfo_ftp.tsv:md5,6e7960f43046c6080435a024e9c426c9", - "ERR1160846.runinfo_ftp.tsv:md5,db8b7bc5877a62b90e719d7cf3c0d25f", - "SRR12848126.runinfo_ftp.tsv:md5,b8ac151eb85a001e9aa3d7319156c016", - "SRR13191702.runinfo_ftp.tsv:md5,7188ac3b1d73ec297a900450e73bf751", + "DRR026872.runinfo_ftp.tsv:md5,c5ab92f6f50717b8163580b642b37aec", + "DRR028935.runinfo_ftp.tsv:md5,9db5d6cba5ce2cccd9b2cc3faaa092e2", + "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", + "ERR1160846.runinfo_ftp.tsv:md5,5611622d583e6bc6d45d8f934696ff1e", + "SRR12848126.runinfo_ftp.tsv:md5,9563f91d4cc6aa58d2ed5fba2eb30baf", + "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e", "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", - "SRR9984183.runinfo_ftp.tsv:md5,827751e211294eeecbb7239f70ead9a5" + "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-09T00:28:56+0000" + "timestamp": "2023-05-09T14:08:13+0000" }, "samplesheet": { "content": [ "id_mappings.csv:md5,40c6daa8d668b4930bfd9045248e16ec", "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d", - "samplesheet.csv:md5,2006cc16ca44e947b5244528310c03e0" + "samplesheet.csv:md5,c5cadf299f1c842cd9063200fb640445" ], - "timestamp": "2023-05-09T00:28:56+0000" + "timestamp": "2023-05-09T14:08:13+0000" }, "software_versions": { "content": [ "software_versions.yml:md5,8b5ec8d90481271f6584ceff4d990caa" ], - "timestamp": "2023-05-09T00:28:56+0000" + "timestamp": "2023-05-09T14:08:13+0000" } } \ No newline at end of file diff --git a/tests/pipeline/sra_with_nf_core_pipeline.nf.test b/tests/pipeline/sra_with_nf_core_pipeline.nf.test index a31c1fbb..9034910c 100644 --- a/tests/pipeline/sra_with_nf_core_pipeline.nf.test +++ b/tests/pipeline/sra_with_nf_core_pipeline.nf.test @@ -25,7 +25,7 @@ nextflow_pipeline { } } - test("SRA NF-CORE/RNASEQ Samplesheet With ENA metadata") { + test("SRA NF-CORE/RNASEQ Samplesheet With Specific ENA metadata") { when { params { diff --git a/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap b/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap index 8cbf7bfa..77c9c730 100644 --- a/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap +++ b/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap @@ -1,59 +1,59 @@ { "taxprofiler_metadata": { "content": [ - "DRR026872.runinfo_ftp.tsv:md5,f46819ed848d0d28dff80fd0f5a4cd34", - "DRR028935.runinfo_ftp.tsv:md5,ef08c3756034e6705b0e13d1f37bfea5", - "ERR1109373.runinfo_ftp.tsv:md5,6e7960f43046c6080435a024e9c426c9", - "ERR1160846.runinfo_ftp.tsv:md5,db8b7bc5877a62b90e719d7cf3c0d25f", - "SRR12848126.runinfo_ftp.tsv:md5,b8ac151eb85a001e9aa3d7319156c016", - "SRR13191702.runinfo_ftp.tsv:md5,7188ac3b1d73ec297a900450e73bf751", + "DRR026872.runinfo_ftp.tsv:md5,c5ab92f6f50717b8163580b642b37aec", + "DRR028935.runinfo_ftp.tsv:md5,9db5d6cba5ce2cccd9b2cc3faaa092e2", + "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", + "ERR1160846.runinfo_ftp.tsv:md5,5611622d583e6bc6d45d8f934696ff1e", + "SRR12848126.runinfo_ftp.tsv:md5,9563f91d4cc6aa58d2ed5fba2eb30baf", + "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e", "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", - "SRR9984183.runinfo_ftp.tsv:md5,827751e211294eeecbb7239f70ead9a5" + "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-09T02:19:58+0000" + "timestamp": "2023-05-09T14:11:58+0000" }, "software_versions": { "content": [ "software_versions.yml:md5,c8ccda032b4de8e103eace767442fcf4" ], - "timestamp": "2023-05-09T02:19:58+0000" + "timestamp": "2023-05-09T14:11:58+0000" }, "viralrecon_metadata": { "content": [ - "DRR026872.runinfo_ftp.tsv:md5,f46819ed848d0d28dff80fd0f5a4cd34", - "DRR028935.runinfo_ftp.tsv:md5,ef08c3756034e6705b0e13d1f37bfea5", - "ERR1109373.runinfo_ftp.tsv:md5,6e7960f43046c6080435a024e9c426c9", - "ERR1160846.runinfo_ftp.tsv:md5,db8b7bc5877a62b90e719d7cf3c0d25f", - "SRR12848126.runinfo_ftp.tsv:md5,b8ac151eb85a001e9aa3d7319156c016", - "SRR13191702.runinfo_ftp.tsv:md5,7188ac3b1d73ec297a900450e73bf751", + "DRR026872.runinfo_ftp.tsv:md5,c5ab92f6f50717b8163580b642b37aec", + "DRR028935.runinfo_ftp.tsv:md5,9db5d6cba5ce2cccd9b2cc3faaa092e2", + "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", + "ERR1160846.runinfo_ftp.tsv:md5,5611622d583e6bc6d45d8f934696ff1e", + "SRR12848126.runinfo_ftp.tsv:md5,9563f91d4cc6aa58d2ed5fba2eb30baf", + "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e", "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", - "SRR9984183.runinfo_ftp.tsv:md5,827751e211294eeecbb7239f70ead9a5" + "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-09T02:19:58+0000" + "timestamp": "2023-05-09T14:11:58+0000" }, "viralrecon_samplesheet": { "content": [ "id_mappings.csv:md5,40c6daa8d668b4930bfd9045248e16ec", "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d", - "samplesheet.csv:md5,9bdd606909eb08fcb6a4b10a5c1fea7a" + "samplesheet.csv:md5,da9e9eca2c1c05e4da526806316faa5f" ], - "timestamp": "2023-05-09T02:19:58+0000" + "timestamp": "2023-05-09T14:11:58+0000" }, "atacseq_metadata": { "content": [ - "DRR026872.runinfo_ftp.tsv:md5,f46819ed848d0d28dff80fd0f5a4cd34", - "DRR028935.runinfo_ftp.tsv:md5,ef08c3756034e6705b0e13d1f37bfea5", - "ERR1109373.runinfo_ftp.tsv:md5,6e7960f43046c6080435a024e9c426c9", - "ERR1160846.runinfo_ftp.tsv:md5,db8b7bc5877a62b90e719d7cf3c0d25f", - "SRR12848126.runinfo_ftp.tsv:md5,b8ac151eb85a001e9aa3d7319156c016", - "SRR13191702.runinfo_ftp.tsv:md5,7188ac3b1d73ec297a900450e73bf751", + "DRR026872.runinfo_ftp.tsv:md5,c5ab92f6f50717b8163580b642b37aec", + "DRR028935.runinfo_ftp.tsv:md5,9db5d6cba5ce2cccd9b2cc3faaa092e2", + "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", + "ERR1160846.runinfo_ftp.tsv:md5,5611622d583e6bc6d45d8f934696ff1e", + "SRR12848126.runinfo_ftp.tsv:md5,9563f91d4cc6aa58d2ed5fba2eb30baf", + "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e", "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", - "SRR9984183.runinfo_ftp.tsv:md5,827751e211294eeecbb7239f70ead9a5" + "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-09T02:19:58+0000" + "timestamp": "2023-05-09T14:11:58+0000" }, "rnaseq_ena_metadata": { "content": [ @@ -67,15 +67,15 @@ "SRR14709033.runinfo_ftp.tsv:md5,2385a9cc5e320e78b02743c45d1338f1", "SRR9984183.runinfo_ftp.tsv:md5,f1ed9fc572d2e0d145be7f547f6d1236" ], - "timestamp": "2023-05-09T02:19:58+0000" + "timestamp": "2023-05-09T14:11:58+0000" }, "rnaseq_samplesheet": { "content": [ "id_mappings.csv:md5,40c6daa8d668b4930bfd9045248e16ec", "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d", - "samplesheet.csv:md5,d6f1c7e9cc6f8e531fc92a9a4ae9993f" + "samplesheet.csv:md5,9fa43672fb5ffcf0dec423a4627dc028" ], - "timestamp": "2023-05-09T02:19:58+0000" + "timestamp": "2023-05-09T14:11:58+0000" }, "rnaseq_samplesheet_specific_ena": { "content": [ @@ -83,21 +83,21 @@ "multiqc_config.yml:md5,6af65b0ae40e1bba60a25361771624bd", "samplesheet.csv:md5,dc7371849e112d0e95646ef1c34339d0" ], - "timestamp": "2023-05-09T02:19:58+0000" + "timestamp": "2023-05-09T14:11:58+0000" }, "rnaseq_metadata": { "content": [ - "DRR026872.runinfo_ftp.tsv:md5,f46819ed848d0d28dff80fd0f5a4cd34", - "DRR028935.runinfo_ftp.tsv:md5,ef08c3756034e6705b0e13d1f37bfea5", - "ERR1109373.runinfo_ftp.tsv:md5,6e7960f43046c6080435a024e9c426c9", - "ERR1160846.runinfo_ftp.tsv:md5,db8b7bc5877a62b90e719d7cf3c0d25f", - "SRR12848126.runinfo_ftp.tsv:md5,b8ac151eb85a001e9aa3d7319156c016", - "SRR13191702.runinfo_ftp.tsv:md5,7188ac3b1d73ec297a900450e73bf751", + "DRR026872.runinfo_ftp.tsv:md5,c5ab92f6f50717b8163580b642b37aec", + "DRR028935.runinfo_ftp.tsv:md5,9db5d6cba5ce2cccd9b2cc3faaa092e2", + "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", + "ERR1160846.runinfo_ftp.tsv:md5,5611622d583e6bc6d45d8f934696ff1e", + "SRR12848126.runinfo_ftp.tsv:md5,9563f91d4cc6aa58d2ed5fba2eb30baf", + "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e", "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", - "SRR9984183.runinfo_ftp.tsv:md5,827751e211294eeecbb7239f70ead9a5" + "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-09T02:19:58+0000" + "timestamp": "2023-05-09T14:11:58+0000" }, "rnaseq_specific_ena_samplesheet": { "content": [ @@ -105,23 +105,23 @@ "multiqc_config.yml:md5,6af65b0ae40e1bba60a25361771624bd", "samplesheet.csv:md5,6a08c28af1ed2629e18f0014f4d72ed6" ], - "timestamp": "2023-05-09T02:19:58+0000" + "timestamp": "2023-05-09T14:11:58+0000" }, "atacseq_samplesheet": { "content": [ "id_mappings.csv:md5,40c6daa8d668b4930bfd9045248e16ec", "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d", - "samplesheet.csv:md5,65e8d7f0f4174271205e777689fe8491" + "samplesheet.csv:md5,236f64ee8d40b3b658aecc0298cccfb2" ], - "timestamp": "2023-05-09T02:19:58+0000" + "timestamp": "2023-05-09T14:11:58+0000" }, "taxprofiler_samplesheet": { "content": [ "id_mappings.csv:md5,40c6daa8d668b4930bfd9045248e16ec", "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d", - "samplesheet.csv:md5,c00d9e0b7c6222a8f31cd22a265c33fe" + "samplesheet.csv:md5,336e53f72cc538a58911880ec7c9b5da" ], - "timestamp": "2023-05-09T02:19:58+0000" + "timestamp": "2023-05-09T14:11:58+0000" }, "fastq": { "content": [ @@ -151,6 +151,6 @@ "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" ] ], - "timestamp": "2023-05-09T02:19:58+0000" + "timestamp": "2023-05-09T14:11:58+0000" } } \ No newline at end of file diff --git a/tests/pipeline/sra_with_sratools.nf.test b/tests/pipeline/sra_with_sratools.nf.test index 97602440..c86ed056 100644 --- a/tests/pipeline/sra_with_sratools.nf.test +++ b/tests/pipeline/sra_with_sratools.nf.test @@ -5,7 +5,7 @@ nextflow_pipeline { options "-profile test,docker" tag "pipeline" - test("SRA Force SRAtools Download") { + test("Force SRA-Tools Download") { when { params { diff --git a/tests/pipeline/sra_with_sratools.nf.test.snap b/tests/pipeline/sra_with_sratools.nf.test.snap index 5bc9b9bf..fb5ab805 100644 --- a/tests/pipeline/sra_with_sratools.nf.test.snap +++ b/tests/pipeline/sra_with_sratools.nf.test.snap @@ -1,31 +1,31 @@ { "metadata": { "content": [ - "DRR026872.runinfo_ftp.tsv:md5,f46819ed848d0d28dff80fd0f5a4cd34", - "DRR028935.runinfo_ftp.tsv:md5,ef08c3756034e6705b0e13d1f37bfea5", - "ERR1109373.runinfo_ftp.tsv:md5,6e7960f43046c6080435a024e9c426c9", - "ERR1160846.runinfo_ftp.tsv:md5,db8b7bc5877a62b90e719d7cf3c0d25f", - "SRR12848126.runinfo_ftp.tsv:md5,b8ac151eb85a001e9aa3d7319156c016", - "SRR13191702.runinfo_ftp.tsv:md5,7188ac3b1d73ec297a900450e73bf751", + "DRR026872.runinfo_ftp.tsv:md5,c5ab92f6f50717b8163580b642b37aec", + "DRR028935.runinfo_ftp.tsv:md5,9db5d6cba5ce2cccd9b2cc3faaa092e2", + "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", + "ERR1160846.runinfo_ftp.tsv:md5,5611622d583e6bc6d45d8f934696ff1e", + "SRR12848126.runinfo_ftp.tsv:md5,9563f91d4cc6aa58d2ed5fba2eb30baf", + "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e", "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", - "SRR9984183.runinfo_ftp.tsv:md5,827751e211294eeecbb7239f70ead9a5" + "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-09T02:12:04+0000" + "timestamp": "2023-05-09T14:07:50+0000" }, "samplesheet": { "content": [ "id_mappings.csv:md5,40c6daa8d668b4930bfd9045248e16ec", "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d", - "samplesheet.csv:md5,24d51c3c83f25902d1841096b12e2d67" + "samplesheet.csv:md5,03ae9aa2cd8b3fc60a123c00e15e7b9a" ], - "timestamp": "2023-05-09T02:12:04+0000" + "timestamp": "2023-05-09T14:07:50+0000" }, "software_versions": { "content": [ "software_versions.yml:md5,ec1f5ee8c99879c3b8f04e7e683f540f" ], - "timestamp": "2023-05-09T02:12:04+0000" + "timestamp": "2023-05-09T14:07:50+0000" }, "fastq": { "content": [ @@ -44,6 +44,6 @@ "SRX9626017_SRR13191702_1.fastq.gz:md5,627a90afcd9f3cfc7f5f91074f9a2df7", "SRX9626017_SRR13191702_2.fastq.gz:md5,3d9b2c68a8ad1547105b17de81b2d9af" ], - "timestamp": "2023-05-09T02:12:04+0000" + "timestamp": "2023-05-09T14:07:50+0000" } } \ No newline at end of file From 9b6ec394a8df647f17970c742f6c801314f8f684 Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Tue, 9 May 2023 10:54:34 -0400 Subject: [PATCH 319/852] remove-samplesheet-with-paths-snapshots --- tests/pipeline/sra.nf.test | 4 +++- tests/pipeline/sra.nf.test.snap | 3 +-- tests/pipeline/sra_skip_fastq.nf.test | 4 +++- tests/pipeline/sra_skip_fastq.nf.test.snap | 3 +-- tests/pipeline/sra_with_nf_core_pipeline.nf.test | 4 +++- tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap | 3 +-- tests/pipeline/sra_with_sratools.nf.test | 4 +++- tests/pipeline/sra_with_sratools.nf.test.snap | 3 +-- 8 files changed, 16 insertions(+), 12 deletions(-) diff --git a/tests/pipeline/sra.nf.test b/tests/pipeline/sra.nf.test index 217eeaa1..00d8ad0f 100644 --- a/tests/pipeline/sra.nf.test +++ b/tests/pipeline/sra.nf.test @@ -19,7 +19,9 @@ nextflow_pipeline { { assert snapshot(path("$outputDir/pipeline_info/software_versions.yml")).match("software_versions") }, { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, { assert snapshot(path("$outputDir/metadata/").list()).match("metadata") }, - { assert snapshot(path("$outputDir/samplesheet/").list()).match("samplesheet") } + { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), + path("$outputDir/samplesheet/multiqc_config.yml")).match("samplesheet") }, + { assert new File("$outputDir/samplesheet/samplesheet.csv").exists() } ) } diff --git a/tests/pipeline/sra.nf.test.snap b/tests/pipeline/sra.nf.test.snap index 26e56065..d16a31ec 100644 --- a/tests/pipeline/sra.nf.test.snap +++ b/tests/pipeline/sra.nf.test.snap @@ -16,8 +16,7 @@ "samplesheet": { "content": [ "id_mappings.csv:md5,40c6daa8d668b4930bfd9045248e16ec", - "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d", - "samplesheet.csv:md5,254be0ca1de8071d22c7e6d6e67fc95e" + "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d" ], "timestamp": "2023-05-09T14:15:30+0000" }, diff --git a/tests/pipeline/sra_skip_fastq.nf.test b/tests/pipeline/sra_skip_fastq.nf.test index 851099c3..0d6849b9 100644 --- a/tests/pipeline/sra_skip_fastq.nf.test +++ b/tests/pipeline/sra_skip_fastq.nf.test @@ -19,7 +19,9 @@ nextflow_pipeline { { assert workflow.success }, { assert snapshot(path("$outputDir/pipeline_info/software_versions.yml")).match("software_versions") }, { assert snapshot(path("$outputDir/metadata/").list()).match("metadata") }, - { assert snapshot(path("$outputDir/samplesheet/").list()).match("samplesheet") }, + { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), + path("$outputDir/samplesheet/multiqc_config.yml")).match("samplesheet") }, + { assert new File("$outputDir/samplesheet/samplesheet.csv").exists() }, { assert !new File("$outputDir/fastq/DRX024467_DRR026872.fastq.gz").exists() }, { assert !new File("$outputDir/fastq/DRX026011_DRR028935_1.fastq.gz").exists() }, { assert !new File("$outputDir/fastq/DRX026011_DRR028935_2.fastq.gz").exists() }, diff --git a/tests/pipeline/sra_skip_fastq.nf.test.snap b/tests/pipeline/sra_skip_fastq.nf.test.snap index 4116e888..a4b5fa9f 100644 --- a/tests/pipeline/sra_skip_fastq.nf.test.snap +++ b/tests/pipeline/sra_skip_fastq.nf.test.snap @@ -16,8 +16,7 @@ "samplesheet": { "content": [ "id_mappings.csv:md5,40c6daa8d668b4930bfd9045248e16ec", - "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d", - "samplesheet.csv:md5,c5cadf299f1c842cd9063200fb640445" + "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d" ], "timestamp": "2023-05-09T14:08:13+0000" }, diff --git a/tests/pipeline/sra_with_nf_core_pipeline.nf.test b/tests/pipeline/sra_with_nf_core_pipeline.nf.test index 9034910c..0618eb81 100644 --- a/tests/pipeline/sra_with_nf_core_pipeline.nf.test +++ b/tests/pipeline/sra_with_nf_core_pipeline.nf.test @@ -20,7 +20,9 @@ nextflow_pipeline { { assert snapshot(path("$outputDir/pipeline_info/software_versions.yml")).match("software_versions") }, { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, { assert snapshot(path("$outputDir/metadata/").list()).match("rnaseq_metadata") }, - { assert snapshot(path("$outputDir/samplesheet/").list()).match("rnaseq_samplesheet") } + { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), + path("$outputDir/samplesheet/multiqc_config.yml")).match("samplesheet") }, + { assert new File("$outputDir/samplesheet/samplesheet.csv").exists() } ) } } diff --git a/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap b/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap index 77c9c730..fda160f4 100644 --- a/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap +++ b/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap @@ -36,8 +36,7 @@ "viralrecon_samplesheet": { "content": [ "id_mappings.csv:md5,40c6daa8d668b4930bfd9045248e16ec", - "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d", - "samplesheet.csv:md5,da9e9eca2c1c05e4da526806316faa5f" + "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d" ], "timestamp": "2023-05-09T14:11:58+0000" }, diff --git a/tests/pipeline/sra_with_sratools.nf.test b/tests/pipeline/sra_with_sratools.nf.test index c86ed056..dd85131c 100644 --- a/tests/pipeline/sra_with_sratools.nf.test +++ b/tests/pipeline/sra_with_sratools.nf.test @@ -20,7 +20,9 @@ nextflow_pipeline { { assert snapshot(path("$outputDir/pipeline_info/software_versions.yml")).match("software_versions") }, { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, { assert snapshot(path("$outputDir/metadata/").list()).match("metadata") }, - { assert snapshot(path("$outputDir/samplesheet/").list()).match("samplesheet") } + { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), + path("$outputDir/samplesheet/multiqc_config.yml")).match("samplesheet") }, + { assert new File("$outputDir/samplesheet/samplesheet.csv").exists() } ) } diff --git a/tests/pipeline/sra_with_sratools.nf.test.snap b/tests/pipeline/sra_with_sratools.nf.test.snap index fb5ab805..44daeaa0 100644 --- a/tests/pipeline/sra_with_sratools.nf.test.snap +++ b/tests/pipeline/sra_with_sratools.nf.test.snap @@ -16,8 +16,7 @@ "samplesheet": { "content": [ "id_mappings.csv:md5,40c6daa8d668b4930bfd9045248e16ec", - "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d", - "samplesheet.csv:md5,03ae9aa2cd8b3fc60a123c00e15e7b9a" + "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d" ], "timestamp": "2023-05-09T14:07:50+0000" }, From aec2794c85b6e7f50113097c7783da9d166b9b81 Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Tue, 9 May 2023 11:11:54 -0400 Subject: [PATCH 320/852] remove-samplesheet-md5-snapshot --- .../sra_with_nf_core_pipeline.nf.test.snap | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap b/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap index fda160f4..cd236ca2 100644 --- a/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap +++ b/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap @@ -71,16 +71,14 @@ "rnaseq_samplesheet": { "content": [ "id_mappings.csv:md5,40c6daa8d668b4930bfd9045248e16ec", - "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d", - "samplesheet.csv:md5,9fa43672fb5ffcf0dec423a4627dc028" + "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d" ], "timestamp": "2023-05-09T14:11:58+0000" }, "rnaseq_samplesheet_specific_ena": { "content": [ "id_mappings.csv:md5,0efde324e1818c0827390a17449a6e8a", - "multiqc_config.yml:md5,6af65b0ae40e1bba60a25361771624bd", - "samplesheet.csv:md5,dc7371849e112d0e95646ef1c34339d0" + "multiqc_config.yml:md5,6af65b0ae40e1bba60a25361771624bd" ], "timestamp": "2023-05-09T14:11:58+0000" }, @@ -101,24 +99,21 @@ "rnaseq_specific_ena_samplesheet": { "content": [ "id_mappings.csv:md5,0efde324e1818c0827390a17449a6e8a", - "multiqc_config.yml:md5,6af65b0ae40e1bba60a25361771624bd", - "samplesheet.csv:md5,6a08c28af1ed2629e18f0014f4d72ed6" + "multiqc_config.yml:md5,6af65b0ae40e1bba60a25361771624bd" ], "timestamp": "2023-05-09T14:11:58+0000" }, "atacseq_samplesheet": { "content": [ "id_mappings.csv:md5,40c6daa8d668b4930bfd9045248e16ec", - "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d", - "samplesheet.csv:md5,236f64ee8d40b3b658aecc0298cccfb2" + "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d" ], "timestamp": "2023-05-09T14:11:58+0000" }, "taxprofiler_samplesheet": { "content": [ "id_mappings.csv:md5,40c6daa8d668b4930bfd9045248e16ec", - "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d", - "samplesheet.csv:md5,336e53f72cc538a58911880ec7c9b5da" + "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d" ], "timestamp": "2023-05-09T14:11:58+0000" }, From 5fd4dde3a66e4aa19e5652780b92db0cccb4404e Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Tue, 9 May 2023 11:20:02 -0400 Subject: [PATCH 321/852] update-samplesheet-nf-test --- .../pipeline/sra_with_nf_core_pipeline.nf.test | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/tests/pipeline/sra_with_nf_core_pipeline.nf.test b/tests/pipeline/sra_with_nf_core_pipeline.nf.test index 0618eb81..a12c678a 100644 --- a/tests/pipeline/sra_with_nf_core_pipeline.nf.test +++ b/tests/pipeline/sra_with_nf_core_pipeline.nf.test @@ -21,7 +21,7 @@ nextflow_pipeline { { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, { assert snapshot(path("$outputDir/metadata/").list()).match("rnaseq_metadata") }, { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), - path("$outputDir/samplesheet/multiqc_config.yml")).match("samplesheet") }, + path("$outputDir/samplesheet/multiqc_config.yml")).match("rnaseq_samplesheet") }, { assert new File("$outputDir/samplesheet/samplesheet.csv").exists() } ) } @@ -44,7 +44,9 @@ nextflow_pipeline { { assert snapshot(path("$outputDir/pipeline_info/software_versions.yml")).match("software_versions") }, { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, { assert snapshot(path("$outputDir/metadata/").list()).match("rnaseq_ena_metadata") }, - { assert snapshot(path("$outputDir/samplesheet/").list()).match("rnaseq_specific_ena_samplesheet") } + { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), + path("$outputDir/samplesheet/multiqc_config.yml")).match("rnaseq_ena_samplesheet") }, + { assert new File("$outputDir/samplesheet/samplesheet.csv").exists() } ) } } @@ -64,7 +66,9 @@ nextflow_pipeline { { assert snapshot(path("$outputDir/pipeline_info/software_versions.yml")).match("software_versions") }, { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, { assert snapshot(path("$outputDir/metadata/").list()).match("atacseq_metadata") }, - { assert snapshot(path("$outputDir/samplesheet/").list()).match("atacseq_samplesheet") } + { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), + path("$outputDir/samplesheet/multiqc_config.yml")).match("atacseq_samplesheet") }, + { assert new File("$outputDir/samplesheet/samplesheet.csv").exists() } ) } } @@ -84,7 +88,9 @@ nextflow_pipeline { { assert snapshot(path("$outputDir/pipeline_info/software_versions.yml")).match("software_versions") }, { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, { assert snapshot(path("$outputDir/metadata/").list()).match("viralrecon_metadata") }, - { assert snapshot(path("$outputDir/samplesheet/").list()).match("viralrecon_samplesheet") } + { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), + path("$outputDir/samplesheet/multiqc_config.yml")).match("viralrecon_samplesheet") }, + { assert new File("$outputDir/samplesheet/samplesheet.csv").exists() } ) } } @@ -104,7 +110,9 @@ nextflow_pipeline { { assert snapshot(path("$outputDir/pipeline_info/software_versions.yml")).match("software_versions") }, { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, { assert snapshot(path("$outputDir/metadata/").list()).match("taxprofiler_metadata") }, - { assert snapshot(path("$outputDir/samplesheet/").list()).match("taxprofiler_samplesheet") } + { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), + path("$outputDir/samplesheet/multiqc_config.yml")).match("taxprofiler_samplesheet") }, + { assert new File("$outputDir/samplesheet/samplesheet.csv").exists() } ) } } From 7c0ca3e7a78c6387c9f6ced5f1641fd5c45800ea Mon Sep 17 00:00:00 2001 From: Edmund Miller Date: Thu, 11 May 2023 17:19:35 -0500 Subject: [PATCH 322/852] chore: Add snaps to generated files --- .gitattributes | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitattributes b/.gitattributes index 7a2dabc2..c1c17000 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,4 +1,5 @@ *.config linguist-language=nextflow *.nf.test linguist-language=nextflow +tests/**/*nf.test.snap linguist-generated modules/nf-core/** linguist-generated subworkflows/nf-core/** linguist-generated From 0b64654f88f684c4c15bb1f31547bc9a4012efea Mon Sep 17 00:00:00 2001 From: Sateesh_Peri <33637490+sateeshperi@users.noreply.github.com> Date: Thu, 11 May 2023 22:13:56 -0400 Subject: [PATCH 323/852] Update tests/pipeline/sra_skip_fastq.nf.test Co-authored-by: Edmund Miller --- tests/pipeline/sra_skip_fastq.nf.test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/pipeline/sra_skip_fastq.nf.test b/tests/pipeline/sra_skip_fastq.nf.test index 0d6849b9..bdf992ef 100644 --- a/tests/pipeline/sra_skip_fastq.nf.test +++ b/tests/pipeline/sra_skip_fastq.nf.test @@ -2,7 +2,7 @@ nextflow_pipeline { name "Test Workflow main.nf" script "main.nf" - options "-profile test,docker" + profile "test,docker" tag "pipeline" test("SRA Skip FASTQ") { From 7dbb311d63460d56e0dafd3e55e750659c11cf6c Mon Sep 17 00:00:00 2001 From: Sateesh_Peri <33637490+sateeshperi@users.noreply.github.com> Date: Thu, 11 May 2023 22:14:08 -0400 Subject: [PATCH 324/852] Update tests/pipeline/sra_with_nf_core_pipeline.nf.test Co-authored-by: Edmund Miller --- tests/pipeline/sra_with_nf_core_pipeline.nf.test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/pipeline/sra_with_nf_core_pipeline.nf.test b/tests/pipeline/sra_with_nf_core_pipeline.nf.test index a12c678a..813c25da 100644 --- a/tests/pipeline/sra_with_nf_core_pipeline.nf.test +++ b/tests/pipeline/sra_with_nf_core_pipeline.nf.test @@ -2,7 +2,7 @@ nextflow_pipeline { name "Test Workflow main.nf" script "main.nf" - options "-profile test,docker" + profile "test,docker" tag "pipeline" test("SRA NF-CORE/RNASEQ Samplesheet") { From 6779785dd561562f7ccf34dc71a49f6cd6d32f7c Mon Sep 17 00:00:00 2001 From: Sateesh_Peri <33637490+sateeshperi@users.noreply.github.com> Date: Thu, 11 May 2023 22:14:16 -0400 Subject: [PATCH 325/852] Update tests/pipeline/sra_with_sratools.nf.test Co-authored-by: Edmund Miller --- tests/pipeline/sra_with_sratools.nf.test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/pipeline/sra_with_sratools.nf.test b/tests/pipeline/sra_with_sratools.nf.test index dd85131c..5bc903ac 100644 --- a/tests/pipeline/sra_with_sratools.nf.test +++ b/tests/pipeline/sra_with_sratools.nf.test @@ -2,7 +2,7 @@ nextflow_pipeline { name "Test Workflow main.nf" script "main.nf" - options "-profile test,docker" + profile "test,docker" tag "pipeline" test("Force SRA-Tools Download") { From 0d03bcb6389e8f7cdabff67edb518d3480ddbc85 Mon Sep 17 00:00:00 2001 From: Sateesh_Peri <33637490+sateeshperi@users.noreply.github.com> Date: Thu, 11 May 2023 22:14:28 -0400 Subject: [PATCH 326/852] Update tests/pipeline/synapse.test Co-authored-by: Edmund Miller --- tests/pipeline/synapse.test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/pipeline/synapse.test b/tests/pipeline/synapse.test index 91f865dc..a59ebf0b 100644 --- a/tests/pipeline/synapse.test +++ b/tests/pipeline/synapse.test @@ -2,7 +2,7 @@ nextflow_pipeline { name "Test Workflow main.nf" script "main.nf" - options "-profile test_synapse,docker" + profile "test_synapse,docker" tag "pipeline" test("Synapse Input Type") { From a42c998ea446d63f2da822884bdd3302aed02bed Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Tue, 16 May 2023 12:21:20 -0400 Subject: [PATCH 327/852] update-snapshots-1.10.0 --- tests/nextflow.config | 5 -- tests/pipeline/sra.nf.test.snap | 36 +++++++-- tests/pipeline/sra_skip_fastq.nf.test.snap | 14 ++-- .../sra_with_nf_core_pipeline.nf.test.snap | 81 ++++++++++++++----- tests/pipeline/sra_with_sratools.nf.test.snap | 26 ++++-- 5 files changed, 115 insertions(+), 47 deletions(-) delete mode 100644 tests/nextflow.config diff --git a/tests/nextflow.config b/tests/nextflow.config deleted file mode 100644 index c19b1ad0..00000000 --- a/tests/nextflow.config +++ /dev/null @@ -1,5 +0,0 @@ -/* -======================================================================================== - Nextflow config file for running tests -======================================================================================== -*/ diff --git a/tests/pipeline/sra.nf.test.snap b/tests/pipeline/sra.nf.test.snap index d16a31ec..c1fe0af7 100644 --- a/tests/pipeline/sra.nf.test.snap +++ b/tests/pipeline/sra.nf.test.snap @@ -5,26 +5,28 @@ "DRR028935.runinfo_ftp.tsv:md5,9db5d6cba5ce2cccd9b2cc3faaa092e2", "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", "ERR1160846.runinfo_ftp.tsv:md5,5611622d583e6bc6d45d8f934696ff1e", + "GSE214215.runinfo_ftp.tsv:md5,4224b5733b92daa40689538de9498ab9", + "GSM4907283.runinfo_ftp.tsv:md5,3d2c2395ee6690338f56fca84acb54ba", "SRR12848126.runinfo_ftp.tsv:md5,9563f91d4cc6aa58d2ed5fba2eb30baf", "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e", "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-09T14:15:30+0000" + "timestamp": "2023-05-16T16:13:55+0000" }, "samplesheet": { "content": [ - "id_mappings.csv:md5,40c6daa8d668b4930bfd9045248e16ec", - "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d" + "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", + "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-09T14:15:30+0000" + "timestamp": "2023-05-16T16:13:55+0000" }, "software_versions": { "content": [ - "software_versions.yml:md5,c8ccda032b4de8e103eace767442fcf4" + "software_versions.yml:md5,7837dd6b0454c15b69cc8d2e6a0e9f83" ], - "timestamp": "2023-05-09T14:15:30+0000" + "timestamp": "2023-05-16T16:13:55+0000" }, "fastq": { "content": [ @@ -37,9 +39,19 @@ "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2", "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda", + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64", + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83", "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544", "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79", + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962", + "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76", + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88", + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04", "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98", [ @@ -49,11 +61,21 @@ "ERX1188904_ERR1109373_1.fastq.gz.md5:md5,50c1c3108631dc32a3151b67e0260d86", "ERX1188904_ERR1109373_2.fastq.gz.md5:md5,1f22463d410e91a288c83d43654b2499", "ERX1234253_ERR1160846.fastq.gz.md5:md5,513a8437ad331fc512b088b3750aa1ff", + "SRX17709227_SRR21711856.fastq.gz.md5:md5,13a38fbef27c3e15867d80887145ae75", + "SRX17709228_SRR21711855.fastq.gz.md5:md5,1e871ddd9e92e1866e0c64d36eb5ec85", "SRX6725035_SRR9984183.fastq.gz.md5:md5,84f59dbb76c9b5eab7e14d90ced352c4", + "SRX9504942_SRR13055517_1.fastq.gz.md5:md5,a03f7f374dc401047b6f6ccaec3885cc", + "SRX9504942_SRR13055517_2.fastq.gz.md5:md5,facaf207753e977327e7b7df7bb8ace0", + "SRX9504942_SRR13055518_1.fastq.gz.md5:md5,5cf412cd62aadaa4838d9eabb5b44368", + "SRX9504942_SRR13055518_2.fastq.gz.md5:md5,93292b826afc72b23be93df26dd710c8", + "SRX9504942_SRR13055519_1.fastq.gz.md5:md5,f6ad6e2610397147a0a55c651de3992f", + "SRX9504942_SRR13055519_2.fastq.gz.md5:md5,2fe7dd4bcc1e7e61c6f54ef50cf961f3", + "SRX9504942_SRR13055520_1.fastq.gz.md5:md5,ab195b37746a3424a1099d9f8cc58de8", + "SRX9504942_SRR13055520_2.fastq.gz.md5:md5,10c448e23f1f7e7af61ec1204f8fc882", "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" ] ], - "timestamp": "2023-05-09T14:15:30+0000" + "timestamp": "2023-05-16T16:13:55+0000" } } \ No newline at end of file diff --git a/tests/pipeline/sra_skip_fastq.nf.test.snap b/tests/pipeline/sra_skip_fastq.nf.test.snap index a4b5fa9f..7b65f527 100644 --- a/tests/pipeline/sra_skip_fastq.nf.test.snap +++ b/tests/pipeline/sra_skip_fastq.nf.test.snap @@ -5,25 +5,27 @@ "DRR028935.runinfo_ftp.tsv:md5,9db5d6cba5ce2cccd9b2cc3faaa092e2", "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", "ERR1160846.runinfo_ftp.tsv:md5,5611622d583e6bc6d45d8f934696ff1e", + "GSE214215.runinfo_ftp.tsv:md5,4224b5733b92daa40689538de9498ab9", + "GSM4907283.runinfo_ftp.tsv:md5,3d2c2395ee6690338f56fca84acb54ba", "SRR12848126.runinfo_ftp.tsv:md5,9563f91d4cc6aa58d2ed5fba2eb30baf", "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e", "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-09T14:08:13+0000" + "timestamp": "2023-05-16T16:01:52+0000" }, "samplesheet": { "content": [ - "id_mappings.csv:md5,40c6daa8d668b4930bfd9045248e16ec", - "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d" + "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", + "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-09T14:08:13+0000" + "timestamp": "2023-05-16T16:01:52+0000" }, "software_versions": { "content": [ - "software_versions.yml:md5,8b5ec8d90481271f6584ceff4d990caa" + "software_versions.yml:md5,fc7829c56a38a69722534e223ad9d818" ], - "timestamp": "2023-05-09T14:08:13+0000" + "timestamp": "2023-05-16T16:01:52+0000" } } \ No newline at end of file diff --git a/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap b/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap index cd236ca2..54312645 100644 --- a/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap +++ b/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap @@ -5,19 +5,21 @@ "DRR028935.runinfo_ftp.tsv:md5,9db5d6cba5ce2cccd9b2cc3faaa092e2", "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", "ERR1160846.runinfo_ftp.tsv:md5,5611622d583e6bc6d45d8f934696ff1e", + "GSE214215.runinfo_ftp.tsv:md5,4224b5733b92daa40689538de9498ab9", + "GSM4907283.runinfo_ftp.tsv:md5,3d2c2395ee6690338f56fca84acb54ba", "SRR12848126.runinfo_ftp.tsv:md5,9563f91d4cc6aa58d2ed5fba2eb30baf", "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e", "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-09T14:11:58+0000" + "timestamp": "2023-05-16T16:11:36+0000" }, "software_versions": { "content": [ - "software_versions.yml:md5,c8ccda032b4de8e103eace767442fcf4" + "software_versions.yml:md5,7837dd6b0454c15b69cc8d2e6a0e9f83" ], - "timestamp": "2023-05-09T14:11:58+0000" + "timestamp": "2023-05-16T16:11:36+0000" }, "viralrecon_metadata": { "content": [ @@ -25,20 +27,22 @@ "DRR028935.runinfo_ftp.tsv:md5,9db5d6cba5ce2cccd9b2cc3faaa092e2", "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", "ERR1160846.runinfo_ftp.tsv:md5,5611622d583e6bc6d45d8f934696ff1e", + "GSE214215.runinfo_ftp.tsv:md5,4224b5733b92daa40689538de9498ab9", + "GSM4907283.runinfo_ftp.tsv:md5,3d2c2395ee6690338f56fca84acb54ba", "SRR12848126.runinfo_ftp.tsv:md5,9563f91d4cc6aa58d2ed5fba2eb30baf", "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e", "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-09T14:11:58+0000" + "timestamp": "2023-05-16T16:11:36+0000" }, "viralrecon_samplesheet": { "content": [ - "id_mappings.csv:md5,40c6daa8d668b4930bfd9045248e16ec", - "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d" + "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", + "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-09T14:11:58+0000" + "timestamp": "2023-05-16T16:11:36+0000" }, "atacseq_metadata": { "content": [ @@ -46,13 +50,15 @@ "DRR028935.runinfo_ftp.tsv:md5,9db5d6cba5ce2cccd9b2cc3faaa092e2", "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", "ERR1160846.runinfo_ftp.tsv:md5,5611622d583e6bc6d45d8f934696ff1e", + "GSE214215.runinfo_ftp.tsv:md5,4224b5733b92daa40689538de9498ab9", + "GSM4907283.runinfo_ftp.tsv:md5,3d2c2395ee6690338f56fca84acb54ba", "SRR12848126.runinfo_ftp.tsv:md5,9563f91d4cc6aa58d2ed5fba2eb30baf", "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e", "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-09T14:11:58+0000" + "timestamp": "2023-05-16T16:11:36+0000" }, "rnaseq_ena_metadata": { "content": [ @@ -60,27 +66,29 @@ "DRR028935.runinfo_ftp.tsv:md5,07a98fdcec207686a4ea2c9a3997edf3", "ERR1109373.runinfo_ftp.tsv:md5,868897310855c50b1d5fc77d1195a1f9", "ERR1160846.runinfo_ftp.tsv:md5,146d7f2ec778b32b7da7ad040e554114", + "GSE214215.runinfo_ftp.tsv:md5,adf62affe371dc9bad8e271450bdc2fe", + "GSM4907283.runinfo_ftp.tsv:md5,5758453402e82490c4841c8e85a6aa53", "SRR12848126.runinfo_ftp.tsv:md5,cf8827612a76645824e83418d7d76cbf", "SRR13191702.runinfo_ftp.tsv:md5,2031ca9b7ab736dbde37d05b10cdb0ad", "SRR14593545.runinfo_ftp.tsv:md5,3a1ac14d71744224a61ab542f869e180", "SRR14709033.runinfo_ftp.tsv:md5,2385a9cc5e320e78b02743c45d1338f1", "SRR9984183.runinfo_ftp.tsv:md5,f1ed9fc572d2e0d145be7f547f6d1236" ], - "timestamp": "2023-05-09T14:11:58+0000" + "timestamp": "2023-05-16T16:11:36+0000" }, "rnaseq_samplesheet": { "content": [ - "id_mappings.csv:md5,40c6daa8d668b4930bfd9045248e16ec", - "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d" + "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", + "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-09T14:11:58+0000" + "timestamp": "2023-05-16T16:11:36+0000" }, "rnaseq_samplesheet_specific_ena": { "content": [ "id_mappings.csv:md5,0efde324e1818c0827390a17449a6e8a", "multiqc_config.yml:md5,6af65b0ae40e1bba60a25361771624bd" ], - "timestamp": "2023-05-09T14:11:58+0000" + "timestamp": "2023-05-16T16:11:36+0000" }, "rnaseq_metadata": { "content": [ @@ -88,34 +96,43 @@ "DRR028935.runinfo_ftp.tsv:md5,9db5d6cba5ce2cccd9b2cc3faaa092e2", "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", "ERR1160846.runinfo_ftp.tsv:md5,5611622d583e6bc6d45d8f934696ff1e", + "GSE214215.runinfo_ftp.tsv:md5,4224b5733b92daa40689538de9498ab9", + "GSM4907283.runinfo_ftp.tsv:md5,3d2c2395ee6690338f56fca84acb54ba", "SRR12848126.runinfo_ftp.tsv:md5,9563f91d4cc6aa58d2ed5fba2eb30baf", "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e", "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-09T14:11:58+0000" + "timestamp": "2023-05-16T16:11:36+0000" }, "rnaseq_specific_ena_samplesheet": { "content": [ "id_mappings.csv:md5,0efde324e1818c0827390a17449a6e8a", "multiqc_config.yml:md5,6af65b0ae40e1bba60a25361771624bd" ], - "timestamp": "2023-05-09T14:11:58+0000" + "timestamp": "2023-05-16T16:11:36+0000" }, "atacseq_samplesheet": { "content": [ - "id_mappings.csv:md5,40c6daa8d668b4930bfd9045248e16ec", - "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d" + "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", + "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-09T14:11:58+0000" + "timestamp": "2023-05-16T16:11:36+0000" + }, + "rnaseq_ena_samplesheet": { + "content": [ + "id_mappings.csv:md5,8473773df806859c6af7acafcfe5aa6f", + "multiqc_config.yml:md5,6f6189ee58855de81eaf82ad86e21040" + ], + "timestamp": "2023-05-16T16:11:36+0000" }, "taxprofiler_samplesheet": { "content": [ - "id_mappings.csv:md5,40c6daa8d668b4930bfd9045248e16ec", - "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d" + "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", + "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-09T14:11:58+0000" + "timestamp": "2023-05-16T16:11:36+0000" }, "fastq": { "content": [ @@ -128,9 +145,19 @@ "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2", "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda", + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64", + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83", "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544", "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79", + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962", + "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76", + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88", + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04", "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98", [ @@ -140,11 +167,21 @@ "ERX1188904_ERR1109373_1.fastq.gz.md5:md5,50c1c3108631dc32a3151b67e0260d86", "ERX1188904_ERR1109373_2.fastq.gz.md5:md5,1f22463d410e91a288c83d43654b2499", "ERX1234253_ERR1160846.fastq.gz.md5:md5,513a8437ad331fc512b088b3750aa1ff", + "SRX17709227_SRR21711856.fastq.gz.md5:md5,13a38fbef27c3e15867d80887145ae75", + "SRX17709228_SRR21711855.fastq.gz.md5:md5,1e871ddd9e92e1866e0c64d36eb5ec85", "SRX6725035_SRR9984183.fastq.gz.md5:md5,84f59dbb76c9b5eab7e14d90ced352c4", + "SRX9504942_SRR13055517_1.fastq.gz.md5:md5,a03f7f374dc401047b6f6ccaec3885cc", + "SRX9504942_SRR13055517_2.fastq.gz.md5:md5,facaf207753e977327e7b7df7bb8ace0", + "SRX9504942_SRR13055518_1.fastq.gz.md5:md5,5cf412cd62aadaa4838d9eabb5b44368", + "SRX9504942_SRR13055518_2.fastq.gz.md5:md5,93292b826afc72b23be93df26dd710c8", + "SRX9504942_SRR13055519_1.fastq.gz.md5:md5,f6ad6e2610397147a0a55c651de3992f", + "SRX9504942_SRR13055519_2.fastq.gz.md5:md5,2fe7dd4bcc1e7e61c6f54ef50cf961f3", + "SRX9504942_SRR13055520_1.fastq.gz.md5:md5,ab195b37746a3424a1099d9f8cc58de8", + "SRX9504942_SRR13055520_2.fastq.gz.md5:md5,10c448e23f1f7e7af61ec1204f8fc882", "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" ] ], - "timestamp": "2023-05-09T14:11:58+0000" + "timestamp": "2023-05-16T16:11:36+0000" } } \ No newline at end of file diff --git a/tests/pipeline/sra_with_sratools.nf.test.snap b/tests/pipeline/sra_with_sratools.nf.test.snap index 44daeaa0..040113af 100644 --- a/tests/pipeline/sra_with_sratools.nf.test.snap +++ b/tests/pipeline/sra_with_sratools.nf.test.snap @@ -5,26 +5,28 @@ "DRR028935.runinfo_ftp.tsv:md5,9db5d6cba5ce2cccd9b2cc3faaa092e2", "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", "ERR1160846.runinfo_ftp.tsv:md5,5611622d583e6bc6d45d8f934696ff1e", + "GSE214215.runinfo_ftp.tsv:md5,4224b5733b92daa40689538de9498ab9", + "GSM4907283.runinfo_ftp.tsv:md5,3d2c2395ee6690338f56fca84acb54ba", "SRR12848126.runinfo_ftp.tsv:md5,9563f91d4cc6aa58d2ed5fba2eb30baf", "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e", "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-09T14:07:50+0000" + "timestamp": "2023-05-16T16:01:21+0000" }, "samplesheet": { "content": [ - "id_mappings.csv:md5,40c6daa8d668b4930bfd9045248e16ec", - "multiqc_config.yml:md5,a6370add94bbe60c6bbe1bb48a038e8d" + "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", + "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-09T14:07:50+0000" + "timestamp": "2023-05-16T16:01:21+0000" }, "software_versions": { "content": [ - "software_versions.yml:md5,ec1f5ee8c99879c3b8f04e7e683f540f" + "software_versions.yml:md5,703fe5063c179f27f5df05252c29b82b" ], - "timestamp": "2023-05-09T14:07:50+0000" + "timestamp": "2023-05-16T16:01:21+0000" }, "fastq": { "content": [ @@ -37,12 +39,22 @@ "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2", "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda", + "SRX17709227_SRR21711856.fastq.gz:md5,eae43f1368d4568f415581394dc9726e", + "SRX17709228_SRR21711855.fastq.gz:md5,5194f8009b74552595c4ec5b7605d231", "SRX6725035_SRR9984183.fastq.gz:md5,7a70e678c400366869601c8be41fe74b", "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79", + "SRX9504942_SRR13055517_1.fastq.gz:md5,b6d912a73466c8f27b1d8021f80ec2bb", + "SRX9504942_SRR13055517_2.fastq.gz:md5,7c6e220694fa5d6d9124c739aa70ea92", + "SRX9504942_SRR13055518_1.fastq.gz:md5,ed29278c21a1bb2d8907a74be0dd4bc4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,83785b728312deb81483fc1fd5b14264", + "SRX9504942_SRR13055519_1.fastq.gz:md5,28babc59a625b5161d97392efd4d0018", + "SRX9504942_SRR13055519_2.fastq.gz:md5,cf1eb4c61ab3522f4d473c86b2f696e1", + "SRX9504942_SRR13055520_1.fastq.gz:md5,cc75af896ec8a7cececb37851b0c6fcd", + "SRX9504942_SRR13055520_2.fastq.gz:md5,fe3e2bf9f738e4959243fad59e879eae", "SRX9626017_SRR13191702_1.fastq.gz:md5,627a90afcd9f3cfc7f5f91074f9a2df7", "SRX9626017_SRR13191702_2.fastq.gz:md5,3d9b2c68a8ad1547105b17de81b2d9af" ], - "timestamp": "2023-05-09T14:07:50+0000" + "timestamp": "2023-05-16T16:01:21+0000" } } \ No newline at end of file From bc1dca9c5fb2da51193329dca74e042150d15b35 Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Tue, 16 May 2023 15:30:24 -0400 Subject: [PATCH 328/852] update-ci-testing-min-nxf-ver --- .github/workflows/ci.yml | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 22e8274e..c54b696c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,31 +18,44 @@ concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true - # Define the jobs to be run in parallel +# Define the jobs to be run in parallel jobs: + get_version: + runs-on: ubuntu-latest + outputs: + version: ${{ steps.get_version.outputs.version }} + + steps: + - name: Check out pipeline code + uses: actions/checkout@v3 + + - name: Get Minimum supported Nextflow version + id: get_version + run: | + VERSION=$(grep 'nextflowVersion' nextflow.config | awk -F'= ' '{print $2}' | tr -d '!>=" ') + echo "::set-output name=version::$VERSION" + test: - # Name the job with the corresponding profile, Nextflow version and aligner - name: Run ${{ matrix.profile }}-${{ matrix.NXF_VER }} pipeline test + name: Run ${{ matrix.profile }} pipeline test + needs: get_version - # Set the condition for running the job if: "${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/fetchngs') }}" - # Specify the runner for the job runs-on: ubuntu-latest + env: + NXF_VER: ${{ needs.get_version.outputs.version }} - # Define the matrix for different Nextflow versions, profiles and aligners strategy: matrix: - NXF_VER: - - "latest-everything" profile: ["docker"] - # Define the steps for the job steps: - # Checkout the pipeline code from the repository - name: Check out pipeline code uses: actions/checkout@v3 + - name: Use Nextflow version + run: echo "Using Nextflow version $NXF_VER" + # Cache Test Data - name: Cache test data uses: actions/cache@v2 From 6d0aab77f7d756fdb475dab0cbc2f0c5aa94ccd7 Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Tue, 16 May 2023 15:54:28 -0400 Subject: [PATCH 329/852] update-snapshots-22.10.1 --- tests/pipeline/sra.nf.test.snap | 10 +++---- tests/pipeline/sra_skip_fastq.nf.test.snap | 8 ++--- .../sra_with_nf_core_pipeline.nf.test.snap | 30 +++++++++---------- tests/pipeline/sra_with_sratools.nf.test.snap | 10 +++---- 4 files changed, 29 insertions(+), 29 deletions(-) diff --git a/tests/pipeline/sra.nf.test.snap b/tests/pipeline/sra.nf.test.snap index c1fe0af7..01c60787 100644 --- a/tests/pipeline/sra.nf.test.snap +++ b/tests/pipeline/sra.nf.test.snap @@ -13,20 +13,20 @@ "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-16T16:13:55+0000" + "timestamp": "2023-05-16T19:53:51+0000" }, "samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-16T16:13:55+0000" + "timestamp": "2023-05-16T19:53:51+0000" }, "software_versions": { "content": [ - "software_versions.yml:md5,7837dd6b0454c15b69cc8d2e6a0e9f83" + "software_versions.yml:md5,a1fb45ebb6c1d809de31398b910942dc" ], - "timestamp": "2023-05-16T16:13:55+0000" + "timestamp": "2023-05-16T19:53:51+0000" }, "fastq": { "content": [ @@ -76,6 +76,6 @@ "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" ] ], - "timestamp": "2023-05-16T16:13:55+0000" + "timestamp": "2023-05-16T19:53:51+0000" } } \ No newline at end of file diff --git a/tests/pipeline/sra_skip_fastq.nf.test.snap b/tests/pipeline/sra_skip_fastq.nf.test.snap index 7b65f527..f3067391 100644 --- a/tests/pipeline/sra_skip_fastq.nf.test.snap +++ b/tests/pipeline/sra_skip_fastq.nf.test.snap @@ -13,19 +13,19 @@ "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-16T16:01:52+0000" + "timestamp": "2023-05-16T19:38:26+0000" }, "samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-16T16:01:52+0000" + "timestamp": "2023-05-16T19:38:26+0000" }, "software_versions": { "content": [ - "software_versions.yml:md5,fc7829c56a38a69722534e223ad9d818" + "software_versions.yml:md5,6615486e6d186ded463ec1dea7c5012f" ], - "timestamp": "2023-05-16T16:01:52+0000" + "timestamp": "2023-05-16T19:38:26+0000" } } \ No newline at end of file diff --git a/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap b/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap index 54312645..958a361e 100644 --- a/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap +++ b/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap @@ -13,13 +13,13 @@ "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-16T16:11:36+0000" + "timestamp": "2023-05-16T19:40:34+0000" }, "software_versions": { "content": [ - "software_versions.yml:md5,7837dd6b0454c15b69cc8d2e6a0e9f83" + "software_versions.yml:md5,a1fb45ebb6c1d809de31398b910942dc" ], - "timestamp": "2023-05-16T16:11:36+0000" + "timestamp": "2023-05-16T19:40:34+0000" }, "viralrecon_metadata": { "content": [ @@ -35,14 +35,14 @@ "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-16T16:11:36+0000" + "timestamp": "2023-05-16T19:40:34+0000" }, "viralrecon_samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-16T16:11:36+0000" + "timestamp": "2023-05-16T19:40:34+0000" }, "atacseq_metadata": { "content": [ @@ -58,7 +58,7 @@ "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-16T16:11:36+0000" + "timestamp": "2023-05-16T19:40:34+0000" }, "rnaseq_ena_metadata": { "content": [ @@ -74,21 +74,21 @@ "SRR14709033.runinfo_ftp.tsv:md5,2385a9cc5e320e78b02743c45d1338f1", "SRR9984183.runinfo_ftp.tsv:md5,f1ed9fc572d2e0d145be7f547f6d1236" ], - "timestamp": "2023-05-16T16:11:36+0000" + "timestamp": "2023-05-16T19:40:34+0000" }, "rnaseq_samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-16T16:11:36+0000" + "timestamp": "2023-05-16T19:40:34+0000" }, "rnaseq_samplesheet_specific_ena": { "content": [ "id_mappings.csv:md5,0efde324e1818c0827390a17449a6e8a", "multiqc_config.yml:md5,6af65b0ae40e1bba60a25361771624bd" ], - "timestamp": "2023-05-16T16:11:36+0000" + "timestamp": "2023-05-16T19:40:34+0000" }, "rnaseq_metadata": { "content": [ @@ -104,35 +104,35 @@ "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-16T16:11:36+0000" + "timestamp": "2023-05-16T19:40:34+0000" }, "rnaseq_specific_ena_samplesheet": { "content": [ "id_mappings.csv:md5,0efde324e1818c0827390a17449a6e8a", "multiqc_config.yml:md5,6af65b0ae40e1bba60a25361771624bd" ], - "timestamp": "2023-05-16T16:11:36+0000" + "timestamp": "2023-05-16T19:40:34+0000" }, "atacseq_samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-16T16:11:36+0000" + "timestamp": "2023-05-16T19:40:34+0000" }, "rnaseq_ena_samplesheet": { "content": [ "id_mappings.csv:md5,8473773df806859c6af7acafcfe5aa6f", "multiqc_config.yml:md5,6f6189ee58855de81eaf82ad86e21040" ], - "timestamp": "2023-05-16T16:11:36+0000" + "timestamp": "2023-05-16T19:40:34+0000" }, "taxprofiler_samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-16T16:11:36+0000" + "timestamp": "2023-05-16T19:40:34+0000" }, "fastq": { "content": [ @@ -182,6 +182,6 @@ "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" ] ], - "timestamp": "2023-05-16T16:11:36+0000" + "timestamp": "2023-05-16T19:40:34+0000" } } \ No newline at end of file diff --git a/tests/pipeline/sra_with_sratools.nf.test.snap b/tests/pipeline/sra_with_sratools.nf.test.snap index 040113af..13e1b5f6 100644 --- a/tests/pipeline/sra_with_sratools.nf.test.snap +++ b/tests/pipeline/sra_with_sratools.nf.test.snap @@ -13,20 +13,20 @@ "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-16T16:01:21+0000" + "timestamp": "2023-05-16T19:37:55+0000" }, "samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-16T16:01:21+0000" + "timestamp": "2023-05-16T19:37:55+0000" }, "software_versions": { "content": [ - "software_versions.yml:md5,703fe5063c179f27f5df05252c29b82b" + "software_versions.yml:md5,ece325a9469ecf48050340b577e252a1" ], - "timestamp": "2023-05-16T16:01:21+0000" + "timestamp": "2023-05-16T19:37:55+0000" }, "fastq": { "content": [ @@ -55,6 +55,6 @@ "SRX9626017_SRR13191702_1.fastq.gz:md5,627a90afcd9f3cfc7f5f91074f9a2df7", "SRX9626017_SRR13191702_2.fastq.gz:md5,3d9b2c68a8ad1547105b17de81b2d9af" ], - "timestamp": "2023-05-16T16:01:21+0000" + "timestamp": "2023-05-16T19:37:55+0000" } } \ No newline at end of file From 04ac6584548954a46395d595b5d598be39a10558 Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Tue, 16 May 2023 17:39:25 -0400 Subject: [PATCH 330/852] update-snaps-1.11.0 --- tests/pipeline/sra.nf.test.snap | 10 +++---- tests/pipeline/sra_skip_fastq.nf.test.snap | 8 ++--- .../sra_with_nf_core_pipeline.nf.test.snap | 30 +++++++++---------- tests/pipeline/sra_with_sratools.nf.test.snap | 10 +++---- 4 files changed, 29 insertions(+), 29 deletions(-) diff --git a/tests/pipeline/sra.nf.test.snap b/tests/pipeline/sra.nf.test.snap index 01c60787..be0a6829 100644 --- a/tests/pipeline/sra.nf.test.snap +++ b/tests/pipeline/sra.nf.test.snap @@ -13,20 +13,20 @@ "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-16T19:53:51+0000" + "timestamp": "2023-05-16T21:05:23+0000" }, "samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-16T19:53:51+0000" + "timestamp": "2023-05-16T21:05:23+0000" }, "software_versions": { "content": [ - "software_versions.yml:md5,a1fb45ebb6c1d809de31398b910942dc" + "software_versions.yml:md5,9f477f11e8db6ac81cda776d0375fbb3" ], - "timestamp": "2023-05-16T19:53:51+0000" + "timestamp": "2023-05-16T21:05:23+0000" }, "fastq": { "content": [ @@ -76,6 +76,6 @@ "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" ] ], - "timestamp": "2023-05-16T19:53:51+0000" + "timestamp": "2023-05-16T21:05:23+0000" } } \ No newline at end of file diff --git a/tests/pipeline/sra_skip_fastq.nf.test.snap b/tests/pipeline/sra_skip_fastq.nf.test.snap index f3067391..116af376 100644 --- a/tests/pipeline/sra_skip_fastq.nf.test.snap +++ b/tests/pipeline/sra_skip_fastq.nf.test.snap @@ -13,19 +13,19 @@ "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-16T19:38:26+0000" + "timestamp": "2023-05-16T20:52:16+0000" }, "samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-16T19:38:26+0000" + "timestamp": "2023-05-16T20:52:16+0000" }, "software_versions": { "content": [ - "software_versions.yml:md5,6615486e6d186ded463ec1dea7c5012f" + "software_versions.yml:md5,5a1fd397bea2323067ca0a6893384ae7" ], - "timestamp": "2023-05-16T19:38:26+0000" + "timestamp": "2023-05-16T20:52:16+0000" } } \ No newline at end of file diff --git a/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap b/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap index 958a361e..b0fa8e18 100644 --- a/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap +++ b/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap @@ -13,13 +13,13 @@ "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-16T19:40:34+0000" + "timestamp": "2023-05-16T20:54:25+0000" }, "software_versions": { "content": [ - "software_versions.yml:md5,a1fb45ebb6c1d809de31398b910942dc" + "software_versions.yml:md5,9f477f11e8db6ac81cda776d0375fbb3" ], - "timestamp": "2023-05-16T19:40:34+0000" + "timestamp": "2023-05-16T20:54:25+0000" }, "viralrecon_metadata": { "content": [ @@ -35,14 +35,14 @@ "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-16T19:40:34+0000" + "timestamp": "2023-05-16T20:54:25+0000" }, "viralrecon_samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-16T19:40:34+0000" + "timestamp": "2023-05-16T20:54:25+0000" }, "atacseq_metadata": { "content": [ @@ -58,7 +58,7 @@ "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-16T19:40:34+0000" + "timestamp": "2023-05-16T20:54:25+0000" }, "rnaseq_ena_metadata": { "content": [ @@ -74,21 +74,21 @@ "SRR14709033.runinfo_ftp.tsv:md5,2385a9cc5e320e78b02743c45d1338f1", "SRR9984183.runinfo_ftp.tsv:md5,f1ed9fc572d2e0d145be7f547f6d1236" ], - "timestamp": "2023-05-16T19:40:34+0000" + "timestamp": "2023-05-16T20:54:25+0000" }, "rnaseq_samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-16T19:40:34+0000" + "timestamp": "2023-05-16T20:54:25+0000" }, "rnaseq_samplesheet_specific_ena": { "content": [ "id_mappings.csv:md5,0efde324e1818c0827390a17449a6e8a", "multiqc_config.yml:md5,6af65b0ae40e1bba60a25361771624bd" ], - "timestamp": "2023-05-16T19:40:34+0000" + "timestamp": "2023-05-16T20:54:25+0000" }, "rnaseq_metadata": { "content": [ @@ -104,35 +104,35 @@ "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-16T19:40:34+0000" + "timestamp": "2023-05-16T20:54:25+0000" }, "rnaseq_specific_ena_samplesheet": { "content": [ "id_mappings.csv:md5,0efde324e1818c0827390a17449a6e8a", "multiqc_config.yml:md5,6af65b0ae40e1bba60a25361771624bd" ], - "timestamp": "2023-05-16T19:40:34+0000" + "timestamp": "2023-05-16T20:54:25+0000" }, "atacseq_samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-16T19:40:34+0000" + "timestamp": "2023-05-16T20:54:25+0000" }, "rnaseq_ena_samplesheet": { "content": [ "id_mappings.csv:md5,8473773df806859c6af7acafcfe5aa6f", "multiqc_config.yml:md5,6f6189ee58855de81eaf82ad86e21040" ], - "timestamp": "2023-05-16T19:40:34+0000" + "timestamp": "2023-05-16T20:54:25+0000" }, "taxprofiler_samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-16T19:40:34+0000" + "timestamp": "2023-05-16T20:54:25+0000" }, "fastq": { "content": [ @@ -182,6 +182,6 @@ "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" ] ], - "timestamp": "2023-05-16T19:40:34+0000" + "timestamp": "2023-05-16T20:54:25+0000" } } \ No newline at end of file diff --git a/tests/pipeline/sra_with_sratools.nf.test.snap b/tests/pipeline/sra_with_sratools.nf.test.snap index 13e1b5f6..9ebf0e55 100644 --- a/tests/pipeline/sra_with_sratools.nf.test.snap +++ b/tests/pipeline/sra_with_sratools.nf.test.snap @@ -13,20 +13,20 @@ "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-16T19:37:55+0000" + "timestamp": "2023-05-16T20:51:44+0000" }, "samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-16T19:37:55+0000" + "timestamp": "2023-05-16T20:51:44+0000" }, "software_versions": { "content": [ - "software_versions.yml:md5,ece325a9469ecf48050340b577e252a1" + "software_versions.yml:md5,53061262d7600d38656f7373a7123159" ], - "timestamp": "2023-05-16T19:37:55+0000" + "timestamp": "2023-05-16T20:51:44+0000" }, "fastq": { "content": [ @@ -55,6 +55,6 @@ "SRX9626017_SRR13191702_1.fastq.gz:md5,627a90afcd9f3cfc7f5f91074f9a2df7", "SRX9626017_SRR13191702_2.fastq.gz:md5,3d9b2c68a8ad1547105b17de81b2d9af" ], - "timestamp": "2023-05-16T19:37:55+0000" + "timestamp": "2023-05-16T20:51:44+0000" } } \ No newline at end of file From c0e5d138dced843b00b019f6d990a0684cc9f93b Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Tue, 16 May 2023 18:47:13 -0400 Subject: [PATCH 331/852] update-ci-use-GITHUB_OUTPUT-for-nxf-ver --- .github/workflows/ci.yml | 2 +- .nf-core.yml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c54b696c..584b9967 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -33,7 +33,7 @@ jobs: id: get_version run: | VERSION=$(grep 'nextflowVersion' nextflow.config | awk -F'= ' '{print $2}' | tr -d '!>=" ') - echo "::set-output name=version::$VERSION" + echo "nxf_version=$VERSION" >> $GITHUB_OUTPUT test: name: Run ${{ matrix.profile }} pipeline test diff --git a/.nf-core.yml b/.nf-core.yml index 402025a7..f11657b7 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -3,4 +3,5 @@ lint: files_unchanged: - assets/sendmail_template.txt - lib/NfcoreTemplate.groovy + - .gitattributes actions_ci: False From a119105d8861f21f6e6659498092f6b956535ddd Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Tue, 16 May 2023 19:38:47 -0400 Subject: [PATCH 332/852] fix-nxf-ver-output-name --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 584b9967..f1140334 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -33,7 +33,7 @@ jobs: id: get_version run: | VERSION=$(grep 'nextflowVersion' nextflow.config | awk -F'= ' '{print $2}' | tr -d '!>=" ') - echo "nxf_version=$VERSION" >> $GITHUB_OUTPUT + echo "version=$VERSION" >> $GITHUB_OUTPUT test: name: Run ${{ matrix.profile }} pipeline test From 0374bcf5bff5ae8ea7ff7a21226b0e62f9d8afb5 Mon Sep 17 00:00:00 2001 From: Edmund Miller Date: Wed, 17 May 2023 11:19:51 -0500 Subject: [PATCH 333/852] test: Remove docker profile --- .github/workflows/ci.yml | 2 +- tests/pipeline/sra.nf.test | 2 +- tests/pipeline/sra_skip_fastq.nf.test | 2 +- tests/pipeline/sra_with_nf_core_pipeline.nf.test | 2 +- tests/pipeline/sra_with_sratools.nf.test | 2 +- tests/pipeline/synapse.test | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f1140334..27216961 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -80,7 +80,7 @@ jobs: # Run nf-test with the specified aligner and output test results in TAP format - name: Run nf-test run: | - nf-test test tests/pipeline/ --tap=test.tap + nf-test test tests/pipeline/ --tap=test.tap --profile "${{ matrix.profile }}" # If the test fails, output the software_versions.yml using the 'batcat' utility - name: Output log on failure diff --git a/tests/pipeline/sra.nf.test b/tests/pipeline/sra.nf.test index 00d8ad0f..c82a8fff 100644 --- a/tests/pipeline/sra.nf.test +++ b/tests/pipeline/sra.nf.test @@ -2,7 +2,7 @@ nextflow_pipeline { name "Test Workflow main.nf" script "main.nf" - options "-profile test,docker" + profile "test" tag "pipeline" test("SRA FASTQ & Metadata") { diff --git a/tests/pipeline/sra_skip_fastq.nf.test b/tests/pipeline/sra_skip_fastq.nf.test index bdf992ef..caa11c75 100644 --- a/tests/pipeline/sra_skip_fastq.nf.test +++ b/tests/pipeline/sra_skip_fastq.nf.test @@ -2,7 +2,7 @@ nextflow_pipeline { name "Test Workflow main.nf" script "main.nf" - profile "test,docker" + profile "test" tag "pipeline" test("SRA Skip FASTQ") { diff --git a/tests/pipeline/sra_with_nf_core_pipeline.nf.test b/tests/pipeline/sra_with_nf_core_pipeline.nf.test index 813c25da..231970be 100644 --- a/tests/pipeline/sra_with_nf_core_pipeline.nf.test +++ b/tests/pipeline/sra_with_nf_core_pipeline.nf.test @@ -2,7 +2,7 @@ nextflow_pipeline { name "Test Workflow main.nf" script "main.nf" - profile "test,docker" + profile "test" tag "pipeline" test("SRA NF-CORE/RNASEQ Samplesheet") { diff --git a/tests/pipeline/sra_with_sratools.nf.test b/tests/pipeline/sra_with_sratools.nf.test index 5bc903ac..cba77760 100644 --- a/tests/pipeline/sra_with_sratools.nf.test +++ b/tests/pipeline/sra_with_sratools.nf.test @@ -2,7 +2,7 @@ nextflow_pipeline { name "Test Workflow main.nf" script "main.nf" - profile "test,docker" + profile "test" tag "pipeline" test("Force SRA-Tools Download") { diff --git a/tests/pipeline/synapse.test b/tests/pipeline/synapse.test index a59ebf0b..464ad226 100644 --- a/tests/pipeline/synapse.test +++ b/tests/pipeline/synapse.test @@ -2,7 +2,7 @@ nextflow_pipeline { name "Test Workflow main.nf" script "main.nf" - profile "test_synapse,docker" + profile "test_synapse" tag "pipeline" test("Synapse Input Type") { From 266fbe48fbf2be7c134f33bdfb6f1b57066e4f62 Mon Sep 17 00:00:00 2001 From: Edmund Miller Date: Wed, 17 May 2023 11:22:40 -0500 Subject: [PATCH 334/852] ci: Remove matrix prefix of NXF_VER --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 27216961..c1ee8f7a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -69,7 +69,7 @@ jobs: - name: Install Nextflow uses: nf-core/setup-nextflow@v1 with: - version: "${{ matrix.NXF_VER }}" + version: "$NXF_VER" # Install nf-test - name: Install nf-test From 7e2ab293d3693f9aa756e1ed5d21f2edbd47769d Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Tue, 23 May 2023 14:31:44 -0400 Subject: [PATCH 335/852] rm-nxf-ver-snapshot --- .github/workflows/ci.yml | 4 +- nf-test.config | 2 +- tests/pipeline/sra.nf.test | 6 +- tests/pipeline/sra.nf.test.snap | 36 ++++++++++-- tests/pipeline/sra_skip_fastq.nf.test | 6 +- tests/pipeline/sra_skip_fastq.nf.test.snap | 28 +++++++-- .../sra_with_nf_core_pipeline.nf.test | 26 +++++++-- .../sra_with_nf_core_pipeline.nf.test.snap | 58 ++++++++++++++----- tests/pipeline/sra_with_sratools.nf.test | 6 +- tests/pipeline/sra_with_sratools.nf.test.snap | 33 +++++++++-- 10 files changed, 160 insertions(+), 45 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c1ee8f7a..f1140334 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -69,7 +69,7 @@ jobs: - name: Install Nextflow uses: nf-core/setup-nextflow@v1 with: - version: "$NXF_VER" + version: "${{ matrix.NXF_VER }}" # Install nf-test - name: Install nf-test @@ -80,7 +80,7 @@ jobs: # Run nf-test with the specified aligner and output test results in TAP format - name: Run nf-test run: | - nf-test test tests/pipeline/ --tap=test.tap --profile "${{ matrix.profile }}" + nf-test test tests/pipeline/ --tap=test.tap # If the test fails, output the software_versions.yml using the 'batcat' utility - name: Output log on failure diff --git a/nf-test.config b/nf-test.config index 9d4198ff..f345cb2d 100644 --- a/nf-test.config +++ b/nf-test.config @@ -3,6 +3,6 @@ config { testsDir "tests" workDir ".nf-test" configFile "nextflow.config" - profile "" + profile "test,docker" } diff --git a/tests/pipeline/sra.nf.test b/tests/pipeline/sra.nf.test index c82a8fff..37749254 100644 --- a/tests/pipeline/sra.nf.test +++ b/tests/pipeline/sra.nf.test @@ -2,7 +2,6 @@ nextflow_pipeline { name "Test Workflow main.nf" script "main.nf" - profile "test" tag "pipeline" test("SRA FASTQ & Metadata") { @@ -14,9 +13,12 @@ nextflow_pipeline { } then { + def softwareVersions = path("$outputDir/pipeline_info/software_versions.yml").yaml + if (softwareVersions.containsKey("Workflow")) { softwareVersions.Workflow.remove("Nextflow") } + assertAll( { assert workflow.success }, - { assert snapshot(path("$outputDir/pipeline_info/software_versions.yml")).match("software_versions") }, + { assert snapshot(softwareVersions).match("software_versions") }, { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, { assert snapshot(path("$outputDir/metadata/").list()).match("metadata") }, { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), diff --git a/tests/pipeline/sra.nf.test.snap b/tests/pipeline/sra.nf.test.snap index be0a6829..fc79907b 100644 --- a/tests/pipeline/sra.nf.test.snap +++ b/tests/pipeline/sra.nf.test.snap @@ -13,20 +13,46 @@ "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-16T21:05:23+0000" + "timestamp": "2023-05-23T18:30:12+0000" }, "samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-16T21:05:23+0000" + "timestamp": "2023-05-23T18:30:12+0000" }, "software_versions": { "content": [ - "software_versions.yml:md5,9f477f11e8db6ac81cda776d0375fbb3" + { + "CUSTOM_DUMPSOFTWAREVERSIONS": { + "python": "3.11.0", + "yaml": "6.0" + }, + "CUSTOM_SRATOOLSNCBISETTINGS": { + "sratools": "2.11.0" + }, + "MULTIQC_MAPPINGS_CONFIG": { + "python": "3.9.5" + }, + "SRA_FASTQ_FTP": { + "curl": "7.81.0" + }, + "SRA_IDS_TO_RUNINFO": { + "python": "3.9.5" + }, + "SRA_MERGE_SAMPLESHEET": { + "sed": "4.7" + }, + "SRA_RUNINFO_TO_FTP": { + "python": "3.9.5" + }, + "Workflow": { + "nf-core/fetchngs": "1.11.0dev" + } + } ], - "timestamp": "2023-05-16T21:05:23+0000" + "timestamp": "2023-05-23T18:30:12+0000" }, "fastq": { "content": [ @@ -76,6 +102,6 @@ "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" ] ], - "timestamp": "2023-05-16T21:05:23+0000" + "timestamp": "2023-05-23T18:30:12+0000" } } \ No newline at end of file diff --git a/tests/pipeline/sra_skip_fastq.nf.test b/tests/pipeline/sra_skip_fastq.nf.test index caa11c75..8497af75 100644 --- a/tests/pipeline/sra_skip_fastq.nf.test +++ b/tests/pipeline/sra_skip_fastq.nf.test @@ -2,7 +2,6 @@ nextflow_pipeline { name "Test Workflow main.nf" script "main.nf" - profile "test" tag "pipeline" test("SRA Skip FASTQ") { @@ -15,9 +14,12 @@ nextflow_pipeline { } then { + def softwareVersions = path("$outputDir/pipeline_info/software_versions.yml").yaml + if (softwareVersions.containsKey("Workflow")) { softwareVersions.Workflow.remove("Nextflow") } + assertAll( { assert workflow.success }, - { assert snapshot(path("$outputDir/pipeline_info/software_versions.yml")).match("software_versions") }, + { assert snapshot(softwareVersions).match("software_versions") }, { assert snapshot(path("$outputDir/metadata/").list()).match("metadata") }, { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), path("$outputDir/samplesheet/multiqc_config.yml")).match("samplesheet") }, diff --git a/tests/pipeline/sra_skip_fastq.nf.test.snap b/tests/pipeline/sra_skip_fastq.nf.test.snap index 116af376..456e101d 100644 --- a/tests/pipeline/sra_skip_fastq.nf.test.snap +++ b/tests/pipeline/sra_skip_fastq.nf.test.snap @@ -13,19 +13,39 @@ "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-16T20:52:16+0000" + "timestamp": "2023-05-23T18:17:54+0000" }, "samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-16T20:52:16+0000" + "timestamp": "2023-05-23T18:17:54+0000" }, "software_versions": { "content": [ - "software_versions.yml:md5,5a1fd397bea2323067ca0a6893384ae7" + { + "CUSTOM_DUMPSOFTWAREVERSIONS": { + "python": "3.11.0", + "yaml": "6.0" + }, + "MULTIQC_MAPPINGS_CONFIG": { + "python": "3.9.5" + }, + "SRA_IDS_TO_RUNINFO": { + "python": "3.9.5" + }, + "SRA_MERGE_SAMPLESHEET": { + "sed": "4.7" + }, + "SRA_RUNINFO_TO_FTP": { + "python": "3.9.5" + }, + "Workflow": { + "nf-core/fetchngs": "1.11.0dev" + } + } ], - "timestamp": "2023-05-16T20:52:16+0000" + "timestamp": "2023-05-23T18:17:54+0000" } } \ No newline at end of file diff --git a/tests/pipeline/sra_with_nf_core_pipeline.nf.test b/tests/pipeline/sra_with_nf_core_pipeline.nf.test index 231970be..54cec435 100644 --- a/tests/pipeline/sra_with_nf_core_pipeline.nf.test +++ b/tests/pipeline/sra_with_nf_core_pipeline.nf.test @@ -2,7 +2,6 @@ nextflow_pipeline { name "Test Workflow main.nf" script "main.nf" - profile "test" tag "pipeline" test("SRA NF-CORE/RNASEQ Samplesheet") { @@ -15,9 +14,12 @@ nextflow_pipeline { } then { + def softwareVersions = path("$outputDir/pipeline_info/software_versions.yml").yaml + if (softwareVersions.containsKey("Workflow")) { softwareVersions.Workflow.remove("Nextflow") } + assertAll( { assert workflow.success }, - { assert snapshot(path("$outputDir/pipeline_info/software_versions.yml")).match("software_versions") }, + { assert snapshot(softwareVersions).match("software_versions") }, { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, { assert snapshot(path("$outputDir/metadata/").list()).match("rnaseq_metadata") }, { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), @@ -39,9 +41,12 @@ nextflow_pipeline { } then { + def softwareVersions = path("$outputDir/pipeline_info/software_versions.yml").yaml + if (softwareVersions.containsKey("Workflow")) { softwareVersions.Workflow.remove("Nextflow") } + assertAll( { assert workflow.success }, - { assert snapshot(path("$outputDir/pipeline_info/software_versions.yml")).match("software_versions") }, + { assert snapshot(softwareVersions).match("software_versions") }, { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, { assert snapshot(path("$outputDir/metadata/").list()).match("rnaseq_ena_metadata") }, { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), @@ -61,9 +66,12 @@ nextflow_pipeline { } then { + def softwareVersions = path("$outputDir/pipeline_info/software_versions.yml").yaml + if (softwareVersions.containsKey("Workflow")) { softwareVersions.Workflow.remove("Nextflow") } + assertAll( { assert workflow.success }, - { assert snapshot(path("$outputDir/pipeline_info/software_versions.yml")).match("software_versions") }, + { assert snapshot(softwareVersions).match("software_versions") }, { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, { assert snapshot(path("$outputDir/metadata/").list()).match("atacseq_metadata") }, { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), @@ -83,9 +91,12 @@ nextflow_pipeline { } then { + def softwareVersions = path("$outputDir/pipeline_info/software_versions.yml").yaml + if (softwareVersions.containsKey("Workflow")) { softwareVersions.Workflow.remove("Nextflow") } + assertAll( { assert workflow.success }, - { assert snapshot(path("$outputDir/pipeline_info/software_versions.yml")).match("software_versions") }, + { assert snapshot(softwareVersions).match("software_versions") }, { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, { assert snapshot(path("$outputDir/metadata/").list()).match("viralrecon_metadata") }, { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), @@ -105,9 +116,12 @@ nextflow_pipeline { } then { + def softwareVersions = path("$outputDir/pipeline_info/software_versions.yml").yaml + if (softwareVersions.containsKey("Workflow")) { softwareVersions.Workflow.remove("Nextflow") } + assertAll( { assert workflow.success }, - { assert snapshot(path("$outputDir/pipeline_info/software_versions.yml")).match("software_versions") }, + { assert snapshot(softwareVersions).match("software_versions") }, { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, { assert snapshot(path("$outputDir/metadata/").list()).match("taxprofiler_metadata") }, { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), diff --git a/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap b/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap index b0fa8e18..ef695ab0 100644 --- a/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap +++ b/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap @@ -6,20 +6,46 @@ "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", "ERR1160846.runinfo_ftp.tsv:md5,5611622d583e6bc6d45d8f934696ff1e", "GSE214215.runinfo_ftp.tsv:md5,4224b5733b92daa40689538de9498ab9", - "GSM4907283.runinfo_ftp.tsv:md5,3d2c2395ee6690338f56fca84acb54ba", + "GSM4907283.runinfo_ftp.tsv:md5,92591968fa8fa37a9f7160fe8ada11a2", "SRR12848126.runinfo_ftp.tsv:md5,9563f91d4cc6aa58d2ed5fba2eb30baf", "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e", "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-16T20:54:25+0000" + "timestamp": "2023-05-23T18:27:58+0000" }, "software_versions": { "content": [ - "software_versions.yml:md5,9f477f11e8db6ac81cda776d0375fbb3" + { + "CUSTOM_DUMPSOFTWAREVERSIONS": { + "python": "3.11.0", + "yaml": "6.0" + }, + "CUSTOM_SRATOOLSNCBISETTINGS": { + "sratools": "2.11.0" + }, + "MULTIQC_MAPPINGS_CONFIG": { + "python": "3.9.5" + }, + "SRA_FASTQ_FTP": { + "curl": "7.81.0" + }, + "SRA_IDS_TO_RUNINFO": { + "python": "3.9.5" + }, + "SRA_MERGE_SAMPLESHEET": { + "sed": "4.7" + }, + "SRA_RUNINFO_TO_FTP": { + "python": "3.9.5" + }, + "Workflow": { + "nf-core/fetchngs": "1.11.0dev" + } + } ], - "timestamp": "2023-05-16T20:54:25+0000" + "timestamp": "2023-05-23T18:27:57+0000" }, "viralrecon_metadata": { "content": [ @@ -35,14 +61,14 @@ "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-16T20:54:25+0000" + "timestamp": "2023-05-23T18:27:57+0000" }, "viralrecon_samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-16T20:54:25+0000" + "timestamp": "2023-05-23T18:27:57+0000" }, "atacseq_metadata": { "content": [ @@ -58,7 +84,7 @@ "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-16T20:54:25+0000" + "timestamp": "2023-05-23T18:27:57+0000" }, "rnaseq_ena_metadata": { "content": [ @@ -74,21 +100,21 @@ "SRR14709033.runinfo_ftp.tsv:md5,2385a9cc5e320e78b02743c45d1338f1", "SRR9984183.runinfo_ftp.tsv:md5,f1ed9fc572d2e0d145be7f547f6d1236" ], - "timestamp": "2023-05-16T20:54:25+0000" + "timestamp": "2023-05-23T18:27:57+0000" }, "rnaseq_samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-16T20:54:25+0000" + "timestamp": "2023-05-23T18:27:57+0000" }, "rnaseq_samplesheet_specific_ena": { "content": [ "id_mappings.csv:md5,0efde324e1818c0827390a17449a6e8a", "multiqc_config.yml:md5,6af65b0ae40e1bba60a25361771624bd" ], - "timestamp": "2023-05-16T20:54:25+0000" + "timestamp": "2023-05-23T18:27:57+0000" }, "rnaseq_metadata": { "content": [ @@ -104,35 +130,35 @@ "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-16T20:54:25+0000" + "timestamp": "2023-05-23T18:27:57+0000" }, "rnaseq_specific_ena_samplesheet": { "content": [ "id_mappings.csv:md5,0efde324e1818c0827390a17449a6e8a", "multiqc_config.yml:md5,6af65b0ae40e1bba60a25361771624bd" ], - "timestamp": "2023-05-16T20:54:25+0000" + "timestamp": "2023-05-23T18:27:57+0000" }, "atacseq_samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-16T20:54:25+0000" + "timestamp": "2023-05-23T18:27:57+0000" }, "rnaseq_ena_samplesheet": { "content": [ "id_mappings.csv:md5,8473773df806859c6af7acafcfe5aa6f", "multiqc_config.yml:md5,6f6189ee58855de81eaf82ad86e21040" ], - "timestamp": "2023-05-16T20:54:25+0000" + "timestamp": "2023-05-23T18:27:57+0000" }, "taxprofiler_samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-16T20:54:25+0000" + "timestamp": "2023-05-23T18:27:57+0000" }, "fastq": { "content": [ @@ -182,6 +208,6 @@ "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" ] ], - "timestamp": "2023-05-16T20:54:25+0000" + "timestamp": "2023-05-23T18:27:57+0000" } } \ No newline at end of file diff --git a/tests/pipeline/sra_with_sratools.nf.test b/tests/pipeline/sra_with_sratools.nf.test index cba77760..7e50cc46 100644 --- a/tests/pipeline/sra_with_sratools.nf.test +++ b/tests/pipeline/sra_with_sratools.nf.test @@ -2,7 +2,6 @@ nextflow_pipeline { name "Test Workflow main.nf" script "main.nf" - profile "test" tag "pipeline" test("Force SRA-Tools Download") { @@ -15,9 +14,12 @@ nextflow_pipeline { } then { + def softwareVersions = path("$outputDir/pipeline_info/software_versions.yml").yaml + if (softwareVersions.containsKey("Workflow")) { softwareVersions.Workflow.remove("Nextflow") } + assertAll( { assert workflow.success }, - { assert snapshot(path("$outputDir/pipeline_info/software_versions.yml")).match("software_versions") }, + { assert snapshot(softwareVersions).match("software_versions") }, { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, { assert snapshot(path("$outputDir/metadata/").list()).match("metadata") }, { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), diff --git a/tests/pipeline/sra_with_sratools.nf.test.snap b/tests/pipeline/sra_with_sratools.nf.test.snap index 9ebf0e55..d66ebc11 100644 --- a/tests/pipeline/sra_with_sratools.nf.test.snap +++ b/tests/pipeline/sra_with_sratools.nf.test.snap @@ -13,20 +13,43 @@ "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-16T20:51:44+0000" + "timestamp": "2023-05-23T18:17:22+0000" }, "samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-16T20:51:44+0000" + "timestamp": "2023-05-23T18:17:22+0000" }, "software_versions": { "content": [ - "software_versions.yml:md5,53061262d7600d38656f7373a7123159" + { + "CUSTOM_DUMPSOFTWAREVERSIONS": { + "python": "3.11.0", + "yaml": "6.0" + }, + "CUSTOM_SRATOOLSNCBISETTINGS": { + "sratools": "2.11.0" + }, + "MULTIQC_MAPPINGS_CONFIG": { + "python": "3.9.5" + }, + "SRA_IDS_TO_RUNINFO": { + "python": "3.9.5" + }, + "SRA_MERGE_SAMPLESHEET": { + "sed": "4.7" + }, + "SRA_RUNINFO_TO_FTP": { + "python": "3.9.5" + }, + "Workflow": { + "nf-core/fetchngs": "1.11.0dev" + } + } ], - "timestamp": "2023-05-16T20:51:44+0000" + "timestamp": "2023-05-23T18:17:23+0000" }, "fastq": { "content": [ @@ -55,6 +78,6 @@ "SRX9626017_SRR13191702_1.fastq.gz:md5,627a90afcd9f3cfc7f5f91074f9a2df7", "SRX9626017_SRR13191702_2.fastq.gz:md5,3d9b2c68a8ad1547105b17de81b2d9af" ], - "timestamp": "2023-05-16T20:51:44+0000" + "timestamp": "2023-05-23T18:17:22+0000" } } \ No newline at end of file From e4a4fe9f536a89cc391aeb5741ec4b06e1e834ae Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Tue, 23 May 2023 14:34:48 -0400 Subject: [PATCH 336/852] fix-ci-setup-nxf-ver --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f1140334..a9c3aff0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -69,7 +69,7 @@ jobs: - name: Install Nextflow uses: nf-core/setup-nextflow@v1 with: - version: "${{ matrix.NXF_VER }}" + version: $NXF_VER # Install nf-test - name: Install nf-test From 6510941e370aec34d5433969ef37582a0730bd09 Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Tue, 23 May 2023 14:35:35 -0400 Subject: [PATCH 337/852] fix-ci-setup-nxf-ver --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a9c3aff0..3e510594 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -69,7 +69,7 @@ jobs: - name: Install Nextflow uses: nf-core/setup-nextflow@v1 with: - version: $NXF_VER + version: "$NXF_VER" # Install nf-test - name: Install nf-test From de9ef6abbf45fbfbd4218254b2f1318d6047d593 Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Tue, 23 May 2023 14:41:45 -0400 Subject: [PATCH 338/852] fix-ci-setup-nxf-ver --- .github/workflows/ci.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3e510594..fc77b35e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -68,8 +68,6 @@ jobs: # Install the specified version of Nextflow - name: Install Nextflow uses: nf-core/setup-nextflow@v1 - with: - version: "$NXF_VER" # Install nf-test - name: Install nf-test From 17d1a36f7be2bba3b0378e1ec0388e0e27fe5533 Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Tue, 23 May 2023 14:47:14 -0400 Subject: [PATCH 339/852] fix-ci-setup-nxf-ver --- .github/workflows/ci.yml | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fc77b35e..38d0fce5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,7 +1,5 @@ -# This is the nf-core CI workflow configuration for GitHub Actions name: nf-core CI -# This workflow is triggered when a pull request is made to the 'dev' branch or when a new release is published on: pull_request: branches: @@ -9,16 +7,13 @@ on: release: types: [published] -# Setting environment variable for Nextflow logs env: NXF_ANSI_LOG: false -# Cancel if a newer run is started concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true -# Define the jobs to be run in parallel jobs: get_version: runs-on: ubuntu-latest @@ -33,7 +28,7 @@ jobs: id: get_version run: | VERSION=$(grep 'nextflowVersion' nextflow.config | awk -F'= ' '{print $2}' | tr -d '!>=" ') - echo "version=$VERSION" >> $GITHUB_OUTPUT + echo "VERSION=$VERSION" >> $GITHUB_ENV test: name: Run ${{ matrix.profile }} pipeline test @@ -56,29 +51,25 @@ jobs: - name: Use Nextflow version run: echo "Using Nextflow version $NXF_VER" - # Cache Test Data - name: Cache test data uses: actions/cache@v2 with: path: /usr/local/bin/nextflow key: ${{ runner.os }} - restore-keys: | - ${{ runner.os }}-nextflow- + restore-keys: ${{ runner.os }}-nextflow- - # Install the specified version of Nextflow - name: Install Nextflow uses: nf-core/setup-nextflow@v1 + with: + version: "$NXF_VER" - # Install nf-test - name: Install nf-test run: | wget -qO- https://code.askimed.com/install/nf-test | bash sudo mv nf-test /usr/local/bin/ - # Run nf-test with the specified aligner and output test results in TAP format - name: Run nf-test - run: | - nf-test test tests/pipeline/ --tap=test.tap + run: nf-test test tests/pipeline/ --tap=test.tap # If the test fails, output the software_versions.yml using the 'batcat' utility - name: Output log on failure @@ -87,8 +78,6 @@ jobs: sudo apt install bat > /dev/null batcat --decorations=always --color=always /home/runner/work/fetchngs/fetchngs/.nf-test/tests/*/output/pipeline_info/software_versions.yml - # Use TAP summary to display test results - uses: pcolby/tap-summary@v1 with: - path: >- - test.tap + path: test.tap From cac3b9f37e707f287f12b88d27455490064bed7e Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Tue, 23 May 2023 14:48:40 -0400 Subject: [PATCH 340/852] fix-ci-setup-nxf-ver --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 38d0fce5..de0f545f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -61,7 +61,7 @@ jobs: - name: Install Nextflow uses: nf-core/setup-nextflow@v1 with: - version: "$NXF_VER" + version: ${{ matrix.NXF_VER }} - name: Install nf-test run: | From 36033bef1b5d3762f586bda3156587bc4d7e6477 Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Tue, 23 May 2023 14:50:05 -0400 Subject: [PATCH 341/852] fix-ci-setup-nxf-ver --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index de0f545f..f7559df1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -38,7 +38,7 @@ jobs: runs-on: ubuntu-latest env: - NXF_VER: ${{ needs.get_version.outputs.version }} + NXF_VER: ${{ needs.get_version.outputs.VERSION }} strategy: matrix: From 9683e029b9ee7e465609e78af3bb04161c48bfcc Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Tue, 23 May 2023 14:53:55 -0400 Subject: [PATCH 342/852] fix-ci-setup-nxf-ver --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f7559df1..960a7dca 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,7 +28,7 @@ jobs: id: get_version run: | VERSION=$(grep 'nextflowVersion' nextflow.config | awk -F'= ' '{print $2}' | tr -d '!>=" ') - echo "VERSION=$VERSION" >> $GITHUB_ENV + echo "VERSION=$VERSION" >> $GITHUB_OUTPUT test: name: Run ${{ matrix.profile }} pipeline test From 1497db02a66719174832c4332daa35bfc27f85fa Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Tue, 23 May 2023 14:57:57 -0400 Subject: [PATCH 343/852] fix-ci-setup-nxf-ver --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 960a7dca..a23c68a4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -61,7 +61,7 @@ jobs: - name: Install Nextflow uses: nf-core/setup-nextflow@v1 with: - version: ${{ matrix.NXF_VER }} + version: ${{ needs.get_version.outputs.VERSION }} - name: Install nf-test run: | From e3fa273ea636dd07db4bbbde9a2f5b1ecfdebf90 Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Tue, 23 May 2023 14:59:27 -0400 Subject: [PATCH 344/852] fix-ci-setup-nxf-ver --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a23c68a4..b090ef85 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -61,7 +61,7 @@ jobs: - name: Install Nextflow uses: nf-core/setup-nextflow@v1 with: - version: ${{ needs.get_version.outputs.VERSION }} + version: "$NXF_VER" - name: Install nf-test run: | From 84dbc4395a4deac65ac4509dd7f32f5cd9f9f2de Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Tue, 23 May 2023 15:09:53 -0400 Subject: [PATCH 345/852] fix-ci-setup-nxf-ver --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b090ef85..e8ef60fc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -61,7 +61,7 @@ jobs: - name: Install Nextflow uses: nf-core/setup-nextflow@v1 with: - version: "$NXF_VER" + version: "${{ env.NXF_VER }}" - name: Install nf-test run: | From 143eed6d377b3b7839d75026fb37a9904a55b883 Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Tue, 23 May 2023 22:09:25 -0400 Subject: [PATCH 346/852] revert-to-testing-2-nxf-vers --- .github/workflows/ci.yml | 48 +++++++++------------------------------- 1 file changed, 10 insertions(+), 38 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e8ef60fc..60259e4d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,9 +1,10 @@ name: nf-core CI - +# This workflow runs the pipeline with the minimal test dataset to check that it completes without any syntax errors on: - pull_request: + push: branches: - dev + pull_request: release: types: [published] @@ -11,57 +12,28 @@ env: NXF_ANSI_LOG: false concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + group: "${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}" cancel-in-progress: true jobs: - get_version: - runs-on: ubuntu-latest - outputs: - version: ${{ steps.get_version.outputs.version }} - - steps: - - name: Check out pipeline code - uses: actions/checkout@v3 - - - name: Get Minimum supported Nextflow version - id: get_version - run: | - VERSION=$(grep 'nextflowVersion' nextflow.config | awk -F'= ' '{print $2}' | tr -d '!>=" ') - echo "VERSION=$VERSION" >> $GITHUB_OUTPUT - test: - name: Run ${{ matrix.profile }} pipeline test - needs: get_version - + name: Run pipeline with test data + # Only run on push if this is the nf-core dev branch (merged PRs) if: "${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/fetchngs') }}" - runs-on: ubuntu-latest - env: - NXF_VER: ${{ needs.get_version.outputs.VERSION }} - strategy: matrix: - profile: ["docker"] - + NXF_VER: + - "22.10.1" + - "latest-everything" steps: - name: Check out pipeline code uses: actions/checkout@v3 - - name: Use Nextflow version - run: echo "Using Nextflow version $NXF_VER" - - - name: Cache test data - uses: actions/cache@v2 - with: - path: /usr/local/bin/nextflow - key: ${{ runner.os }} - restore-keys: ${{ runner.os }}-nextflow- - - name: Install Nextflow uses: nf-core/setup-nextflow@v1 with: - version: "${{ env.NXF_VER }}" + version: "${{ matrix.NXF_VER }}" - name: Install nf-test run: | From a26c031785771592d45a31f0f1c256f8bffdfec7 Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Wed, 24 May 2023 00:09:00 -0400 Subject: [PATCH 347/852] update-snapshots --- tests/pipeline/sra.nf.test.snap | 10 +++--- tests/pipeline/sra_skip_fastq.nf.test.snap | 8 ++--- .../sra_with_nf_core_pipeline.nf.test.snap | 34 +++++++++---------- tests/pipeline/sra_with_sratools.nf.test.snap | 10 +++--- 4 files changed, 31 insertions(+), 31 deletions(-) diff --git a/tests/pipeline/sra.nf.test.snap b/tests/pipeline/sra.nf.test.snap index fc79907b..9732de6f 100644 --- a/tests/pipeline/sra.nf.test.snap +++ b/tests/pipeline/sra.nf.test.snap @@ -6,21 +6,21 @@ "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", "ERR1160846.runinfo_ftp.tsv:md5,5611622d583e6bc6d45d8f934696ff1e", "GSE214215.runinfo_ftp.tsv:md5,4224b5733b92daa40689538de9498ab9", - "GSM4907283.runinfo_ftp.tsv:md5,3d2c2395ee6690338f56fca84acb54ba", + "GSM4907283.runinfo_ftp.tsv:md5,92591968fa8fa37a9f7160fe8ada11a2", "SRR12848126.runinfo_ftp.tsv:md5,9563f91d4cc6aa58d2ed5fba2eb30baf", "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e", "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-23T18:30:12+0000" + "timestamp": "2023-05-24T04:05:51+0000" }, "samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-23T18:30:12+0000" + "timestamp": "2023-05-24T04:05:51+0000" }, "software_versions": { "content": [ @@ -52,7 +52,7 @@ } } ], - "timestamp": "2023-05-23T18:30:12+0000" + "timestamp": "2023-05-24T04:05:51+0000" }, "fastq": { "content": [ @@ -102,6 +102,6 @@ "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" ] ], - "timestamp": "2023-05-23T18:30:12+0000" + "timestamp": "2023-05-24T04:05:51+0000" } } \ No newline at end of file diff --git a/tests/pipeline/sra_skip_fastq.nf.test.snap b/tests/pipeline/sra_skip_fastq.nf.test.snap index 456e101d..5452bd4a 100644 --- a/tests/pipeline/sra_skip_fastq.nf.test.snap +++ b/tests/pipeline/sra_skip_fastq.nf.test.snap @@ -6,21 +6,21 @@ "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", "ERR1160846.runinfo_ftp.tsv:md5,5611622d583e6bc6d45d8f934696ff1e", "GSE214215.runinfo_ftp.tsv:md5,4224b5733b92daa40689538de9498ab9", - "GSM4907283.runinfo_ftp.tsv:md5,3d2c2395ee6690338f56fca84acb54ba", + "GSM4907283.runinfo_ftp.tsv:md5,92591968fa8fa37a9f7160fe8ada11a2", "SRR12848126.runinfo_ftp.tsv:md5,9563f91d4cc6aa58d2ed5fba2eb30baf", "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e", "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-23T18:17:54+0000" + "timestamp": "2023-05-24T02:38:17+0000" }, "samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-23T18:17:54+0000" + "timestamp": "2023-05-24T02:38:17+0000" }, "software_versions": { "content": [ @@ -46,6 +46,6 @@ } } ], - "timestamp": "2023-05-23T18:17:54+0000" + "timestamp": "2023-05-24T02:38:17+0000" } } \ No newline at end of file diff --git a/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap b/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap index ef695ab0..c858773b 100644 --- a/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap +++ b/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap @@ -6,14 +6,14 @@ "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", "ERR1160846.runinfo_ftp.tsv:md5,5611622d583e6bc6d45d8f934696ff1e", "GSE214215.runinfo_ftp.tsv:md5,4224b5733b92daa40689538de9498ab9", - "GSM4907283.runinfo_ftp.tsv:md5,92591968fa8fa37a9f7160fe8ada11a2", + "GSM4907283.runinfo_ftp.tsv:md5,3d2c2395ee6690338f56fca84acb54ba", "SRR12848126.runinfo_ftp.tsv:md5,9563f91d4cc6aa58d2ed5fba2eb30baf", "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e", "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-23T18:27:58+0000" + "timestamp": "2023-05-24T03:54:13+0000" }, "software_versions": { "content": [ @@ -45,7 +45,7 @@ } } ], - "timestamp": "2023-05-23T18:27:57+0000" + "timestamp": "2023-05-24T03:54:13+0000" }, "viralrecon_metadata": { "content": [ @@ -54,21 +54,21 @@ "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", "ERR1160846.runinfo_ftp.tsv:md5,5611622d583e6bc6d45d8f934696ff1e", "GSE214215.runinfo_ftp.tsv:md5,4224b5733b92daa40689538de9498ab9", - "GSM4907283.runinfo_ftp.tsv:md5,3d2c2395ee6690338f56fca84acb54ba", + "GSM4907283.runinfo_ftp.tsv:md5,92591968fa8fa37a9f7160fe8ada11a2", "SRR12848126.runinfo_ftp.tsv:md5,9563f91d4cc6aa58d2ed5fba2eb30baf", "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e", "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-23T18:27:57+0000" + "timestamp": "2023-05-24T03:54:13+0000" }, "viralrecon_samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-23T18:27:57+0000" + "timestamp": "2023-05-24T03:54:13+0000" }, "atacseq_metadata": { "content": [ @@ -84,7 +84,7 @@ "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-23T18:27:57+0000" + "timestamp": "2023-05-24T03:54:13+0000" }, "rnaseq_ena_metadata": { "content": [ @@ -100,21 +100,21 @@ "SRR14709033.runinfo_ftp.tsv:md5,2385a9cc5e320e78b02743c45d1338f1", "SRR9984183.runinfo_ftp.tsv:md5,f1ed9fc572d2e0d145be7f547f6d1236" ], - "timestamp": "2023-05-23T18:27:57+0000" + "timestamp": "2023-05-24T03:54:13+0000" }, "rnaseq_samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-23T18:27:57+0000" + "timestamp": "2023-05-24T03:54:13+0000" }, "rnaseq_samplesheet_specific_ena": { "content": [ "id_mappings.csv:md5,0efde324e1818c0827390a17449a6e8a", "multiqc_config.yml:md5,6af65b0ae40e1bba60a25361771624bd" ], - "timestamp": "2023-05-23T18:27:57+0000" + "timestamp": "2023-05-24T03:54:13+0000" }, "rnaseq_metadata": { "content": [ @@ -123,42 +123,42 @@ "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", "ERR1160846.runinfo_ftp.tsv:md5,5611622d583e6bc6d45d8f934696ff1e", "GSE214215.runinfo_ftp.tsv:md5,4224b5733b92daa40689538de9498ab9", - "GSM4907283.runinfo_ftp.tsv:md5,3d2c2395ee6690338f56fca84acb54ba", + "GSM4907283.runinfo_ftp.tsv:md5,92591968fa8fa37a9f7160fe8ada11a2", "SRR12848126.runinfo_ftp.tsv:md5,9563f91d4cc6aa58d2ed5fba2eb30baf", "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e", "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-23T18:27:57+0000" + "timestamp": "2023-05-24T03:54:13+0000" }, "rnaseq_specific_ena_samplesheet": { "content": [ "id_mappings.csv:md5,0efde324e1818c0827390a17449a6e8a", "multiqc_config.yml:md5,6af65b0ae40e1bba60a25361771624bd" ], - "timestamp": "2023-05-23T18:27:57+0000" + "timestamp": "2023-05-24T03:54:13+0000" }, "atacseq_samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-23T18:27:57+0000" + "timestamp": "2023-05-24T03:54:13+0000" }, "rnaseq_ena_samplesheet": { "content": [ "id_mappings.csv:md5,8473773df806859c6af7acafcfe5aa6f", "multiqc_config.yml:md5,6f6189ee58855de81eaf82ad86e21040" ], - "timestamp": "2023-05-23T18:27:57+0000" + "timestamp": "2023-05-24T03:54:13+0000" }, "taxprofiler_samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-23T18:27:57+0000" + "timestamp": "2023-05-24T03:54:13+0000" }, "fastq": { "content": [ @@ -208,6 +208,6 @@ "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" ] ], - "timestamp": "2023-05-23T18:27:57+0000" + "timestamp": "2023-05-24T03:54:13+0000" } } \ No newline at end of file diff --git a/tests/pipeline/sra_with_sratools.nf.test.snap b/tests/pipeline/sra_with_sratools.nf.test.snap index d66ebc11..8844905b 100644 --- a/tests/pipeline/sra_with_sratools.nf.test.snap +++ b/tests/pipeline/sra_with_sratools.nf.test.snap @@ -6,21 +6,21 @@ "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", "ERR1160846.runinfo_ftp.tsv:md5,5611622d583e6bc6d45d8f934696ff1e", "GSE214215.runinfo_ftp.tsv:md5,4224b5733b92daa40689538de9498ab9", - "GSM4907283.runinfo_ftp.tsv:md5,3d2c2395ee6690338f56fca84acb54ba", + "GSM4907283.runinfo_ftp.tsv:md5,92591968fa8fa37a9f7160fe8ada11a2", "SRR12848126.runinfo_ftp.tsv:md5,9563f91d4cc6aa58d2ed5fba2eb30baf", "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e", "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-23T18:17:22+0000" + "timestamp": "2023-05-24T04:03:04+0000" }, "samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-23T18:17:22+0000" + "timestamp": "2023-05-24T04:03:04+0000" }, "software_versions": { "content": [ @@ -49,7 +49,7 @@ } } ], - "timestamp": "2023-05-23T18:17:23+0000" + "timestamp": "2023-05-24T04:03:04+0000" }, "fastq": { "content": [ @@ -78,6 +78,6 @@ "SRX9626017_SRR13191702_1.fastq.gz:md5,627a90afcd9f3cfc7f5f91074f9a2df7", "SRX9626017_SRR13191702_2.fastq.gz:md5,3d9b2c68a8ad1547105b17de81b2d9af" ], - "timestamp": "2023-05-23T18:17:22+0000" + "timestamp": "2023-05-24T04:03:04+0000" } } \ No newline at end of file From de7d5ab1533564e1b2c4d5d05a72a29cae09c393 Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Wed, 24 May 2023 11:38:15 -0400 Subject: [PATCH 348/852] update-snapshots --- .../sra_with_nf_core_pipeline.nf.test | 10 +- .../sra_with_nf_core_pipeline.nf.test.snap | 174 +++++++++++++++--- 2 files changed, 149 insertions(+), 35 deletions(-) diff --git a/tests/pipeline/sra_with_nf_core_pipeline.nf.test b/tests/pipeline/sra_with_nf_core_pipeline.nf.test index 54cec435..9facceef 100644 --- a/tests/pipeline/sra_with_nf_core_pipeline.nf.test +++ b/tests/pipeline/sra_with_nf_core_pipeline.nf.test @@ -19,7 +19,7 @@ nextflow_pipeline { assertAll( { assert workflow.success }, - { assert snapshot(softwareVersions).match("software_versions") }, + { assert snapshot(softwareVersions).match("rnaseq_software_versions") }, { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, { assert snapshot(path("$outputDir/metadata/").list()).match("rnaseq_metadata") }, { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), @@ -46,7 +46,7 @@ nextflow_pipeline { assertAll( { assert workflow.success }, - { assert snapshot(softwareVersions).match("software_versions") }, + { assert snapshot(softwareVersions).match("rnaseq_ena_software_versions") }, { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, { assert snapshot(path("$outputDir/metadata/").list()).match("rnaseq_ena_metadata") }, { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), @@ -71,7 +71,7 @@ nextflow_pipeline { assertAll( { assert workflow.success }, - { assert snapshot(softwareVersions).match("software_versions") }, + { assert snapshot(softwareVersions).match("atacseq_software_versions") }, { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, { assert snapshot(path("$outputDir/metadata/").list()).match("atacseq_metadata") }, { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), @@ -96,7 +96,7 @@ nextflow_pipeline { assertAll( { assert workflow.success }, - { assert snapshot(softwareVersions).match("software_versions") }, + { assert snapshot(softwareVersions).match("viralrecon_software_versions") }, { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, { assert snapshot(path("$outputDir/metadata/").list()).match("viralrecon_metadata") }, { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), @@ -121,7 +121,7 @@ nextflow_pipeline { assertAll( { assert workflow.success }, - { assert snapshot(softwareVersions).match("software_versions") }, + { assert snapshot(softwareVersions).match("taxprofiler_software_versions") }, { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, { assert snapshot(path("$outputDir/metadata/").list()).match("taxprofiler_metadata") }, { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), diff --git a/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap b/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap index c858773b..25a8308b 100644 --- a/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap +++ b/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap @@ -13,9 +13,9 @@ "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-24T03:54:13+0000" + "timestamp": "2023-05-24T14:53:28+0000" }, - "software_versions": { + "rnaseq_software_versions": { "content": [ { "CUSTOM_DUMPSOFTWAREVERSIONS": { @@ -45,7 +45,39 @@ } } ], - "timestamp": "2023-05-24T03:54:13+0000" + "timestamp": "2023-05-24T14:53:28+0000" + }, + "rnaseq_ena_software_versions": { + "content": [ + { + "CUSTOM_DUMPSOFTWAREVERSIONS": { + "python": "3.11.0", + "yaml": "6.0" + }, + "CUSTOM_SRATOOLSNCBISETTINGS": { + "sratools": "2.11.0" + }, + "MULTIQC_MAPPINGS_CONFIG": { + "python": "3.9.5" + }, + "SRA_FASTQ_FTP": { + "curl": "7.81.0" + }, + "SRA_IDS_TO_RUNINFO": { + "python": "3.9.5" + }, + "SRA_MERGE_SAMPLESHEET": { + "sed": "4.7" + }, + "SRA_RUNINFO_TO_FTP": { + "python": "3.9.5" + }, + "Workflow": { + "nf-core/fetchngs": "1.11.0dev" + } + } + ], + "timestamp": "2023-05-24T14:53:28+0000" }, "viralrecon_metadata": { "content": [ @@ -54,21 +86,85 @@ "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", "ERR1160846.runinfo_ftp.tsv:md5,5611622d583e6bc6d45d8f934696ff1e", "GSE214215.runinfo_ftp.tsv:md5,4224b5733b92daa40689538de9498ab9", - "GSM4907283.runinfo_ftp.tsv:md5,92591968fa8fa37a9f7160fe8ada11a2", + "GSM4907283.runinfo_ftp.tsv:md5,3d2c2395ee6690338f56fca84acb54ba", "SRR12848126.runinfo_ftp.tsv:md5,9563f91d4cc6aa58d2ed5fba2eb30baf", "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e", "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-24T03:54:13+0000" + "timestamp": "2023-05-24T14:53:28+0000" + }, + "viralrecon_software_versions": { + "content": [ + { + "CUSTOM_DUMPSOFTWAREVERSIONS": { + "python": "3.11.0", + "yaml": "6.0" + }, + "CUSTOM_SRATOOLSNCBISETTINGS": { + "sratools": "2.11.0" + }, + "MULTIQC_MAPPINGS_CONFIG": { + "python": "3.9.5" + }, + "SRA_FASTQ_FTP": { + "curl": "7.81.0" + }, + "SRA_IDS_TO_RUNINFO": { + "python": "3.9.5" + }, + "SRA_MERGE_SAMPLESHEET": { + "sed": "4.7" + }, + "SRA_RUNINFO_TO_FTP": { + "python": "3.9.5" + }, + "Workflow": { + "nf-core/fetchngs": "1.11.0dev" + } + } + ], + "timestamp": "2023-05-24T14:53:28+0000" }, "viralrecon_samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-24T03:54:13+0000" + "timestamp": "2023-05-24T14:53:28+0000" + }, + "taxprofiler_software_versions": { + "content": [ + { + "CUSTOM_DUMPSOFTWAREVERSIONS": { + "python": "3.11.0", + "yaml": "6.0" + }, + "CUSTOM_SRATOOLSNCBISETTINGS": { + "sratools": "2.11.0" + }, + "MULTIQC_MAPPINGS_CONFIG": { + "python": "3.9.5" + }, + "SRA_FASTQ_FTP": { + "curl": "7.81.0" + }, + "SRA_IDS_TO_RUNINFO": { + "python": "3.9.5" + }, + "SRA_MERGE_SAMPLESHEET": { + "sed": "4.7" + }, + "SRA_RUNINFO_TO_FTP": { + "python": "3.9.5" + }, + "Workflow": { + "nf-core/fetchngs": "1.11.0dev" + } + } + ], + "timestamp": "2023-05-24T14:53:28+0000" }, "atacseq_metadata": { "content": [ @@ -77,14 +173,14 @@ "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", "ERR1160846.runinfo_ftp.tsv:md5,5611622d583e6bc6d45d8f934696ff1e", "GSE214215.runinfo_ftp.tsv:md5,4224b5733b92daa40689538de9498ab9", - "GSM4907283.runinfo_ftp.tsv:md5,3d2c2395ee6690338f56fca84acb54ba", + "GSM4907283.runinfo_ftp.tsv:md5,92591968fa8fa37a9f7160fe8ada11a2", "SRR12848126.runinfo_ftp.tsv:md5,9563f91d4cc6aa58d2ed5fba2eb30baf", "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e", "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-24T03:54:13+0000" + "timestamp": "2023-05-24T14:53:28+0000" }, "rnaseq_ena_metadata": { "content": [ @@ -100,21 +196,14 @@ "SRR14709033.runinfo_ftp.tsv:md5,2385a9cc5e320e78b02743c45d1338f1", "SRR9984183.runinfo_ftp.tsv:md5,f1ed9fc572d2e0d145be7f547f6d1236" ], - "timestamp": "2023-05-24T03:54:13+0000" + "timestamp": "2023-05-24T14:53:28+0000" }, "rnaseq_samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-24T03:54:13+0000" - }, - "rnaseq_samplesheet_specific_ena": { - "content": [ - "id_mappings.csv:md5,0efde324e1818c0827390a17449a6e8a", - "multiqc_config.yml:md5,6af65b0ae40e1bba60a25361771624bd" - ], - "timestamp": "2023-05-24T03:54:13+0000" + "timestamp": "2023-05-24T14:53:28+0000" }, "rnaseq_metadata": { "content": [ @@ -123,42 +212,67 @@ "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", "ERR1160846.runinfo_ftp.tsv:md5,5611622d583e6bc6d45d8f934696ff1e", "GSE214215.runinfo_ftp.tsv:md5,4224b5733b92daa40689538de9498ab9", - "GSM4907283.runinfo_ftp.tsv:md5,92591968fa8fa37a9f7160fe8ada11a2", + "GSM4907283.runinfo_ftp.tsv:md5,3d2c2395ee6690338f56fca84acb54ba", "SRR12848126.runinfo_ftp.tsv:md5,9563f91d4cc6aa58d2ed5fba2eb30baf", "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e", "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-24T03:54:13+0000" - }, - "rnaseq_specific_ena_samplesheet": { - "content": [ - "id_mappings.csv:md5,0efde324e1818c0827390a17449a6e8a", - "multiqc_config.yml:md5,6af65b0ae40e1bba60a25361771624bd" - ], - "timestamp": "2023-05-24T03:54:13+0000" + "timestamp": "2023-05-24T14:53:28+0000" }, "atacseq_samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-24T03:54:13+0000" + "timestamp": "2023-05-24T14:53:28+0000" }, "rnaseq_ena_samplesheet": { "content": [ "id_mappings.csv:md5,8473773df806859c6af7acafcfe5aa6f", "multiqc_config.yml:md5,6f6189ee58855de81eaf82ad86e21040" ], - "timestamp": "2023-05-24T03:54:13+0000" + "timestamp": "2023-05-24T14:53:28+0000" + }, + "atacseq_software_versions": { + "content": [ + { + "CUSTOM_DUMPSOFTWAREVERSIONS": { + "python": "3.11.0", + "yaml": "6.0" + }, + "CUSTOM_SRATOOLSNCBISETTINGS": { + "sratools": "2.11.0" + }, + "MULTIQC_MAPPINGS_CONFIG": { + "python": "3.9.5" + }, + "SRA_FASTQ_FTP": { + "curl": "7.81.0" + }, + "SRA_IDS_TO_RUNINFO": { + "python": "3.9.5" + }, + "SRA_MERGE_SAMPLESHEET": { + "sed": "4.7" + }, + "SRA_RUNINFO_TO_FTP": { + "python": "3.9.5" + }, + "Workflow": { + "nf-core/fetchngs": "1.11.0dev" + } + } + ], + "timestamp": "2023-05-24T14:53:28+0000" }, "taxprofiler_samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-24T03:54:13+0000" + "timestamp": "2023-05-24T14:53:28+0000" }, "fastq": { "content": [ @@ -208,6 +322,6 @@ "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" ] ], - "timestamp": "2023-05-24T03:54:13+0000" + "timestamp": "2023-05-24T14:53:28+0000" } } \ No newline at end of file From 325264799b3b216337a996f5e648929941b951c4 Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Wed, 24 May 2023 21:58:20 -0400 Subject: [PATCH 349/852] update-snapshots-metadata-runinfo --- tests/pipeline/sra.nf.test | 12 +++- tests/pipeline/sra.nf.test.snap | 9 ++- tests/pipeline/sra_skip_fastq.nf.test | 12 +++- tests/pipeline/sra_skip_fastq.nf.test.snap | 7 +-- .../sra_with_nf_core_pipeline.nf.test | 60 +++++++++++++++++-- .../sra_with_nf_core_pipeline.nf.test.snap | 37 +++++------- tests/pipeline/sra_with_sratools.nf.test | 12 +++- tests/pipeline/sra_with_sratools.nf.test.snap | 9 ++- 8 files changed, 115 insertions(+), 43 deletions(-) diff --git a/tests/pipeline/sra.nf.test b/tests/pipeline/sra.nf.test index 37749254..970840de 100644 --- a/tests/pipeline/sra.nf.test +++ b/tests/pipeline/sra.nf.test @@ -20,7 +20,17 @@ nextflow_pipeline { { assert workflow.success }, { assert snapshot(softwareVersions).match("software_versions") }, { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, - { assert snapshot(path("$outputDir/metadata/").list()).match("metadata") }, + { assert snapshot(path("$outputDir/metadata/DRR026872.runinfo_ftp.tsv"), + path("$outputDir/metadata/DRR028935.runinfo_ftp.tsv"), + path("$outputDir/metadata/ERR1109373.runinfo_ftp.tsv"), + path("$outputDir/metadata/ERR1160846.runinfo_ftp.tsv"), + path("$outputDir/metadata/GSE214215.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR12848126.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR13191702.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR14593545.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR14709033.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR9984183.runinfo_ftp.tsv")).match("metadata") }, + { assert new File("$outputDir/metadata/GSM4907283.runinfo_ftp.tsv").exists() }, { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), path("$outputDir/samplesheet/multiqc_config.yml")).match("samplesheet") }, { assert new File("$outputDir/samplesheet/samplesheet.csv").exists() } diff --git a/tests/pipeline/sra.nf.test.snap b/tests/pipeline/sra.nf.test.snap index 9732de6f..86c6780e 100644 --- a/tests/pipeline/sra.nf.test.snap +++ b/tests/pipeline/sra.nf.test.snap @@ -6,21 +6,20 @@ "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", "ERR1160846.runinfo_ftp.tsv:md5,5611622d583e6bc6d45d8f934696ff1e", "GSE214215.runinfo_ftp.tsv:md5,4224b5733b92daa40689538de9498ab9", - "GSM4907283.runinfo_ftp.tsv:md5,92591968fa8fa37a9f7160fe8ada11a2", "SRR12848126.runinfo_ftp.tsv:md5,9563f91d4cc6aa58d2ed5fba2eb30baf", "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e", "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-24T04:05:51+0000" + "timestamp": "2023-05-25T01:31:04+0000" }, "samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-24T04:05:51+0000" + "timestamp": "2023-05-25T01:31:04+0000" }, "software_versions": { "content": [ @@ -52,7 +51,7 @@ } } ], - "timestamp": "2023-05-24T04:05:51+0000" + "timestamp": "2023-05-25T01:31:04+0000" }, "fastq": { "content": [ @@ -102,6 +101,6 @@ "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" ] ], - "timestamp": "2023-05-24T04:05:51+0000" + "timestamp": "2023-05-25T01:31:04+0000" } } \ No newline at end of file diff --git a/tests/pipeline/sra_skip_fastq.nf.test b/tests/pipeline/sra_skip_fastq.nf.test index 8497af75..e00dc66a 100644 --- a/tests/pipeline/sra_skip_fastq.nf.test +++ b/tests/pipeline/sra_skip_fastq.nf.test @@ -20,7 +20,17 @@ nextflow_pipeline { assertAll( { assert workflow.success }, { assert snapshot(softwareVersions).match("software_versions") }, - { assert snapshot(path("$outputDir/metadata/").list()).match("metadata") }, + { assert snapshot(path("$outputDir/metadata/DRR026872.runinfo_ftp.tsv"), + path("$outputDir/metadata/DRR028935.runinfo_ftp.tsv"), + path("$outputDir/metadata/ERR1109373.runinfo_ftp.tsv"), + path("$outputDir/metadata/ERR1160846.runinfo_ftp.tsv"), + path("$outputDir/metadata/GSE214215.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR12848126.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR13191702.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR14593545.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR14709033.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR9984183.runinfo_ftp.tsv")).match("metadata") }, + { assert new File("$outputDir/metadata/GSM4907283.runinfo_ftp.tsv").exists() }, { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), path("$outputDir/samplesheet/multiqc_config.yml")).match("samplesheet") }, { assert new File("$outputDir/samplesheet/samplesheet.csv").exists() }, diff --git a/tests/pipeline/sra_skip_fastq.nf.test.snap b/tests/pipeline/sra_skip_fastq.nf.test.snap index 5452bd4a..c2edd1c3 100644 --- a/tests/pipeline/sra_skip_fastq.nf.test.snap +++ b/tests/pipeline/sra_skip_fastq.nf.test.snap @@ -6,21 +6,20 @@ "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", "ERR1160846.runinfo_ftp.tsv:md5,5611622d583e6bc6d45d8f934696ff1e", "GSE214215.runinfo_ftp.tsv:md5,4224b5733b92daa40689538de9498ab9", - "GSM4907283.runinfo_ftp.tsv:md5,92591968fa8fa37a9f7160fe8ada11a2", "SRR12848126.runinfo_ftp.tsv:md5,9563f91d4cc6aa58d2ed5fba2eb30baf", "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e", "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-24T02:38:17+0000" + "timestamp": "2023-05-24T23:49:24+0000" }, "samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-24T02:38:17+0000" + "timestamp": "2023-05-24T23:49:24+0000" }, "software_versions": { "content": [ @@ -46,6 +45,6 @@ } } ], - "timestamp": "2023-05-24T02:38:17+0000" + "timestamp": "2023-05-24T23:49:24+0000" } } \ No newline at end of file diff --git a/tests/pipeline/sra_with_nf_core_pipeline.nf.test b/tests/pipeline/sra_with_nf_core_pipeline.nf.test index 9facceef..3015311a 100644 --- a/tests/pipeline/sra_with_nf_core_pipeline.nf.test +++ b/tests/pipeline/sra_with_nf_core_pipeline.nf.test @@ -21,7 +21,17 @@ nextflow_pipeline { { assert workflow.success }, { assert snapshot(softwareVersions).match("rnaseq_software_versions") }, { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, - { assert snapshot(path("$outputDir/metadata/").list()).match("rnaseq_metadata") }, + { assert snapshot(path("$outputDir/metadata/DRR026872.runinfo_ftp.tsv"), + path("$outputDir/metadata/DRR028935.runinfo_ftp.tsv"), + path("$outputDir/metadata/ERR1109373.runinfo_ftp.tsv"), + path("$outputDir/metadata/ERR1160846.runinfo_ftp.tsv"), + path("$outputDir/metadata/GSE214215.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR12848126.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR13191702.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR14593545.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR14709033.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR9984183.runinfo_ftp.tsv")).match("rnaseq_metadata") }, + { assert new File("$outputDir/metadata/GSM4907283.runinfo_ftp.tsv").exists() }, { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), path("$outputDir/samplesheet/multiqc_config.yml")).match("rnaseq_samplesheet") }, { assert new File("$outputDir/samplesheet/samplesheet.csv").exists() } @@ -48,7 +58,17 @@ nextflow_pipeline { { assert workflow.success }, { assert snapshot(softwareVersions).match("rnaseq_ena_software_versions") }, { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, - { assert snapshot(path("$outputDir/metadata/").list()).match("rnaseq_ena_metadata") }, + { assert snapshot(path("$outputDir/metadata/DRR026872.runinfo_ftp.tsv"), + path("$outputDir/metadata/DRR028935.runinfo_ftp.tsv"), + path("$outputDir/metadata/ERR1109373.runinfo_ftp.tsv"), + path("$outputDir/metadata/ERR1160846.runinfo_ftp.tsv"), + path("$outputDir/metadata/GSE214215.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR12848126.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR13191702.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR14593545.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR14709033.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR9984183.runinfo_ftp.tsv")).match("rnaseq_ena_metadata") }, + { assert new File("$outputDir/metadata/GSM4907283.runinfo_ftp.tsv").exists() }, { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), path("$outputDir/samplesheet/multiqc_config.yml")).match("rnaseq_ena_samplesheet") }, { assert new File("$outputDir/samplesheet/samplesheet.csv").exists() } @@ -73,7 +93,17 @@ nextflow_pipeline { { assert workflow.success }, { assert snapshot(softwareVersions).match("atacseq_software_versions") }, { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, - { assert snapshot(path("$outputDir/metadata/").list()).match("atacseq_metadata") }, + { assert snapshot(path("$outputDir/metadata/DRR026872.runinfo_ftp.tsv"), + path("$outputDir/metadata/DRR028935.runinfo_ftp.tsv"), + path("$outputDir/metadata/ERR1109373.runinfo_ftp.tsv"), + path("$outputDir/metadata/ERR1160846.runinfo_ftp.tsv"), + path("$outputDir/metadata/GSE214215.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR12848126.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR13191702.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR14593545.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR14709033.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR9984183.runinfo_ftp.tsv")).match("atacseq_metadata") }, + { assert new File("$outputDir/metadata/GSM4907283.runinfo_ftp.tsv").exists() }, { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), path("$outputDir/samplesheet/multiqc_config.yml")).match("atacseq_samplesheet") }, { assert new File("$outputDir/samplesheet/samplesheet.csv").exists() } @@ -98,7 +128,17 @@ nextflow_pipeline { { assert workflow.success }, { assert snapshot(softwareVersions).match("viralrecon_software_versions") }, { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, - { assert snapshot(path("$outputDir/metadata/").list()).match("viralrecon_metadata") }, + { assert snapshot(path("$outputDir/metadata/DRR026872.runinfo_ftp.tsv"), + path("$outputDir/metadata/DRR028935.runinfo_ftp.tsv"), + path("$outputDir/metadata/ERR1109373.runinfo_ftp.tsv"), + path("$outputDir/metadata/ERR1160846.runinfo_ftp.tsv"), + path("$outputDir/metadata/GSE214215.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR12848126.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR13191702.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR14593545.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR14709033.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR9984183.runinfo_ftp.tsv")).match("viralrecon_metadata") }, + { assert new File("$outputDir/metadata/GSM4907283.runinfo_ftp.tsv").exists() }, { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), path("$outputDir/samplesheet/multiqc_config.yml")).match("viralrecon_samplesheet") }, { assert new File("$outputDir/samplesheet/samplesheet.csv").exists() } @@ -123,7 +163,17 @@ nextflow_pipeline { { assert workflow.success }, { assert snapshot(softwareVersions).match("taxprofiler_software_versions") }, { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, - { assert snapshot(path("$outputDir/metadata/").list()).match("taxprofiler_metadata") }, + { assert snapshot(path("$outputDir/metadata/DRR026872.runinfo_ftp.tsv"), + path("$outputDir/metadata/DRR028935.runinfo_ftp.tsv"), + path("$outputDir/metadata/ERR1109373.runinfo_ftp.tsv"), + path("$outputDir/metadata/ERR1160846.runinfo_ftp.tsv"), + path("$outputDir/metadata/GSE214215.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR12848126.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR13191702.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR14593545.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR14709033.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR9984183.runinfo_ftp.tsv")).match("taxprofiler_metadata") }, + { assert new File("$outputDir/metadata/GSM4907283.runinfo_ftp.tsv").exists() }, { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), path("$outputDir/samplesheet/multiqc_config.yml")).match("taxprofiler_samplesheet") }, { assert new File("$outputDir/samplesheet/samplesheet.csv").exists() } diff --git a/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap b/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap index 25a8308b..ca946dc8 100644 --- a/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap +++ b/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap @@ -6,14 +6,13 @@ "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", "ERR1160846.runinfo_ftp.tsv:md5,5611622d583e6bc6d45d8f934696ff1e", "GSE214215.runinfo_ftp.tsv:md5,4224b5733b92daa40689538de9498ab9", - "GSM4907283.runinfo_ftp.tsv:md5,3d2c2395ee6690338f56fca84acb54ba", "SRR12848126.runinfo_ftp.tsv:md5,9563f91d4cc6aa58d2ed5fba2eb30baf", "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e", "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-24T14:53:28+0000" + "timestamp": "2023-05-25T01:47:31+0000" }, "rnaseq_software_versions": { "content": [ @@ -45,7 +44,7 @@ } } ], - "timestamp": "2023-05-24T14:53:28+0000" + "timestamp": "2023-05-25T01:47:31+0000" }, "rnaseq_ena_software_versions": { "content": [ @@ -77,7 +76,7 @@ } } ], - "timestamp": "2023-05-24T14:53:28+0000" + "timestamp": "2023-05-25T01:47:31+0000" }, "viralrecon_metadata": { "content": [ @@ -86,14 +85,13 @@ "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", "ERR1160846.runinfo_ftp.tsv:md5,5611622d583e6bc6d45d8f934696ff1e", "GSE214215.runinfo_ftp.tsv:md5,4224b5733b92daa40689538de9498ab9", - "GSM4907283.runinfo_ftp.tsv:md5,3d2c2395ee6690338f56fca84acb54ba", "SRR12848126.runinfo_ftp.tsv:md5,9563f91d4cc6aa58d2ed5fba2eb30baf", "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e", "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-24T14:53:28+0000" + "timestamp": "2023-05-25T01:47:31+0000" }, "viralrecon_software_versions": { "content": [ @@ -125,14 +123,14 @@ } } ], - "timestamp": "2023-05-24T14:53:28+0000" + "timestamp": "2023-05-25T01:47:31+0000" }, "viralrecon_samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-24T14:53:28+0000" + "timestamp": "2023-05-25T01:47:31+0000" }, "taxprofiler_software_versions": { "content": [ @@ -164,7 +162,7 @@ } } ], - "timestamp": "2023-05-24T14:53:28+0000" + "timestamp": "2023-05-25T01:47:31+0000" }, "atacseq_metadata": { "content": [ @@ -173,14 +171,13 @@ "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", "ERR1160846.runinfo_ftp.tsv:md5,5611622d583e6bc6d45d8f934696ff1e", "GSE214215.runinfo_ftp.tsv:md5,4224b5733b92daa40689538de9498ab9", - "GSM4907283.runinfo_ftp.tsv:md5,92591968fa8fa37a9f7160fe8ada11a2", "SRR12848126.runinfo_ftp.tsv:md5,9563f91d4cc6aa58d2ed5fba2eb30baf", "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e", "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-24T14:53:28+0000" + "timestamp": "2023-05-25T01:47:31+0000" }, "rnaseq_ena_metadata": { "content": [ @@ -189,21 +186,20 @@ "ERR1109373.runinfo_ftp.tsv:md5,868897310855c50b1d5fc77d1195a1f9", "ERR1160846.runinfo_ftp.tsv:md5,146d7f2ec778b32b7da7ad040e554114", "GSE214215.runinfo_ftp.tsv:md5,adf62affe371dc9bad8e271450bdc2fe", - "GSM4907283.runinfo_ftp.tsv:md5,5758453402e82490c4841c8e85a6aa53", "SRR12848126.runinfo_ftp.tsv:md5,cf8827612a76645824e83418d7d76cbf", "SRR13191702.runinfo_ftp.tsv:md5,2031ca9b7ab736dbde37d05b10cdb0ad", "SRR14593545.runinfo_ftp.tsv:md5,3a1ac14d71744224a61ab542f869e180", "SRR14709033.runinfo_ftp.tsv:md5,2385a9cc5e320e78b02743c45d1338f1", "SRR9984183.runinfo_ftp.tsv:md5,f1ed9fc572d2e0d145be7f547f6d1236" ], - "timestamp": "2023-05-24T14:53:28+0000" + "timestamp": "2023-05-25T01:47:31+0000" }, "rnaseq_samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-24T14:53:28+0000" + "timestamp": "2023-05-25T01:47:31+0000" }, "rnaseq_metadata": { "content": [ @@ -212,28 +208,27 @@ "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", "ERR1160846.runinfo_ftp.tsv:md5,5611622d583e6bc6d45d8f934696ff1e", "GSE214215.runinfo_ftp.tsv:md5,4224b5733b92daa40689538de9498ab9", - "GSM4907283.runinfo_ftp.tsv:md5,3d2c2395ee6690338f56fca84acb54ba", "SRR12848126.runinfo_ftp.tsv:md5,9563f91d4cc6aa58d2ed5fba2eb30baf", "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e", "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-24T14:53:28+0000" + "timestamp": "2023-05-25T01:47:31+0000" }, "atacseq_samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-24T14:53:28+0000" + "timestamp": "2023-05-25T01:47:31+0000" }, "rnaseq_ena_samplesheet": { "content": [ "id_mappings.csv:md5,8473773df806859c6af7acafcfe5aa6f", "multiqc_config.yml:md5,6f6189ee58855de81eaf82ad86e21040" ], - "timestamp": "2023-05-24T14:53:28+0000" + "timestamp": "2023-05-25T01:47:31+0000" }, "atacseq_software_versions": { "content": [ @@ -265,14 +260,14 @@ } } ], - "timestamp": "2023-05-24T14:53:28+0000" + "timestamp": "2023-05-25T01:47:31+0000" }, "taxprofiler_samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-24T14:53:28+0000" + "timestamp": "2023-05-25T01:47:31+0000" }, "fastq": { "content": [ @@ -322,6 +317,6 @@ "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" ] ], - "timestamp": "2023-05-24T14:53:28+0000" + "timestamp": "2023-05-25T01:47:31+0000" } } \ No newline at end of file diff --git a/tests/pipeline/sra_with_sratools.nf.test b/tests/pipeline/sra_with_sratools.nf.test index 7e50cc46..755f0c9c 100644 --- a/tests/pipeline/sra_with_sratools.nf.test +++ b/tests/pipeline/sra_with_sratools.nf.test @@ -21,7 +21,17 @@ nextflow_pipeline { { assert workflow.success }, { assert snapshot(softwareVersions).match("software_versions") }, { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, - { assert snapshot(path("$outputDir/metadata/").list()).match("metadata") }, + { assert snapshot(path("$outputDir/metadata/DRR026872.runinfo_ftp.tsv"), + path("$outputDir/metadata/DRR028935.runinfo_ftp.tsv"), + path("$outputDir/metadata/ERR1109373.runinfo_ftp.tsv"), + path("$outputDir/metadata/ERR1160846.runinfo_ftp.tsv"), + path("$outputDir/metadata/GSE214215.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR12848126.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR13191702.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR14593545.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR14709033.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR9984183.runinfo_ftp.tsv")).match("metadata") }, + { assert new File("$outputDir/metadata/GSM4907283.runinfo_ftp.tsv").exists() }, { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), path("$outputDir/samplesheet/multiqc_config.yml")).match("samplesheet") }, { assert new File("$outputDir/samplesheet/samplesheet.csv").exists() } diff --git a/tests/pipeline/sra_with_sratools.nf.test.snap b/tests/pipeline/sra_with_sratools.nf.test.snap index 8844905b..ee8278a9 100644 --- a/tests/pipeline/sra_with_sratools.nf.test.snap +++ b/tests/pipeline/sra_with_sratools.nf.test.snap @@ -6,21 +6,20 @@ "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", "ERR1160846.runinfo_ftp.tsv:md5,5611622d583e6bc6d45d8f934696ff1e", "GSE214215.runinfo_ftp.tsv:md5,4224b5733b92daa40689538de9498ab9", - "GSM4907283.runinfo_ftp.tsv:md5,92591968fa8fa37a9f7160fe8ada11a2", "SRR12848126.runinfo_ftp.tsv:md5,9563f91d4cc6aa58d2ed5fba2eb30baf", "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e", "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-24T04:03:04+0000" + "timestamp": "2023-05-24T23:48:56+0000" }, "samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-24T04:03:04+0000" + "timestamp": "2023-05-24T23:48:56+0000" }, "software_versions": { "content": [ @@ -49,7 +48,7 @@ } } ], - "timestamp": "2023-05-24T04:03:04+0000" + "timestamp": "2023-05-24T23:48:56+0000" }, "fastq": { "content": [ @@ -78,6 +77,6 @@ "SRX9626017_SRR13191702_1.fastq.gz:md5,627a90afcd9f3cfc7f5f91074f9a2df7", "SRX9626017_SRR13191702_2.fastq.gz:md5,3d9b2c68a8ad1547105b17de81b2d9af" ], - "timestamp": "2023-05-24T04:03:04+0000" + "timestamp": "2023-05-24T23:48:56+0000" } } \ No newline at end of file From 6886432d55d3babeca24d36fea8d1068513eab0c Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Wed, 24 May 2023 22:01:03 -0400 Subject: [PATCH 350/852] CI-add-master-tests --- .github/workflows/ci.yml | 49 ++++++++++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 60259e4d..37a33264 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,6 +5,9 @@ on: branches: - dev pull_request: + branches: + - dev + - master release: types: [published] @@ -16,16 +19,48 @@ concurrency: cancel-in-progress: true jobs: - test: - name: Run pipeline with test data - # Only run on push if this is the nf-core dev branch (merged PRs) - if: "${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/fetchngs') }}" + test-dev: + if: github.base_ref == 'dev' || github.event_name == 'push' + name: Run pipeline with test data on dev + runs-on: ubuntu-latest + strategy: + matrix: + NXF_VER: ["latest-everything"] + steps: + - name: Check out pipeline code + uses: actions/checkout@v3 + + - name: Install Nextflow + uses: nf-core/setup-nextflow@v1 + with: + version: "${{ matrix.NXF_VER }}" + + - name: Install nf-test + run: | + wget -qO- https://code.askimed.com/install/nf-test | bash + sudo mv nf-test /usr/local/bin/ + + - name: Run nf-test + run: nf-test test tests/pipeline/ --tap=test.tap + + # If the test fails, output the software_versions.yml using the 'batcat' utility + - name: Output log on failure + if: failure() + run: | + sudo apt install bat > /dev/null + batcat --decorations=always --color=always /home/runner/work/fetchngs/fetchngs/.nf-test/tests/*/output/pipeline_info/software_versions.yml + + - uses: pcolby/tap-summary@v1 + with: + path: test.tap + + test-master: + if: github.base_ref == 'master' + name: Run pipeline with test data on master runs-on: ubuntu-latest strategy: matrix: - NXF_VER: - - "22.10.1" - - "latest-everything" + NXF_VER: ["22.10.1", "latest-everything"] steps: - name: Check out pipeline code uses: actions/checkout@v3 From 0c00e742f8395f7d67083c27bc83c0565943c241 Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Thu, 25 May 2023 15:19:11 -0400 Subject: [PATCH 351/852] CI-comment-pr-test-tap-results --- .github/workflows/ci.yml | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 37a33264..4abae6d9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,6 +20,7 @@ concurrency: jobs: test-dev: + # Only run on dev branch or when a PR is opened against dev if: github.base_ref == 'dev' || github.event_name == 'push' name: Run pipeline with test data on dev runs-on: ubuntu-latest @@ -30,16 +31,19 @@ jobs: - name: Check out pipeline code uses: actions/checkout@v3 + # Install Nextflow - name: Install Nextflow uses: nf-core/setup-nextflow@v1 with: version: "${{ matrix.NXF_VER }}" + # Install nf-test - name: Install nf-test run: | wget -qO- https://code.askimed.com/install/nf-test | bash sudo mv nf-test /usr/local/bin/ + # Run nf-test - name: Run nf-test run: nf-test test tests/pipeline/ --tap=test.tap @@ -50,9 +54,11 @@ jobs: sudo apt install bat > /dev/null batcat --decorations=always --color=always /home/runner/work/fetchngs/fetchngs/.nf-test/tests/*/output/pipeline_info/software_versions.yml - - uses: pcolby/tap-summary@v1 + # Comment on the PR with the test results + - name: PR comment with file + uses: thollander/actions-comment-pull-request@v2 with: - path: test.tap + filePath: test.tap test-master: if: github.base_ref == 'master' @@ -65,16 +71,19 @@ jobs: - name: Check out pipeline code uses: actions/checkout@v3 + # Install Nextflow - name: Install Nextflow uses: nf-core/setup-nextflow@v1 with: version: "${{ matrix.NXF_VER }}" + # Install nf-test - name: Install nf-test run: | wget -qO- https://code.askimed.com/install/nf-test | bash sudo mv nf-test /usr/local/bin/ + # Run nf-test - name: Run nf-test run: nf-test test tests/pipeline/ --tap=test.tap @@ -85,6 +94,8 @@ jobs: sudo apt install bat > /dev/null batcat --decorations=always --color=always /home/runner/work/fetchngs/fetchngs/.nf-test/tests/*/output/pipeline_info/software_versions.yml - - uses: pcolby/tap-summary@v1 + # Comment on the PR with the test results + - name: PR comment with file + uses: thollander/actions-comment-pull-request@v2 with: - path: test.tap + filePath: test.tap From 4e4a5c39dffd996ab7832ff0d8f1a75c04a36fad Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Thu, 25 May 2023 20:28:17 -0400 Subject: [PATCH 352/852] CI-fix-comment-pr-pull-request --- .github/workflows/ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4abae6d9..7f65ab67 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -56,6 +56,7 @@ jobs: # Comment on the PR with the test results - name: PR comment with file + if: github.event_name == 'pull_request' uses: thollander/actions-comment-pull-request@v2 with: filePath: test.tap @@ -96,6 +97,7 @@ jobs: # Comment on the PR with the test results - name: PR comment with file + if: github.event_name == 'pull_request' uses: thollander/actions-comment-pull-request@v2 with: filePath: test.tap From 3b7be1d51c7a5d48de4244d92e521b5a91ca7928 Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Thu, 25 May 2023 20:29:20 -0400 Subject: [PATCH 353/852] CI-fix-comment-pr-pull-request --- .github/workflows/ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7f65ab67..f541dc19 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,6 +24,7 @@ jobs: if: github.base_ref == 'dev' || github.event_name == 'push' name: Run pipeline with test data on dev runs-on: ubuntu-latest + # Define the matrix of different Nextflow versions to test strategy: matrix: NXF_VER: ["latest-everything"] @@ -62,9 +63,11 @@ jobs: filePath: test.tap test-master: + # Only run on master branch or when a PR is opened against master if: github.base_ref == 'master' name: Run pipeline with test data on master runs-on: ubuntu-latest + # Define the matrix of different Nextflow versions to test strategy: matrix: NXF_VER: ["22.10.1", "latest-everything"] From a148806aa52c8843b955b5ab96a01b567d800aa7 Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Sun, 28 May 2023 11:26:41 -0400 Subject: [PATCH 354/852] CI-add-nf-test-ver-to-matrix --- .github/workflows/ci.yml | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f541dc19..ab3a10de 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,5 +1,5 @@ -name: nf-core CI # This workflow runs the pipeline with the minimal test dataset to check that it completes without any syntax errors +name: nf-core CI on: push: branches: @@ -14,20 +14,22 @@ on: env: NXF_ANSI_LOG: false +# cancel-in-progress: true ensures that if a new push is made to the same branch while a previous run is still in progress, the previous run is cancelled concurrency: group: "${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}" cancel-in-progress: true jobs: test-dev: - # Only run on dev branch or when a PR is opened against dev - if: github.base_ref == 'dev' || github.event_name == 'push' + # Only run if the pull request is against the dev branch or if the push is to the dev branch + if: ${{ (github.base_ref == 'dev' || (github.event_name == 'push')) }} name: Run pipeline with test data on dev runs-on: ubuntu-latest # Define the matrix of different Nextflow versions to test strategy: matrix: NXF_VER: ["latest-everything"] + NFTEST_VER: ["0.7.3"] steps: - name: Check out pipeline code uses: actions/checkout@v3 @@ -41,7 +43,7 @@ jobs: # Install nf-test - name: Install nf-test run: | - wget -qO- https://code.askimed.com/install/nf-test | bash + wget -qO- https://code.askimed.com/install/nf-test | bash -s ${{ matrix.NFTEST_VER }} sudo mv nf-test /usr/local/bin/ # Run nf-test @@ -64,13 +66,14 @@ jobs: test-master: # Only run on master branch or when a PR is opened against master - if: github.base_ref == 'master' + if: ${{ (github.base_ref == 'master') }} name: Run pipeline with test data on master runs-on: ubuntu-latest # Define the matrix of different Nextflow versions to test strategy: matrix: NXF_VER: ["22.10.1", "latest-everything"] + NFTEST_VER: ["0.7.3"] steps: - name: Check out pipeline code uses: actions/checkout@v3 @@ -84,7 +87,7 @@ jobs: # Install nf-test - name: Install nf-test run: | - wget -qO- https://code.askimed.com/install/nf-test | bash + wget -qO- https://code.askimed.com/install/nf-test | bash -s ${{ matrix.NFTEST_VER }} sudo mv nf-test /usr/local/bin/ # Run nf-test From a4a86d88865274e201209b05023d720ec51740a8 Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Sun, 28 May 2023 11:27:20 -0400 Subject: [PATCH 355/852] add-utils-groovy-update-snapshots --- nf-test.config | 12 +- tests/pipeline/lib/UTILS.groovy | 11 + tests/pipeline/sra.nf.test | 7 +- tests/pipeline/sra.nf.test.snap | 36 +--- tests/pipeline/sra_skip_fastq.nf.test | 7 +- tests/pipeline/sra_skip_fastq.nf.test.snap | 28 +-- .../sra_with_nf_core_pipeline.nf.test | 27 +-- .../sra_with_nf_core_pipeline.nf.test.snap | 198 +++--------------- tests/pipeline/sra_with_sratools.nf.test | 7 +- tests/pipeline/sra_with_sratools.nf.test.snap | 33 +-- 10 files changed, 81 insertions(+), 285 deletions(-) create mode 100644 tests/pipeline/lib/UTILS.groovy diff --git a/nf-test.config b/nf-test.config index f345cb2d..7d705067 100644 --- a/nf-test.config +++ b/nf-test.config @@ -1,8 +1,16 @@ config { - + // location for all nf-tests testsDir "tests" + + // nf-test directory including temporary files for each test workDir ".nf-test" + + // location of library folder that is added automatically to the classpath + libDir "tests/pipeline/lib/" + + // location of an optional nextflow.config file specific for executing tests configFile "nextflow.config" - profile "test,docker" + // run all test with the defined docker profile from the main nextflow.config + profile "test,docker" } diff --git a/tests/pipeline/lib/UTILS.groovy b/tests/pipeline/lib/UTILS.groovy new file mode 100644 index 00000000..311403cc --- /dev/null +++ b/tests/pipeline/lib/UTILS.groovy @@ -0,0 +1,11 @@ +// Function to remove Nextflow version from software_versions.yml + +class UTILS { + public static String removeNextflowVersion(outputDir) { + def softwareVersions = path("$outputDir/pipeline_info/software_versions.yml").yaml + if (softwareVersions.containsKey("Workflow")) { + softwareVersions.Workflow.remove("Nextflow") + } + return softwareVersions + } +} diff --git a/tests/pipeline/sra.nf.test b/tests/pipeline/sra.nf.test index 970840de..96f4dc93 100644 --- a/tests/pipeline/sra.nf.test +++ b/tests/pipeline/sra.nf.test @@ -2,7 +2,7 @@ nextflow_pipeline { name "Test Workflow main.nf" script "main.nf" - tag "pipeline" + tag "sra" test("SRA FASTQ & Metadata") { @@ -13,12 +13,9 @@ nextflow_pipeline { } then { - def softwareVersions = path("$outputDir/pipeline_info/software_versions.yml").yaml - if (softwareVersions.containsKey("Workflow")) { softwareVersions.Workflow.remove("Nextflow") } - assertAll( { assert workflow.success }, - { assert snapshot(softwareVersions).match("software_versions") }, + { assert snapshot(UTILS.removeNextflowVersion("$outputDir")).match("software_versions") }, { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, { assert snapshot(path("$outputDir/metadata/DRR026872.runinfo_ftp.tsv"), path("$outputDir/metadata/DRR028935.runinfo_ftp.tsv"), diff --git a/tests/pipeline/sra.nf.test.snap b/tests/pipeline/sra.nf.test.snap index 86c6780e..366b20f6 100644 --- a/tests/pipeline/sra.nf.test.snap +++ b/tests/pipeline/sra.nf.test.snap @@ -12,46 +12,20 @@ "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-25T01:31:04+0000" + "timestamp": "2023-05-28T15:25:33+0000" }, "samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-25T01:31:04+0000" + "timestamp": "2023-05-28T15:25:33+0000" }, "software_versions": { "content": [ - { - "CUSTOM_DUMPSOFTWAREVERSIONS": { - "python": "3.11.0", - "yaml": "6.0" - }, - "CUSTOM_SRATOOLSNCBISETTINGS": { - "sratools": "2.11.0" - }, - "MULTIQC_MAPPINGS_CONFIG": { - "python": "3.9.5" - }, - "SRA_FASTQ_FTP": { - "curl": "7.81.0" - }, - "SRA_IDS_TO_RUNINFO": { - "python": "3.9.5" - }, - "SRA_MERGE_SAMPLESHEET": { - "sed": "4.7" - }, - "SRA_RUNINFO_TO_FTP": { - "python": "3.9.5" - }, - "Workflow": { - "nf-core/fetchngs": "1.11.0dev" - } - } + "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.11.0dev}}" ], - "timestamp": "2023-05-25T01:31:04+0000" + "timestamp": "2023-05-28T15:25:33+0000" }, "fastq": { "content": [ @@ -101,6 +75,6 @@ "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" ] ], - "timestamp": "2023-05-25T01:31:04+0000" + "timestamp": "2023-05-28T15:25:33+0000" } } \ No newline at end of file diff --git a/tests/pipeline/sra_skip_fastq.nf.test b/tests/pipeline/sra_skip_fastq.nf.test index e00dc66a..7d8a6789 100644 --- a/tests/pipeline/sra_skip_fastq.nf.test +++ b/tests/pipeline/sra_skip_fastq.nf.test @@ -2,7 +2,7 @@ nextflow_pipeline { name "Test Workflow main.nf" script "main.nf" - tag "pipeline" + tag "sra_skip_fastq" test("SRA Skip FASTQ") { @@ -14,12 +14,9 @@ nextflow_pipeline { } then { - def softwareVersions = path("$outputDir/pipeline_info/software_versions.yml").yaml - if (softwareVersions.containsKey("Workflow")) { softwareVersions.Workflow.remove("Nextflow") } - assertAll( { assert workflow.success }, - { assert snapshot(softwareVersions).match("software_versions") }, + { assert snapshot(UTILS.removeNextflowVersion("$outputDir")).match("software_versions") }, { assert snapshot(path("$outputDir/metadata/DRR026872.runinfo_ftp.tsv"), path("$outputDir/metadata/DRR028935.runinfo_ftp.tsv"), path("$outputDir/metadata/ERR1109373.runinfo_ftp.tsv"), diff --git a/tests/pipeline/sra_skip_fastq.nf.test.snap b/tests/pipeline/sra_skip_fastq.nf.test.snap index c2edd1c3..e5fcb176 100644 --- a/tests/pipeline/sra_skip_fastq.nf.test.snap +++ b/tests/pipeline/sra_skip_fastq.nf.test.snap @@ -12,39 +12,19 @@ "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-24T23:49:24+0000" + "timestamp": "2023-05-28T15:07:52+0000" }, "samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-24T23:49:24+0000" + "timestamp": "2023-05-28T15:07:52+0000" }, "software_versions": { "content": [ - { - "CUSTOM_DUMPSOFTWAREVERSIONS": { - "python": "3.11.0", - "yaml": "6.0" - }, - "MULTIQC_MAPPINGS_CONFIG": { - "python": "3.9.5" - }, - "SRA_IDS_TO_RUNINFO": { - "python": "3.9.5" - }, - "SRA_MERGE_SAMPLESHEET": { - "sed": "4.7" - }, - "SRA_RUNINFO_TO_FTP": { - "python": "3.9.5" - }, - "Workflow": { - "nf-core/fetchngs": "1.11.0dev" - } - } + "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.11.0dev}}" ], - "timestamp": "2023-05-24T23:49:24+0000" + "timestamp": "2023-05-28T15:07:52+0000" } } \ No newline at end of file diff --git a/tests/pipeline/sra_with_nf_core_pipeline.nf.test b/tests/pipeline/sra_with_nf_core_pipeline.nf.test index 3015311a..17324e60 100644 --- a/tests/pipeline/sra_with_nf_core_pipeline.nf.test +++ b/tests/pipeline/sra_with_nf_core_pipeline.nf.test @@ -2,7 +2,7 @@ nextflow_pipeline { name "Test Workflow main.nf" script "main.nf" - tag "pipeline" + tag "sra_nf-core" test("SRA NF-CORE/RNASEQ Samplesheet") { @@ -14,12 +14,9 @@ nextflow_pipeline { } then { - def softwareVersions = path("$outputDir/pipeline_info/software_versions.yml").yaml - if (softwareVersions.containsKey("Workflow")) { softwareVersions.Workflow.remove("Nextflow") } - assertAll( { assert workflow.success }, - { assert snapshot(softwareVersions).match("rnaseq_software_versions") }, + { assert snapshot(UTILS.removeNextflowVersion("$outputDir")).match("rnaseq_software_versions") }, { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, { assert snapshot(path("$outputDir/metadata/DRR026872.runinfo_ftp.tsv"), path("$outputDir/metadata/DRR028935.runinfo_ftp.tsv"), @@ -51,12 +48,9 @@ nextflow_pipeline { } then { - def softwareVersions = path("$outputDir/pipeline_info/software_versions.yml").yaml - if (softwareVersions.containsKey("Workflow")) { softwareVersions.Workflow.remove("Nextflow") } - assertAll( { assert workflow.success }, - { assert snapshot(softwareVersions).match("rnaseq_ena_software_versions") }, + { assert snapshot(UTILS.removeNextflowVersion("$outputDir")).match("rnaseq_ena_software_versions") }, { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, { assert snapshot(path("$outputDir/metadata/DRR026872.runinfo_ftp.tsv"), path("$outputDir/metadata/DRR028935.runinfo_ftp.tsv"), @@ -86,12 +80,9 @@ nextflow_pipeline { } then { - def softwareVersions = path("$outputDir/pipeline_info/software_versions.yml").yaml - if (softwareVersions.containsKey("Workflow")) { softwareVersions.Workflow.remove("Nextflow") } - assertAll( { assert workflow.success }, - { assert snapshot(softwareVersions).match("atacseq_software_versions") }, + { assert snapshot(UTILS.removeNextflowVersion("$outputDir")).match("atacseq_software_versions") }, { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, { assert snapshot(path("$outputDir/metadata/DRR026872.runinfo_ftp.tsv"), path("$outputDir/metadata/DRR028935.runinfo_ftp.tsv"), @@ -121,12 +112,9 @@ nextflow_pipeline { } then { - def softwareVersions = path("$outputDir/pipeline_info/software_versions.yml").yaml - if (softwareVersions.containsKey("Workflow")) { softwareVersions.Workflow.remove("Nextflow") } - assertAll( { assert workflow.success }, - { assert snapshot(softwareVersions).match("viralrecon_software_versions") }, + { assert snapshot(UTILS.removeNextflowVersion("$outputDir")).match("viralrecon_software_versions") }, { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, { assert snapshot(path("$outputDir/metadata/DRR026872.runinfo_ftp.tsv"), path("$outputDir/metadata/DRR028935.runinfo_ftp.tsv"), @@ -156,12 +144,9 @@ nextflow_pipeline { } then { - def softwareVersions = path("$outputDir/pipeline_info/software_versions.yml").yaml - if (softwareVersions.containsKey("Workflow")) { softwareVersions.Workflow.remove("Nextflow") } - assertAll( { assert workflow.success }, - { assert snapshot(softwareVersions).match("taxprofiler_software_versions") }, + { assert snapshot(UTILS.removeNextflowVersion("$outputDir")).match("taxprofiler_software_versions") }, { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, { assert snapshot(path("$outputDir/metadata/DRR026872.runinfo_ftp.tsv"), path("$outputDir/metadata/DRR028935.runinfo_ftp.tsv"), diff --git a/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap b/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap index ca946dc8..edd1e910 100644 --- a/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap +++ b/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap @@ -12,71 +12,7 @@ "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-25T01:47:31+0000" - }, - "rnaseq_software_versions": { - "content": [ - { - "CUSTOM_DUMPSOFTWAREVERSIONS": { - "python": "3.11.0", - "yaml": "6.0" - }, - "CUSTOM_SRATOOLSNCBISETTINGS": { - "sratools": "2.11.0" - }, - "MULTIQC_MAPPINGS_CONFIG": { - "python": "3.9.5" - }, - "SRA_FASTQ_FTP": { - "curl": "7.81.0" - }, - "SRA_IDS_TO_RUNINFO": { - "python": "3.9.5" - }, - "SRA_MERGE_SAMPLESHEET": { - "sed": "4.7" - }, - "SRA_RUNINFO_TO_FTP": { - "python": "3.9.5" - }, - "Workflow": { - "nf-core/fetchngs": "1.11.0dev" - } - } - ], - "timestamp": "2023-05-25T01:47:31+0000" - }, - "rnaseq_ena_software_versions": { - "content": [ - { - "CUSTOM_DUMPSOFTWAREVERSIONS": { - "python": "3.11.0", - "yaml": "6.0" - }, - "CUSTOM_SRATOOLSNCBISETTINGS": { - "sratools": "2.11.0" - }, - "MULTIQC_MAPPINGS_CONFIG": { - "python": "3.9.5" - }, - "SRA_FASTQ_FTP": { - "curl": "7.81.0" - }, - "SRA_IDS_TO_RUNINFO": { - "python": "3.9.5" - }, - "SRA_MERGE_SAMPLESHEET": { - "sed": "4.7" - }, - "SRA_RUNINFO_TO_FTP": { - "python": "3.9.5" - }, - "Workflow": { - "nf-core/fetchngs": "1.11.0dev" - } - } - ], - "timestamp": "2023-05-25T01:47:31+0000" + "timestamp": "2023-05-28T15:19:39+0000" }, "viralrecon_metadata": { "content": [ @@ -91,78 +27,38 @@ "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-25T01:47:31+0000" + "timestamp": "2023-05-28T15:19:39+0000" }, - "viralrecon_software_versions": { + "rnaseq_software_versions": { + "content": [ + "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.11.0dev}}" + ], + "timestamp": "2023-05-28T15:19:39+0000" + }, + "rnaseq_ena_software_versions": { "content": [ - { - "CUSTOM_DUMPSOFTWAREVERSIONS": { - "python": "3.11.0", - "yaml": "6.0" - }, - "CUSTOM_SRATOOLSNCBISETTINGS": { - "sratools": "2.11.0" - }, - "MULTIQC_MAPPINGS_CONFIG": { - "python": "3.9.5" - }, - "SRA_FASTQ_FTP": { - "curl": "7.81.0" - }, - "SRA_IDS_TO_RUNINFO": { - "python": "3.9.5" - }, - "SRA_MERGE_SAMPLESHEET": { - "sed": "4.7" - }, - "SRA_RUNINFO_TO_FTP": { - "python": "3.9.5" - }, - "Workflow": { - "nf-core/fetchngs": "1.11.0dev" - } - } + "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.11.0dev}}" ], - "timestamp": "2023-05-25T01:47:31+0000" + "timestamp": "2023-05-28T15:19:39+0000" }, "viralrecon_samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-25T01:47:31+0000" + "timestamp": "2023-05-28T15:19:39+0000" + }, + "viralrecon_software_versions": { + "content": [ + "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.11.0dev}}" + ], + "timestamp": "2023-05-28T15:19:39+0000" }, "taxprofiler_software_versions": { "content": [ - { - "CUSTOM_DUMPSOFTWAREVERSIONS": { - "python": "3.11.0", - "yaml": "6.0" - }, - "CUSTOM_SRATOOLSNCBISETTINGS": { - "sratools": "2.11.0" - }, - "MULTIQC_MAPPINGS_CONFIG": { - "python": "3.9.5" - }, - "SRA_FASTQ_FTP": { - "curl": "7.81.0" - }, - "SRA_IDS_TO_RUNINFO": { - "python": "3.9.5" - }, - "SRA_MERGE_SAMPLESHEET": { - "sed": "4.7" - }, - "SRA_RUNINFO_TO_FTP": { - "python": "3.9.5" - }, - "Workflow": { - "nf-core/fetchngs": "1.11.0dev" - } - } + "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.11.0dev}}" ], - "timestamp": "2023-05-25T01:47:31+0000" + "timestamp": "2023-05-28T15:19:39+0000" }, "atacseq_metadata": { "content": [ @@ -177,7 +73,7 @@ "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-25T01:47:31+0000" + "timestamp": "2023-05-28T15:19:39+0000" }, "rnaseq_ena_metadata": { "content": [ @@ -192,14 +88,14 @@ "SRR14709033.runinfo_ftp.tsv:md5,2385a9cc5e320e78b02743c45d1338f1", "SRR9984183.runinfo_ftp.tsv:md5,f1ed9fc572d2e0d145be7f547f6d1236" ], - "timestamp": "2023-05-25T01:47:31+0000" + "timestamp": "2023-05-28T15:19:39+0000" }, "rnaseq_samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-25T01:47:31+0000" + "timestamp": "2023-05-28T15:19:39+0000" }, "rnaseq_metadata": { "content": [ @@ -214,60 +110,34 @@ "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-25T01:47:31+0000" + "timestamp": "2023-05-28T15:19:39+0000" }, "atacseq_samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-25T01:47:31+0000" + "timestamp": "2023-05-28T15:19:39+0000" }, "rnaseq_ena_samplesheet": { "content": [ "id_mappings.csv:md5,8473773df806859c6af7acafcfe5aa6f", "multiqc_config.yml:md5,6f6189ee58855de81eaf82ad86e21040" ], - "timestamp": "2023-05-25T01:47:31+0000" - }, - "atacseq_software_versions": { - "content": [ - { - "CUSTOM_DUMPSOFTWAREVERSIONS": { - "python": "3.11.0", - "yaml": "6.0" - }, - "CUSTOM_SRATOOLSNCBISETTINGS": { - "sratools": "2.11.0" - }, - "MULTIQC_MAPPINGS_CONFIG": { - "python": "3.9.5" - }, - "SRA_FASTQ_FTP": { - "curl": "7.81.0" - }, - "SRA_IDS_TO_RUNINFO": { - "python": "3.9.5" - }, - "SRA_MERGE_SAMPLESHEET": { - "sed": "4.7" - }, - "SRA_RUNINFO_TO_FTP": { - "python": "3.9.5" - }, - "Workflow": { - "nf-core/fetchngs": "1.11.0dev" - } - } - ], - "timestamp": "2023-05-25T01:47:31+0000" + "timestamp": "2023-05-28T15:19:39+0000" }, "taxprofiler_samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-25T01:47:31+0000" + "timestamp": "2023-05-28T15:19:39+0000" + }, + "atacseq_software_versions": { + "content": [ + "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.11.0dev}}" + ], + "timestamp": "2023-05-28T15:19:39+0000" }, "fastq": { "content": [ @@ -317,6 +187,6 @@ "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" ] ], - "timestamp": "2023-05-25T01:47:31+0000" + "timestamp": "2023-05-28T15:19:39+0000" } } \ No newline at end of file diff --git a/tests/pipeline/sra_with_sratools.nf.test b/tests/pipeline/sra_with_sratools.nf.test index 755f0c9c..863f050c 100644 --- a/tests/pipeline/sra_with_sratools.nf.test +++ b/tests/pipeline/sra_with_sratools.nf.test @@ -2,7 +2,7 @@ nextflow_pipeline { name "Test Workflow main.nf" script "main.nf" - tag "pipeline" + tag "sratools_force" test("Force SRA-Tools Download") { @@ -14,12 +14,9 @@ nextflow_pipeline { } then { - def softwareVersions = path("$outputDir/pipeline_info/software_versions.yml").yaml - if (softwareVersions.containsKey("Workflow")) { softwareVersions.Workflow.remove("Nextflow") } - assertAll( { assert workflow.success }, - { assert snapshot(softwareVersions).match("software_versions") }, + { assert snapshot(UTILS.removeNextflowVersion("$outputDir")).match("software_versions") }, { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, { assert snapshot(path("$outputDir/metadata/DRR026872.runinfo_ftp.tsv"), path("$outputDir/metadata/DRR028935.runinfo_ftp.tsv"), diff --git a/tests/pipeline/sra_with_sratools.nf.test.snap b/tests/pipeline/sra_with_sratools.nf.test.snap index ee8278a9..75ccd0a6 100644 --- a/tests/pipeline/sra_with_sratools.nf.test.snap +++ b/tests/pipeline/sra_with_sratools.nf.test.snap @@ -12,43 +12,20 @@ "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" ], - "timestamp": "2023-05-24T23:48:56+0000" + "timestamp": "2023-05-28T15:07:23+0000" }, "samplesheet": { "content": [ "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" ], - "timestamp": "2023-05-24T23:48:56+0000" + "timestamp": "2023-05-28T15:07:23+0000" }, "software_versions": { "content": [ - { - "CUSTOM_DUMPSOFTWAREVERSIONS": { - "python": "3.11.0", - "yaml": "6.0" - }, - "CUSTOM_SRATOOLSNCBISETTINGS": { - "sratools": "2.11.0" - }, - "MULTIQC_MAPPINGS_CONFIG": { - "python": "3.9.5" - }, - "SRA_IDS_TO_RUNINFO": { - "python": "3.9.5" - }, - "SRA_MERGE_SAMPLESHEET": { - "sed": "4.7" - }, - "SRA_RUNINFO_TO_FTP": { - "python": "3.9.5" - }, - "Workflow": { - "nf-core/fetchngs": "1.11.0dev" - } - } + "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.11.0dev}}" ], - "timestamp": "2023-05-24T23:48:56+0000" + "timestamp": "2023-05-28T15:07:23+0000" }, "fastq": { "content": [ @@ -77,6 +54,6 @@ "SRX9626017_SRR13191702_1.fastq.gz:md5,627a90afcd9f3cfc7f5f91074f9a2df7", "SRX9626017_SRR13191702_2.fastq.gz:md5,3d9b2c68a8ad1547105b17de81b2d9af" ], - "timestamp": "2023-05-24T23:48:56+0000" + "timestamp": "2023-05-28T15:07:23+0000" } } \ No newline at end of file From d6263a0b38e3b0a92e11a8f169c3340797d79c35 Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Sun, 28 May 2023 11:27:56 -0400 Subject: [PATCH 356/852] rm-old-module-test --- tests/modules/sra_ids_to_runinfo/main.nf.test | 43 ------------------- .../sra_ids_to_runinfo/main.nf.test.snap | 40 ----------------- 2 files changed, 83 deletions(-) delete mode 100644 tests/modules/sra_ids_to_runinfo/main.nf.test delete mode 100644 tests/modules/sra_ids_to_runinfo/main.nf.test.snap diff --git a/tests/modules/sra_ids_to_runinfo/main.nf.test b/tests/modules/sra_ids_to_runinfo/main.nf.test deleted file mode 100644 index f5467e75..00000000 --- a/tests/modules/sra_ids_to_runinfo/main.nf.test +++ /dev/null @@ -1,43 +0,0 @@ -nextflow_process { - - name "Test Process SRA_IDS_TO_RUNINFO" - script "modules/local/sra_ids_to_runinfo.nf" - process "SRA_IDS_TO_RUNINFO" - - test("Should run without failures without fields") { - - when { - process { - """ - input[0] = 'SRR9984183' - input[1] = '' - """ - } - } - - then { - assert process.success - assert snapshot(process.out).match() - } - - } - - test("Should run without failures with fields") { - - when { - process { - """ - input[0] = 'SRR9984183' - input[1] = 'run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5' - """ - } - } - - then { - assert process.success - assert snapshot(process.out).match() - } - - } - -} diff --git a/tests/modules/sra_ids_to_runinfo/main.nf.test.snap b/tests/modules/sra_ids_to_runinfo/main.nf.test.snap deleted file mode 100644 index e13c470f..00000000 --- a/tests/modules/sra_ids_to_runinfo/main.nf.test.snap +++ /dev/null @@ -1,40 +0,0 @@ -{ - "Should run without failures without fields": { - "content": [ - { - "0": [ - "SRR9984183.runinfo.tsv:md5,6bc8bfb7058412e5a54b83e08d3d1673" - ], - "1": [ - "versions.yml:md5,61ebf47bc00075513ff16295beddb197" - ], - "tsv": [ - "SRR9984183.runinfo.tsv:md5,6bc8bfb7058412e5a54b83e08d3d1673" - ], - "versions": [ - "versions.yml:md5,61ebf47bc00075513ff16295beddb197" - ] - } - ], - "timestamp": "2023-05-09T02:22:52+0000" - }, - "Should run without failures with fields": { - "content": [ - { - "0": [ - "SRR9984183.runinfo.tsv:md5,6419f18c29ab09634b3dd97a6b2acd06" - ], - "1": [ - "versions.yml:md5,61ebf47bc00075513ff16295beddb197" - ], - "tsv": [ - "SRR9984183.runinfo.tsv:md5,6419f18c29ab09634b3dd97a6b2acd06" - ], - "versions": [ - "versions.yml:md5,61ebf47bc00075513ff16295beddb197" - ] - } - ], - "timestamp": "2023-05-09T02:22:52+0000" - } -} \ No newline at end of file From 1db801fe6bb600c5c34cbfe0750fbbefd304e6d8 Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Wed, 31 May 2023 13:15:32 -0400 Subject: [PATCH 357/852] rm-docker-hardcode.nf-test-config-add-pipeline-tag --- nf-test.config | 2 +- tests/pipeline/sra.nf.test | 1 + tests/pipeline/sra_skip_fastq.nf.test | 1 + tests/pipeline/sra_with_nf_core_pipeline.nf.test | 1 + tests/pipeline/sra_with_sratools.nf.test | 1 + 5 files changed, 5 insertions(+), 1 deletion(-) diff --git a/nf-test.config b/nf-test.config index 7d705067..cd432d43 100644 --- a/nf-test.config +++ b/nf-test.config @@ -12,5 +12,5 @@ config { configFile "nextflow.config" // run all test with the defined docker profile from the main nextflow.config - profile "test,docker" + profile "" } diff --git a/tests/pipeline/sra.nf.test b/tests/pipeline/sra.nf.test index 96f4dc93..f545d93d 100644 --- a/tests/pipeline/sra.nf.test +++ b/tests/pipeline/sra.nf.test @@ -3,6 +3,7 @@ nextflow_pipeline { name "Test Workflow main.nf" script "main.nf" tag "sra" + tag "pipeline" test("SRA FASTQ & Metadata") { diff --git a/tests/pipeline/sra_skip_fastq.nf.test b/tests/pipeline/sra_skip_fastq.nf.test index 7d8a6789..b0237a81 100644 --- a/tests/pipeline/sra_skip_fastq.nf.test +++ b/tests/pipeline/sra_skip_fastq.nf.test @@ -3,6 +3,7 @@ nextflow_pipeline { name "Test Workflow main.nf" script "main.nf" tag "sra_skip_fastq" + tag "pipeline" test("SRA Skip FASTQ") { diff --git a/tests/pipeline/sra_with_nf_core_pipeline.nf.test b/tests/pipeline/sra_with_nf_core_pipeline.nf.test index 17324e60..d0c41baf 100644 --- a/tests/pipeline/sra_with_nf_core_pipeline.nf.test +++ b/tests/pipeline/sra_with_nf_core_pipeline.nf.test @@ -3,6 +3,7 @@ nextflow_pipeline { name "Test Workflow main.nf" script "main.nf" tag "sra_nf-core" + tag "pipeline" test("SRA NF-CORE/RNASEQ Samplesheet") { diff --git a/tests/pipeline/sra_with_sratools.nf.test b/tests/pipeline/sra_with_sratools.nf.test index 863f050c..2fd06ba8 100644 --- a/tests/pipeline/sra_with_sratools.nf.test +++ b/tests/pipeline/sra_with_sratools.nf.test @@ -3,6 +3,7 @@ nextflow_pipeline { name "Test Workflow main.nf" script "main.nf" tag "sratools_force" + tag "pipeline" test("Force SRA-Tools Download") { From 3e2158c1f5d9b4ff89442d02942d0bcb687acdce Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Wed, 31 May 2023 13:16:03 -0400 Subject: [PATCH 358/852] CI-add-matrix-profile-nf-test-run-update-pr-commenter --- .github/workflows/ci.yml | 45 +++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ab3a10de..3b9936f5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,10 +9,12 @@ on: - dev - master release: - types: [published] + types: + - "published" env: NXF_ANSI_LOG: false + NFTEST_VER: "0.7.3" # cancel-in-progress: true ensures that if a new push is made to the same branch while a previous run is still in progress, the previous run is cancelled concurrency: @@ -22,14 +24,16 @@ concurrency: jobs: test-dev: # Only run if the pull request is against the dev branch or if the push is to the dev branch - if: ${{ (github.base_ref == 'dev' || (github.event_name == 'push')) }} + if: (github.base_ref == 'dev' || (github.event_name == 'push')) name: Run pipeline with test data on dev runs-on: ubuntu-latest # Define the matrix of different Nextflow versions to test strategy: matrix: - NXF_VER: ["latest-everything"] - NFTEST_VER: ["0.7.3"] + NXF_VER: + - "latest-everything" + profile: # TODO ["singularity", "conda"] + - "docker" steps: - name: Check out pipeline code uses: actions/checkout@v3 @@ -43,12 +47,12 @@ jobs: # Install nf-test - name: Install nf-test run: | - wget -qO- https://code.askimed.com/install/nf-test | bash -s ${{ matrix.NFTEST_VER }} + wget -qO- https://code.askimed.com/install/nf-test | bash -s $NFTEST_VER sudo mv nf-test /usr/local/bin/ # Run nf-test - name: Run nf-test - run: nf-test test tests/pipeline/ --tap=test.tap + run: nf-test test tests/pipeline/ --profile "test,${{ matrix.profile }}" --tap=test.tap # If the test fails, output the software_versions.yml using the 'batcat' utility - name: Output log on failure @@ -58,22 +62,27 @@ jobs: batcat --decorations=always --color=always /home/runner/work/fetchngs/fetchngs/.nf-test/tests/*/output/pipeline_info/software_versions.yml # Comment on the PR with the test results - - name: PR comment with file - if: github.event_name == 'pull_request' + - name: Comment PR with execution number uses: thollander/actions-comment-pull-request@v2 with: - filePath: test.tap + message: | + _(execution **${{ github.run_id }}** / attempt **${{ github.run_attempt }}**)_ + comment_tag: execution + reactions: eyes test-master: # Only run on master branch or when a PR is opened against master - if: ${{ (github.base_ref == 'master') }} + if: github.base_ref == 'master' name: Run pipeline with test data on master runs-on: ubuntu-latest # Define the matrix of different Nextflow versions to test strategy: matrix: - NXF_VER: ["22.10.1", "latest-everything"] - NFTEST_VER: ["0.7.3"] + NXF_VER: + - "22.10.1" + - "latest-everything" + profile: + - "docker" steps: - name: Check out pipeline code uses: actions/checkout@v3 @@ -87,12 +96,12 @@ jobs: # Install nf-test - name: Install nf-test run: | - wget -qO- https://code.askimed.com/install/nf-test | bash -s ${{ matrix.NFTEST_VER }} + wget -qO- https://code.askimed.com/install/nf-test | bash -s $NFTEST_VER sudo mv nf-test /usr/local/bin/ # Run nf-test - name: Run nf-test - run: nf-test test tests/pipeline/ --tap=test.tap + run: nf-test test tests/pipeline/ --profile "test,${{ matrix.profile }}" --tap=test.tap # If the test fails, output the software_versions.yml using the 'batcat' utility - name: Output log on failure @@ -102,8 +111,10 @@ jobs: batcat --decorations=always --color=always /home/runner/work/fetchngs/fetchngs/.nf-test/tests/*/output/pipeline_info/software_versions.yml # Comment on the PR with the test results - - name: PR comment with file - if: github.event_name == 'pull_request' + - name: Comment PR with execution number uses: thollander/actions-comment-pull-request@v2 with: - filePath: test.tap + message: | + _(execution **${{ github.run_id }}** / attempt **${{ github.run_attempt }}**)_ + comment_tag: execution + reactions: eyes From 75e1cb5618048dd96ed194d381ab322b28edebac Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Thu, 1 Jun 2023 17:57:34 -0400 Subject: [PATCH 359/852] CI-disable-pr-commenter-ref-dev --- .github/workflows/ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3b9936f5..a5b6b592 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -63,6 +63,7 @@ jobs: # Comment on the PR with the test results - name: Comment PR with execution number + if: github.event_name == 'pull_request' && github.ref != 'refs/heads/dev' uses: thollander/actions-comment-pull-request@v2 with: message: | @@ -112,6 +113,7 @@ jobs: # Comment on the PR with the test results - name: Comment PR with execution number + if: github.event_name == 'pull_request' && github.ref != 'refs/heads/dev' uses: thollander/actions-comment-pull-request@v2 with: message: | From d4a7830b4bbc4b01add191b36a5e4cb834133ff8 Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Fri, 9 Jun 2023 09:38:38 -0400 Subject: [PATCH 360/852] CI-skip-condition-for-dev --- .github/workflows/ci.yml | 89 ++++++++-------------------------------- 1 file changed, 18 insertions(+), 71 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a5b6b592..c3d8511a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,67 +16,14 @@ env: NXF_ANSI_LOG: false NFTEST_VER: "0.7.3" -# cancel-in-progress: true ensures that if a new push is made to the same branch while a previous run is still in progress, the previous run is cancelled concurrency: group: "${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}" cancel-in-progress: true jobs: - test-dev: - # Only run if the pull request is against the dev branch or if the push is to the dev branch - if: (github.base_ref == 'dev' || (github.event_name == 'push')) - name: Run pipeline with test data on dev + test: + name: Run pipeline with test data runs-on: ubuntu-latest - # Define the matrix of different Nextflow versions to test - strategy: - matrix: - NXF_VER: - - "latest-everything" - profile: # TODO ["singularity", "conda"] - - "docker" - steps: - - name: Check out pipeline code - uses: actions/checkout@v3 - - # Install Nextflow - - name: Install Nextflow - uses: nf-core/setup-nextflow@v1 - with: - version: "${{ matrix.NXF_VER }}" - - # Install nf-test - - name: Install nf-test - run: | - wget -qO- https://code.askimed.com/install/nf-test | bash -s $NFTEST_VER - sudo mv nf-test /usr/local/bin/ - - # Run nf-test - - name: Run nf-test - run: nf-test test tests/pipeline/ --profile "test,${{ matrix.profile }}" --tap=test.tap - - # If the test fails, output the software_versions.yml using the 'batcat' utility - - name: Output log on failure - if: failure() - run: | - sudo apt install bat > /dev/null - batcat --decorations=always --color=always /home/runner/work/fetchngs/fetchngs/.nf-test/tests/*/output/pipeline_info/software_versions.yml - - # Comment on the PR with the test results - - name: Comment PR with execution number - if: github.event_name == 'pull_request' && github.ref != 'refs/heads/dev' - uses: thollander/actions-comment-pull-request@v2 - with: - message: | - _(execution **${{ github.run_id }}** / attempt **${{ github.run_attempt }}**)_ - comment_tag: execution - reactions: eyes - - test-master: - # Only run on master branch or when a PR is opened against master - if: github.base_ref == 'master' - name: Run pipeline with test data on master - runs-on: ubuntu-latest - # Define the matrix of different Nextflow versions to test strategy: matrix: NXF_VER: @@ -84,39 +31,39 @@ jobs: - "latest-everything" profile: - "docker" + steps: + # Skip if it's a pull_request to dev and NXF_VER is '22.10.1' + - name: Skip condition + id: condition + run: | + if [[ "${{ github.event_name }}" == "pull_request" && "${{ github.base_ref }}" == "dev" && "${{ matrix.NXF_VER }}" != "latest-everything" ]]; then + echo "skip=true" >> $GITHUB_OUTPUT + fi + - name: Check out pipeline code + if: steps.condition.outputs.skip != 'true' uses: actions/checkout@v3 - # Install Nextflow - name: Install Nextflow + if: steps.condition.outputs.skip != 'true' uses: nf-core/setup-nextflow@v1 with: version: "${{ matrix.NXF_VER }}" - # Install nf-test - name: Install nf-test + if: steps.condition.outputs.skip != 'true' run: | wget -qO- https://code.askimed.com/install/nf-test | bash -s $NFTEST_VER sudo mv nf-test /usr/local/bin/ - # Run nf-test - name: Run nf-test - run: nf-test test tests/pipeline/ --profile "test,${{ matrix.profile }}" --tap=test.tap + if: steps.condition.outputs.skip != 'true' + run: | + nf-test test tests/pipeline/ --profile "test,${{ matrix.profile }}" --tap=test.tap - # If the test fails, output the software_versions.yml using the 'batcat' utility - name: Output log on failure if: failure() run: | sudo apt install bat > /dev/null - batcat --decorations=always --color=always /home/runner/work/fetchngs/fetchngs/.nf-test/tests/*/output/pipeline_info/software_versions.yml - - # Comment on the PR with the test results - - name: Comment PR with execution number - if: github.event_name == 'pull_request' && github.ref != 'refs/heads/dev' - uses: thollander/actions-comment-pull-request@v2 - with: - message: | - _(execution **${{ github.run_id }}** / attempt **${{ github.run_attempt }}**)_ - comment_tag: execution - reactions: eyes + batcat --decorations=always --color=always ${{ github.workspace }}/.nf-test/tests/*/output/pipeline_info/software_versions.yml From 23c6e24608cd9162ba817a31e56eddb71957c3a5 Mon Sep 17 00:00:00 2001 From: MCMandR <136441313+MCMandR@users.noreply.github.com> Date: Tue, 13 Jun 2023 10:48:00 +0200 Subject: [PATCH 361/852] sra_runinfo_to_ftp.py: Avoid dependency on Python 3.8 The ":=" assignment was introduced in Python 3.8. On HPC environments this is not always available. --- bin/sra_runinfo_to_ftp.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bin/sra_runinfo_to_ftp.py b/bin/sra_runinfo_to_ftp.py index ef80ec80..c220f74e 100755 --- a/bin/sra_runinfo_to_ftp.py +++ b/bin/sra_runinfo_to_ftp.py @@ -61,7 +61,8 @@ def parse_sra_runinfo(file_in): with open(file_in, "r", newline="") as fin: reader = csv.DictReader(fin, delimiter="\t", skipinitialspace=True) header = list(reader.fieldnames) - if missing := frozenset(columns).difference(frozenset(header)): + missing = frozenset(columns).difference(frozenset(header)) + if missing: logger.critical(f"The following expected columns are missing from {file_in}: " f"{', '.join(missing)}.") sys.exit(1) for row in reader: From 80ead031899101715d6d97363a67c52cbd17a02c Mon Sep 17 00:00:00 2001 From: davidecarlson Date: Thu, 15 Jun 2023 10:17:07 -0400 Subject: [PATCH 362/852] updated usage with info on downloading 10X data. --- docs/usage.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/usage.md b/docs/usage.md index 0720a680..5bef3bcb 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -70,6 +70,12 @@ From v1.9 of this pipeline the default `strandedness` in the output samplesheet If FTP connections are blocked on your network use the [`--force_sratools_download`](https://nf-co.re/fetchngs/parameters#force_sratools_download) parameter to force the pipeline to download data using sra-tools instead of the ENA FTP. +### Downloading 10X Genomics Data + +As of v1.010.0, this pipeline now supports downloading of 10X Genomics data. For 10X data sets, the output needs to be split into three fastq files, consisting of the feature barcode+UMI, cDNA sequence reads, and sample index. Adding the `--force_sratools_download` parameter will cause the pipeline to use the sra-tools fasterq-dump program with appropriate setting to ensure that all three files are generated. + +Please note that in our experience the downloaded R1, R2, and R3 fastq files do not always correspond to the same data types across different submissions. In many cases, R1 will be the cell barcode + UMI, R2 is the cDNA sequence, and R3 is the sample index. However, this is not alway the case. Users are strongly encouraged to verify their data before proceeding with downstream analysis. + ### Downloading dbGAP data with JWT As of v1.10.0, the SRA Toolkit used in this pipeline can be configured to access protected data from dbGAP using a [JWT cart file](https://www.ncbi.nlm.nih.gov/sra/docs/sra-dbGAP-cloud-download/) on a supported cloud computing environment (Amazon Web Services or Google Cloud Platform). The JWT cart file can be specified with `--dbgap_key /path/to/cart.jwt`. From 944bb3abb792a91ceb318f27cddcd1779ce75462 Mon Sep 17 00:00:00 2001 From: davidecarlson Date: Thu, 15 Jun 2023 10:54:53 -0400 Subject: [PATCH 363/852] prettier formatting --- docs/usage.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 5bef3bcb..8fe801fd 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -72,9 +72,9 @@ If FTP connections are blocked on your network use the [`--force_sratools_downlo ### Downloading 10X Genomics Data -As of v1.010.0, this pipeline now supports downloading of 10X Genomics data. For 10X data sets, the output needs to be split into three fastq files, consisting of the feature barcode+UMI, cDNA sequence reads, and sample index. Adding the `--force_sratools_download` parameter will cause the pipeline to use the sra-tools fasterq-dump program with appropriate setting to ensure that all three files are generated. +As of v1.010.0, this pipeline now supports downloading of 10X Genomics data. For 10X data sets, the output needs to be split into three fastq files, consisting of the feature barcode+UMI, cDNA sequence reads, and sample index. Adding the `--force_sratools_download` parameter will cause the pipeline to use the sra-tools fasterq-dump program with appropriate setting to ensure that all three files are generated. -Please note that in our experience the downloaded R1, R2, and R3 fastq files do not always correspond to the same data types across different submissions. In many cases, R1 will be the cell barcode + UMI, R2 is the cDNA sequence, and R3 is the sample index. However, this is not alway the case. Users are strongly encouraged to verify their data before proceeding with downstream analysis. +Please note that in our experience the downloaded R1, R2, and R3 fastq files do not always correspond to the same data types across different submissions. In many cases, R1 will be the cell barcode + UMI, R2 is the cDNA sequence, and R3 is the sample index. However, this is not alway the case. Users are strongly encouraged to verify their data before proceeding with downstream analysis. ### Downloading dbGAP data with JWT From f3b8cf872ccb3e7b2b893909fd70a9f2605036ad Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 15 Jun 2023 17:23:36 +0100 Subject: [PATCH 364/852] Update docs/usage.md --- docs/usage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/usage.md b/docs/usage.md index 8fe801fd..b2cd7b50 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -72,7 +72,7 @@ If FTP connections are blocked on your network use the [`--force_sratools_downlo ### Downloading 10X Genomics Data -As of v1.010.0, this pipeline now supports downloading of 10X Genomics data. For 10X data sets, the output needs to be split into three fastq files, consisting of the feature barcode+UMI, cDNA sequence reads, and sample index. Adding the `--force_sratools_download` parameter will cause the pipeline to use the sra-tools fasterq-dump program with appropriate setting to ensure that all three files are generated. +As of v1.10.0, this pipeline now supports downloading of 10X Genomics data. For 10X data sets, the output needs to be split into three fastq files, consisting of the feature barcode+UMI, cDNA sequence reads, and sample index. Adding the `--force_sratools_download` parameter will cause the pipeline to use the sra-tools fasterq-dump program with appropriate setting to ensure that all three files are generated. Please note that in our experience the downloaded R1, R2, and R3 fastq files do not always correspond to the same data types across different submissions. In many cases, R1 will be the cell barcode + UMI, R2 is the cDNA sequence, and R3 is the sample index. However, this is not alway the case. Users are strongly encouraged to verify their data before proceeding with downstream analysis. From 385d0884eaa5797270a5182fc525378f6041571c Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Sat, 17 Jun 2023 09:24:43 -0400 Subject: [PATCH 365/852] CI to use dynamic matrix nextflow versions based on target branch --- .github/workflows/ci.yml | 39 +++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c3d8511a..d0198cae 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,49 +21,56 @@ concurrency: cancel-in-progress: true jobs: + define_nxf_versions: + name: Choose nextflow versions to test against depending on target branch + runs-on: ubuntu-latest + outputs: + matrix: ${{ steps.nxf_versions.outputs.matrix }} + steps: + - id: nxf_versions + run: | + if [[ "${{ github.event_name }}" == "pull_request" && "${{ github.base_ref }}" == "dev" && "${{ matrix.NXF_VER }}" != "latest-everything" ]]; then + echo matrix='["latest-everything"]' | tee -a $GITHUB_OUTPUT + else + echo matrix='["latest-everything", "22.10.1"]' | tee -a $GITHUB_OUTPUT + fi + test: name: Run pipeline with test data + needs: define_nxf_versions runs-on: ubuntu-latest strategy: matrix: - NXF_VER: - - "22.10.1" - - "latest-everything" + NXF_VER: ${{ fromJson(needs.define_nxf_versions.outputs.matrix) }} profile: - "docker" steps: - # Skip if it's a pull_request to dev and NXF_VER is '22.10.1' - - name: Skip condition - id: condition - run: | - if [[ "${{ github.event_name }}" == "pull_request" && "${{ github.base_ref }}" == "dev" && "${{ matrix.NXF_VER }}" != "latest-everything" ]]; then - echo "skip=true" >> $GITHUB_OUTPUT - fi - - name: Check out pipeline code - if: steps.condition.outputs.skip != 'true' uses: actions/checkout@v3 - name: Install Nextflow - if: steps.condition.outputs.skip != 'true' uses: nf-core/setup-nextflow@v1 with: version: "${{ matrix.NXF_VER }}" - name: Install nf-test - if: steps.condition.outputs.skip != 'true' run: | wget -qO- https://code.askimed.com/install/nf-test | bash -s $NFTEST_VER sudo mv nf-test /usr/local/bin/ - name: Run nf-test - if: steps.condition.outputs.skip != 'true' run: | - nf-test test tests/pipeline/ --profile "test,${{ matrix.profile }}" --tap=test.tap + nf-test test tests/pipeline/ --profile "test,${{ matrix.profile }}" --junitxml=test.xml - name: Output log on failure if: failure() run: | sudo apt install bat > /dev/null batcat --decorations=always --color=always ${{ github.workspace }}/.nf-test/tests/*/output/pipeline_info/software_versions.yml + + - name: Publish Test Report + uses: mikepenz/action-junit-report@v3 + if: always() # always run even if the previous step fails + with: + report_paths: test.xml From 6e9a0adf506f09f92c46f0cb13d1254e483ae0aa Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Wed, 28 Jun 2023 09:24:47 -0400 Subject: [PATCH 366/852] bump version --- nextflow.config | 2 +- tests/pipeline/sra.nf.test.snap | 2 +- tests/pipeline/sra_skip_fastq.nf.test.snap | 2 +- tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap | 10 +++++----- tests/pipeline/sra_with_sratools.nf.test.snap | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/nextflow.config b/nextflow.config index 0e0886e4..fff1910c 100644 --- a/nextflow.config +++ b/nextflow.config @@ -212,7 +212,7 @@ manifest { description = """Pipeline to fetch metadata and raw FastQ files from public databases""" mainScript = 'main.nf' nextflowVersion = '!>=22.10.1' - version = '1.11.0dev' + version = '1.11.0' doi = 'https://doi.org/10.5281/zenodo.5070524' } diff --git a/tests/pipeline/sra.nf.test.snap b/tests/pipeline/sra.nf.test.snap index 366b20f6..bcfbd5c3 100644 --- a/tests/pipeline/sra.nf.test.snap +++ b/tests/pipeline/sra.nf.test.snap @@ -23,7 +23,7 @@ }, "software_versions": { "content": [ - "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.11.0dev}}" + "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.11.0}}" ], "timestamp": "2023-05-28T15:25:33+0000" }, diff --git a/tests/pipeline/sra_skip_fastq.nf.test.snap b/tests/pipeline/sra_skip_fastq.nf.test.snap index e5fcb176..3033bb7e 100644 --- a/tests/pipeline/sra_skip_fastq.nf.test.snap +++ b/tests/pipeline/sra_skip_fastq.nf.test.snap @@ -23,7 +23,7 @@ }, "software_versions": { "content": [ - "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.11.0dev}}" + "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.11.0}}" ], "timestamp": "2023-05-28T15:07:52+0000" } diff --git a/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap b/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap index edd1e910..0d0b8cb3 100644 --- a/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap +++ b/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap @@ -31,13 +31,13 @@ }, "rnaseq_software_versions": { "content": [ - "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.11.0dev}}" + "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.11.0}}" ], "timestamp": "2023-05-28T15:19:39+0000" }, "rnaseq_ena_software_versions": { "content": [ - "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.11.0dev}}" + "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.11.0}}" ], "timestamp": "2023-05-28T15:19:39+0000" }, @@ -50,13 +50,13 @@ }, "viralrecon_software_versions": { "content": [ - "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.11.0dev}}" + "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.11.0}}" ], "timestamp": "2023-05-28T15:19:39+0000" }, "taxprofiler_software_versions": { "content": [ - "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.11.0dev}}" + "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.11.0}}" ], "timestamp": "2023-05-28T15:19:39+0000" }, @@ -135,7 +135,7 @@ }, "atacseq_software_versions": { "content": [ - "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.11.0dev}}" + "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.11.0}}" ], "timestamp": "2023-05-28T15:19:39+0000" }, diff --git a/tests/pipeline/sra_with_sratools.nf.test.snap b/tests/pipeline/sra_with_sratools.nf.test.snap index 75ccd0a6..c31fde9f 100644 --- a/tests/pipeline/sra_with_sratools.nf.test.snap +++ b/tests/pipeline/sra_with_sratools.nf.test.snap @@ -23,7 +23,7 @@ }, "software_versions": { "content": [ - "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.11.0dev}}" + "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.11.0}}" ], "timestamp": "2023-05-28T15:07:23+0000" }, From 473db19f6e650ac54c9ea326ac27730a846a8dc8 Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Thu, 29 Jun 2023 08:52:15 -0400 Subject: [PATCH 367/852] update changelog --- CHANGELOG.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2bd283e9..146b93b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,10 +3,22 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unpublished Version / DEV] +## [[1.10.1](https://github.com/nf-core/fetchngs/releases/tag/1.10.1)] - 2023-06-29 + +### Credits + +Special thanks to the following for their contributions to the release: + +- [Sateesh Peri](https://github.com/sateeshperi) +- [Edmund Miller](https://github.com/Emiller88) +- [Maxime Garcia](https://github.com/maxulysse) + +Thank you to everyone else that has contributed by reporting bugs, enhancements or in any other way, shape or form. ### Enhancements & fixes +- [#166](https://github.com/nf-core/fetchngs/issues/175) - Add NF-TEST pipeline end-to-end tests for existing CI tests + ## [[1.10.0](https://github.com/nf-core/fetchngs/releases/tag/1.10.0)] - 2023-05-16 ### Credits From e5fa57a3c90f595f324f4688e327fb79f10f5d0f Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Thu, 29 Jun 2023 16:20:57 +0200 Subject: [PATCH 368/852] Update nextflow.config --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index fff1910c..6eb5c18d 100644 --- a/nextflow.config +++ b/nextflow.config @@ -212,7 +212,7 @@ manifest { description = """Pipeline to fetch metadata and raw FastQ files from public databases""" mainScript = 'main.nf' nextflowVersion = '!>=22.10.1' - version = '1.11.0' + version = '1.10.1' doi = 'https://doi.org/10.5281/zenodo.5070524' } From c7f7df926b93677aee4bb0cf9bb09d46fcba2c0b Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Thu, 29 Jun 2023 16:35:40 +0200 Subject: [PATCH 369/852] Apply suggestions from code review --- tests/pipeline/sra.nf.test.snap | 2 +- tests/pipeline/sra_skip_fastq.nf.test.snap | 2 +- tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap | 10 +++++----- tests/pipeline/sra_with_sratools.nf.test.snap | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/pipeline/sra.nf.test.snap b/tests/pipeline/sra.nf.test.snap index bcfbd5c3..02cf5541 100644 --- a/tests/pipeline/sra.nf.test.snap +++ b/tests/pipeline/sra.nf.test.snap @@ -23,7 +23,7 @@ }, "software_versions": { "content": [ - "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.11.0}}" + "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" ], "timestamp": "2023-05-28T15:25:33+0000" }, diff --git a/tests/pipeline/sra_skip_fastq.nf.test.snap b/tests/pipeline/sra_skip_fastq.nf.test.snap index 3033bb7e..4f2efb49 100644 --- a/tests/pipeline/sra_skip_fastq.nf.test.snap +++ b/tests/pipeline/sra_skip_fastq.nf.test.snap @@ -23,7 +23,7 @@ }, "software_versions": { "content": [ - "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.11.0}}" + "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" ], "timestamp": "2023-05-28T15:07:52+0000" } diff --git a/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap b/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap index 0d0b8cb3..ea9e25d8 100644 --- a/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap +++ b/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap @@ -31,13 +31,13 @@ }, "rnaseq_software_versions": { "content": [ - "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.11.0}}" + "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" ], "timestamp": "2023-05-28T15:19:39+0000" }, "rnaseq_ena_software_versions": { "content": [ - "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.11.0}}" + "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" ], "timestamp": "2023-05-28T15:19:39+0000" }, @@ -50,13 +50,13 @@ }, "viralrecon_software_versions": { "content": [ - "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.11.0}}" + "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" ], "timestamp": "2023-05-28T15:19:39+0000" }, "taxprofiler_software_versions": { "content": [ - "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.11.0}}" + "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" ], "timestamp": "2023-05-28T15:19:39+0000" }, @@ -135,7 +135,7 @@ }, "atacseq_software_versions": { "content": [ - "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.11.0}}" + "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" ], "timestamp": "2023-05-28T15:19:39+0000" }, diff --git a/tests/pipeline/sra_with_sratools.nf.test.snap b/tests/pipeline/sra_with_sratools.nf.test.snap index c31fde9f..285b9ce1 100644 --- a/tests/pipeline/sra_with_sratools.nf.test.snap +++ b/tests/pipeline/sra_with_sratools.nf.test.snap @@ -23,7 +23,7 @@ }, "software_versions": { "content": [ - "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.11.0}}" + "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" ], "timestamp": "2023-05-28T15:07:23+0000" }, From 93f1aa368220bf38b2164ec99560a5c5a2129f75 Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Sun, 9 Jul 2023 07:36:08 -0400 Subject: [PATCH 370/852] restrucutre local modules workflow dirs for tests --- .github/workflows/ci.yml | 13 +- .nf-core.yml | 10 +- conf/test_data.config | 14 ++ lib/NftestUtils.groovy | 38 ++++ main.nf | 4 +- .../multiqc_mappings_config.nf | 0 .../multiqc_mappings_config.nf.test | 31 +++ .../multiqc_mappings_config.nf.test.snap | 27 +++ .../{ => sra_fastq_ftp}/sra_fastq_ftp.nf | 0 .../local/sra_fastq_ftp/sra_fastq_ftp.nf.test | 33 +++ .../sra_ids_to_runinfo.nf | 0 .../sra_ids_to_runinfo.nf.test | 32 +++ .../sra_ids_to_runinfo.nf.test.snap | 21 ++ .../sra_merge_samplesheet.nf | 0 .../sra_merge_samplesheet.nf.test | 32 +++ .../sra_merge_samplesheet.nf.test.snap | 27 +++ .../sra_runinfo_to_ftp.nf | 0 .../sra_runinfo_to_ftp.nf.test | 31 +++ .../sra_runinfo_to_ftp.nf.test.snap | 21 ++ .../sra_to_samplesheet.nf | 0 .../sra_to_samplesheet.nf.test | 33 +++ .../local/{ => synapse_get}/synapse_get.nf | 0 .../local/{ => synapse_list}/synapse_list.nf | 0 .../synapse_merge_samplesheet.nf | 0 .../local/{ => synapse_show}/synapse_show.nf | 0 .../synapse_to_samplesheet.nf | 0 nf-test.config | 4 +- tests/config/tags.yml | 14 -- tests/pipeline/lib/UTILS.groovy | 11 - tests/pipeline/sra_skip_fastq.nf.test.snap | 30 --- .../sra_with_nf_core_pipeline.nf.test | 170 ---------------- .../sra_with_nf_core_pipeline.nf.test.snap | 192 ------------------ workflows/{sra.nf => sra/main.nf} | 16 +- .../sra/tests/skip_fastq.nf.test | 4 +- workflows/sra/tests/skip_fastq.nf.test.snap | 30 +++ .../sra/tests}/sra.nf.test | 4 +- .../sra/tests}/sra.nf.test.snap | 30 +-- .../tests/with_atacseq_samplesheet.nf.test | 39 ++++ .../with_atacseq_samplesheet.nf.test.snap | 80 ++++++++ .../sra/tests/with_rnaseq_samplesheet.nf.test | 39 ++++ .../with_rnaseq_samplesheet.nf.test.snap | 80 ++++++++ .../with_rnaseq_specific_ena_metadata.nf.test | 41 ++++ ..._rnaseq_specific_ena_metadata.nf.test.snap | 80 ++++++++ .../sra/tests/with_sratools.nf.test | 6 +- .../sra/tests/with_sratools.nf.test.snap | 30 +-- .../with_taxprofiler_samplesheet.nf.test | 40 ++++ .../with_taxprofiler_samplesheet.nf.test.snap | 80 ++++++++ .../tests/with_viralrecon_samplesheet.nf.test | 39 ++++ .../with_viralrecon_samplesheet.nf.test.snap | 80 ++++++++ workflows/{synapse.nf => synapse/main.nf} | 12 +- .../synapse/tests}/synapse.test | 0 51 files changed, 1044 insertions(+), 474 deletions(-) create mode 100644 conf/test_data.config create mode 100644 lib/NftestUtils.groovy rename modules/local/{ => multiqc_mappings_config}/multiqc_mappings_config.nf (100%) create mode 100644 modules/local/multiqc_mappings_config/multiqc_mappings_config.nf.test create mode 100644 modules/local/multiqc_mappings_config/multiqc_mappings_config.nf.test.snap rename modules/local/{ => sra_fastq_ftp}/sra_fastq_ftp.nf (100%) create mode 100644 modules/local/sra_fastq_ftp/sra_fastq_ftp.nf.test rename modules/local/{ => sra_ids_to_runinfo}/sra_ids_to_runinfo.nf (100%) create mode 100644 modules/local/sra_ids_to_runinfo/sra_ids_to_runinfo.nf.test create mode 100644 modules/local/sra_ids_to_runinfo/sra_ids_to_runinfo.nf.test.snap rename modules/local/{ => sra_merge_samplesheet}/sra_merge_samplesheet.nf (100%) create mode 100644 modules/local/sra_merge_samplesheet/sra_merge_samplesheet.nf.test create mode 100644 modules/local/sra_merge_samplesheet/sra_merge_samplesheet.nf.test.snap rename modules/local/{ => sra_runinfo_to_ftp}/sra_runinfo_to_ftp.nf (100%) create mode 100644 modules/local/sra_runinfo_to_ftp/sra_runinfo_to_ftp.nf.test create mode 100644 modules/local/sra_runinfo_to_ftp/sra_runinfo_to_ftp.nf.test.snap rename modules/local/{ => sra_to_samplesheet}/sra_to_samplesheet.nf (100%) create mode 100644 modules/local/sra_to_samplesheet/sra_to_samplesheet.nf.test rename modules/local/{ => synapse_get}/synapse_get.nf (100%) rename modules/local/{ => synapse_list}/synapse_list.nf (100%) rename modules/local/{ => synapse_merge_samplesheet}/synapse_merge_samplesheet.nf (100%) rename modules/local/{ => synapse_show}/synapse_show.nf (100%) rename modules/local/{ => synapse_to_sampleshee}/synapse_to_samplesheet.nf (100%) delete mode 100644 tests/config/tags.yml delete mode 100644 tests/pipeline/lib/UTILS.groovy delete mode 100644 tests/pipeline/sra_skip_fastq.nf.test.snap delete mode 100644 tests/pipeline/sra_with_nf_core_pipeline.nf.test delete mode 100644 tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap rename workflows/{sra.nf => sra/main.nf} (87%) rename tests/pipeline/sra_skip_fastq.nf.test => workflows/sra/tests/skip_fastq.nf.test (95%) create mode 100644 workflows/sra/tests/skip_fastq.nf.test.snap rename {tests/pipeline => workflows/sra/tests}/sra.nf.test (92%) rename {tests/pipeline => workflows/sra/tests}/sra.nf.test.snap (81%) create mode 100644 workflows/sra/tests/with_atacseq_samplesheet.nf.test create mode 100644 workflows/sra/tests/with_atacseq_samplesheet.nf.test.snap create mode 100644 workflows/sra/tests/with_rnaseq_samplesheet.nf.test create mode 100644 workflows/sra/tests/with_rnaseq_samplesheet.nf.test.snap create mode 100644 workflows/sra/tests/with_rnaseq_specific_ena_metadata.nf.test create mode 100644 workflows/sra/tests/with_rnaseq_specific_ena_metadata.nf.test.snap rename tests/pipeline/sra_with_sratools.nf.test => workflows/sra/tests/with_sratools.nf.test (91%) rename tests/pipeline/sra_with_sratools.nf.test.snap => workflows/sra/tests/with_sratools.nf.test.snap (71%) create mode 100644 workflows/sra/tests/with_taxprofiler_samplesheet.nf.test create mode 100644 workflows/sra/tests/with_taxprofiler_samplesheet.nf.test.snap create mode 100644 workflows/sra/tests/with_viralrecon_samplesheet.nf.test create mode 100644 workflows/sra/tests/with_viralrecon_samplesheet.nf.test.snap rename workflows/{synapse.nf => synapse/main.nf} (89%) rename {tests/pipeline => workflows/synapse/tests}/synapse.test (100%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d0198cae..0abe1037 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -40,8 +40,19 @@ jobs: needs: define_nxf_versions runs-on: ubuntu-latest strategy: + fail-fast: false matrix: NXF_VER: ${{ fromJson(needs.define_nxf_versions.outputs.matrix) }} + test_tags: + - "sra" + - "sra_force_sratools_download" + - "sra_skip_fastq" + - "sra_with_atacseq" + - "sra_with_rnaseq" + - "sra_with_rnaseq_specific_ena" + - "sra_with_taxprofiler" + - "sra_with_viralrecon" + - "modules_local" profile: - "docker" @@ -61,7 +72,7 @@ jobs: - name: Run nf-test run: | - nf-test test tests/pipeline/ --profile "test,${{ matrix.profile }}" --junitxml=test.xml + nf-test test --tag ${{ matrix.test_tags }} --profile "test,${{ matrix.profile }}" --junitxml=test.xml - name: Output log on failure if: failure() diff --git a/.nf-core.yml b/.nf-core.yml index f11657b7..253f86e2 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,7 +1,15 @@ repository_type: pipeline lint: files_unchanged: + - .github/CONTRIBUTING.md + - .github/ISSUE_TEMPLATE/bug_report.yml + - assets/nf-core-fetchngs_logo_light.png - assets/sendmail_template.txt - lib/NfcoreTemplate.groovy - .gitattributes - actions_ci: False + actions_ci: false + multiqc_config: false + nextflow_config: + - "params.validationShowHiddenParams" + - "params.validationSchemaIgnoreParams" + schema_params: false diff --git a/conf/test_data.config b/conf/test_data.config new file mode 100644 index 00000000..31639250 --- /dev/null +++ b/conf/test_data.config @@ -0,0 +1,14 @@ +params { + // Base directory for test data + test_data_base = "https://raw.githubusercontent.com/nf-core/test-datasets/fetchngs" + + modules { + 'local' { + multiqc_mappings_config = "${params.test_data_base}/modules/local/multiqc_mappings_config/" + sra_merge_samplesheet = "${params.test_data_base}/modules/local/sra_merge_samplesheet/" + sra_to_samplesheet = "${params.test_data_base}/modules/local/sra_to_samplesheet/" + sra_fastq_ftp = "${params.test_data_base}/modules/local/sra_fastq_ftp/" + sra_runinfo_to_ftp = "${params.test_data_base}/modules/local/sra_runinfo_to_ftp/" + } + } +} diff --git a/lib/NftestUtils.groovy b/lib/NftestUtils.groovy new file mode 100644 index 00000000..ce6fc8b4 --- /dev/null +++ b/lib/NftestUtils.groovy @@ -0,0 +1,38 @@ +// Helper functions for pipeline tests + +class NftestUtils { + + // Function to remove Nextflow version from software_versions.yml + public static String removeNextflowVersion(outputDir) { + def softwareVersions = path("$outputDir/pipeline_info/software_versions.yml").yaml + if (softwareVersions.containsKey("Workflow")) { + softwareVersions.Workflow.remove("Nextflow") + } + return softwareVersions + } + + // Function to filter lines from a file and return a new file + public static File filterLines(String inFilePath, int linesToSkip) { + if (linesToSkip >= 0) { + File inputFile = new File(inFilePath) + File outputFile = new File(inFilePath + ".filtered") + def lineCount = 0 + inputFile.eachLine { line -> + lineCount++ + if (lineCount > linesToSkip) { + outputFile.append(line + '\n') + } + } + return outputFile + } else { + File inputFile = new File(inFilePath) + File outputFile = new File(inFilePath + ".filtered") + def lines = inputFile.readLines() + def totalLines = lines.size() + lines.take(totalLines + linesToSkip).each { line -> + outputFile.append(line + '\n') + } + return outputFile + } + } +} diff --git a/main.nf b/main.nf index 6da732be..f856a93c 100644 --- a/main.nf +++ b/main.nf @@ -49,9 +49,9 @@ if (WorkflowMain.isSraId(ch_input)) { if (params.input_type == input_type) { if (params.input_type == 'sra') { - include { SRA } from './workflows/sra' + include { SRA } from './workflows/sra/main' } else if (params.input_type == 'synapse') { - include { SYNAPSE } from './workflows/synapse' + include { SYNAPSE } from './workflows/synapse/main' } } else { exit 1, "Ids auto-detected as ${input_type}. Please provide '--input_type ${input_type}' as a parameter to the pipeline!" diff --git a/modules/local/multiqc_mappings_config.nf b/modules/local/multiqc_mappings_config/multiqc_mappings_config.nf similarity index 100% rename from modules/local/multiqc_mappings_config.nf rename to modules/local/multiqc_mappings_config/multiqc_mappings_config.nf diff --git a/modules/local/multiqc_mappings_config/multiqc_mappings_config.nf.test b/modules/local/multiqc_mappings_config/multiqc_mappings_config.nf.test new file mode 100644 index 00000000..7a0fe2dd --- /dev/null +++ b/modules/local/multiqc_mappings_config/multiqc_mappings_config.nf.test @@ -0,0 +1,31 @@ +nextflow_process { + + name "Test Process MULTIQC_MAPPINGS_CONFIG" + script "modules/local/multiqc_mappings_config.nf" + process "MULTIQC_MAPPINGS_CONFIG" + tag "multiqc_mappings_config" + tag "modules_local" + + test("SRX9626017_SRR13191702") { + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = file("$baseDir/modules/local/tests/input/multiqc_mappings_config/SRX9626017_SRR13191702.mappings.csv", checkIfExists: true) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() }, + ) + } + + } + +} diff --git a/modules/local/multiqc_mappings_config/multiqc_mappings_config.nf.test.snap b/modules/local/multiqc_mappings_config/multiqc_mappings_config.nf.test.snap new file mode 100644 index 00000000..e8914aea --- /dev/null +++ b/modules/local/multiqc_mappings_config/multiqc_mappings_config.nf.test.snap @@ -0,0 +1,27 @@ +{ + "SRX9626017_SRR13191702": { + "content": [ + { + "0": [ + [ + "multiqc_config.yml:md5,7f3cb10fff83ba9eb3e8fa6862d1290a", + "versions.yml:md5,dd4c66f0551d15510b36bb2e2b2fdd73" + ] + ], + "1": [ + "versions.yml:md5,dd4c66f0551d15510b36bb2e2b2fdd73" + ], + "versions": [ + "versions.yml:md5,dd4c66f0551d15510b36bb2e2b2fdd73" + ], + "yml": [ + [ + "multiqc_config.yml:md5,7f3cb10fff83ba9eb3e8fa6862d1290a", + "versions.yml:md5,dd4c66f0551d15510b36bb2e2b2fdd73" + ] + ] + } + ], + "timestamp": "2023-07-05T15:01:18+0000" + } +} \ No newline at end of file diff --git a/modules/local/sra_fastq_ftp.nf b/modules/local/sra_fastq_ftp/sra_fastq_ftp.nf similarity index 100% rename from modules/local/sra_fastq_ftp.nf rename to modules/local/sra_fastq_ftp/sra_fastq_ftp.nf diff --git a/modules/local/sra_fastq_ftp/sra_fastq_ftp.nf.test b/modules/local/sra_fastq_ftp/sra_fastq_ftp.nf.test new file mode 100644 index 00000000..fb8d53e2 --- /dev/null +++ b/modules/local/sra_fastq_ftp/sra_fastq_ftp.nf.test @@ -0,0 +1,33 @@ +nextflow_process { + + name "Test Process SRA_FASTQ_FTP" + script "modules/local/sra_fastq_ftp.nf" + process "SRA_FASTQ_FTP" + tag "sra_fastq_ftp" + + test("Should run without failures") { + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = [ + [ id:'SRX9626017_SRR13191702', single_end:false ], // meta map + [ SRR13191702 ] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() }, + ) + } + + } + +} diff --git a/modules/local/sra_ids_to_runinfo.nf b/modules/local/sra_ids_to_runinfo/sra_ids_to_runinfo.nf similarity index 100% rename from modules/local/sra_ids_to_runinfo.nf rename to modules/local/sra_ids_to_runinfo/sra_ids_to_runinfo.nf diff --git a/modules/local/sra_ids_to_runinfo/sra_ids_to_runinfo.nf.test b/modules/local/sra_ids_to_runinfo/sra_ids_to_runinfo.nf.test new file mode 100644 index 00000000..36699bb4 --- /dev/null +++ b/modules/local/sra_ids_to_runinfo/sra_ids_to_runinfo.nf.test @@ -0,0 +1,32 @@ +nextflow_process { + + name "Test Process SRA_IDS_TO_RUNINFO" + script "modules/local/sra_ids_to_runinfo.nf" + process "SRA_IDS_TO_RUNINFO" + tag "sra_ids_to_runinfo" + tag "modules_local" + + test("Should run without failures") { + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = 'SRR9984183' + input[1] = '' + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() }, + ) + } + + } + +} diff --git a/modules/local/sra_ids_to_runinfo/sra_ids_to_runinfo.nf.test.snap b/modules/local/sra_ids_to_runinfo/sra_ids_to_runinfo.nf.test.snap new file mode 100644 index 00000000..d4e1e05d --- /dev/null +++ b/modules/local/sra_ids_to_runinfo/sra_ids_to_runinfo.nf.test.snap @@ -0,0 +1,21 @@ +{ + "Should run without failures": { + "content": [ + { + "0": [ + "SRR9984183.runinfo.tsv:md5,51cba5fab4d6f0c0386e4397672240b9" + ], + "1": [ + "versions.yml:md5,1c14442e9b494b586eafe41e77300fae" + ], + "tsv": [ + "SRR9984183.runinfo.tsv:md5,51cba5fab4d6f0c0386e4397672240b9" + ], + "versions": [ + "versions.yml:md5,1c14442e9b494b586eafe41e77300fae" + ] + } + ], + "timestamp": "2023-07-06T13:16:51+0000" + } +} \ No newline at end of file diff --git a/modules/local/sra_merge_samplesheet.nf b/modules/local/sra_merge_samplesheet/sra_merge_samplesheet.nf similarity index 100% rename from modules/local/sra_merge_samplesheet.nf rename to modules/local/sra_merge_samplesheet/sra_merge_samplesheet.nf diff --git a/modules/local/sra_merge_samplesheet/sra_merge_samplesheet.nf.test b/modules/local/sra_merge_samplesheet/sra_merge_samplesheet.nf.test new file mode 100644 index 00000000..00c23f19 --- /dev/null +++ b/modules/local/sra_merge_samplesheet/sra_merge_samplesheet.nf.test @@ -0,0 +1,32 @@ +nextflow_process { + + name "Test Process SRA_MERGE_SAMPLESHEET" + script "modules/local/sra_merge_samplesheet.nf" + process "SRA_MERGE_SAMPLESHEET" + tag "sra_merge_samplesheet" + tag "modules_local" + + test("Should run without failures") { + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = file("$baseDir/modules/local/tests/input/sra_merge_samplesheet/samplesheets/*", checkIfExists: true) + input[1] = file("$baseDir/modules/local/tests/input/sra_merge_samplesheet/mappings/*", checkIfExists: true) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() }, + ) + } + + } + +} diff --git a/modules/local/sra_merge_samplesheet/sra_merge_samplesheet.nf.test.snap b/modules/local/sra_merge_samplesheet/sra_merge_samplesheet.nf.test.snap new file mode 100644 index 00000000..c5f06aac --- /dev/null +++ b/modules/local/sra_merge_samplesheet/sra_merge_samplesheet.nf.test.snap @@ -0,0 +1,27 @@ +{ + "Should run without failures": { + "content": [ + { + "0": [ + "samplesheet.csv:md5,ef756557b0735becd2574c2a3f5840b2" + ], + "1": [ + "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253" + ], + "2": [ + "versions.yml:md5,410006679d5e496d8c55e58e78ca6b34" + ], + "mappings": [ + "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253" + ], + "samplesheet": [ + "samplesheet.csv:md5,ef756557b0735becd2574c2a3f5840b2" + ], + "versions": [ + "versions.yml:md5,410006679d5e496d8c55e58e78ca6b34" + ] + } + ], + "timestamp": "2023-07-06T13:16:36+0000" + } +} \ No newline at end of file diff --git a/modules/local/sra_runinfo_to_ftp.nf b/modules/local/sra_runinfo_to_ftp/sra_runinfo_to_ftp.nf similarity index 100% rename from modules/local/sra_runinfo_to_ftp.nf rename to modules/local/sra_runinfo_to_ftp/sra_runinfo_to_ftp.nf diff --git a/modules/local/sra_runinfo_to_ftp/sra_runinfo_to_ftp.nf.test b/modules/local/sra_runinfo_to_ftp/sra_runinfo_to_ftp.nf.test new file mode 100644 index 00000000..14bb829b --- /dev/null +++ b/modules/local/sra_runinfo_to_ftp/sra_runinfo_to_ftp.nf.test @@ -0,0 +1,31 @@ +nextflow_process { + + name "Test Process SRA_RUNINFO_TO_FTP" + script "modules/local/sra_runinfo_to_ftp.nf" + process "SRA_RUNINFO_TO_FTP" + tag "sra_runinfo_to_ftp" + tag "modules_local" + + test("Should run without failures") { + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = file("$baseDir/modules/local/tests/input/sra_runinfo_to_ftp/SRR13191702.runinfo.tsv", checkIfExists: true) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() }, + ) + } + + } + +} diff --git a/modules/local/sra_runinfo_to_ftp/sra_runinfo_to_ftp.nf.test.snap b/modules/local/sra_runinfo_to_ftp/sra_runinfo_to_ftp.nf.test.snap new file mode 100644 index 00000000..03cf80e8 --- /dev/null +++ b/modules/local/sra_runinfo_to_ftp/sra_runinfo_to_ftp.nf.test.snap @@ -0,0 +1,21 @@ +{ + "Should run without failures": { + "content": [ + { + "0": [ + "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e" + ], + "1": [ + "versions.yml:md5,e95f8185f665127a73622a19d321bcca" + ], + "tsv": [ + "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e" + ], + "versions": [ + "versions.yml:md5,e95f8185f665127a73622a19d321bcca" + ] + } + ], + "timestamp": "2023-07-06T02:05:52+0000" + } +} \ No newline at end of file diff --git a/modules/local/sra_to_samplesheet.nf b/modules/local/sra_to_samplesheet/sra_to_samplesheet.nf similarity index 100% rename from modules/local/sra_to_samplesheet.nf rename to modules/local/sra_to_samplesheet/sra_to_samplesheet.nf diff --git a/modules/local/sra_to_samplesheet/sra_to_samplesheet.nf.test b/modules/local/sra_to_samplesheet/sra_to_samplesheet.nf.test new file mode 100644 index 00000000..413c6410 --- /dev/null +++ b/modules/local/sra_to_samplesheet/sra_to_samplesheet.nf.test @@ -0,0 +1,33 @@ +nextflow_process { + + name "Test Process SRA_TO_SAMPLESHEET" + script "modules/local/sra_to_samplesheet.nf" + process "SRA_TO_SAMPLESHEET" + tag "sra_to_samplesheet" + + test("Should run without failures") { + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[1] = + input[2] = + input[3] = + input[4] = file("$baseDir/modules/local/tests/input/sra_to_samplesheet/SRX9626017_SRR13191702.mappings.csv", checkIfExists: true) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() }, + ) + } + + } + +} diff --git a/modules/local/synapse_get.nf b/modules/local/synapse_get/synapse_get.nf similarity index 100% rename from modules/local/synapse_get.nf rename to modules/local/synapse_get/synapse_get.nf diff --git a/modules/local/synapse_list.nf b/modules/local/synapse_list/synapse_list.nf similarity index 100% rename from modules/local/synapse_list.nf rename to modules/local/synapse_list/synapse_list.nf diff --git a/modules/local/synapse_merge_samplesheet.nf b/modules/local/synapse_merge_samplesheet/synapse_merge_samplesheet.nf similarity index 100% rename from modules/local/synapse_merge_samplesheet.nf rename to modules/local/synapse_merge_samplesheet/synapse_merge_samplesheet.nf diff --git a/modules/local/synapse_show.nf b/modules/local/synapse_show/synapse_show.nf similarity index 100% rename from modules/local/synapse_show.nf rename to modules/local/synapse_show/synapse_show.nf diff --git a/modules/local/synapse_to_samplesheet.nf b/modules/local/synapse_to_sampleshee/synapse_to_samplesheet.nf similarity index 100% rename from modules/local/synapse_to_samplesheet.nf rename to modules/local/synapse_to_sampleshee/synapse_to_samplesheet.nf diff --git a/nf-test.config b/nf-test.config index cd432d43..0799cb40 100644 --- a/nf-test.config +++ b/nf-test.config @@ -1,12 +1,12 @@ config { // location for all nf-tests - testsDir "tests" + testsDir "." // nf-test directory including temporary files for each test workDir ".nf-test" // location of library folder that is added automatically to the classpath - libDir "tests/pipeline/lib/" + libDir "lib/" // location of an optional nextflow.config file specific for executing tests configFile "nextflow.config" diff --git a/tests/config/tags.yml b/tests/config/tags.yml deleted file mode 100644 index 9214c834..00000000 --- a/tests/config/tags.yml +++ /dev/null @@ -1,14 +0,0 @@ -default: - - bin/** - - conf/** - - lib/** - - modules/** - - subworkflows/** - - tests/** - - workflows/** - - nextflow.config - - main.nf - -sra_ids_to_runinfo: - - modules/local/sra_ids_to_runinfo.nf - - tests/modules/sra_ids_to_runinfo/** diff --git a/tests/pipeline/lib/UTILS.groovy b/tests/pipeline/lib/UTILS.groovy deleted file mode 100644 index 311403cc..00000000 --- a/tests/pipeline/lib/UTILS.groovy +++ /dev/null @@ -1,11 +0,0 @@ -// Function to remove Nextflow version from software_versions.yml - -class UTILS { - public static String removeNextflowVersion(outputDir) { - def softwareVersions = path("$outputDir/pipeline_info/software_versions.yml").yaml - if (softwareVersions.containsKey("Workflow")) { - softwareVersions.Workflow.remove("Nextflow") - } - return softwareVersions - } -} diff --git a/tests/pipeline/sra_skip_fastq.nf.test.snap b/tests/pipeline/sra_skip_fastq.nf.test.snap deleted file mode 100644 index 4f2efb49..00000000 --- a/tests/pipeline/sra_skip_fastq.nf.test.snap +++ /dev/null @@ -1,30 +0,0 @@ -{ - "metadata": { - "content": [ - "DRR026872.runinfo_ftp.tsv:md5,c5ab92f6f50717b8163580b642b37aec", - "DRR028935.runinfo_ftp.tsv:md5,9db5d6cba5ce2cccd9b2cc3faaa092e2", - "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", - "ERR1160846.runinfo_ftp.tsv:md5,5611622d583e6bc6d45d8f934696ff1e", - "GSE214215.runinfo_ftp.tsv:md5,4224b5733b92daa40689538de9498ab9", - "SRR12848126.runinfo_ftp.tsv:md5,9563f91d4cc6aa58d2ed5fba2eb30baf", - "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e", - "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", - "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", - "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" - ], - "timestamp": "2023-05-28T15:07:52+0000" - }, - "samplesheet": { - "content": [ - "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", - "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" - ], - "timestamp": "2023-05-28T15:07:52+0000" - }, - "software_versions": { - "content": [ - "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" - ], - "timestamp": "2023-05-28T15:07:52+0000" - } -} \ No newline at end of file diff --git a/tests/pipeline/sra_with_nf_core_pipeline.nf.test b/tests/pipeline/sra_with_nf_core_pipeline.nf.test deleted file mode 100644 index d0c41baf..00000000 --- a/tests/pipeline/sra_with_nf_core_pipeline.nf.test +++ /dev/null @@ -1,170 +0,0 @@ -nextflow_pipeline { - - name "Test Workflow main.nf" - script "main.nf" - tag "sra_nf-core" - tag "pipeline" - - test("SRA NF-CORE/RNASEQ Samplesheet") { - - when { - params { - outdir = "$outputDir" - nf_core_pipeline = "rnaseq" - } - } - - then { - assertAll( - { assert workflow.success }, - { assert snapshot(UTILS.removeNextflowVersion("$outputDir")).match("rnaseq_software_versions") }, - { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, - { assert snapshot(path("$outputDir/metadata/DRR026872.runinfo_ftp.tsv"), - path("$outputDir/metadata/DRR028935.runinfo_ftp.tsv"), - path("$outputDir/metadata/ERR1109373.runinfo_ftp.tsv"), - path("$outputDir/metadata/ERR1160846.runinfo_ftp.tsv"), - path("$outputDir/metadata/GSE214215.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR12848126.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR13191702.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR14593545.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR14709033.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR9984183.runinfo_ftp.tsv")).match("rnaseq_metadata") }, - { assert new File("$outputDir/metadata/GSM4907283.runinfo_ftp.tsv").exists() }, - { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), - path("$outputDir/samplesheet/multiqc_config.yml")).match("rnaseq_samplesheet") }, - { assert new File("$outputDir/samplesheet/samplesheet.csv").exists() } - ) - } - } - - test("SRA NF-CORE/RNASEQ Samplesheet With Specific ENA metadata") { - - when { - params { - outdir = "$outputDir" - nf_core_pipeline = "rnaseq" - ena_metadata_fields = "run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5" - sample_mapping_fields = "run_accession,library_layout" - } - } - - then { - assertAll( - { assert workflow.success }, - { assert snapshot(UTILS.removeNextflowVersion("$outputDir")).match("rnaseq_ena_software_versions") }, - { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, - { assert snapshot(path("$outputDir/metadata/DRR026872.runinfo_ftp.tsv"), - path("$outputDir/metadata/DRR028935.runinfo_ftp.tsv"), - path("$outputDir/metadata/ERR1109373.runinfo_ftp.tsv"), - path("$outputDir/metadata/ERR1160846.runinfo_ftp.tsv"), - path("$outputDir/metadata/GSE214215.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR12848126.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR13191702.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR14593545.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR14709033.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR9984183.runinfo_ftp.tsv")).match("rnaseq_ena_metadata") }, - { assert new File("$outputDir/metadata/GSM4907283.runinfo_ftp.tsv").exists() }, - { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), - path("$outputDir/samplesheet/multiqc_config.yml")).match("rnaseq_ena_samplesheet") }, - { assert new File("$outputDir/samplesheet/samplesheet.csv").exists() } - ) - } - } - - test("SRA NF-CORE/ATACSEQ Samplesheet") { - - when { - params { - outdir = "$outputDir" - nf_core_pipeline = "atacseq" - } - } - - then { - assertAll( - { assert workflow.success }, - { assert snapshot(UTILS.removeNextflowVersion("$outputDir")).match("atacseq_software_versions") }, - { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, - { assert snapshot(path("$outputDir/metadata/DRR026872.runinfo_ftp.tsv"), - path("$outputDir/metadata/DRR028935.runinfo_ftp.tsv"), - path("$outputDir/metadata/ERR1109373.runinfo_ftp.tsv"), - path("$outputDir/metadata/ERR1160846.runinfo_ftp.tsv"), - path("$outputDir/metadata/GSE214215.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR12848126.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR13191702.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR14593545.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR14709033.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR9984183.runinfo_ftp.tsv")).match("atacseq_metadata") }, - { assert new File("$outputDir/metadata/GSM4907283.runinfo_ftp.tsv").exists() }, - { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), - path("$outputDir/samplesheet/multiqc_config.yml")).match("atacseq_samplesheet") }, - { assert new File("$outputDir/samplesheet/samplesheet.csv").exists() } - ) - } - } - - test("SRA NF-CORE/VIRALRECON Samplesheet") { - - when { - params { - outdir = "$outputDir" - nf_core_pipeline = "viralrecon" - } - } - - then { - assertAll( - { assert workflow.success }, - { assert snapshot(UTILS.removeNextflowVersion("$outputDir")).match("viralrecon_software_versions") }, - { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, - { assert snapshot(path("$outputDir/metadata/DRR026872.runinfo_ftp.tsv"), - path("$outputDir/metadata/DRR028935.runinfo_ftp.tsv"), - path("$outputDir/metadata/ERR1109373.runinfo_ftp.tsv"), - path("$outputDir/metadata/ERR1160846.runinfo_ftp.tsv"), - path("$outputDir/metadata/GSE214215.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR12848126.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR13191702.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR14593545.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR14709033.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR9984183.runinfo_ftp.tsv")).match("viralrecon_metadata") }, - { assert new File("$outputDir/metadata/GSM4907283.runinfo_ftp.tsv").exists() }, - { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), - path("$outputDir/samplesheet/multiqc_config.yml")).match("viralrecon_samplesheet") }, - { assert new File("$outputDir/samplesheet/samplesheet.csv").exists() } - ) - } - } - - test("SRA NF-CORE/TAXPROFILER Samplesheet") { - - when { - params { - outdir = "$outputDir" - nf_core_pipeline = "taxprofiler" - } - } - - then { - assertAll( - { assert workflow.success }, - { assert snapshot(UTILS.removeNextflowVersion("$outputDir")).match("taxprofiler_software_versions") }, - { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, - { assert snapshot(path("$outputDir/metadata/DRR026872.runinfo_ftp.tsv"), - path("$outputDir/metadata/DRR028935.runinfo_ftp.tsv"), - path("$outputDir/metadata/ERR1109373.runinfo_ftp.tsv"), - path("$outputDir/metadata/ERR1160846.runinfo_ftp.tsv"), - path("$outputDir/metadata/GSE214215.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR12848126.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR13191702.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR14593545.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR14709033.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR9984183.runinfo_ftp.tsv")).match("taxprofiler_metadata") }, - { assert new File("$outputDir/metadata/GSM4907283.runinfo_ftp.tsv").exists() }, - { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), - path("$outputDir/samplesheet/multiqc_config.yml")).match("taxprofiler_samplesheet") }, - { assert new File("$outputDir/samplesheet/samplesheet.csv").exists() } - ) - } - } - -} diff --git a/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap b/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap deleted file mode 100644 index ea9e25d8..00000000 --- a/tests/pipeline/sra_with_nf_core_pipeline.nf.test.snap +++ /dev/null @@ -1,192 +0,0 @@ -{ - "taxprofiler_metadata": { - "content": [ - "DRR026872.runinfo_ftp.tsv:md5,c5ab92f6f50717b8163580b642b37aec", - "DRR028935.runinfo_ftp.tsv:md5,9db5d6cba5ce2cccd9b2cc3faaa092e2", - "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", - "ERR1160846.runinfo_ftp.tsv:md5,5611622d583e6bc6d45d8f934696ff1e", - "GSE214215.runinfo_ftp.tsv:md5,4224b5733b92daa40689538de9498ab9", - "SRR12848126.runinfo_ftp.tsv:md5,9563f91d4cc6aa58d2ed5fba2eb30baf", - "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e", - "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", - "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", - "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" - ], - "timestamp": "2023-05-28T15:19:39+0000" - }, - "viralrecon_metadata": { - "content": [ - "DRR026872.runinfo_ftp.tsv:md5,c5ab92f6f50717b8163580b642b37aec", - "DRR028935.runinfo_ftp.tsv:md5,9db5d6cba5ce2cccd9b2cc3faaa092e2", - "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", - "ERR1160846.runinfo_ftp.tsv:md5,5611622d583e6bc6d45d8f934696ff1e", - "GSE214215.runinfo_ftp.tsv:md5,4224b5733b92daa40689538de9498ab9", - "SRR12848126.runinfo_ftp.tsv:md5,9563f91d4cc6aa58d2ed5fba2eb30baf", - "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e", - "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", - "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", - "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" - ], - "timestamp": "2023-05-28T15:19:39+0000" - }, - "rnaseq_software_versions": { - "content": [ - "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" - ], - "timestamp": "2023-05-28T15:19:39+0000" - }, - "rnaseq_ena_software_versions": { - "content": [ - "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" - ], - "timestamp": "2023-05-28T15:19:39+0000" - }, - "viralrecon_samplesheet": { - "content": [ - "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", - "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" - ], - "timestamp": "2023-05-28T15:19:39+0000" - }, - "viralrecon_software_versions": { - "content": [ - "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" - ], - "timestamp": "2023-05-28T15:19:39+0000" - }, - "taxprofiler_software_versions": { - "content": [ - "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" - ], - "timestamp": "2023-05-28T15:19:39+0000" - }, - "atacseq_metadata": { - "content": [ - "DRR026872.runinfo_ftp.tsv:md5,c5ab92f6f50717b8163580b642b37aec", - "DRR028935.runinfo_ftp.tsv:md5,9db5d6cba5ce2cccd9b2cc3faaa092e2", - "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", - "ERR1160846.runinfo_ftp.tsv:md5,5611622d583e6bc6d45d8f934696ff1e", - "GSE214215.runinfo_ftp.tsv:md5,4224b5733b92daa40689538de9498ab9", - "SRR12848126.runinfo_ftp.tsv:md5,9563f91d4cc6aa58d2ed5fba2eb30baf", - "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e", - "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", - "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", - "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" - ], - "timestamp": "2023-05-28T15:19:39+0000" - }, - "rnaseq_ena_metadata": { - "content": [ - "DRR026872.runinfo_ftp.tsv:md5,74a5f7058f27a565ce59db481355ca54", - "DRR028935.runinfo_ftp.tsv:md5,07a98fdcec207686a4ea2c9a3997edf3", - "ERR1109373.runinfo_ftp.tsv:md5,868897310855c50b1d5fc77d1195a1f9", - "ERR1160846.runinfo_ftp.tsv:md5,146d7f2ec778b32b7da7ad040e554114", - "GSE214215.runinfo_ftp.tsv:md5,adf62affe371dc9bad8e271450bdc2fe", - "SRR12848126.runinfo_ftp.tsv:md5,cf8827612a76645824e83418d7d76cbf", - "SRR13191702.runinfo_ftp.tsv:md5,2031ca9b7ab736dbde37d05b10cdb0ad", - "SRR14593545.runinfo_ftp.tsv:md5,3a1ac14d71744224a61ab542f869e180", - "SRR14709033.runinfo_ftp.tsv:md5,2385a9cc5e320e78b02743c45d1338f1", - "SRR9984183.runinfo_ftp.tsv:md5,f1ed9fc572d2e0d145be7f547f6d1236" - ], - "timestamp": "2023-05-28T15:19:39+0000" - }, - "rnaseq_samplesheet": { - "content": [ - "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", - "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" - ], - "timestamp": "2023-05-28T15:19:39+0000" - }, - "rnaseq_metadata": { - "content": [ - "DRR026872.runinfo_ftp.tsv:md5,c5ab92f6f50717b8163580b642b37aec", - "DRR028935.runinfo_ftp.tsv:md5,9db5d6cba5ce2cccd9b2cc3faaa092e2", - "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", - "ERR1160846.runinfo_ftp.tsv:md5,5611622d583e6bc6d45d8f934696ff1e", - "GSE214215.runinfo_ftp.tsv:md5,4224b5733b92daa40689538de9498ab9", - "SRR12848126.runinfo_ftp.tsv:md5,9563f91d4cc6aa58d2ed5fba2eb30baf", - "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e", - "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", - "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", - "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" - ], - "timestamp": "2023-05-28T15:19:39+0000" - }, - "atacseq_samplesheet": { - "content": [ - "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", - "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" - ], - "timestamp": "2023-05-28T15:19:39+0000" - }, - "rnaseq_ena_samplesheet": { - "content": [ - "id_mappings.csv:md5,8473773df806859c6af7acafcfe5aa6f", - "multiqc_config.yml:md5,6f6189ee58855de81eaf82ad86e21040" - ], - "timestamp": "2023-05-28T15:19:39+0000" - }, - "taxprofiler_samplesheet": { - "content": [ - "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", - "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" - ], - "timestamp": "2023-05-28T15:19:39+0000" - }, - "atacseq_software_versions": { - "content": [ - "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" - ], - "timestamp": "2023-05-28T15:19:39+0000" - }, - "fastq": { - "content": [ - "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791", - "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", - "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30", - "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9", - "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6", - "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", - "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2", - "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda", - "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64", - "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83", - "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544", - "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", - "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79", - "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", - "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962", - "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", - "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76", - "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", - "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88", - "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", - "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04", - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98", - [ - "DRX024467_DRR026872.fastq.gz.md5:md5,dacaeba3498fb8f405411a22cdb4b40d", - "DRX026011_DRR028935_1.fastq.gz.md5:md5,a47018c5972ba4c11539d0d6bc25eda9", - "DRX026011_DRR028935_2.fastq.gz.md5:md5,f477bbef548fbed665734ebf084eea2f", - "ERX1188904_ERR1109373_1.fastq.gz.md5:md5,50c1c3108631dc32a3151b67e0260d86", - "ERX1188904_ERR1109373_2.fastq.gz.md5:md5,1f22463d410e91a288c83d43654b2499", - "ERX1234253_ERR1160846.fastq.gz.md5:md5,513a8437ad331fc512b088b3750aa1ff", - "SRX17709227_SRR21711856.fastq.gz.md5:md5,13a38fbef27c3e15867d80887145ae75", - "SRX17709228_SRR21711855.fastq.gz.md5:md5,1e871ddd9e92e1866e0c64d36eb5ec85", - "SRX6725035_SRR9984183.fastq.gz.md5:md5,84f59dbb76c9b5eab7e14d90ced352c4", - "SRX9504942_SRR13055517_1.fastq.gz.md5:md5,a03f7f374dc401047b6f6ccaec3885cc", - "SRX9504942_SRR13055517_2.fastq.gz.md5:md5,facaf207753e977327e7b7df7bb8ace0", - "SRX9504942_SRR13055518_1.fastq.gz.md5:md5,5cf412cd62aadaa4838d9eabb5b44368", - "SRX9504942_SRR13055518_2.fastq.gz.md5:md5,93292b826afc72b23be93df26dd710c8", - "SRX9504942_SRR13055519_1.fastq.gz.md5:md5,f6ad6e2610397147a0a55c651de3992f", - "SRX9504942_SRR13055519_2.fastq.gz.md5:md5,2fe7dd4bcc1e7e61c6f54ef50cf961f3", - "SRX9504942_SRR13055520_1.fastq.gz.md5:md5,ab195b37746a3424a1099d9f8cc58de8", - "SRX9504942_SRR13055520_2.fastq.gz.md5:md5,10c448e23f1f7e7af61ec1204f8fc882", - "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", - "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" - ] - ], - "timestamp": "2023-05-28T15:19:39+0000" - } -} \ No newline at end of file diff --git a/workflows/sra.nf b/workflows/sra/main.nf similarity index 87% rename from workflows/sra.nf rename to workflows/sra/main.nf index 44ff8346..05b9a80d 100644 --- a/workflows/sra.nf +++ b/workflows/sra/main.nf @@ -19,12 +19,12 @@ WorkflowSra.initialise(params, valid_params) ======================================================================================== */ -include { SRA_IDS_TO_RUNINFO } from '../modules/local/sra_ids_to_runinfo' -include { SRA_RUNINFO_TO_FTP } from '../modules/local/sra_runinfo_to_ftp' -include { SRA_FASTQ_FTP } from '../modules/local/sra_fastq_ftp' -include { SRA_TO_SAMPLESHEET } from '../modules/local/sra_to_samplesheet' -include { SRA_MERGE_SAMPLESHEET } from '../modules/local/sra_merge_samplesheet' -include { MULTIQC_MAPPINGS_CONFIG } from '../modules/local/multiqc_mappings_config' +include { SRA_IDS_TO_RUNINFO } from '../../modules/local/sra_ids_to_runinfo/sra_ids_to_runinfo' +include { SRA_RUNINFO_TO_FTP } from '../../modules/local/sra_runinfo_to_ftp/sra_runinfo_to_ftp' +include { SRA_FASTQ_FTP } from '../../modules/local/sra_fastq_ftp/sra_fastq_ftp' +include { SRA_TO_SAMPLESHEET } from '../../modules/local/sra_to_samplesheet/sra_to_samplesheet' +include { SRA_MERGE_SAMPLESHEET } from '../../modules/local/sra_merge_samplesheet/sra_merge_samplesheet' +include { MULTIQC_MAPPINGS_CONFIG } from '../../modules/local/multiqc_mappings_config/multiqc_mappings_config' /* ======================================================================================== @@ -32,9 +32,9 @@ include { MULTIQC_MAPPINGS_CONFIG } from '../modules/local/multiqc_mappings_conf ======================================================================================== */ -include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/custom/dumpsoftwareversions/main' +include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../../modules/nf-core/custom/dumpsoftwareversions/main' -include { FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS } from '../subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/main' +include { FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS } from '../../subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/main' /* ======================================================================================== diff --git a/tests/pipeline/sra_skip_fastq.nf.test b/workflows/sra/tests/skip_fastq.nf.test similarity index 95% rename from tests/pipeline/sra_skip_fastq.nf.test rename to workflows/sra/tests/skip_fastq.nf.test index b0237a81..38814a77 100644 --- a/tests/pipeline/sra_skip_fastq.nf.test +++ b/workflows/sra/tests/skip_fastq.nf.test @@ -3,7 +3,7 @@ nextflow_pipeline { name "Test Workflow main.nf" script "main.nf" tag "sra_skip_fastq" - tag "pipeline" + tag "workflow" test("SRA Skip FASTQ") { @@ -17,7 +17,7 @@ nextflow_pipeline { then { assertAll( { assert workflow.success }, - { assert snapshot(UTILS.removeNextflowVersion("$outputDir")).match("software_versions") }, + { assert snapshot(NftestUtils.removeNextflowVersion("$outputDir")).match("software_versions") }, { assert snapshot(path("$outputDir/metadata/DRR026872.runinfo_ftp.tsv"), path("$outputDir/metadata/DRR028935.runinfo_ftp.tsv"), path("$outputDir/metadata/ERR1109373.runinfo_ftp.tsv"), diff --git a/workflows/sra/tests/skip_fastq.nf.test.snap b/workflows/sra/tests/skip_fastq.nf.test.snap new file mode 100644 index 00000000..6d3201e8 --- /dev/null +++ b/workflows/sra/tests/skip_fastq.nf.test.snap @@ -0,0 +1,30 @@ +{ + "metadata": { + "content": [ + "DRR026872.runinfo_ftp.tsv:md5,ef90876b2cbcb3721251b4cdef8cc47b", + "DRR028935.runinfo_ftp.tsv:md5,f79eefcea5db346f76f76f87df7f8dd2", + "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", + "ERR1160846.runinfo_ftp.tsv:md5,1b2dc1a64117de20b2164724836da345", + "GSE214215.runinfo_ftp.tsv:md5,23a580c89ee7bf681ca3ffa26aa1837f", + "SRR12848126.runinfo_ftp.tsv:md5,5d1e6bfd3d4077d1e66378c58e44975d", + "SRR13191702.runinfo_ftp.tsv:md5,409e262bb41bb6103315126db4d0dd1d", + "SRR14593545.runinfo_ftp.tsv:md5,888eaa19fd0b7fea4dc3e9800c1d26f2", + "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", + "SRR9984183.runinfo_ftp.tsv:md5,911a48308f76387b97842d35abc43c8f" + ], + "timestamp": "2023-07-06T14:02:03+0000" + }, + "samplesheet": { + "content": [ + "id_mappings.csv:md5,aa5eab8068e59a3866fd6d1fa8fe1b5a", + "multiqc_config.yml:md5,1337fdab76cbca9b78dbf06d7344a3b8" + ], + "timestamp": "2023-07-06T14:02:03+0000" + }, + "software_versions": { + "content": [ + "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" + ], + "timestamp": "2023-07-06T14:02:03+0000" + } +} \ No newline at end of file diff --git a/tests/pipeline/sra.nf.test b/workflows/sra/tests/sra.nf.test similarity index 92% rename from tests/pipeline/sra.nf.test rename to workflows/sra/tests/sra.nf.test index f545d93d..16074b64 100644 --- a/tests/pipeline/sra.nf.test +++ b/workflows/sra/tests/sra.nf.test @@ -3,7 +3,7 @@ nextflow_pipeline { name "Test Workflow main.nf" script "main.nf" tag "sra" - tag "pipeline" + tag "workflow" test("SRA FASTQ & Metadata") { @@ -16,7 +16,7 @@ nextflow_pipeline { then { assertAll( { assert workflow.success }, - { assert snapshot(UTILS.removeNextflowVersion("$outputDir")).match("software_versions") }, + { assert snapshot(NftestUtils.removeNextflowVersion("$outputDir")).match("software_versions") }, { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, { assert snapshot(path("$outputDir/metadata/DRR026872.runinfo_ftp.tsv"), path("$outputDir/metadata/DRR028935.runinfo_ftp.tsv"), diff --git a/tests/pipeline/sra.nf.test.snap b/workflows/sra/tests/sra.nf.test.snap similarity index 81% rename from tests/pipeline/sra.nf.test.snap rename to workflows/sra/tests/sra.nf.test.snap index 02cf5541..a4276e94 100644 --- a/tests/pipeline/sra.nf.test.snap +++ b/workflows/sra/tests/sra.nf.test.snap @@ -1,31 +1,31 @@ { "metadata": { "content": [ - "DRR026872.runinfo_ftp.tsv:md5,c5ab92f6f50717b8163580b642b37aec", - "DRR028935.runinfo_ftp.tsv:md5,9db5d6cba5ce2cccd9b2cc3faaa092e2", + "DRR026872.runinfo_ftp.tsv:md5,ef90876b2cbcb3721251b4cdef8cc47b", + "DRR028935.runinfo_ftp.tsv:md5,f79eefcea5db346f76f76f87df7f8dd2", "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", - "ERR1160846.runinfo_ftp.tsv:md5,5611622d583e6bc6d45d8f934696ff1e", - "GSE214215.runinfo_ftp.tsv:md5,4224b5733b92daa40689538de9498ab9", - "SRR12848126.runinfo_ftp.tsv:md5,9563f91d4cc6aa58d2ed5fba2eb30baf", - "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e", - "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", - "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", - "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" + "ERR1160846.runinfo_ftp.tsv:md5,1b2dc1a64117de20b2164724836da345", + "GSE214215.runinfo_ftp.tsv:md5,23a580c89ee7bf681ca3ffa26aa1837f", + "SRR12848126.runinfo_ftp.tsv:md5,5d1e6bfd3d4077d1e66378c58e44975d", + "SRR13191702.runinfo_ftp.tsv:md5,409e262bb41bb6103315126db4d0dd1d", + "SRR14593545.runinfo_ftp.tsv:md5,888eaa19fd0b7fea4dc3e9800c1d26f2", + "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", + "SRR9984183.runinfo_ftp.tsv:md5,911a48308f76387b97842d35abc43c8f" ], - "timestamp": "2023-05-28T15:25:33+0000" + "timestamp": "2023-07-06T14:10:16+0000" }, "samplesheet": { "content": [ - "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", - "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" + "id_mappings.csv:md5,aa5eab8068e59a3866fd6d1fa8fe1b5a", + "multiqc_config.yml:md5,1337fdab76cbca9b78dbf06d7344a3b8" ], - "timestamp": "2023-05-28T15:25:33+0000" + "timestamp": "2023-07-06T14:10:16+0000" }, "software_versions": { "content": [ "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" ], - "timestamp": "2023-05-28T15:25:33+0000" + "timestamp": "2023-07-06T14:10:16+0000" }, "fastq": { "content": [ @@ -75,6 +75,6 @@ "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" ] ], - "timestamp": "2023-05-28T15:25:33+0000" + "timestamp": "2023-07-06T14:10:16+0000" } } \ No newline at end of file diff --git a/workflows/sra/tests/with_atacseq_samplesheet.nf.test b/workflows/sra/tests/with_atacseq_samplesheet.nf.test new file mode 100644 index 00000000..4ebc9352 --- /dev/null +++ b/workflows/sra/tests/with_atacseq_samplesheet.nf.test @@ -0,0 +1,39 @@ +nextflow_pipeline { + + name "Test Workflow main.nf" + script "main.nf" + tag "sra_with_atacseq" + tag "workflow" + + test("SRA NF-CORE/ATACSEQ Samplesheet") { + + when { + params { + outdir = "$outputDir" + nf_core_pipeline = "atacseq" + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(NftestUtils.removeNextflowVersion("$outputDir")).match("software_versions") }, + { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, + { assert snapshot(path("$outputDir/metadata/DRR026872.runinfo_ftp.tsv"), + path("$outputDir/metadata/DRR028935.runinfo_ftp.tsv"), + path("$outputDir/metadata/ERR1109373.runinfo_ftp.tsv"), + path("$outputDir/metadata/ERR1160846.runinfo_ftp.tsv"), + path("$outputDir/metadata/GSE214215.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR12848126.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR13191702.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR14593545.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR14709033.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR9984183.runinfo_ftp.tsv")).match("metadata") }, + { assert new File("$outputDir/metadata/GSM4907283.runinfo_ftp.tsv").exists() }, + { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), + path("$outputDir/samplesheet/multiqc_config.yml")).match("samplesheet") }, + { assert new File("$outputDir/samplesheet/samplesheet.csv").exists() } + ) + } + } +} diff --git a/workflows/sra/tests/with_atacseq_samplesheet.nf.test.snap b/workflows/sra/tests/with_atacseq_samplesheet.nf.test.snap new file mode 100644 index 00000000..e49f6010 --- /dev/null +++ b/workflows/sra/tests/with_atacseq_samplesheet.nf.test.snap @@ -0,0 +1,80 @@ +{ + "metadata": { + "content": [ + "DRR026872.runinfo_ftp.tsv:md5,ef90876b2cbcb3721251b4cdef8cc47b", + "DRR028935.runinfo_ftp.tsv:md5,f79eefcea5db346f76f76f87df7f8dd2", + "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", + "ERR1160846.runinfo_ftp.tsv:md5,1b2dc1a64117de20b2164724836da345", + "GSE214215.runinfo_ftp.tsv:md5,23a580c89ee7bf681ca3ffa26aa1837f", + "SRR12848126.runinfo_ftp.tsv:md5,5d1e6bfd3d4077d1e66378c58e44975d", + "SRR13191702.runinfo_ftp.tsv:md5,409e262bb41bb6103315126db4d0dd1d", + "SRR14593545.runinfo_ftp.tsv:md5,888eaa19fd0b7fea4dc3e9800c1d26f2", + "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", + "SRR9984183.runinfo_ftp.tsv:md5,911a48308f76387b97842d35abc43c8f" + ], + "timestamp": "2023-07-06T14:03:45+0000" + }, + "samplesheet": { + "content": [ + "id_mappings.csv:md5,aa5eab8068e59a3866fd6d1fa8fe1b5a", + "multiqc_config.yml:md5,1337fdab76cbca9b78dbf06d7344a3b8" + ], + "timestamp": "2023-07-06T14:03:45+0000" + }, + "software_versions": { + "content": [ + "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" + ], + "timestamp": "2023-07-06T14:03:45+0000" + }, + "fastq": { + "content": [ + "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791", + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30", + "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9", + "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6", + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2", + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda", + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64", + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83", + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544", + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79", + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962", + "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76", + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88", + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04", + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98", + [ + "DRX024467_DRR026872.fastq.gz.md5:md5,dacaeba3498fb8f405411a22cdb4b40d", + "DRX026011_DRR028935_1.fastq.gz.md5:md5,a47018c5972ba4c11539d0d6bc25eda9", + "DRX026011_DRR028935_2.fastq.gz.md5:md5,f477bbef548fbed665734ebf084eea2f", + "ERX1188904_ERR1109373_1.fastq.gz.md5:md5,50c1c3108631dc32a3151b67e0260d86", + "ERX1188904_ERR1109373_2.fastq.gz.md5:md5,1f22463d410e91a288c83d43654b2499", + "ERX1234253_ERR1160846.fastq.gz.md5:md5,513a8437ad331fc512b088b3750aa1ff", + "SRX17709227_SRR21711856.fastq.gz.md5:md5,13a38fbef27c3e15867d80887145ae75", + "SRX17709228_SRR21711855.fastq.gz.md5:md5,1e871ddd9e92e1866e0c64d36eb5ec85", + "SRX6725035_SRR9984183.fastq.gz.md5:md5,84f59dbb76c9b5eab7e14d90ced352c4", + "SRX9504942_SRR13055517_1.fastq.gz.md5:md5,a03f7f374dc401047b6f6ccaec3885cc", + "SRX9504942_SRR13055517_2.fastq.gz.md5:md5,facaf207753e977327e7b7df7bb8ace0", + "SRX9504942_SRR13055518_1.fastq.gz.md5:md5,5cf412cd62aadaa4838d9eabb5b44368", + "SRX9504942_SRR13055518_2.fastq.gz.md5:md5,93292b826afc72b23be93df26dd710c8", + "SRX9504942_SRR13055519_1.fastq.gz.md5:md5,f6ad6e2610397147a0a55c651de3992f", + "SRX9504942_SRR13055519_2.fastq.gz.md5:md5,2fe7dd4bcc1e7e61c6f54ef50cf961f3", + "SRX9504942_SRR13055520_1.fastq.gz.md5:md5,ab195b37746a3424a1099d9f8cc58de8", + "SRX9504942_SRR13055520_2.fastq.gz.md5:md5,10c448e23f1f7e7af61ec1204f8fc882", + "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", + "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" + ] + ], + "timestamp": "2023-07-06T14:03:45+0000" + } +} \ No newline at end of file diff --git a/workflows/sra/tests/with_rnaseq_samplesheet.nf.test b/workflows/sra/tests/with_rnaseq_samplesheet.nf.test new file mode 100644 index 00000000..ca77778c --- /dev/null +++ b/workflows/sra/tests/with_rnaseq_samplesheet.nf.test @@ -0,0 +1,39 @@ +nextflow_pipeline { + + name "Test Workflow main.nf" + script "main.nf" + tag "sra_with_rnaseq" + tag "workflow" + + test("SRA NF-CORE/RNASEQ Samplesheet") { + + when { + params { + outdir = "$outputDir" + nf_core_pipeline = "rnaseq" + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(NftestUtils.removeNextflowVersion("$outputDir")).match("software_versions") }, + { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, + { assert snapshot(path("$outputDir/metadata/DRR026872.runinfo_ftp.tsv"), + path("$outputDir/metadata/DRR028935.runinfo_ftp.tsv"), + path("$outputDir/metadata/ERR1109373.runinfo_ftp.tsv"), + path("$outputDir/metadata/ERR1160846.runinfo_ftp.tsv"), + path("$outputDir/metadata/GSE214215.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR12848126.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR13191702.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR14593545.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR14709033.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR9984183.runinfo_ftp.tsv")).match("metadata") }, + { assert new File("$outputDir/metadata/GSM4907283.runinfo_ftp.tsv").exists() }, + { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), + path("$outputDir/samplesheet/multiqc_config.yml")).match("samplesheet") }, + { assert new File("$outputDir/samplesheet/samplesheet.csv").exists() } + ) + } + } +} diff --git a/workflows/sra/tests/with_rnaseq_samplesheet.nf.test.snap b/workflows/sra/tests/with_rnaseq_samplesheet.nf.test.snap new file mode 100644 index 00000000..1efae9c1 --- /dev/null +++ b/workflows/sra/tests/with_rnaseq_samplesheet.nf.test.snap @@ -0,0 +1,80 @@ +{ + "metadata": { + "content": [ + "DRR026872.runinfo_ftp.tsv:md5,ef90876b2cbcb3721251b4cdef8cc47b", + "DRR028935.runinfo_ftp.tsv:md5,f79eefcea5db346f76f76f87df7f8dd2", + "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", + "ERR1160846.runinfo_ftp.tsv:md5,1b2dc1a64117de20b2164724836da345", + "GSE214215.runinfo_ftp.tsv:md5,23a580c89ee7bf681ca3ffa26aa1837f", + "SRR12848126.runinfo_ftp.tsv:md5,5d1e6bfd3d4077d1e66378c58e44975d", + "SRR13191702.runinfo_ftp.tsv:md5,409e262bb41bb6103315126db4d0dd1d", + "SRR14593545.runinfo_ftp.tsv:md5,888eaa19fd0b7fea4dc3e9800c1d26f2", + "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", + "SRR9984183.runinfo_ftp.tsv:md5,911a48308f76387b97842d35abc43c8f" + ], + "timestamp": "2023-07-06T14:12:03+0000" + }, + "samplesheet": { + "content": [ + "id_mappings.csv:md5,aa5eab8068e59a3866fd6d1fa8fe1b5a", + "multiqc_config.yml:md5,1337fdab76cbca9b78dbf06d7344a3b8" + ], + "timestamp": "2023-07-06T14:12:03+0000" + }, + "software_versions": { + "content": [ + "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" + ], + "timestamp": "2023-07-06T14:12:03+0000" + }, + "fastq": { + "content": [ + "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791", + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30", + "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9", + "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6", + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2", + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda", + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64", + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83", + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544", + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79", + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962", + "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76", + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88", + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04", + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98", + [ + "DRX024467_DRR026872.fastq.gz.md5:md5,dacaeba3498fb8f405411a22cdb4b40d", + "DRX026011_DRR028935_1.fastq.gz.md5:md5,a47018c5972ba4c11539d0d6bc25eda9", + "DRX026011_DRR028935_2.fastq.gz.md5:md5,f477bbef548fbed665734ebf084eea2f", + "ERX1188904_ERR1109373_1.fastq.gz.md5:md5,50c1c3108631dc32a3151b67e0260d86", + "ERX1188904_ERR1109373_2.fastq.gz.md5:md5,1f22463d410e91a288c83d43654b2499", + "ERX1234253_ERR1160846.fastq.gz.md5:md5,513a8437ad331fc512b088b3750aa1ff", + "SRX17709227_SRR21711856.fastq.gz.md5:md5,13a38fbef27c3e15867d80887145ae75", + "SRX17709228_SRR21711855.fastq.gz.md5:md5,1e871ddd9e92e1866e0c64d36eb5ec85", + "SRX6725035_SRR9984183.fastq.gz.md5:md5,84f59dbb76c9b5eab7e14d90ced352c4", + "SRX9504942_SRR13055517_1.fastq.gz.md5:md5,a03f7f374dc401047b6f6ccaec3885cc", + "SRX9504942_SRR13055517_2.fastq.gz.md5:md5,facaf207753e977327e7b7df7bb8ace0", + "SRX9504942_SRR13055518_1.fastq.gz.md5:md5,5cf412cd62aadaa4838d9eabb5b44368", + "SRX9504942_SRR13055518_2.fastq.gz.md5:md5,93292b826afc72b23be93df26dd710c8", + "SRX9504942_SRR13055519_1.fastq.gz.md5:md5,f6ad6e2610397147a0a55c651de3992f", + "SRX9504942_SRR13055519_2.fastq.gz.md5:md5,2fe7dd4bcc1e7e61c6f54ef50cf961f3", + "SRX9504942_SRR13055520_1.fastq.gz.md5:md5,ab195b37746a3424a1099d9f8cc58de8", + "SRX9504942_SRR13055520_2.fastq.gz.md5:md5,10c448e23f1f7e7af61ec1204f8fc882", + "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", + "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" + ] + ], + "timestamp": "2023-07-06T14:12:03+0000" + } +} \ No newline at end of file diff --git a/workflows/sra/tests/with_rnaseq_specific_ena_metadata.nf.test b/workflows/sra/tests/with_rnaseq_specific_ena_metadata.nf.test new file mode 100644 index 00000000..2fc12241 --- /dev/null +++ b/workflows/sra/tests/with_rnaseq_specific_ena_metadata.nf.test @@ -0,0 +1,41 @@ +nextflow_pipeline { + + name "Test Workflow main.nf" + script "main.nf" + tag "sra_with_rnaseq_specific_ena" + tag "workflow" + + test("SRA NF-CORE/RNASEQ Samplesheet With Specific ENA metadata") { + + when { + params { + outdir = "$outputDir" + nf_core_pipeline = "rnaseq" + ena_metadata_fields = "run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5" + sample_mapping_fields = "run_accession,library_layout" + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(NftestUtils.removeNextflowVersion("$outputDir")).match("software_versions") }, + { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, + { assert snapshot(path("$outputDir/metadata/DRR026872.runinfo_ftp.tsv"), + path("$outputDir/metadata/DRR028935.runinfo_ftp.tsv"), + path("$outputDir/metadata/ERR1109373.runinfo_ftp.tsv"), + path("$outputDir/metadata/ERR1160846.runinfo_ftp.tsv"), + path("$outputDir/metadata/GSE214215.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR12848126.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR13191702.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR14593545.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR14709033.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR9984183.runinfo_ftp.tsv")).match("metadata") }, + { assert new File("$outputDir/metadata/GSM4907283.runinfo_ftp.tsv").exists() }, + { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), + path("$outputDir/samplesheet/multiqc_config.yml")).match("samplesheet") }, + { assert new File("$outputDir/samplesheet/samplesheet.csv").exists() } + ) + } + } +} diff --git a/workflows/sra/tests/with_rnaseq_specific_ena_metadata.nf.test.snap b/workflows/sra/tests/with_rnaseq_specific_ena_metadata.nf.test.snap new file mode 100644 index 00000000..bfa3c9cd --- /dev/null +++ b/workflows/sra/tests/with_rnaseq_specific_ena_metadata.nf.test.snap @@ -0,0 +1,80 @@ +{ + "metadata": { + "content": [ + "DRR026872.runinfo_ftp.tsv:md5,74a5f7058f27a565ce59db481355ca54", + "DRR028935.runinfo_ftp.tsv:md5,07a98fdcec207686a4ea2c9a3997edf3", + "ERR1109373.runinfo_ftp.tsv:md5,868897310855c50b1d5fc77d1195a1f9", + "ERR1160846.runinfo_ftp.tsv:md5,146d7f2ec778b32b7da7ad040e554114", + "GSE214215.runinfo_ftp.tsv:md5,adf62affe371dc9bad8e271450bdc2fe", + "SRR12848126.runinfo_ftp.tsv:md5,cf8827612a76645824e83418d7d76cbf", + "SRR13191702.runinfo_ftp.tsv:md5,2031ca9b7ab736dbde37d05b10cdb0ad", + "SRR14593545.runinfo_ftp.tsv:md5,3a1ac14d71744224a61ab542f869e180", + "SRR14709033.runinfo_ftp.tsv:md5,2385a9cc5e320e78b02743c45d1338f1", + "SRR9984183.runinfo_ftp.tsv:md5,f1ed9fc572d2e0d145be7f547f6d1236" + ], + "timestamp": "2023-07-03T23:38:27+0000" + }, + "samplesheet": { + "content": [ + "id_mappings.csv:md5,8473773df806859c6af7acafcfe5aa6f", + "multiqc_config.yml:md5,6f6189ee58855de81eaf82ad86e21040" + ], + "timestamp": "2023-07-03T23:38:27+0000" + }, + "software_versions": { + "content": [ + "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" + ], + "timestamp": "2023-07-03T23:38:27+0000" + }, + "fastq": { + "content": [ + "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791", + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30", + "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9", + "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6", + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2", + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda", + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64", + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83", + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544", + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79", + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962", + "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76", + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88", + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04", + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98", + [ + "DRX024467_DRR026872.fastq.gz.md5:md5,dacaeba3498fb8f405411a22cdb4b40d", + "DRX026011_DRR028935_1.fastq.gz.md5:md5,a47018c5972ba4c11539d0d6bc25eda9", + "DRX026011_DRR028935_2.fastq.gz.md5:md5,f477bbef548fbed665734ebf084eea2f", + "ERX1188904_ERR1109373_1.fastq.gz.md5:md5,50c1c3108631dc32a3151b67e0260d86", + "ERX1188904_ERR1109373_2.fastq.gz.md5:md5,1f22463d410e91a288c83d43654b2499", + "ERX1234253_ERR1160846.fastq.gz.md5:md5,513a8437ad331fc512b088b3750aa1ff", + "SRX17709227_SRR21711856.fastq.gz.md5:md5,13a38fbef27c3e15867d80887145ae75", + "SRX17709228_SRR21711855.fastq.gz.md5:md5,1e871ddd9e92e1866e0c64d36eb5ec85", + "SRX6725035_SRR9984183.fastq.gz.md5:md5,84f59dbb76c9b5eab7e14d90ced352c4", + "SRX9504942_SRR13055517_1.fastq.gz.md5:md5,a03f7f374dc401047b6f6ccaec3885cc", + "SRX9504942_SRR13055517_2.fastq.gz.md5:md5,facaf207753e977327e7b7df7bb8ace0", + "SRX9504942_SRR13055518_1.fastq.gz.md5:md5,5cf412cd62aadaa4838d9eabb5b44368", + "SRX9504942_SRR13055518_2.fastq.gz.md5:md5,93292b826afc72b23be93df26dd710c8", + "SRX9504942_SRR13055519_1.fastq.gz.md5:md5,f6ad6e2610397147a0a55c651de3992f", + "SRX9504942_SRR13055519_2.fastq.gz.md5:md5,2fe7dd4bcc1e7e61c6f54ef50cf961f3", + "SRX9504942_SRR13055520_1.fastq.gz.md5:md5,ab195b37746a3424a1099d9f8cc58de8", + "SRX9504942_SRR13055520_2.fastq.gz.md5:md5,10c448e23f1f7e7af61ec1204f8fc882", + "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", + "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" + ] + ], + "timestamp": "2023-07-03T23:38:27+0000" + } +} \ No newline at end of file diff --git a/tests/pipeline/sra_with_sratools.nf.test b/workflows/sra/tests/with_sratools.nf.test similarity index 91% rename from tests/pipeline/sra_with_sratools.nf.test rename to workflows/sra/tests/with_sratools.nf.test index 2fd06ba8..839e3089 100644 --- a/tests/pipeline/sra_with_sratools.nf.test +++ b/workflows/sra/tests/with_sratools.nf.test @@ -2,8 +2,8 @@ nextflow_pipeline { name "Test Workflow main.nf" script "main.nf" - tag "sratools_force" - tag "pipeline" + tag "sra_force_sratools_download" + tag "workflow" test("Force SRA-Tools Download") { @@ -17,7 +17,7 @@ nextflow_pipeline { then { assertAll( { assert workflow.success }, - { assert snapshot(UTILS.removeNextflowVersion("$outputDir")).match("software_versions") }, + { assert snapshot(NftestUtils.removeNextflowVersion("$outputDir")).match("software_versions") }, { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, { assert snapshot(path("$outputDir/metadata/DRR026872.runinfo_ftp.tsv"), path("$outputDir/metadata/DRR028935.runinfo_ftp.tsv"), diff --git a/tests/pipeline/sra_with_sratools.nf.test.snap b/workflows/sra/tests/with_sratools.nf.test.snap similarity index 71% rename from tests/pipeline/sra_with_sratools.nf.test.snap rename to workflows/sra/tests/with_sratools.nf.test.snap index 285b9ce1..7d6d007a 100644 --- a/tests/pipeline/sra_with_sratools.nf.test.snap +++ b/workflows/sra/tests/with_sratools.nf.test.snap @@ -1,31 +1,31 @@ { "metadata": { "content": [ - "DRR026872.runinfo_ftp.tsv:md5,c5ab92f6f50717b8163580b642b37aec", - "DRR028935.runinfo_ftp.tsv:md5,9db5d6cba5ce2cccd9b2cc3faaa092e2", + "DRR026872.runinfo_ftp.tsv:md5,ef90876b2cbcb3721251b4cdef8cc47b", + "DRR028935.runinfo_ftp.tsv:md5,f79eefcea5db346f76f76f87df7f8dd2", "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", - "ERR1160846.runinfo_ftp.tsv:md5,5611622d583e6bc6d45d8f934696ff1e", - "GSE214215.runinfo_ftp.tsv:md5,4224b5733b92daa40689538de9498ab9", - "SRR12848126.runinfo_ftp.tsv:md5,9563f91d4cc6aa58d2ed5fba2eb30baf", - "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e", - "SRR14593545.runinfo_ftp.tsv:md5,302271a4a1d99865362d0228e6439580", - "SRR14709033.runinfo_ftp.tsv:md5,e059c4a0dfdddd70c1998a1ea9c1e65f", - "SRR9984183.runinfo_ftp.tsv:md5,1e299191d23e0f3bd0aabf98c9d8133e" + "ERR1160846.runinfo_ftp.tsv:md5,1b2dc1a64117de20b2164724836da345", + "GSE214215.runinfo_ftp.tsv:md5,23a580c89ee7bf681ca3ffa26aa1837f", + "SRR12848126.runinfo_ftp.tsv:md5,5d1e6bfd3d4077d1e66378c58e44975d", + "SRR13191702.runinfo_ftp.tsv:md5,409e262bb41bb6103315126db4d0dd1d", + "SRR14593545.runinfo_ftp.tsv:md5,888eaa19fd0b7fea4dc3e9800c1d26f2", + "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", + "SRR9984183.runinfo_ftp.tsv:md5,911a48308f76387b97842d35abc43c8f" ], - "timestamp": "2023-05-28T15:07:23+0000" + "timestamp": "2023-07-06T14:08:40+0000" }, "samplesheet": { "content": [ - "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253", - "multiqc_config.yml:md5,a24e0e280fa03b95bb678c17e4c36d93" + "id_mappings.csv:md5,aa5eab8068e59a3866fd6d1fa8fe1b5a", + "multiqc_config.yml:md5,1337fdab76cbca9b78dbf06d7344a3b8" ], - "timestamp": "2023-05-28T15:07:23+0000" + "timestamp": "2023-07-06T14:08:40+0000" }, "software_versions": { "content": [ "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" ], - "timestamp": "2023-05-28T15:07:23+0000" + "timestamp": "2023-07-06T14:08:40+0000" }, "fastq": { "content": [ @@ -54,6 +54,6 @@ "SRX9626017_SRR13191702_1.fastq.gz:md5,627a90afcd9f3cfc7f5f91074f9a2df7", "SRX9626017_SRR13191702_2.fastq.gz:md5,3d9b2c68a8ad1547105b17de81b2d9af" ], - "timestamp": "2023-05-28T15:07:23+0000" + "timestamp": "2023-07-06T14:08:40+0000" } } \ No newline at end of file diff --git a/workflows/sra/tests/with_taxprofiler_samplesheet.nf.test b/workflows/sra/tests/with_taxprofiler_samplesheet.nf.test new file mode 100644 index 00000000..7ffbca59 --- /dev/null +++ b/workflows/sra/tests/with_taxprofiler_samplesheet.nf.test @@ -0,0 +1,40 @@ +nextflow_pipeline { + + name "Test Workflow main.nf" + script "main.nf" + tag "sra_with_taxprofiler" + tag "workflow" + + test("SRA NF-CORE/TAXPROFILER Samplesheet") { + + when { + params { + outdir = "$outputDir" + nf_core_pipeline = "taxprofiler" + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(NftestUtils.removeNextflowVersion("$outputDir")).match("software_versions") }, + { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, + { assert snapshot(path("$outputDir/metadata/DRR026872.runinfo_ftp.tsv"), + path("$outputDir/metadata/DRR028935.runinfo_ftp.tsv"), + path("$outputDir/metadata/ERR1109373.runinfo_ftp.tsv"), + path("$outputDir/metadata/ERR1160846.runinfo_ftp.tsv"), + path("$outputDir/metadata/GSE214215.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR12848126.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR13191702.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR14593545.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR14709033.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR9984183.runinfo_ftp.tsv")).match("metadata") }, + { assert new File("$outputDir/metadata/GSM4907283.runinfo_ftp.tsv").exists() }, + { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), + path("$outputDir/samplesheet/multiqc_config.yml")).match("samplesheet") }, + { assert new File("$outputDir/samplesheet/samplesheet.csv").exists() } + ) + } + } + +} diff --git a/workflows/sra/tests/with_taxprofiler_samplesheet.nf.test.snap b/workflows/sra/tests/with_taxprofiler_samplesheet.nf.test.snap new file mode 100644 index 00000000..1e10d64b --- /dev/null +++ b/workflows/sra/tests/with_taxprofiler_samplesheet.nf.test.snap @@ -0,0 +1,80 @@ +{ + "metadata": { + "content": [ + "DRR026872.runinfo_ftp.tsv:md5,ef90876b2cbcb3721251b4cdef8cc47b", + "DRR028935.runinfo_ftp.tsv:md5,f79eefcea5db346f76f76f87df7f8dd2", + "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", + "ERR1160846.runinfo_ftp.tsv:md5,1b2dc1a64117de20b2164724836da345", + "GSE214215.runinfo_ftp.tsv:md5,23a580c89ee7bf681ca3ffa26aa1837f", + "SRR12848126.runinfo_ftp.tsv:md5,5d1e6bfd3d4077d1e66378c58e44975d", + "SRR13191702.runinfo_ftp.tsv:md5,409e262bb41bb6103315126db4d0dd1d", + "SRR14593545.runinfo_ftp.tsv:md5,888eaa19fd0b7fea4dc3e9800c1d26f2", + "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", + "SRR9984183.runinfo_ftp.tsv:md5,911a48308f76387b97842d35abc43c8f" + ], + "timestamp": "2023-07-06T14:05:23+0000" + }, + "samplesheet": { + "content": [ + "id_mappings.csv:md5,aa5eab8068e59a3866fd6d1fa8fe1b5a", + "multiqc_config.yml:md5,1337fdab76cbca9b78dbf06d7344a3b8" + ], + "timestamp": "2023-07-06T14:05:23+0000" + }, + "software_versions": { + "content": [ + "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" + ], + "timestamp": "2023-07-06T14:05:23+0000" + }, + "fastq": { + "content": [ + "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791", + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30", + "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9", + "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6", + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2", + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda", + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64", + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83", + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544", + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79", + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962", + "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76", + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88", + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04", + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98", + [ + "DRX024467_DRR026872.fastq.gz.md5:md5,dacaeba3498fb8f405411a22cdb4b40d", + "DRX026011_DRR028935_1.fastq.gz.md5:md5,a47018c5972ba4c11539d0d6bc25eda9", + "DRX026011_DRR028935_2.fastq.gz.md5:md5,f477bbef548fbed665734ebf084eea2f", + "ERX1188904_ERR1109373_1.fastq.gz.md5:md5,50c1c3108631dc32a3151b67e0260d86", + "ERX1188904_ERR1109373_2.fastq.gz.md5:md5,1f22463d410e91a288c83d43654b2499", + "ERX1234253_ERR1160846.fastq.gz.md5:md5,513a8437ad331fc512b088b3750aa1ff", + "SRX17709227_SRR21711856.fastq.gz.md5:md5,13a38fbef27c3e15867d80887145ae75", + "SRX17709228_SRR21711855.fastq.gz.md5:md5,1e871ddd9e92e1866e0c64d36eb5ec85", + "SRX6725035_SRR9984183.fastq.gz.md5:md5,84f59dbb76c9b5eab7e14d90ced352c4", + "SRX9504942_SRR13055517_1.fastq.gz.md5:md5,a03f7f374dc401047b6f6ccaec3885cc", + "SRX9504942_SRR13055517_2.fastq.gz.md5:md5,facaf207753e977327e7b7df7bb8ace0", + "SRX9504942_SRR13055518_1.fastq.gz.md5:md5,5cf412cd62aadaa4838d9eabb5b44368", + "SRX9504942_SRR13055518_2.fastq.gz.md5:md5,93292b826afc72b23be93df26dd710c8", + "SRX9504942_SRR13055519_1.fastq.gz.md5:md5,f6ad6e2610397147a0a55c651de3992f", + "SRX9504942_SRR13055519_2.fastq.gz.md5:md5,2fe7dd4bcc1e7e61c6f54ef50cf961f3", + "SRX9504942_SRR13055520_1.fastq.gz.md5:md5,ab195b37746a3424a1099d9f8cc58de8", + "SRX9504942_SRR13055520_2.fastq.gz.md5:md5,10c448e23f1f7e7af61ec1204f8fc882", + "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", + "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" + ] + ], + "timestamp": "2023-07-06T14:05:23+0000" + } +} \ No newline at end of file diff --git a/workflows/sra/tests/with_viralrecon_samplesheet.nf.test b/workflows/sra/tests/with_viralrecon_samplesheet.nf.test new file mode 100644 index 00000000..e10e2db8 --- /dev/null +++ b/workflows/sra/tests/with_viralrecon_samplesheet.nf.test @@ -0,0 +1,39 @@ +nextflow_pipeline { + + name "Test Workflow main.nf" + script "main.nf" + tag "sra_with_viralrecon" + tag "workflow" + + test("SRA NF-CORE/VIRALRECON Samplesheet") { + + when { + params { + outdir = "$outputDir" + nf_core_pipeline = "viralrecon" + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(NftestUtils.removeNextflowVersion("$outputDir")).match("software_versions") }, + { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, + { assert snapshot(path("$outputDir/metadata/DRR026872.runinfo_ftp.tsv"), + path("$outputDir/metadata/DRR028935.runinfo_ftp.tsv"), + path("$outputDir/metadata/ERR1109373.runinfo_ftp.tsv"), + path("$outputDir/metadata/ERR1160846.runinfo_ftp.tsv"), + path("$outputDir/metadata/GSE214215.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR12848126.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR13191702.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR14593545.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR14709033.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR9984183.runinfo_ftp.tsv")).match("metadata") }, + { assert new File("$outputDir/metadata/GSM4907283.runinfo_ftp.tsv").exists() }, + { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), + path("$outputDir/samplesheet/multiqc_config.yml")).match("samplesheet") }, + { assert new File("$outputDir/samplesheet/samplesheet.csv").exists() } + ) + } + } +} diff --git a/workflows/sra/tests/with_viralrecon_samplesheet.nf.test.snap b/workflows/sra/tests/with_viralrecon_samplesheet.nf.test.snap new file mode 100644 index 00000000..34e8a234 --- /dev/null +++ b/workflows/sra/tests/with_viralrecon_samplesheet.nf.test.snap @@ -0,0 +1,80 @@ +{ + "metadata": { + "content": [ + "DRR026872.runinfo_ftp.tsv:md5,ef90876b2cbcb3721251b4cdef8cc47b", + "DRR028935.runinfo_ftp.tsv:md5,f79eefcea5db346f76f76f87df7f8dd2", + "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", + "ERR1160846.runinfo_ftp.tsv:md5,1b2dc1a64117de20b2164724836da345", + "GSE214215.runinfo_ftp.tsv:md5,23a580c89ee7bf681ca3ffa26aa1837f", + "SRR12848126.runinfo_ftp.tsv:md5,5d1e6bfd3d4077d1e66378c58e44975d", + "SRR13191702.runinfo_ftp.tsv:md5,409e262bb41bb6103315126db4d0dd1d", + "SRR14593545.runinfo_ftp.tsv:md5,888eaa19fd0b7fea4dc3e9800c1d26f2", + "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", + "SRR9984183.runinfo_ftp.tsv:md5,911a48308f76387b97842d35abc43c8f" + ], + "timestamp": "2023-07-06T13:44:03+0000" + }, + "samplesheet": { + "content": [ + "id_mappings.csv:md5,aa5eab8068e59a3866fd6d1fa8fe1b5a", + "multiqc_config.yml:md5,1337fdab76cbca9b78dbf06d7344a3b8" + ], + "timestamp": "2023-07-06T13:44:03+0000" + }, + "software_versions": { + "content": [ + "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" + ], + "timestamp": "2023-07-06T13:44:03+0000" + }, + "fastq": { + "content": [ + "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791", + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30", + "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9", + "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6", + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2", + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda", + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64", + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83", + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544", + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79", + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962", + "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76", + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88", + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04", + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98", + [ + "DRX024467_DRR026872.fastq.gz.md5:md5,dacaeba3498fb8f405411a22cdb4b40d", + "DRX026011_DRR028935_1.fastq.gz.md5:md5,a47018c5972ba4c11539d0d6bc25eda9", + "DRX026011_DRR028935_2.fastq.gz.md5:md5,f477bbef548fbed665734ebf084eea2f", + "ERX1188904_ERR1109373_1.fastq.gz.md5:md5,50c1c3108631dc32a3151b67e0260d86", + "ERX1188904_ERR1109373_2.fastq.gz.md5:md5,1f22463d410e91a288c83d43654b2499", + "ERX1234253_ERR1160846.fastq.gz.md5:md5,513a8437ad331fc512b088b3750aa1ff", + "SRX17709227_SRR21711856.fastq.gz.md5:md5,13a38fbef27c3e15867d80887145ae75", + "SRX17709228_SRR21711855.fastq.gz.md5:md5,1e871ddd9e92e1866e0c64d36eb5ec85", + "SRX6725035_SRR9984183.fastq.gz.md5:md5,84f59dbb76c9b5eab7e14d90ced352c4", + "SRX9504942_SRR13055517_1.fastq.gz.md5:md5,a03f7f374dc401047b6f6ccaec3885cc", + "SRX9504942_SRR13055517_2.fastq.gz.md5:md5,facaf207753e977327e7b7df7bb8ace0", + "SRX9504942_SRR13055518_1.fastq.gz.md5:md5,5cf412cd62aadaa4838d9eabb5b44368", + "SRX9504942_SRR13055518_2.fastq.gz.md5:md5,93292b826afc72b23be93df26dd710c8", + "SRX9504942_SRR13055519_1.fastq.gz.md5:md5,f6ad6e2610397147a0a55c651de3992f", + "SRX9504942_SRR13055519_2.fastq.gz.md5:md5,2fe7dd4bcc1e7e61c6f54ef50cf961f3", + "SRX9504942_SRR13055520_1.fastq.gz.md5:md5,ab195b37746a3424a1099d9f8cc58de8", + "SRX9504942_SRR13055520_2.fastq.gz.md5:md5,10c448e23f1f7e7af61ec1204f8fc882", + "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", + "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" + ] + ], + "timestamp": "2023-07-06T13:44:03+0000" + } +} \ No newline at end of file diff --git a/workflows/synapse.nf b/workflows/synapse/main.nf similarity index 89% rename from workflows/synapse.nf rename to workflows/synapse/main.nf index f2138a60..7d871659 100644 --- a/workflows/synapse.nf +++ b/workflows/synapse/main.nf @@ -19,11 +19,11 @@ if (params.synapse_config) { ======================================================================================== */ -include { SYNAPSE_LIST } from '../modules/local/synapse_list' -include { SYNAPSE_SHOW } from '../modules/local/synapse_show' -include { SYNAPSE_GET } from '../modules/local/synapse_get' -include { SYNAPSE_TO_SAMPLESHEET } from '../modules/local/synapse_to_samplesheet' -include { SYNAPSE_MERGE_SAMPLESHEET } from '../modules/local/synapse_merge_samplesheet' +include { SYNAPSE_LIST } from '../../modules/local/synapse_list' +include { SYNAPSE_SHOW } from '../../modules/local/synapse_show' +include { SYNAPSE_GET } from '../../modules/local/synapse_get' +include { SYNAPSE_TO_SAMPLESHEET } from '../../modules/local/synapse_to_samplesheet' +include { SYNAPSE_MERGE_SAMPLESHEET } from '../../modules/local/synapse_merge_samplesheet' /* ======================================================================================== @@ -31,7 +31,7 @@ include { SYNAPSE_MERGE_SAMPLESHEET } from '../modules/local/synapse_merge_sampl ======================================================================================== */ -include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/custom/dumpsoftwareversions/main' +include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../../modules/nf-core/custom/dumpsoftwareversions/main' /* ======================================================================================== diff --git a/tests/pipeline/synapse.test b/workflows/synapse/tests/synapse.test similarity index 100% rename from tests/pipeline/synapse.test rename to workflows/synapse/tests/synapse.test From 65fc8d2d4ec98ed1635ed604f87c983bcb692bb6 Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Wed, 19 Jul 2023 08:28:15 -0400 Subject: [PATCH 371/852] include test_data config to point to nf-core/test-datasets --- conf/test.config | 3 +++ conf/test_data.config | 15 ++++++++------- .../multiqc_mappings_config.nf.test | 4 ++-- modules/local/sra_fastq_ftp/sra_fastq_ftp.nf.test | 3 ++- .../sra_merge_samplesheet.nf.test | 6 +++--- .../sra_runinfo_to_ftp/sra_runinfo_to_ftp.nf.test | 4 ++-- .../sra_to_samplesheet/sra_to_samplesheet.nf.test | 5 +++-- 7 files changed, 23 insertions(+), 17 deletions(-) diff --git a/conf/test.config b/conf/test.config index 3c58e9cf..0bc98595 100644 --- a/conf/test.config +++ b/conf/test.config @@ -22,3 +22,6 @@ params { // Input data input = 'https://raw.githubusercontent.com/nf-core/test-datasets/fetchngs/sra_ids_test.csv' } + +// Load test_data.config for nf-tests +includeConfig 'test_data.config' diff --git a/conf/test_data.config b/conf/test_data.config index 31639250..16acdabf 100644 --- a/conf/test_data.config +++ b/conf/test_data.config @@ -2,13 +2,14 @@ params { // Base directory for test data test_data_base = "https://raw.githubusercontent.com/nf-core/test-datasets/fetchngs" - modules { - 'local' { - multiqc_mappings_config = "${params.test_data_base}/modules/local/multiqc_mappings_config/" - sra_merge_samplesheet = "${params.test_data_base}/modules/local/sra_merge_samplesheet/" - sra_to_samplesheet = "${params.test_data_base}/modules/local/sra_to_samplesheet/" - sra_fastq_ftp = "${params.test_data_base}/modules/local/sra_fastq_ftp/" - sra_runinfo_to_ftp = "${params.test_data_base}/modules/local/sra_runinfo_to_ftp/" + test_data { + 'modules_local' { + multiqc_mappings_config = "${params.test_data_base}/modules/local/multiqc_mappings_config/SRX9626017_SRR13191702.mappings.csv" + sra_merge_samplesheet_samplesheets = "${params.test_data_base}/modules/local/sra_merge_samplesheet/samplesheets/" + sra_merge_samplesheet_mappings = "${params.test_data_base}/modules/local/sra_merge_samplesheet/mappings/" + sra_to_samplesheet = "${params.test_data_base}/modules/local/sra_to_samplesheet/SRX9626017_SRR13191702.mappings.csv" + sra_fastq_ftp = "${params.test_data_base}/modules/local/sra_fastq_ftp/" + sra_runinfo_to_ftp = "${params.test_data_base}/modules/local/sra_runinfo_to_ftp/SRR13191702.runinfo.tsv" } } } diff --git a/modules/local/multiqc_mappings_config/multiqc_mappings_config.nf.test b/modules/local/multiqc_mappings_config/multiqc_mappings_config.nf.test index 7a0fe2dd..a5c148dc 100644 --- a/modules/local/multiqc_mappings_config/multiqc_mappings_config.nf.test +++ b/modules/local/multiqc_mappings_config/multiqc_mappings_config.nf.test @@ -1,7 +1,7 @@ nextflow_process { name "Test Process MULTIQC_MAPPINGS_CONFIG" - script "modules/local/multiqc_mappings_config.nf" + script "modules/local/multiqc_mappings_config/multiqc_mappings_config.nf" process "MULTIQC_MAPPINGS_CONFIG" tag "multiqc_mappings_config" tag "modules_local" @@ -14,7 +14,7 @@ nextflow_process { } process { """ - input[0] = file("$baseDir/modules/local/tests/input/multiqc_mappings_config/SRX9626017_SRR13191702.mappings.csv", checkIfExists: true) + input[0] = file(params.test_data['modules_local']['multiqc_mappings_config'], checkIfExists: true) """ } } diff --git a/modules/local/sra_fastq_ftp/sra_fastq_ftp.nf.test b/modules/local/sra_fastq_ftp/sra_fastq_ftp.nf.test index fb8d53e2..7ba37846 100644 --- a/modules/local/sra_fastq_ftp/sra_fastq_ftp.nf.test +++ b/modules/local/sra_fastq_ftp/sra_fastq_ftp.nf.test @@ -1,9 +1,10 @@ nextflow_process { name "Test Process SRA_FASTQ_FTP" - script "modules/local/sra_fastq_ftp.nf" + script "modules/local/sra_fastq_ftp/sra_fastq_ftp.nf" process "SRA_FASTQ_FTP" tag "sra_fastq_ftp" + tag "modules_local" test("Should run without failures") { diff --git a/modules/local/sra_merge_samplesheet/sra_merge_samplesheet.nf.test b/modules/local/sra_merge_samplesheet/sra_merge_samplesheet.nf.test index 00c23f19..fae3fdf1 100644 --- a/modules/local/sra_merge_samplesheet/sra_merge_samplesheet.nf.test +++ b/modules/local/sra_merge_samplesheet/sra_merge_samplesheet.nf.test @@ -1,7 +1,7 @@ nextflow_process { name "Test Process SRA_MERGE_SAMPLESHEET" - script "modules/local/sra_merge_samplesheet.nf" + script "modules/local/sra_merge_samplesheet/sra_merge_samplesheet.nf" process "SRA_MERGE_SAMPLESHEET" tag "sra_merge_samplesheet" tag "modules_local" @@ -14,8 +14,8 @@ nextflow_process { } process { """ - input[0] = file("$baseDir/modules/local/tests/input/sra_merge_samplesheet/samplesheets/*", checkIfExists: true) - input[1] = file("$baseDir/modules/local/tests/input/sra_merge_samplesheet/mappings/*", checkIfExists: true) + input[0] = file(params.test_data['modules_local']['sra_merge_samplesheet_samplesheets'], checkIfExists: true) + input[1] = file(params.test_data['modules_local']['sra_merge_samplesheet_mappings'], checkIfExists: true) """ } } diff --git a/modules/local/sra_runinfo_to_ftp/sra_runinfo_to_ftp.nf.test b/modules/local/sra_runinfo_to_ftp/sra_runinfo_to_ftp.nf.test index 14bb829b..dfff36fe 100644 --- a/modules/local/sra_runinfo_to_ftp/sra_runinfo_to_ftp.nf.test +++ b/modules/local/sra_runinfo_to_ftp/sra_runinfo_to_ftp.nf.test @@ -1,7 +1,7 @@ nextflow_process { name "Test Process SRA_RUNINFO_TO_FTP" - script "modules/local/sra_runinfo_to_ftp.nf" + script "modules/local/sra_runinfo_to_ftp/sra_runinfo_to_ftp.nf" process "SRA_RUNINFO_TO_FTP" tag "sra_runinfo_to_ftp" tag "modules_local" @@ -14,7 +14,7 @@ nextflow_process { } process { """ - input[0] = file("$baseDir/modules/local/tests/input/sra_runinfo_to_ftp/SRR13191702.runinfo.tsv", checkIfExists: true) + input[0] = file(params.test_data['modules_local']['sra_runinfo_to_ftp'], checkIfExists: true) """ } } diff --git a/modules/local/sra_to_samplesheet/sra_to_samplesheet.nf.test b/modules/local/sra_to_samplesheet/sra_to_samplesheet.nf.test index 413c6410..a9e8c1f7 100644 --- a/modules/local/sra_to_samplesheet/sra_to_samplesheet.nf.test +++ b/modules/local/sra_to_samplesheet/sra_to_samplesheet.nf.test @@ -1,9 +1,10 @@ nextflow_process { name "Test Process SRA_TO_SAMPLESHEET" - script "modules/local/sra_to_samplesheet.nf" + script "modules/local/sra_to_samplesheet/sra_to_samplesheet.nf" process "SRA_TO_SAMPLESHEET" tag "sra_to_samplesheet" + tag "modules_local" test("Should run without failures") { @@ -16,7 +17,7 @@ nextflow_process { input[1] = input[2] = input[3] = - input[4] = file("$baseDir/modules/local/tests/input/sra_to_samplesheet/SRX9626017_SRR13191702.mappings.csv", checkIfExists: true) + input[4] = file(params.test_data['modules_local']['sra_to_samplesheet'], checkIfExists: true) """ } } From 2011565650099d464a19971d35b292500750c201 Mon Sep 17 00:00:00 2001 From: Sateesh Peri Date: Sun, 6 Aug 2023 19:54:56 -0400 Subject: [PATCH 372/852] update test_data config to fetch urls and update snapshots --- conf/test_data.config | 27 +++- .../local/sra_fastq_ftp/sra_fastq_ftp.nf.test | 6 +- .../sra_fastq_ftp/sra_fastq_ftp.nf.test.snap | 140 ++++++++++++++++++ .../sra_ids_to_runinfo.nf.test | 4 +- .../sra_ids_to_runinfo.nf.test.snap | 6 +- .../sra_merge_samplesheet.nf.test | 4 +- .../sra_runinfo_to_ftp.nf.test.snap | 2 +- .../sra_to_samplesheet.nf.test | 9 +- workflows/sra/tests/skip_fastq.nf.test.snap | 16 +- workflows/sra/tests/sra.nf.test.snap | 18 +-- .../with_atacseq_samplesheet.nf.test.snap | 18 +-- .../with_rnaseq_samplesheet.nf.test.snap | 18 +-- .../sra/tests/with_sratools.nf.test.snap | 18 +-- .../with_taxprofiler_samplesheet.nf.test.snap | 18 +-- .../with_viralrecon_samplesheet.nf.test.snap | 18 +-- 15 files changed, 241 insertions(+), 81 deletions(-) create mode 100644 modules/local/sra_fastq_ftp/sra_fastq_ftp.nf.test.snap diff --git a/conf/test_data.config b/conf/test_data.config index 16acdabf..42d3d818 100644 --- a/conf/test_data.config +++ b/conf/test_data.config @@ -2,13 +2,34 @@ params { // Base directory for test data test_data_base = "https://raw.githubusercontent.com/nf-core/test-datasets/fetchngs" + merge_samplesheet_ids = [ "DRX024467_DRR026872", "SRX11047067_SRR14709033", "SRX9504942_SRR13055517", "DRX026011_DRR028935", "SRX17709227_SRR21711856", "SRX9504942_SRR13055518", "ERX1188904_ERR1109373", "SRX17709228_SRR21711855", "SRX9504942_SRR13055519", "ERX1234253_ERR1160846", "SRX6725035_SRR9984183", "SRX9504942_SRR13055520", "SRX10940790_SRR14593545", "SRX9315476_SRR12848126", "SRX9626017_SRR13191702" ] + + def merge_samplesheet_url = "${params.test_data_base}/modules/local/sra_merge_samplesheet/samplesheets/" + def merge_mappings_url = "${params.test_data_base}/modules/local/sra_merge_samplesheet/mappings/" + def merge_samplesheet_urls = [] + def merge_mappings_urls = [] + + merge_samplesheet_ids.each { id -> + merge_samplesheet_urls += "${merge_samplesheet_url}${id}.samplesheet.csv" + merge_mappings_urls += "${merge_mappings_url}/${id}.mappings.csv" + } + + fastq_ftp_ids = ["SRR13191702"] + def fastq_ftp_url = "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/" + def fastq_ftp_urls = [] + + fastq_ftp_ids.each { id -> + fastq_ftp_urls += "${fastq_ftp_url}${id}_1.fastq.gz" + fastq_ftp_urls += "${fastq_ftp_url}${id}_2.fastq.gz" + } + test_data { 'modules_local' { multiqc_mappings_config = "${params.test_data_base}/modules/local/multiqc_mappings_config/SRX9626017_SRR13191702.mappings.csv" - sra_merge_samplesheet_samplesheets = "${params.test_data_base}/modules/local/sra_merge_samplesheet/samplesheets/" - sra_merge_samplesheet_mappings = "${params.test_data_base}/modules/local/sra_merge_samplesheet/mappings/" + sra_merge_samplesheet_samplesheets = merge_samplesheet_urls + sra_merge_samplesheet_mappings = merge_mappings_urls sra_to_samplesheet = "${params.test_data_base}/modules/local/sra_to_samplesheet/SRX9626017_SRR13191702.mappings.csv" - sra_fastq_ftp = "${params.test_data_base}/modules/local/sra_fastq_ftp/" + sra_fastq_ftp = fastq_ftp_urls sra_runinfo_to_ftp = "${params.test_data_base}/modules/local/sra_runinfo_to_ftp/SRR13191702.runinfo.tsv" } } diff --git a/modules/local/sra_fastq_ftp/sra_fastq_ftp.nf.test b/modules/local/sra_fastq_ftp/sra_fastq_ftp.nf.test index 7ba37846..5fa043ab 100644 --- a/modules/local/sra_fastq_ftp/sra_fastq_ftp.nf.test +++ b/modules/local/sra_fastq_ftp/sra_fastq_ftp.nf.test @@ -6,7 +6,7 @@ nextflow_process { tag "sra_fastq_ftp" tag "modules_local" - test("Should run without failures") { + test("SRX9626017_SRR13191702") { when { params { @@ -15,8 +15,8 @@ nextflow_process { process { """ input[0] = [ - [ id:'SRX9626017_SRR13191702', single_end:false ], // meta map - [ SRR13191702 ] + [ id:'SRX9626017_SRR13191702', single_end:false, md5_1: '89c5be920021a035084d8aeb74f32df7', md5_2: '56271be38a80db78ef3bdfc5d9909b98' ], // meta map + params.test_data['modules_local']['sra_fastq_ftp'] ] """ } diff --git a/modules/local/sra_fastq_ftp/sra_fastq_ftp.nf.test.snap b/modules/local/sra_fastq_ftp/sra_fastq_ftp.nf.test.snap new file mode 100644 index 00000000..c0d5ffdc --- /dev/null +++ b/modules/local/sra_fastq_ftp/sra_fastq_ftp.nf.test.snap @@ -0,0 +1,140 @@ +{ + "SRX9626017_SRR13191702": { + "content": [ + { + "0": [ + [ + { + "id": "SRX9626017_SRR13191702", + "single_end": false, + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98" + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + ] + ] + ], + "1": [ + [ + { + "id": "SRX9626017_SRR13191702", + "single_end": false, + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98" + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", + "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" + ] + ] + ], + "2": [ + "versions.yml:md5,6b9d69dea1c1305f74a65197ee871f1b" + ], + "fastq": [ + [ + { + "id": "SRX9626017_SRR13191702", + "single_end": false, + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98" + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + ] + ] + ], + "md5": [ + [ + { + "id": "SRX9626017_SRR13191702", + "single_end": false, + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98" + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", + "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" + ] + ] + ], + "versions": [ + "versions.yml:md5,6b9d69dea1c1305f74a65197ee871f1b" + ] + } + ], + "timestamp": "2023-08-06T23:31:57+0000" + }, + "Should run without failures": { + "content": [ + { + "0": [ + [ + { + "id": "SRX9626017_SRR13191702", + "single_end": false, + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98" + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + ] + ] + ], + "1": [ + [ + { + "id": "SRX9626017_SRR13191702", + "single_end": false, + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98" + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", + "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" + ] + ] + ], + "2": [ + "versions.yml:md5,6b9d69dea1c1305f74a65197ee871f1b" + ], + "fastq": [ + [ + { + "id": "SRX9626017_SRR13191702", + "single_end": false, + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98" + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + ] + ] + ], + "md5": [ + [ + { + "id": "SRX9626017_SRR13191702", + "single_end": false, + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98" + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", + "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" + ] + ] + ], + "versions": [ + "versions.yml:md5,6b9d69dea1c1305f74a65197ee871f1b" + ] + } + ], + "timestamp": "2023-08-06T23:31:57+0000" + } +} \ No newline at end of file diff --git a/modules/local/sra_ids_to_runinfo/sra_ids_to_runinfo.nf.test b/modules/local/sra_ids_to_runinfo/sra_ids_to_runinfo.nf.test index 36699bb4..a89e21fa 100644 --- a/modules/local/sra_ids_to_runinfo/sra_ids_to_runinfo.nf.test +++ b/modules/local/sra_ids_to_runinfo/sra_ids_to_runinfo.nf.test @@ -1,7 +1,7 @@ nextflow_process { name "Test Process SRA_IDS_TO_RUNINFO" - script "modules/local/sra_ids_to_runinfo.nf" + script "modules/local/sra_ids_to_runinfo/sra_ids_to_runinfo.nf" process "SRA_IDS_TO_RUNINFO" tag "sra_ids_to_runinfo" tag "modules_local" @@ -14,7 +14,7 @@ nextflow_process { } process { """ - input[0] = 'SRR9984183' + input[0] = 'SRR13191702' input[1] = '' """ } diff --git a/modules/local/sra_ids_to_runinfo/sra_ids_to_runinfo.nf.test.snap b/modules/local/sra_ids_to_runinfo/sra_ids_to_runinfo.nf.test.snap index d4e1e05d..dbca931f 100644 --- a/modules/local/sra_ids_to_runinfo/sra_ids_to_runinfo.nf.test.snap +++ b/modules/local/sra_ids_to_runinfo/sra_ids_to_runinfo.nf.test.snap @@ -3,19 +3,19 @@ "content": [ { "0": [ - "SRR9984183.runinfo.tsv:md5,51cba5fab4d6f0c0386e4397672240b9" + "SRR13191702.runinfo.tsv:md5,3a1be35781ca6e8a28d8fd4d2f3bbe85" ], "1": [ "versions.yml:md5,1c14442e9b494b586eafe41e77300fae" ], "tsv": [ - "SRR9984183.runinfo.tsv:md5,51cba5fab4d6f0c0386e4397672240b9" + "SRR13191702.runinfo.tsv:md5,3a1be35781ca6e8a28d8fd4d2f3bbe85" ], "versions": [ "versions.yml:md5,1c14442e9b494b586eafe41e77300fae" ] } ], - "timestamp": "2023-07-06T13:16:51+0000" + "timestamp": "2023-08-06T23:30:51+0000" } } \ No newline at end of file diff --git a/modules/local/sra_merge_samplesheet/sra_merge_samplesheet.nf.test b/modules/local/sra_merge_samplesheet/sra_merge_samplesheet.nf.test index fae3fdf1..9385dab8 100644 --- a/modules/local/sra_merge_samplesheet/sra_merge_samplesheet.nf.test +++ b/modules/local/sra_merge_samplesheet/sra_merge_samplesheet.nf.test @@ -14,8 +14,8 @@ nextflow_process { } process { """ - input[0] = file(params.test_data['modules_local']['sra_merge_samplesheet_samplesheets'], checkIfExists: true) - input[1] = file(params.test_data['modules_local']['sra_merge_samplesheet_mappings'], checkIfExists: true) + input[0] = params.test_data['modules_local']['sra_merge_samplesheet_samplesheets'].collect { file(it, checkIfExists: true) } + input[1] = params.test_data['modules_local']['sra_merge_samplesheet_mappings'].collect { file(it, checkIfExists: true) } """ } } diff --git a/modules/local/sra_runinfo_to_ftp/sra_runinfo_to_ftp.nf.test.snap b/modules/local/sra_runinfo_to_ftp/sra_runinfo_to_ftp.nf.test.snap index 03cf80e8..71a25f99 100644 --- a/modules/local/sra_runinfo_to_ftp/sra_runinfo_to_ftp.nf.test.snap +++ b/modules/local/sra_runinfo_to_ftp/sra_runinfo_to_ftp.nf.test.snap @@ -16,6 +16,6 @@ ] } ], - "timestamp": "2023-07-06T02:05:52+0000" + "timestamp": "2023-08-06T23:13:20+0000" } } \ No newline at end of file diff --git a/modules/local/sra_to_samplesheet/sra_to_samplesheet.nf.test b/modules/local/sra_to_samplesheet/sra_to_samplesheet.nf.test index a9e8c1f7..5c7ff7d9 100644 --- a/modules/local/sra_to_samplesheet/sra_to_samplesheet.nf.test +++ b/modules/local/sra_to_samplesheet/sra_to_samplesheet.nf.test @@ -4,7 +4,6 @@ nextflow_process { script "modules/local/sra_to_samplesheet/sra_to_samplesheet.nf" process "SRA_TO_SAMPLESHEET" tag "sra_to_samplesheet" - tag "modules_local" test("Should run without failures") { @@ -14,10 +13,10 @@ nextflow_process { } process { """ - input[1] = - input[2] = - input[3] = - input[4] = file(params.test_data['modules_local']['sra_to_samplesheet'], checkIfExists: true) + input[0] = 'meta' + input[1] = 'rnaseq' + input[2] = 'strandedness' + input[3] = 'mapping_fields' """ } } diff --git a/workflows/sra/tests/skip_fastq.nf.test.snap b/workflows/sra/tests/skip_fastq.nf.test.snap index 6d3201e8..7f71a838 100644 --- a/workflows/sra/tests/skip_fastq.nf.test.snap +++ b/workflows/sra/tests/skip_fastq.nf.test.snap @@ -1,30 +1,30 @@ { "metadata": { "content": [ - "DRR026872.runinfo_ftp.tsv:md5,ef90876b2cbcb3721251b4cdef8cc47b", + "DRR026872.runinfo_ftp.tsv:md5,73606f6a05c45b077809da43ca638b5f", "DRR028935.runinfo_ftp.tsv:md5,f79eefcea5db346f76f76f87df7f8dd2", "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", "ERR1160846.runinfo_ftp.tsv:md5,1b2dc1a64117de20b2164724836da345", "GSE214215.runinfo_ftp.tsv:md5,23a580c89ee7bf681ca3ffa26aa1837f", "SRR12848126.runinfo_ftp.tsv:md5,5d1e6bfd3d4077d1e66378c58e44975d", "SRR13191702.runinfo_ftp.tsv:md5,409e262bb41bb6103315126db4d0dd1d", - "SRR14593545.runinfo_ftp.tsv:md5,888eaa19fd0b7fea4dc3e9800c1d26f2", + "SRR14593545.runinfo_ftp.tsv:md5,62015706ac156693ba3d86ed050cab54", "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", - "SRR9984183.runinfo_ftp.tsv:md5,911a48308f76387b97842d35abc43c8f" + "SRR9984183.runinfo_ftp.tsv:md5,53ab34ff3612b0e2c7d60476822787be" ], - "timestamp": "2023-07-06T14:02:03+0000" + "timestamp": "2023-08-06T23:37:00+0000" }, "samplesheet": { "content": [ - "id_mappings.csv:md5,aa5eab8068e59a3866fd6d1fa8fe1b5a", - "multiqc_config.yml:md5,1337fdab76cbca9b78dbf06d7344a3b8" + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565", + "multiqc_config.yml:md5,a97047e12b0ea3f46d285629e4053548" ], - "timestamp": "2023-07-06T14:02:03+0000" + "timestamp": "2023-08-06T23:37:00+0000" }, "software_versions": { "content": [ "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" ], - "timestamp": "2023-07-06T14:02:03+0000" + "timestamp": "2023-08-06T23:37:00+0000" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra.nf.test.snap b/workflows/sra/tests/sra.nf.test.snap index a4276e94..dcdb43b5 100644 --- a/workflows/sra/tests/sra.nf.test.snap +++ b/workflows/sra/tests/sra.nf.test.snap @@ -1,31 +1,31 @@ { "metadata": { "content": [ - "DRR026872.runinfo_ftp.tsv:md5,ef90876b2cbcb3721251b4cdef8cc47b", + "DRR026872.runinfo_ftp.tsv:md5,73606f6a05c45b077809da43ca638b5f", "DRR028935.runinfo_ftp.tsv:md5,f79eefcea5db346f76f76f87df7f8dd2", "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", "ERR1160846.runinfo_ftp.tsv:md5,1b2dc1a64117de20b2164724836da345", "GSE214215.runinfo_ftp.tsv:md5,23a580c89ee7bf681ca3ffa26aa1837f", "SRR12848126.runinfo_ftp.tsv:md5,5d1e6bfd3d4077d1e66378c58e44975d", "SRR13191702.runinfo_ftp.tsv:md5,409e262bb41bb6103315126db4d0dd1d", - "SRR14593545.runinfo_ftp.tsv:md5,888eaa19fd0b7fea4dc3e9800c1d26f2", + "SRR14593545.runinfo_ftp.tsv:md5,62015706ac156693ba3d86ed050cab54", "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", - "SRR9984183.runinfo_ftp.tsv:md5,911a48308f76387b97842d35abc43c8f" + "SRR9984183.runinfo_ftp.tsv:md5,53ab34ff3612b0e2c7d60476822787be" ], - "timestamp": "2023-07-06T14:10:16+0000" + "timestamp": "2023-08-06T23:48:50+0000" }, "samplesheet": { "content": [ - "id_mappings.csv:md5,aa5eab8068e59a3866fd6d1fa8fe1b5a", - "multiqc_config.yml:md5,1337fdab76cbca9b78dbf06d7344a3b8" + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565", + "multiqc_config.yml:md5,a97047e12b0ea3f46d285629e4053548" ], - "timestamp": "2023-07-06T14:10:16+0000" + "timestamp": "2023-08-06T23:48:50+0000" }, "software_versions": { "content": [ "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" ], - "timestamp": "2023-07-06T14:10:16+0000" + "timestamp": "2023-08-06T23:48:50+0000" }, "fastq": { "content": [ @@ -75,6 +75,6 @@ "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" ] ], - "timestamp": "2023-07-06T14:10:16+0000" + "timestamp": "2023-08-06T23:48:50+0000" } } \ No newline at end of file diff --git a/workflows/sra/tests/with_atacseq_samplesheet.nf.test.snap b/workflows/sra/tests/with_atacseq_samplesheet.nf.test.snap index e49f6010..a9dd40a0 100644 --- a/workflows/sra/tests/with_atacseq_samplesheet.nf.test.snap +++ b/workflows/sra/tests/with_atacseq_samplesheet.nf.test.snap @@ -1,31 +1,31 @@ { "metadata": { "content": [ - "DRR026872.runinfo_ftp.tsv:md5,ef90876b2cbcb3721251b4cdef8cc47b", + "DRR026872.runinfo_ftp.tsv:md5,73606f6a05c45b077809da43ca638b5f", "DRR028935.runinfo_ftp.tsv:md5,f79eefcea5db346f76f76f87df7f8dd2", "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", "ERR1160846.runinfo_ftp.tsv:md5,1b2dc1a64117de20b2164724836da345", "GSE214215.runinfo_ftp.tsv:md5,23a580c89ee7bf681ca3ffa26aa1837f", "SRR12848126.runinfo_ftp.tsv:md5,5d1e6bfd3d4077d1e66378c58e44975d", "SRR13191702.runinfo_ftp.tsv:md5,409e262bb41bb6103315126db4d0dd1d", - "SRR14593545.runinfo_ftp.tsv:md5,888eaa19fd0b7fea4dc3e9800c1d26f2", + "SRR14593545.runinfo_ftp.tsv:md5,62015706ac156693ba3d86ed050cab54", "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", - "SRR9984183.runinfo_ftp.tsv:md5,911a48308f76387b97842d35abc43c8f" + "SRR9984183.runinfo_ftp.tsv:md5,53ab34ff3612b0e2c7d60476822787be" ], - "timestamp": "2023-07-06T14:03:45+0000" + "timestamp": "2023-08-06T23:38:47+0000" }, "samplesheet": { "content": [ - "id_mappings.csv:md5,aa5eab8068e59a3866fd6d1fa8fe1b5a", - "multiqc_config.yml:md5,1337fdab76cbca9b78dbf06d7344a3b8" + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565", + "multiqc_config.yml:md5,a97047e12b0ea3f46d285629e4053548" ], - "timestamp": "2023-07-06T14:03:45+0000" + "timestamp": "2023-08-06T23:38:47+0000" }, "software_versions": { "content": [ "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" ], - "timestamp": "2023-07-06T14:03:45+0000" + "timestamp": "2023-08-06T23:38:47+0000" }, "fastq": { "content": [ @@ -75,6 +75,6 @@ "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" ] ], - "timestamp": "2023-07-06T14:03:45+0000" + "timestamp": "2023-08-06T23:38:47+0000" } } \ No newline at end of file diff --git a/workflows/sra/tests/with_rnaseq_samplesheet.nf.test.snap b/workflows/sra/tests/with_rnaseq_samplesheet.nf.test.snap index 1efae9c1..1e3e8a5b 100644 --- a/workflows/sra/tests/with_rnaseq_samplesheet.nf.test.snap +++ b/workflows/sra/tests/with_rnaseq_samplesheet.nf.test.snap @@ -1,31 +1,31 @@ { "metadata": { "content": [ - "DRR026872.runinfo_ftp.tsv:md5,ef90876b2cbcb3721251b4cdef8cc47b", + "DRR026872.runinfo_ftp.tsv:md5,73606f6a05c45b077809da43ca638b5f", "DRR028935.runinfo_ftp.tsv:md5,f79eefcea5db346f76f76f87df7f8dd2", "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", "ERR1160846.runinfo_ftp.tsv:md5,1b2dc1a64117de20b2164724836da345", "GSE214215.runinfo_ftp.tsv:md5,23a580c89ee7bf681ca3ffa26aa1837f", "SRR12848126.runinfo_ftp.tsv:md5,5d1e6bfd3d4077d1e66378c58e44975d", "SRR13191702.runinfo_ftp.tsv:md5,409e262bb41bb6103315126db4d0dd1d", - "SRR14593545.runinfo_ftp.tsv:md5,888eaa19fd0b7fea4dc3e9800c1d26f2", + "SRR14593545.runinfo_ftp.tsv:md5,62015706ac156693ba3d86ed050cab54", "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", - "SRR9984183.runinfo_ftp.tsv:md5,911a48308f76387b97842d35abc43c8f" + "SRR9984183.runinfo_ftp.tsv:md5,53ab34ff3612b0e2c7d60476822787be" ], - "timestamp": "2023-07-06T14:12:03+0000" + "timestamp": "2023-08-06T23:50:46+0000" }, "samplesheet": { "content": [ - "id_mappings.csv:md5,aa5eab8068e59a3866fd6d1fa8fe1b5a", - "multiqc_config.yml:md5,1337fdab76cbca9b78dbf06d7344a3b8" + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565", + "multiqc_config.yml:md5,a97047e12b0ea3f46d285629e4053548" ], - "timestamp": "2023-07-06T14:12:03+0000" + "timestamp": "2023-08-06T23:50:46+0000" }, "software_versions": { "content": [ "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" ], - "timestamp": "2023-07-06T14:12:03+0000" + "timestamp": "2023-08-06T23:50:46+0000" }, "fastq": { "content": [ @@ -75,6 +75,6 @@ "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" ] ], - "timestamp": "2023-07-06T14:12:03+0000" + "timestamp": "2023-08-06T23:50:46+0000" } } \ No newline at end of file diff --git a/workflows/sra/tests/with_sratools.nf.test.snap b/workflows/sra/tests/with_sratools.nf.test.snap index 7d6d007a..bbec9969 100644 --- a/workflows/sra/tests/with_sratools.nf.test.snap +++ b/workflows/sra/tests/with_sratools.nf.test.snap @@ -1,31 +1,31 @@ { "metadata": { "content": [ - "DRR026872.runinfo_ftp.tsv:md5,ef90876b2cbcb3721251b4cdef8cc47b", + "DRR026872.runinfo_ftp.tsv:md5,73606f6a05c45b077809da43ca638b5f", "DRR028935.runinfo_ftp.tsv:md5,f79eefcea5db346f76f76f87df7f8dd2", "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", "ERR1160846.runinfo_ftp.tsv:md5,1b2dc1a64117de20b2164724836da345", "GSE214215.runinfo_ftp.tsv:md5,23a580c89ee7bf681ca3ffa26aa1837f", "SRR12848126.runinfo_ftp.tsv:md5,5d1e6bfd3d4077d1e66378c58e44975d", "SRR13191702.runinfo_ftp.tsv:md5,409e262bb41bb6103315126db4d0dd1d", - "SRR14593545.runinfo_ftp.tsv:md5,888eaa19fd0b7fea4dc3e9800c1d26f2", + "SRR14593545.runinfo_ftp.tsv:md5,62015706ac156693ba3d86ed050cab54", "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", - "SRR9984183.runinfo_ftp.tsv:md5,911a48308f76387b97842d35abc43c8f" + "SRR9984183.runinfo_ftp.tsv:md5,53ab34ff3612b0e2c7d60476822787be" ], - "timestamp": "2023-07-06T14:08:40+0000" + "timestamp": "2023-08-06T23:43:45+0000" }, "samplesheet": { "content": [ - "id_mappings.csv:md5,aa5eab8068e59a3866fd6d1fa8fe1b5a", - "multiqc_config.yml:md5,1337fdab76cbca9b78dbf06d7344a3b8" + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565", + "multiqc_config.yml:md5,a97047e12b0ea3f46d285629e4053548" ], - "timestamp": "2023-07-06T14:08:40+0000" + "timestamp": "2023-08-06T23:43:45+0000" }, "software_versions": { "content": [ "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" ], - "timestamp": "2023-07-06T14:08:40+0000" + "timestamp": "2023-08-06T23:43:45+0000" }, "fastq": { "content": [ @@ -54,6 +54,6 @@ "SRX9626017_SRR13191702_1.fastq.gz:md5,627a90afcd9f3cfc7f5f91074f9a2df7", "SRX9626017_SRR13191702_2.fastq.gz:md5,3d9b2c68a8ad1547105b17de81b2d9af" ], - "timestamp": "2023-07-06T14:08:40+0000" + "timestamp": "2023-08-06T23:43:45+0000" } } \ No newline at end of file diff --git a/workflows/sra/tests/with_taxprofiler_samplesheet.nf.test.snap b/workflows/sra/tests/with_taxprofiler_samplesheet.nf.test.snap index 1e10d64b..b4fe3748 100644 --- a/workflows/sra/tests/with_taxprofiler_samplesheet.nf.test.snap +++ b/workflows/sra/tests/with_taxprofiler_samplesheet.nf.test.snap @@ -1,31 +1,31 @@ { "metadata": { "content": [ - "DRR026872.runinfo_ftp.tsv:md5,ef90876b2cbcb3721251b4cdef8cc47b", + "DRR026872.runinfo_ftp.tsv:md5,73606f6a05c45b077809da43ca638b5f", "DRR028935.runinfo_ftp.tsv:md5,f79eefcea5db346f76f76f87df7f8dd2", "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", "ERR1160846.runinfo_ftp.tsv:md5,1b2dc1a64117de20b2164724836da345", "GSE214215.runinfo_ftp.tsv:md5,23a580c89ee7bf681ca3ffa26aa1837f", "SRR12848126.runinfo_ftp.tsv:md5,5d1e6bfd3d4077d1e66378c58e44975d", "SRR13191702.runinfo_ftp.tsv:md5,409e262bb41bb6103315126db4d0dd1d", - "SRR14593545.runinfo_ftp.tsv:md5,888eaa19fd0b7fea4dc3e9800c1d26f2", + "SRR14593545.runinfo_ftp.tsv:md5,62015706ac156693ba3d86ed050cab54", "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", - "SRR9984183.runinfo_ftp.tsv:md5,911a48308f76387b97842d35abc43c8f" + "SRR9984183.runinfo_ftp.tsv:md5,53ab34ff3612b0e2c7d60476822787be" ], - "timestamp": "2023-07-06T14:05:23+0000" + "timestamp": "2023-08-06T23:40:33+0000" }, "samplesheet": { "content": [ - "id_mappings.csv:md5,aa5eab8068e59a3866fd6d1fa8fe1b5a", - "multiqc_config.yml:md5,1337fdab76cbca9b78dbf06d7344a3b8" + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565", + "multiqc_config.yml:md5,a97047e12b0ea3f46d285629e4053548" ], - "timestamp": "2023-07-06T14:05:23+0000" + "timestamp": "2023-08-06T23:40:33+0000" }, "software_versions": { "content": [ "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" ], - "timestamp": "2023-07-06T14:05:23+0000" + "timestamp": "2023-08-06T23:40:33+0000" }, "fastq": { "content": [ @@ -75,6 +75,6 @@ "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" ] ], - "timestamp": "2023-07-06T14:05:23+0000" + "timestamp": "2023-08-06T23:40:33+0000" } } \ No newline at end of file diff --git a/workflows/sra/tests/with_viralrecon_samplesheet.nf.test.snap b/workflows/sra/tests/with_viralrecon_samplesheet.nf.test.snap index 34e8a234..51b0ea51 100644 --- a/workflows/sra/tests/with_viralrecon_samplesheet.nf.test.snap +++ b/workflows/sra/tests/with_viralrecon_samplesheet.nf.test.snap @@ -1,31 +1,31 @@ { "metadata": { "content": [ - "DRR026872.runinfo_ftp.tsv:md5,ef90876b2cbcb3721251b4cdef8cc47b", + "DRR026872.runinfo_ftp.tsv:md5,73606f6a05c45b077809da43ca638b5f", "DRR028935.runinfo_ftp.tsv:md5,f79eefcea5db346f76f76f87df7f8dd2", "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", "ERR1160846.runinfo_ftp.tsv:md5,1b2dc1a64117de20b2164724836da345", "GSE214215.runinfo_ftp.tsv:md5,23a580c89ee7bf681ca3ffa26aa1837f", "SRR12848126.runinfo_ftp.tsv:md5,5d1e6bfd3d4077d1e66378c58e44975d", "SRR13191702.runinfo_ftp.tsv:md5,409e262bb41bb6103315126db4d0dd1d", - "SRR14593545.runinfo_ftp.tsv:md5,888eaa19fd0b7fea4dc3e9800c1d26f2", + "SRR14593545.runinfo_ftp.tsv:md5,62015706ac156693ba3d86ed050cab54", "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", - "SRR9984183.runinfo_ftp.tsv:md5,911a48308f76387b97842d35abc43c8f" + "SRR9984183.runinfo_ftp.tsv:md5,53ab34ff3612b0e2c7d60476822787be" ], - "timestamp": "2023-07-06T13:44:03+0000" + "timestamp": "2023-08-06T23:34:45+0000" }, "samplesheet": { "content": [ - "id_mappings.csv:md5,aa5eab8068e59a3866fd6d1fa8fe1b5a", - "multiqc_config.yml:md5,1337fdab76cbca9b78dbf06d7344a3b8" + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565", + "multiqc_config.yml:md5,a97047e12b0ea3f46d285629e4053548" ], - "timestamp": "2023-07-06T13:44:03+0000" + "timestamp": "2023-08-06T23:34:45+0000" }, "software_versions": { "content": [ "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" ], - "timestamp": "2023-07-06T13:44:03+0000" + "timestamp": "2023-08-06T23:34:45+0000" }, "fastq": { "content": [ @@ -75,6 +75,6 @@ "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" ] ], - "timestamp": "2023-07-06T13:44:03+0000" + "timestamp": "2023-08-06T23:34:45+0000" } } \ No newline at end of file From 4cf72b43e4d7668e9efbd6784a2ed8afb013bf00 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 16 Aug 2023 18:55:23 +0100 Subject: [PATCH 373/852] Restructure local modules and main script names --- .../{multiqc_mappings_config.nf => main.nf} | 0 .../{multiqc_mappings_config.nf.test => tests/main.nf.test} | 0 .../main.nf.test.snap} | 0 modules/local/sra_fastq_ftp/{sra_fastq_ftp.nf => main.nf} | 0 .../sra_fastq_ftp/{sra_fastq_ftp.nf.test => tests/main.nf.test} | 0 .../{sra_fastq_ftp.nf.test.snap => tests/main.nf.test.snap} | 0 .../local/sra_ids_to_runinfo/{sra_ids_to_runinfo.nf => main.nf} | 0 .../{sra_ids_to_runinfo.nf.test => tests/main.nf.test} | 0 .../{sra_ids_to_runinfo.nf.test.snap => tests/main.nf.test.snap} | 0 .../sra_merge_samplesheet/{sra_merge_samplesheet.nf => main.nf} | 0 .../{sra_merge_samplesheet.nf.test => tests/main.nf.test} | 0 .../main.nf.test.snap} | 0 .../local/sra_runinfo_to_ftp/{sra_runinfo_to_ftp.nf => main.nf} | 0 .../{sra_runinfo_to_ftp.nf.test => tests/main.nf.test} | 0 .../{sra_runinfo_to_ftp.nf.test.snap => tests/main.nf.test.snap} | 0 .../local/sra_to_samplesheet/{sra_to_samplesheet.nf => main.nf} | 0 .../{sra_to_samplesheet.nf.test => tests/main.nf.test} | 0 modules/local/synapse_get/{synapse_get.nf => main.nf} | 0 modules/local/synapse_list/{synapse_list.nf => main.nf} | 0 .../{synapse_merge_samplesheet.nf => main.nf} | 0 modules/local/synapse_show/{synapse_show.nf => main.nf} | 0 .../synapse_to_samplesheet.nf => synapse_to_samplesheet/main.nf} | 0 workflows/sra/tests/{sra.nf.test => main.nf.test} | 0 workflows/sra/tests/{sra.nf.test.snap => main.nf.test.snap} | 0 workflows/synapse/tests/{synapse.test => main.nf.test} | 0 25 files changed, 0 insertions(+), 0 deletions(-) rename modules/local/multiqc_mappings_config/{multiqc_mappings_config.nf => main.nf} (100%) rename modules/local/multiqc_mappings_config/{multiqc_mappings_config.nf.test => tests/main.nf.test} (100%) rename modules/local/multiqc_mappings_config/{multiqc_mappings_config.nf.test.snap => tests/main.nf.test.snap} (100%) rename modules/local/sra_fastq_ftp/{sra_fastq_ftp.nf => main.nf} (100%) rename modules/local/sra_fastq_ftp/{sra_fastq_ftp.nf.test => tests/main.nf.test} (100%) rename modules/local/sra_fastq_ftp/{sra_fastq_ftp.nf.test.snap => tests/main.nf.test.snap} (100%) rename modules/local/sra_ids_to_runinfo/{sra_ids_to_runinfo.nf => main.nf} (100%) rename modules/local/sra_ids_to_runinfo/{sra_ids_to_runinfo.nf.test => tests/main.nf.test} (100%) rename modules/local/sra_ids_to_runinfo/{sra_ids_to_runinfo.nf.test.snap => tests/main.nf.test.snap} (100%) rename modules/local/sra_merge_samplesheet/{sra_merge_samplesheet.nf => main.nf} (100%) rename modules/local/sra_merge_samplesheet/{sra_merge_samplesheet.nf.test => tests/main.nf.test} (100%) rename modules/local/sra_merge_samplesheet/{sra_merge_samplesheet.nf.test.snap => tests/main.nf.test.snap} (100%) rename modules/local/sra_runinfo_to_ftp/{sra_runinfo_to_ftp.nf => main.nf} (100%) rename modules/local/sra_runinfo_to_ftp/{sra_runinfo_to_ftp.nf.test => tests/main.nf.test} (100%) rename modules/local/sra_runinfo_to_ftp/{sra_runinfo_to_ftp.nf.test.snap => tests/main.nf.test.snap} (100%) rename modules/local/sra_to_samplesheet/{sra_to_samplesheet.nf => main.nf} (100%) rename modules/local/sra_to_samplesheet/{sra_to_samplesheet.nf.test => tests/main.nf.test} (100%) rename modules/local/synapse_get/{synapse_get.nf => main.nf} (100%) rename modules/local/synapse_list/{synapse_list.nf => main.nf} (100%) rename modules/local/synapse_merge_samplesheet/{synapse_merge_samplesheet.nf => main.nf} (100%) rename modules/local/synapse_show/{synapse_show.nf => main.nf} (100%) rename modules/local/{synapse_to_sampleshee/synapse_to_samplesheet.nf => synapse_to_samplesheet/main.nf} (100%) rename workflows/sra/tests/{sra.nf.test => main.nf.test} (100%) rename workflows/sra/tests/{sra.nf.test.snap => main.nf.test.snap} (100%) rename workflows/synapse/tests/{synapse.test => main.nf.test} (100%) diff --git a/modules/local/multiqc_mappings_config/multiqc_mappings_config.nf b/modules/local/multiqc_mappings_config/main.nf similarity index 100% rename from modules/local/multiqc_mappings_config/multiqc_mappings_config.nf rename to modules/local/multiqc_mappings_config/main.nf diff --git a/modules/local/multiqc_mappings_config/multiqc_mappings_config.nf.test b/modules/local/multiqc_mappings_config/tests/main.nf.test similarity index 100% rename from modules/local/multiqc_mappings_config/multiqc_mappings_config.nf.test rename to modules/local/multiqc_mappings_config/tests/main.nf.test diff --git a/modules/local/multiqc_mappings_config/multiqc_mappings_config.nf.test.snap b/modules/local/multiqc_mappings_config/tests/main.nf.test.snap similarity index 100% rename from modules/local/multiqc_mappings_config/multiqc_mappings_config.nf.test.snap rename to modules/local/multiqc_mappings_config/tests/main.nf.test.snap diff --git a/modules/local/sra_fastq_ftp/sra_fastq_ftp.nf b/modules/local/sra_fastq_ftp/main.nf similarity index 100% rename from modules/local/sra_fastq_ftp/sra_fastq_ftp.nf rename to modules/local/sra_fastq_ftp/main.nf diff --git a/modules/local/sra_fastq_ftp/sra_fastq_ftp.nf.test b/modules/local/sra_fastq_ftp/tests/main.nf.test similarity index 100% rename from modules/local/sra_fastq_ftp/sra_fastq_ftp.nf.test rename to modules/local/sra_fastq_ftp/tests/main.nf.test diff --git a/modules/local/sra_fastq_ftp/sra_fastq_ftp.nf.test.snap b/modules/local/sra_fastq_ftp/tests/main.nf.test.snap similarity index 100% rename from modules/local/sra_fastq_ftp/sra_fastq_ftp.nf.test.snap rename to modules/local/sra_fastq_ftp/tests/main.nf.test.snap diff --git a/modules/local/sra_ids_to_runinfo/sra_ids_to_runinfo.nf b/modules/local/sra_ids_to_runinfo/main.nf similarity index 100% rename from modules/local/sra_ids_to_runinfo/sra_ids_to_runinfo.nf rename to modules/local/sra_ids_to_runinfo/main.nf diff --git a/modules/local/sra_ids_to_runinfo/sra_ids_to_runinfo.nf.test b/modules/local/sra_ids_to_runinfo/tests/main.nf.test similarity index 100% rename from modules/local/sra_ids_to_runinfo/sra_ids_to_runinfo.nf.test rename to modules/local/sra_ids_to_runinfo/tests/main.nf.test diff --git a/modules/local/sra_ids_to_runinfo/sra_ids_to_runinfo.nf.test.snap b/modules/local/sra_ids_to_runinfo/tests/main.nf.test.snap similarity index 100% rename from modules/local/sra_ids_to_runinfo/sra_ids_to_runinfo.nf.test.snap rename to modules/local/sra_ids_to_runinfo/tests/main.nf.test.snap diff --git a/modules/local/sra_merge_samplesheet/sra_merge_samplesheet.nf b/modules/local/sra_merge_samplesheet/main.nf similarity index 100% rename from modules/local/sra_merge_samplesheet/sra_merge_samplesheet.nf rename to modules/local/sra_merge_samplesheet/main.nf diff --git a/modules/local/sra_merge_samplesheet/sra_merge_samplesheet.nf.test b/modules/local/sra_merge_samplesheet/tests/main.nf.test similarity index 100% rename from modules/local/sra_merge_samplesheet/sra_merge_samplesheet.nf.test rename to modules/local/sra_merge_samplesheet/tests/main.nf.test diff --git a/modules/local/sra_merge_samplesheet/sra_merge_samplesheet.nf.test.snap b/modules/local/sra_merge_samplesheet/tests/main.nf.test.snap similarity index 100% rename from modules/local/sra_merge_samplesheet/sra_merge_samplesheet.nf.test.snap rename to modules/local/sra_merge_samplesheet/tests/main.nf.test.snap diff --git a/modules/local/sra_runinfo_to_ftp/sra_runinfo_to_ftp.nf b/modules/local/sra_runinfo_to_ftp/main.nf similarity index 100% rename from modules/local/sra_runinfo_to_ftp/sra_runinfo_to_ftp.nf rename to modules/local/sra_runinfo_to_ftp/main.nf diff --git a/modules/local/sra_runinfo_to_ftp/sra_runinfo_to_ftp.nf.test b/modules/local/sra_runinfo_to_ftp/tests/main.nf.test similarity index 100% rename from modules/local/sra_runinfo_to_ftp/sra_runinfo_to_ftp.nf.test rename to modules/local/sra_runinfo_to_ftp/tests/main.nf.test diff --git a/modules/local/sra_runinfo_to_ftp/sra_runinfo_to_ftp.nf.test.snap b/modules/local/sra_runinfo_to_ftp/tests/main.nf.test.snap similarity index 100% rename from modules/local/sra_runinfo_to_ftp/sra_runinfo_to_ftp.nf.test.snap rename to modules/local/sra_runinfo_to_ftp/tests/main.nf.test.snap diff --git a/modules/local/sra_to_samplesheet/sra_to_samplesheet.nf b/modules/local/sra_to_samplesheet/main.nf similarity index 100% rename from modules/local/sra_to_samplesheet/sra_to_samplesheet.nf rename to modules/local/sra_to_samplesheet/main.nf diff --git a/modules/local/sra_to_samplesheet/sra_to_samplesheet.nf.test b/modules/local/sra_to_samplesheet/tests/main.nf.test similarity index 100% rename from modules/local/sra_to_samplesheet/sra_to_samplesheet.nf.test rename to modules/local/sra_to_samplesheet/tests/main.nf.test diff --git a/modules/local/synapse_get/synapse_get.nf b/modules/local/synapse_get/main.nf similarity index 100% rename from modules/local/synapse_get/synapse_get.nf rename to modules/local/synapse_get/main.nf diff --git a/modules/local/synapse_list/synapse_list.nf b/modules/local/synapse_list/main.nf similarity index 100% rename from modules/local/synapse_list/synapse_list.nf rename to modules/local/synapse_list/main.nf diff --git a/modules/local/synapse_merge_samplesheet/synapse_merge_samplesheet.nf b/modules/local/synapse_merge_samplesheet/main.nf similarity index 100% rename from modules/local/synapse_merge_samplesheet/synapse_merge_samplesheet.nf rename to modules/local/synapse_merge_samplesheet/main.nf diff --git a/modules/local/synapse_show/synapse_show.nf b/modules/local/synapse_show/main.nf similarity index 100% rename from modules/local/synapse_show/synapse_show.nf rename to modules/local/synapse_show/main.nf diff --git a/modules/local/synapse_to_sampleshee/synapse_to_samplesheet.nf b/modules/local/synapse_to_samplesheet/main.nf similarity index 100% rename from modules/local/synapse_to_sampleshee/synapse_to_samplesheet.nf rename to modules/local/synapse_to_samplesheet/main.nf diff --git a/workflows/sra/tests/sra.nf.test b/workflows/sra/tests/main.nf.test similarity index 100% rename from workflows/sra/tests/sra.nf.test rename to workflows/sra/tests/main.nf.test diff --git a/workflows/sra/tests/sra.nf.test.snap b/workflows/sra/tests/main.nf.test.snap similarity index 100% rename from workflows/sra/tests/sra.nf.test.snap rename to workflows/sra/tests/main.nf.test.snap diff --git a/workflows/synapse/tests/synapse.test b/workflows/synapse/tests/main.nf.test similarity index 100% rename from workflows/synapse/tests/synapse.test rename to workflows/synapse/tests/main.nf.test From 168a6812bf84e1044520b2907b79c987ba2bb892 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 17 Aug 2023 11:31:36 +0100 Subject: [PATCH 374/852] Fix tests and standardise tags --- main.nf | 4 ++-- .../multiqc_mappings_config/tests/main.nf.test | 5 +++-- modules/local/sra_fastq_ftp/tests/main.nf.test | 5 +++-- .../local/sra_ids_to_runinfo/tests/main.nf.test | 5 +++-- .../sra_merge_samplesheet/tests/main.nf.test | 5 +++-- .../local/sra_runinfo_to_ftp/tests/main.nf.test | 5 +++-- .../local/sra_to_samplesheet/tests/main.nf.test | 4 +++- workflows/sra/main.nf | 16 ++++++++-------- workflows/sra/tests/main.nf.test | 3 ++- workflows/sra/tests/skip_fastq.nf.test | 3 ++- .../sra/tests/with_atacseq_samplesheet.nf.test | 3 ++- .../sra/tests/with_rnaseq_samplesheet.nf.test | 3 ++- .../with_rnaseq_specific_ena_metadata.nf.test | 3 ++- workflows/sra/tests/with_sratools.nf.test | 3 ++- .../tests/with_taxprofiler_samplesheet.nf.test | 3 ++- .../tests/with_viralrecon_samplesheet.nf.test | 3 ++- workflows/synapse/main.nf | 2 +- workflows/synapse/tests/main.nf.test | 4 +++- 18 files changed, 48 insertions(+), 31 deletions(-) diff --git a/main.nf b/main.nf index f856a93c..6da732be 100644 --- a/main.nf +++ b/main.nf @@ -49,9 +49,9 @@ if (WorkflowMain.isSraId(ch_input)) { if (params.input_type == input_type) { if (params.input_type == 'sra') { - include { SRA } from './workflows/sra/main' + include { SRA } from './workflows/sra' } else if (params.input_type == 'synapse') { - include { SYNAPSE } from './workflows/synapse/main' + include { SYNAPSE } from './workflows/synapse' } } else { exit 1, "Ids auto-detected as ${input_type}. Please provide '--input_type ${input_type}' as a parameter to the pipeline!" diff --git a/modules/local/multiqc_mappings_config/tests/main.nf.test b/modules/local/multiqc_mappings_config/tests/main.nf.test index a5c148dc..26dbe22f 100644 --- a/modules/local/multiqc_mappings_config/tests/main.nf.test +++ b/modules/local/multiqc_mappings_config/tests/main.nf.test @@ -1,10 +1,11 @@ nextflow_process { name "Test Process MULTIQC_MAPPINGS_CONFIG" - script "modules/local/multiqc_mappings_config/multiqc_mappings_config.nf" + script "modules/local/multiqc_mappings_config/main.nf" process "MULTIQC_MAPPINGS_CONFIG" - tag "multiqc_mappings_config" + tag "modules" tag "modules_local" + tag "multiqc_mappings_config" test("SRX9626017_SRR13191702") { diff --git a/modules/local/sra_fastq_ftp/tests/main.nf.test b/modules/local/sra_fastq_ftp/tests/main.nf.test index 5fa043ab..e8b0d406 100644 --- a/modules/local/sra_fastq_ftp/tests/main.nf.test +++ b/modules/local/sra_fastq_ftp/tests/main.nf.test @@ -1,10 +1,11 @@ nextflow_process { name "Test Process SRA_FASTQ_FTP" - script "modules/local/sra_fastq_ftp/sra_fastq_ftp.nf" + script "modules/local/sra_fastq_ftp/main.nf" process "SRA_FASTQ_FTP" - tag "sra_fastq_ftp" + tag "modules" tag "modules_local" + tag "sra_fastq_ftp" test("SRX9626017_SRR13191702") { diff --git a/modules/local/sra_ids_to_runinfo/tests/main.nf.test b/modules/local/sra_ids_to_runinfo/tests/main.nf.test index a89e21fa..a140efdc 100644 --- a/modules/local/sra_ids_to_runinfo/tests/main.nf.test +++ b/modules/local/sra_ids_to_runinfo/tests/main.nf.test @@ -1,10 +1,11 @@ nextflow_process { name "Test Process SRA_IDS_TO_RUNINFO" - script "modules/local/sra_ids_to_runinfo/sra_ids_to_runinfo.nf" + script "modules/local/sra_ids_to_runinfo/main.nf" process "SRA_IDS_TO_RUNINFO" - tag "sra_ids_to_runinfo" + tag "modules" tag "modules_local" + tag "sra_ids_to_runinfo" test("Should run without failures") { diff --git a/modules/local/sra_merge_samplesheet/tests/main.nf.test b/modules/local/sra_merge_samplesheet/tests/main.nf.test index 9385dab8..6ff471e8 100644 --- a/modules/local/sra_merge_samplesheet/tests/main.nf.test +++ b/modules/local/sra_merge_samplesheet/tests/main.nf.test @@ -1,10 +1,11 @@ nextflow_process { name "Test Process SRA_MERGE_SAMPLESHEET" - script "modules/local/sra_merge_samplesheet/sra_merge_samplesheet.nf" + script "modules/local/sra_merge_samplesheet/main.nf" process "SRA_MERGE_SAMPLESHEET" - tag "sra_merge_samplesheet" + tag "modules" tag "modules_local" + tag "sra_merge_samplesheet" test("Should run without failures") { diff --git a/modules/local/sra_runinfo_to_ftp/tests/main.nf.test b/modules/local/sra_runinfo_to_ftp/tests/main.nf.test index dfff36fe..154ae4eb 100644 --- a/modules/local/sra_runinfo_to_ftp/tests/main.nf.test +++ b/modules/local/sra_runinfo_to_ftp/tests/main.nf.test @@ -1,10 +1,11 @@ nextflow_process { name "Test Process SRA_RUNINFO_TO_FTP" - script "modules/local/sra_runinfo_to_ftp/sra_runinfo_to_ftp.nf" + script "modules/local/sra_runinfo_to_ftp/main.nf" process "SRA_RUNINFO_TO_FTP" - tag "sra_runinfo_to_ftp" + tag "modules" tag "modules_local" + tag "sra_runinfo_to_ftp" test("Should run without failures") { diff --git a/modules/local/sra_to_samplesheet/tests/main.nf.test b/modules/local/sra_to_samplesheet/tests/main.nf.test index 5c7ff7d9..7448fe1d 100644 --- a/modules/local/sra_to_samplesheet/tests/main.nf.test +++ b/modules/local/sra_to_samplesheet/tests/main.nf.test @@ -1,8 +1,10 @@ nextflow_process { name "Test Process SRA_TO_SAMPLESHEET" - script "modules/local/sra_to_samplesheet/sra_to_samplesheet.nf" + script "modules/local/sra_to_samplesheet/main.nf" process "SRA_TO_SAMPLESHEET" + tag "modules" + tag "modules_local" tag "sra_to_samplesheet" test("Should run without failures") { diff --git a/workflows/sra/main.nf b/workflows/sra/main.nf index 05b9a80d..512a73d4 100644 --- a/workflows/sra/main.nf +++ b/workflows/sra/main.nf @@ -19,12 +19,12 @@ WorkflowSra.initialise(params, valid_params) ======================================================================================== */ -include { SRA_IDS_TO_RUNINFO } from '../../modules/local/sra_ids_to_runinfo/sra_ids_to_runinfo' -include { SRA_RUNINFO_TO_FTP } from '../../modules/local/sra_runinfo_to_ftp/sra_runinfo_to_ftp' -include { SRA_FASTQ_FTP } from '../../modules/local/sra_fastq_ftp/sra_fastq_ftp' -include { SRA_TO_SAMPLESHEET } from '../../modules/local/sra_to_samplesheet/sra_to_samplesheet' -include { SRA_MERGE_SAMPLESHEET } from '../../modules/local/sra_merge_samplesheet/sra_merge_samplesheet' -include { MULTIQC_MAPPINGS_CONFIG } from '../../modules/local/multiqc_mappings_config/multiqc_mappings_config' +include { SRA_IDS_TO_RUNINFO } from '../../modules/local/sra_ids_to_runinfo' +include { SRA_RUNINFO_TO_FTP } from '../../modules/local/sra_runinfo_to_ftp' +include { SRA_FASTQ_FTP } from '../../modules/local/sra_fastq_ftp' +include { SRA_TO_SAMPLESHEET } from '../../modules/local/sra_to_samplesheet' +include { SRA_MERGE_SAMPLESHEET } from '../../modules/local/sra_merge_samplesheet' +include { MULTIQC_MAPPINGS_CONFIG } from '../../modules/local/multiqc_mappings_config' /* ======================================================================================== @@ -32,9 +32,9 @@ include { MULTIQC_MAPPINGS_CONFIG } from '../../modules/local/multiqc_mappings_c ======================================================================================== */ -include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../../modules/nf-core/custom/dumpsoftwareversions/main' +include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../../modules/nf-core/custom/dumpsoftwareversions' -include { FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS } from '../../subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/main' +include { FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS } from '../../subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools' /* ======================================================================================== diff --git a/workflows/sra/tests/main.nf.test b/workflows/sra/tests/main.nf.test index 16074b64..4fa13985 100644 --- a/workflows/sra/tests/main.nf.test +++ b/workflows/sra/tests/main.nf.test @@ -2,8 +2,9 @@ nextflow_pipeline { name "Test Workflow main.nf" script "main.nf" + tag "workflows" tag "sra" - tag "workflow" + tag "sra_default" test("SRA FASTQ & Metadata") { diff --git a/workflows/sra/tests/skip_fastq.nf.test b/workflows/sra/tests/skip_fastq.nf.test index 38814a77..188f0652 100644 --- a/workflows/sra/tests/skip_fastq.nf.test +++ b/workflows/sra/tests/skip_fastq.nf.test @@ -2,8 +2,9 @@ nextflow_pipeline { name "Test Workflow main.nf" script "main.nf" + tag "workflows" + tag "sra" tag "sra_skip_fastq" - tag "workflow" test("SRA Skip FASTQ") { diff --git a/workflows/sra/tests/with_atacseq_samplesheet.nf.test b/workflows/sra/tests/with_atacseq_samplesheet.nf.test index 4ebc9352..13f41868 100644 --- a/workflows/sra/tests/with_atacseq_samplesheet.nf.test +++ b/workflows/sra/tests/with_atacseq_samplesheet.nf.test @@ -2,8 +2,9 @@ nextflow_pipeline { name "Test Workflow main.nf" script "main.nf" + tag "workflows" + tag "sra" tag "sra_with_atacseq" - tag "workflow" test("SRA NF-CORE/ATACSEQ Samplesheet") { diff --git a/workflows/sra/tests/with_rnaseq_samplesheet.nf.test b/workflows/sra/tests/with_rnaseq_samplesheet.nf.test index ca77778c..fce8853c 100644 --- a/workflows/sra/tests/with_rnaseq_samplesheet.nf.test +++ b/workflows/sra/tests/with_rnaseq_samplesheet.nf.test @@ -2,8 +2,9 @@ nextflow_pipeline { name "Test Workflow main.nf" script "main.nf" + tag "workflows" + tag "sra" tag "sra_with_rnaseq" - tag "workflow" test("SRA NF-CORE/RNASEQ Samplesheet") { diff --git a/workflows/sra/tests/with_rnaseq_specific_ena_metadata.nf.test b/workflows/sra/tests/with_rnaseq_specific_ena_metadata.nf.test index 2fc12241..b9956366 100644 --- a/workflows/sra/tests/with_rnaseq_specific_ena_metadata.nf.test +++ b/workflows/sra/tests/with_rnaseq_specific_ena_metadata.nf.test @@ -2,8 +2,9 @@ nextflow_pipeline { name "Test Workflow main.nf" script "main.nf" + tag "workflows" + tag "sra" tag "sra_with_rnaseq_specific_ena" - tag "workflow" test("SRA NF-CORE/RNASEQ Samplesheet With Specific ENA metadata") { diff --git a/workflows/sra/tests/with_sratools.nf.test b/workflows/sra/tests/with_sratools.nf.test index 839e3089..e3239a18 100644 --- a/workflows/sra/tests/with_sratools.nf.test +++ b/workflows/sra/tests/with_sratools.nf.test @@ -2,8 +2,9 @@ nextflow_pipeline { name "Test Workflow main.nf" script "main.nf" + tag "workflows" + tag "sra" tag "sra_force_sratools_download" - tag "workflow" test("Force SRA-Tools Download") { diff --git a/workflows/sra/tests/with_taxprofiler_samplesheet.nf.test b/workflows/sra/tests/with_taxprofiler_samplesheet.nf.test index 7ffbca59..9d6e5f1f 100644 --- a/workflows/sra/tests/with_taxprofiler_samplesheet.nf.test +++ b/workflows/sra/tests/with_taxprofiler_samplesheet.nf.test @@ -2,8 +2,9 @@ nextflow_pipeline { name "Test Workflow main.nf" script "main.nf" + tag "workflows" + tag "sra" tag "sra_with_taxprofiler" - tag "workflow" test("SRA NF-CORE/TAXPROFILER Samplesheet") { diff --git a/workflows/sra/tests/with_viralrecon_samplesheet.nf.test b/workflows/sra/tests/with_viralrecon_samplesheet.nf.test index e10e2db8..429a114a 100644 --- a/workflows/sra/tests/with_viralrecon_samplesheet.nf.test +++ b/workflows/sra/tests/with_viralrecon_samplesheet.nf.test @@ -2,8 +2,9 @@ nextflow_pipeline { name "Test Workflow main.nf" script "main.nf" + tag "workflows" + tag "sra" tag "sra_with_viralrecon" - tag "workflow" test("SRA NF-CORE/VIRALRECON Samplesheet") { diff --git a/workflows/synapse/main.nf b/workflows/synapse/main.nf index 7d871659..f8cbeba1 100644 --- a/workflows/synapse/main.nf +++ b/workflows/synapse/main.nf @@ -31,7 +31,7 @@ include { SYNAPSE_MERGE_SAMPLESHEET } from '../../modules/local/synapse_merge_sa ======================================================================================== */ -include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../../modules/nf-core/custom/dumpsoftwareversions/main' +include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../../modules/nf-core/custom/dumpsoftwareversions' /* ======================================================================================== diff --git a/workflows/synapse/tests/main.nf.test b/workflows/synapse/tests/main.nf.test index 464ad226..efb7d793 100644 --- a/workflows/synapse/tests/main.nf.test +++ b/workflows/synapse/tests/main.nf.test @@ -2,8 +2,10 @@ nextflow_pipeline { name "Test Workflow main.nf" script "main.nf" + tag "workflows" + tag "synapse" + tag "synapse_default" profile "test_synapse" - tag "pipeline" test("Synapse Input Type") { From 53f75ecc1e9e8e7ea57fce3d494c282f45edd90d Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 17 Aug 2023 11:31:55 +0100 Subject: [PATCH 375/852] Use generic tags in CI tests --- .github/workflows/ci.yml | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0abe1037..5f329342 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -44,15 +44,8 @@ jobs: matrix: NXF_VER: ${{ fromJson(needs.define_nxf_versions.outputs.matrix) }} test_tags: - - "sra" - - "sra_force_sratools_download" - - "sra_skip_fastq" - - "sra_with_atacseq" - - "sra_with_rnaseq" - - "sra_with_rnaseq_specific_ena" - - "sra_with_taxprofiler" - - "sra_with_viralrecon" - "modules_local" + - "sra" profile: - "docker" From e49ad85996f27286b1e0971063bbb1f7e683af42 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 17 Aug 2023 12:51:05 +0100 Subject: [PATCH 376/852] Fix tests for sra_to_samplesheet module --- .../tests/main.nf.test.snap | 113 ++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 modules/local/sra_to_samplesheet/tests/main.nf.test.snap diff --git a/modules/local/sra_to_samplesheet/tests/main.nf.test.snap b/modules/local/sra_to_samplesheet/tests/main.nf.test.snap new file mode 100644 index 00000000..8b5f4947 --- /dev/null +++ b/modules/local/sra_to_samplesheet/tests/main.nf.test.snap @@ -0,0 +1,113 @@ +{ + "Should run without failures": { + "content": [ + { + "0": [ + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "sample_accession": "SAMEA3643867", + "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", + "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", + "sample_alias": "sample_56", + "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", + "library_layout": "PAIRED", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing", + "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_1": "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "fastq_2": "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, + "ERX1188904_ERR1109373.samplesheet.csv:md5,e7898191d57258e049ee7129d36f5c08" + ] + ], + "1": [ + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "sample_accession": "SAMEA3643867", + "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", + "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", + "sample_alias": "sample_56", + "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", + "library_layout": "PAIRED", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing", + "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_1": "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "fastq_2": "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, + "ERX1188904_ERR1109373.mappings.csv:md5,d09ddb4f0709675e5dfe1eadf12c608f" + ] + ], + "mappings": [ + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "sample_accession": "SAMEA3643867", + "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", + "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", + "sample_alias": "sample_56", + "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", + "library_layout": "PAIRED", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing", + "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_1": "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "fastq_2": "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, + "ERX1188904_ERR1109373.mappings.csv:md5,d09ddb4f0709675e5dfe1eadf12c608f" + ] + ], + "samplesheet": [ + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "sample_accession": "SAMEA3643867", + "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", + "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", + "sample_alias": "sample_56", + "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", + "library_layout": "PAIRED", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing", + "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_1": "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "fastq_2": "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, + "ERX1188904_ERR1109373.samplesheet.csv:md5,e7898191d57258e049ee7129d36f5c08" + ] + ] + } + ], + "timestamp": "2023-08-17T10:55:52+0000" + } +} \ No newline at end of file From 885ba0f30cc0c6925b081d14eb2720e6299e9136 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 17 Aug 2023 12:51:32 +0100 Subject: [PATCH 377/852] Rename workflows and standardise tags --- .github/workflows/ci.yml | 9 ++++- .../tests/main.nf.test | 9 ++--- .../local/sra_fastq_ftp/tests/main.nf.test | 15 ++++---- .../sra_ids_to_runinfo/tests/main.nf.test | 7 ++-- .../sra_merge_samplesheet/tests/main.nf.test | 7 ++-- .../sra_runinfo_to_ftp/tests/main.nf.test | 7 ++-- .../sra_to_samplesheet/tests/main.nf.test | 13 +++---- workflows/sra/tests/main.nf.test | 38 ++++++++++--------- ...=> sra_custom_ena_metadata_fields.nf.test} | 14 +++---- ...a_custom_ena_metadata_fields.nf.test.snap} | 0 ...st => sra_force_sratools_download.nf.test} | 10 ++--- ... sra_force_sratools_download.nf.test.snap} | 0 ...t => sra_nf_core_pipeline_atacseq.nf.test} | 10 ++--- ...sra_nf_core_pipeline_atacseq.nf.test.snap} | 0 ...st => sra_nf_core_pipeline_rnaseq.nf.test} | 10 ++--- ... sra_nf_core_pipeline_rnaseq.nf.test.snap} | 0 ... sra_nf_core_pipeline_taxprofiler.nf.test} | 11 +++--- ...nf_core_pipeline_taxprofiler.nf.test.snap} | 0 ...> sra_nf_core_pipeline_viralrecon.nf.test} | 10 ++--- ..._nf_core_pipeline_viralrecon.nf.test.snap} | 0 ...f.test => sra_skip_fastq_download.nf.test} | 12 +++--- ...p => sra_skip_fastq_download.nf.test.snap} | 0 workflows/synapse/tests/main.nf.test | 2 +- 23 files changed, 91 insertions(+), 93 deletions(-) rename workflows/sra/tests/{with_rnaseq_specific_ena_metadata.nf.test => sra_custom_ena_metadata_fields.nf.test} (81%) rename workflows/sra/tests/{with_rnaseq_specific_ena_metadata.nf.test.snap => sra_custom_ena_metadata_fields.nf.test.snap} (100%) rename workflows/sra/tests/{with_sratools.nf.test => sra_force_sratools_download.nf.test} (92%) rename workflows/sra/tests/{with_sratools.nf.test.snap => sra_force_sratools_download.nf.test.snap} (100%) rename workflows/sra/tests/{with_atacseq_samplesheet.nf.test => sra_nf_core_pipeline_atacseq.nf.test} (90%) rename workflows/sra/tests/{with_atacseq_samplesheet.nf.test.snap => sra_nf_core_pipeline_atacseq.nf.test.snap} (100%) rename workflows/sra/tests/{with_rnaseq_samplesheet.nf.test => sra_nf_core_pipeline_rnaseq.nf.test} (90%) rename workflows/sra/tests/{with_rnaseq_samplesheet.nf.test.snap => sra_nf_core_pipeline_rnaseq.nf.test.snap} (100%) rename workflows/sra/tests/{with_taxprofiler_samplesheet.nf.test => sra_nf_core_pipeline_taxprofiler.nf.test} (89%) rename workflows/sra/tests/{with_taxprofiler_samplesheet.nf.test.snap => sra_nf_core_pipeline_taxprofiler.nf.test.snap} (100%) rename workflows/sra/tests/{with_viralrecon_samplesheet.nf.test => sra_nf_core_pipeline_viralrecon.nf.test} (90%) rename workflows/sra/tests/{with_viralrecon_samplesheet.nf.test.snap => sra_nf_core_pipeline_viralrecon.nf.test.snap} (100%) rename workflows/sra/tests/{skip_fastq.nf.test => sra_skip_fastq_download.nf.test} (94%) rename workflows/sra/tests/{skip_fastq.nf.test.snap => sra_skip_fastq_download.nf.test.snap} (100%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5f329342..451613fb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -45,7 +45,14 @@ jobs: NXF_VER: ${{ fromJson(needs.define_nxf_versions.outputs.matrix) }} test_tags: - "modules_local" - - "sra" + - "sra_default_parameters" + - "sra_custom_ena_metadata_fields" + - "sra_force_sratools_download" + - "sra_nf_core_pipeline_atacseq" + - "sra_nf_core_pipeline_rnaseq" + - "sra_nf_core_pipeline_taxprofiler" + - "sra_nf_core_pipeline_viralrecon" + - "sra_skip_fastq_download" profile: - "docker" diff --git a/modules/local/multiqc_mappings_config/tests/main.nf.test b/modules/local/multiqc_mappings_config/tests/main.nf.test index 26dbe22f..5f08ceca 100644 --- a/modules/local/multiqc_mappings_config/tests/main.nf.test +++ b/modules/local/multiqc_mappings_config/tests/main.nf.test @@ -1,18 +1,19 @@ nextflow_process { - name "Test Process MULTIQC_MAPPINGS_CONFIG" + name "Test process: MULTIQC_MAPPINGS_CONFIG" script "modules/local/multiqc_mappings_config/main.nf" process "MULTIQC_MAPPINGS_CONFIG" tag "modules" tag "modules_local" tag "multiqc_mappings_config" - test("SRX9626017_SRR13191702") { + test("Should run without failures") { when { params { - outdir = "$outputDir" + outdir = "$outputDir" } + process { """ input[0] = file(params.test_data['modules_local']['multiqc_mappings_config'], checkIfExists: true) @@ -26,7 +27,5 @@ nextflow_process { { assert snapshot(process.out).match() }, ) } - } - } diff --git a/modules/local/sra_fastq_ftp/tests/main.nf.test b/modules/local/sra_fastq_ftp/tests/main.nf.test index e8b0d406..33b9b185 100644 --- a/modules/local/sra_fastq_ftp/tests/main.nf.test +++ b/modules/local/sra_fastq_ftp/tests/main.nf.test @@ -1,24 +1,25 @@ nextflow_process { - name "Test Process SRA_FASTQ_FTP" + name "Test process: SRA_FASTQ_FTP" script "modules/local/sra_fastq_ftp/main.nf" process "SRA_FASTQ_FTP" tag "modules" tag "modules_local" tag "sra_fastq_ftp" - test("SRX9626017_SRR13191702") { + test("Should run without failures") { when { params { - outdir = "$outputDir" + outdir = "$outputDir" } + process { """ input[0] = [ - [ id:'SRX9626017_SRR13191702', single_end:false, md5_1: '89c5be920021a035084d8aeb74f32df7', md5_2: '56271be38a80db78ef3bdfc5d9909b98' ], // meta map - params.test_data['modules_local']['sra_fastq_ftp'] - ] + [ id:'SRX9626017_SRR13191702', single_end:false, md5_1: '89c5be920021a035084d8aeb74f32df7', md5_2: '56271be38a80db78ef3bdfc5d9909b98' ], // meta map + params.test_data['modules_local']['sra_fastq_ftp'] + ] """ } } @@ -29,7 +30,5 @@ nextflow_process { { assert snapshot(process.out).match() }, ) } - } - } diff --git a/modules/local/sra_ids_to_runinfo/tests/main.nf.test b/modules/local/sra_ids_to_runinfo/tests/main.nf.test index a140efdc..3953f008 100644 --- a/modules/local/sra_ids_to_runinfo/tests/main.nf.test +++ b/modules/local/sra_ids_to_runinfo/tests/main.nf.test @@ -1,6 +1,6 @@ nextflow_process { - name "Test Process SRA_IDS_TO_RUNINFO" + name "Test process: SRA_IDS_TO_RUNINFO" script "modules/local/sra_ids_to_runinfo/main.nf" process "SRA_IDS_TO_RUNINFO" tag "modules" @@ -11,8 +11,9 @@ nextflow_process { when { params { - outdir = "$outputDir" + outdir = "$outputDir" } + process { """ input[0] = 'SRR13191702' @@ -27,7 +28,5 @@ nextflow_process { { assert snapshot(process.out).match() }, ) } - } - } diff --git a/modules/local/sra_merge_samplesheet/tests/main.nf.test b/modules/local/sra_merge_samplesheet/tests/main.nf.test index 6ff471e8..6012103e 100644 --- a/modules/local/sra_merge_samplesheet/tests/main.nf.test +++ b/modules/local/sra_merge_samplesheet/tests/main.nf.test @@ -1,6 +1,6 @@ nextflow_process { - name "Test Process SRA_MERGE_SAMPLESHEET" + name "Test process: SRA_MERGE_SAMPLESHEET" script "modules/local/sra_merge_samplesheet/main.nf" process "SRA_MERGE_SAMPLESHEET" tag "modules" @@ -11,8 +11,9 @@ nextflow_process { when { params { - outdir = "$outputDir" + outdir = "$outputDir" } + process { """ input[0] = params.test_data['modules_local']['sra_merge_samplesheet_samplesheets'].collect { file(it, checkIfExists: true) } @@ -27,7 +28,5 @@ nextflow_process { { assert snapshot(process.out).match() }, ) } - } - } diff --git a/modules/local/sra_runinfo_to_ftp/tests/main.nf.test b/modules/local/sra_runinfo_to_ftp/tests/main.nf.test index 154ae4eb..7311f847 100644 --- a/modules/local/sra_runinfo_to_ftp/tests/main.nf.test +++ b/modules/local/sra_runinfo_to_ftp/tests/main.nf.test @@ -1,6 +1,6 @@ nextflow_process { - name "Test Process SRA_RUNINFO_TO_FTP" + name "Test process: SRA_RUNINFO_TO_FTP" script "modules/local/sra_runinfo_to_ftp/main.nf" process "SRA_RUNINFO_TO_FTP" tag "modules" @@ -11,8 +11,9 @@ nextflow_process { when { params { - outdir = "$outputDir" + outdir = "$outputDir" } + process { """ input[0] = file(params.test_data['modules_local']['sra_runinfo_to_ftp'], checkIfExists: true) @@ -26,7 +27,5 @@ nextflow_process { { assert snapshot(process.out).match() }, ) } - } - } diff --git a/modules/local/sra_to_samplesheet/tests/main.nf.test b/modules/local/sra_to_samplesheet/tests/main.nf.test index 7448fe1d..163312c7 100644 --- a/modules/local/sra_to_samplesheet/tests/main.nf.test +++ b/modules/local/sra_to_samplesheet/tests/main.nf.test @@ -1,6 +1,6 @@ nextflow_process { - name "Test Process SRA_TO_SAMPLESHEET" + name "Test process: SRA_TO_SAMPLESHEET" script "modules/local/sra_to_samplesheet/main.nf" process "SRA_TO_SAMPLESHEET" tag "modules" @@ -11,14 +11,15 @@ nextflow_process { when { params { - outdir = "$outputDir" + outdir = "$outputDir" } + process { """ - input[0] = 'meta' + input[0] = [id:'ERX1188904_ERR1109373', run_accession:'ERR1109373', experiment_accession:'ERX1188904', sample_accession:'SAMEA3643867', experiment_alias:'ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7', run_alias:'ena-RUN-CAM-03-11-2015-17:01:52:847-7', sample_alias:'sample_56', study_alias:'ena-STUDY-CAM-02-11-2015-17:42:24:189-13', library_layout:'PAIRED', experiment_title:'Illumina HiSeq 2500 paired end sequencing', sample_title:'RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome', sample_description:'RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome', fastq_md5:'8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9', fastq_ftp:'ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz', fastq_1:'./results/fastq/ERX1188904_ERR1109373_1.fastq.gz', fastq_2:'./results/fastq/ERX1188904_ERR1109373_2.fastq.gz', md5_1:'9fd57225d6c07a31843276d6df9b15c0', md5_2:'5a62e8f785687dce890cfb4fe3e607f9', single_end:false] input[1] = 'rnaseq' - input[2] = 'strandedness' - input[3] = 'mapping_fields' + input[2] = 'auto' + input[3] = 'experiment_accession,run_accession,sample_accession,experiment_alias,run_alias,sample_alias,experiment_title,sample_title,sample_description' """ } } @@ -29,7 +30,5 @@ nextflow_process { { assert snapshot(process.out).match() }, ) } - } - } diff --git a/workflows/sra/tests/main.nf.test b/workflows/sra/tests/main.nf.test index 4fa13985..0d6aa1a1 100644 --- a/workflows/sra/tests/main.nf.test +++ b/workflows/sra/tests/main.nf.test @@ -1,12 +1,12 @@ nextflow_pipeline { - name "Test Workflow main.nf" + name "Test workflow: sra.nf" script "main.nf" tag "workflows" - tag "sra" - tag "sra_default" + tag "workflows_sra" + tag "sra_default_parameters" - test("SRA FASTQ & Metadata") { + test("Parameters: default") { when { params { @@ -19,23 +19,25 @@ nextflow_pipeline { { assert workflow.success }, { assert snapshot(NftestUtils.removeNextflowVersion("$outputDir")).match("software_versions") }, { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, - { assert snapshot(path("$outputDir/metadata/DRR026872.runinfo_ftp.tsv"), - path("$outputDir/metadata/DRR028935.runinfo_ftp.tsv"), - path("$outputDir/metadata/ERR1109373.runinfo_ftp.tsv"), - path("$outputDir/metadata/ERR1160846.runinfo_ftp.tsv"), - path("$outputDir/metadata/GSE214215.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR12848126.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR13191702.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR14593545.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR14709033.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR9984183.runinfo_ftp.tsv")).match("metadata") }, + { assert snapshot( + path("$outputDir/metadata/DRR026872.runinfo_ftp.tsv"), + path("$outputDir/metadata/DRR028935.runinfo_ftp.tsv"), + path("$outputDir/metadata/ERR1109373.runinfo_ftp.tsv"), + path("$outputDir/metadata/ERR1160846.runinfo_ftp.tsv"), + path("$outputDir/metadata/GSE214215.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR12848126.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR13191702.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR14593545.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR14709033.runinfo_ftp.tsv"), + path("$outputDir/metadata/SRR9984183.runinfo_ftp.tsv")).match("metadata") + }, { assert new File("$outputDir/metadata/GSM4907283.runinfo_ftp.tsv").exists() }, - { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), - path("$outputDir/samplesheet/multiqc_config.yml")).match("samplesheet") }, + { assert snapshot( + path("$outputDir/samplesheet/id_mappings.csv"), + path("$outputDir/samplesheet/multiqc_config.yml")).match("samplesheet") + }, { assert new File("$outputDir/samplesheet/samplesheet.csv").exists() } ) } - } - } diff --git a/workflows/sra/tests/with_rnaseq_specific_ena_metadata.nf.test b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test similarity index 81% rename from workflows/sra/tests/with_rnaseq_specific_ena_metadata.nf.test rename to workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test index b9956366..173b9fbd 100644 --- a/workflows/sra/tests/with_rnaseq_specific_ena_metadata.nf.test +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test @@ -1,18 +1,18 @@ nextflow_pipeline { - name "Test Workflow main.nf" + name "Test workflow: sra.nf" script "main.nf" tag "workflows" - tag "sra" - tag "sra_with_rnaseq_specific_ena" + tag "workflows_sra" + tag "sra_custom_ena_metadata_fields" - test("SRA NF-CORE/RNASEQ Samplesheet With Specific ENA metadata") { + test("Parameters: '--nf_core_pipeline rnaseq --ena_metadata_fields ... --sample_mapping_fields ...'") { when { params { - outdir = "$outputDir" - nf_core_pipeline = "rnaseq" - ena_metadata_fields = "run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5" + outdir = "$outputDir" + nf_core_pipeline = "rnaseq" + ena_metadata_fields = "run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5" sample_mapping_fields = "run_accession,library_layout" } } diff --git a/workflows/sra/tests/with_rnaseq_specific_ena_metadata.nf.test.snap b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap similarity index 100% rename from workflows/sra/tests/with_rnaseq_specific_ena_metadata.nf.test.snap rename to workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap diff --git a/workflows/sra/tests/with_sratools.nf.test b/workflows/sra/tests/sra_force_sratools_download.nf.test similarity index 92% rename from workflows/sra/tests/with_sratools.nf.test rename to workflows/sra/tests/sra_force_sratools_download.nf.test index e3239a18..a5c6afa6 100644 --- a/workflows/sra/tests/with_sratools.nf.test +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test @@ -1,16 +1,16 @@ nextflow_pipeline { - name "Test Workflow main.nf" + name "Test workflow: sra.nf" script "main.nf" tag "workflows" - tag "sra" + tag "workflows_sra" tag "sra_force_sratools_download" - test("Force SRA-Tools Download") { + test("Parameters: '--force_sratools_download'") { when { params { - outdir = "$outputDir" + outdir = "$outputDir" force_sratools_download = true } } @@ -36,7 +36,5 @@ nextflow_pipeline { { assert new File("$outputDir/samplesheet/samplesheet.csv").exists() } ) } - } - } diff --git a/workflows/sra/tests/with_sratools.nf.test.snap b/workflows/sra/tests/sra_force_sratools_download.nf.test.snap similarity index 100% rename from workflows/sra/tests/with_sratools.nf.test.snap rename to workflows/sra/tests/sra_force_sratools_download.nf.test.snap diff --git a/workflows/sra/tests/with_atacseq_samplesheet.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test similarity index 90% rename from workflows/sra/tests/with_atacseq_samplesheet.nf.test rename to workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test index 13f41868..4286327f 100644 --- a/workflows/sra/tests/with_atacseq_samplesheet.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test @@ -1,16 +1,16 @@ nextflow_pipeline { - name "Test Workflow main.nf" + name "Test workflow: sra.nf" script "main.nf" tag "workflows" - tag "sra" - tag "sra_with_atacseq" + tag "workflows_sra" + tag "sra_nf_core_pipeline_atacseq" - test("SRA NF-CORE/ATACSEQ Samplesheet") { + test("Parameters: '--nf_core_pipeline atacseq'") { when { params { - outdir = "$outputDir" + outdir = "$outputDir" nf_core_pipeline = "atacseq" } } diff --git a/workflows/sra/tests/with_atacseq_samplesheet.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap similarity index 100% rename from workflows/sra/tests/with_atacseq_samplesheet.nf.test.snap rename to workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap diff --git a/workflows/sra/tests/with_rnaseq_samplesheet.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test similarity index 90% rename from workflows/sra/tests/with_rnaseq_samplesheet.nf.test rename to workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test index fce8853c..c948e7dc 100644 --- a/workflows/sra/tests/with_rnaseq_samplesheet.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test @@ -1,16 +1,16 @@ nextflow_pipeline { - name "Test Workflow main.nf" + name "Test workflow: sra.nf" script "main.nf" tag "workflows" - tag "sra" - tag "sra_with_rnaseq" + tag "workflows_sra" + tag "sra_nf_core_pipeline_rnaseq" - test("SRA NF-CORE/RNASEQ Samplesheet") { + test("Parameters: '--nf_core_pipeline rnaseq'") { when { params { - outdir = "$outputDir" + outdir = "$outputDir" nf_core_pipeline = "rnaseq" } } diff --git a/workflows/sra/tests/with_rnaseq_samplesheet.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap similarity index 100% rename from workflows/sra/tests/with_rnaseq_samplesheet.nf.test.snap rename to workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap diff --git a/workflows/sra/tests/with_taxprofiler_samplesheet.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test similarity index 89% rename from workflows/sra/tests/with_taxprofiler_samplesheet.nf.test rename to workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test index 9d6e5f1f..ab39f52f 100644 --- a/workflows/sra/tests/with_taxprofiler_samplesheet.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test @@ -1,16 +1,16 @@ nextflow_pipeline { - name "Test Workflow main.nf" + name "Test workflow: sra.nf" script "main.nf" tag "workflows" - tag "sra" - tag "sra_with_taxprofiler" + tag "workflows_sra" + tag "sra_nf_core_pipeline_taxprofiler" - test("SRA NF-CORE/TAXPROFILER Samplesheet") { + test("Parameters: '--nf_core_pipeline taxprofiler'") { when { params { - outdir = "$outputDir" + outdir = "$outputDir" nf_core_pipeline = "taxprofiler" } } @@ -37,5 +37,4 @@ nextflow_pipeline { ) } } - } diff --git a/workflows/sra/tests/with_taxprofiler_samplesheet.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap similarity index 100% rename from workflows/sra/tests/with_taxprofiler_samplesheet.nf.test.snap rename to workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap diff --git a/workflows/sra/tests/with_viralrecon_samplesheet.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test similarity index 90% rename from workflows/sra/tests/with_viralrecon_samplesheet.nf.test rename to workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test index 429a114a..c80a092a 100644 --- a/workflows/sra/tests/with_viralrecon_samplesheet.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test @@ -1,16 +1,16 @@ nextflow_pipeline { - name "Test Workflow main.nf" + name "Test workflow: sra.nf" script "main.nf" tag "workflows" - tag "sra" - tag "sra_with_viralrecon" + tag "workflows_sra" + tag "sra_nf_core_pipeline_viralrecon" - test("SRA NF-CORE/VIRALRECON Samplesheet") { + test("Parameters: '--nf_core_pipeline viralrecon'") { when { params { - outdir = "$outputDir" + outdir = "$outputDir" nf_core_pipeline = "viralrecon" } } diff --git a/workflows/sra/tests/with_viralrecon_samplesheet.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap similarity index 100% rename from workflows/sra/tests/with_viralrecon_samplesheet.nf.test.snap rename to workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap diff --git a/workflows/sra/tests/skip_fastq.nf.test b/workflows/sra/tests/sra_skip_fastq_download.nf.test similarity index 94% rename from workflows/sra/tests/skip_fastq.nf.test rename to workflows/sra/tests/sra_skip_fastq_download.nf.test index 188f0652..9a274731 100644 --- a/workflows/sra/tests/skip_fastq.nf.test +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test @@ -1,16 +1,16 @@ nextflow_pipeline { - name "Test Workflow main.nf" + name "Test workflow: sra.nf" script "main.nf" tag "workflows" - tag "sra" - tag "sra_skip_fastq" + tag "workflows_sra" + tag "sra_skip_fastq_download" - test("SRA Skip FASTQ") { + test("Parameters: '--skip_fastq_download'") { when { params { - outdir = "$outputDir" + outdir = "$outputDir" skip_fastq_download = true } } @@ -49,7 +49,5 @@ nextflow_pipeline { { assert !new File("$outputDir/fastq/SRX9626017_SRR13191702_2.fastq.gz").exists() } ) } - } - } diff --git a/workflows/sra/tests/skip_fastq.nf.test.snap b/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap similarity index 100% rename from workflows/sra/tests/skip_fastq.nf.test.snap rename to workflows/sra/tests/sra_skip_fastq_download.nf.test.snap diff --git a/workflows/synapse/tests/main.nf.test b/workflows/synapse/tests/main.nf.test index efb7d793..7cbfed11 100644 --- a/workflows/synapse/tests/main.nf.test +++ b/workflows/synapse/tests/main.nf.test @@ -1,6 +1,6 @@ nextflow_pipeline { - name "Test Workflow main.nf" + name "Test workflow: synapse.nf" script "main.nf" tag "workflows" tag "synapse" From 73ea3ca585f027ae73bd9003f0f5480389ab5528 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 17 Aug 2023 13:06:34 +0100 Subject: [PATCH 378/852] Patch custom/dumpsoftwareversions module to remove NF version dump --- modules.json | 3 ++- .../custom-dumpsoftwareversions.diff | 13 +++++++++++++ .../templates/dumpsoftwareversions.py | 1 - 3 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 modules/nf-core/custom/dumpsoftwareversions/custom-dumpsoftwareversions.diff diff --git a/modules.json b/modules.json index 3137b88b..2244addd 100644 --- a/modules.json +++ b/modules.json @@ -8,7 +8,8 @@ "custom/dumpsoftwareversions": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": ["modules"], + "patch": "modules/nf-core/custom/dumpsoftwareversions/custom-dumpsoftwareversions.diff" }, "custom/sratoolsncbisettings": { "branch": "master", diff --git a/modules/nf-core/custom/dumpsoftwareversions/custom-dumpsoftwareversions.diff b/modules/nf-core/custom/dumpsoftwareversions/custom-dumpsoftwareversions.diff new file mode 100644 index 00000000..a7893b24 --- /dev/null +++ b/modules/nf-core/custom/dumpsoftwareversions/custom-dumpsoftwareversions.diff @@ -0,0 +1,13 @@ +Changes in module 'nf-core/custom/dumpsoftwareversions' +--- modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py ++++ modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py +@@ -75,7 +75,6 @@ + versions_by_module[module] = process_versions + + versions_by_module["Workflow"] = { +- "Nextflow": "$workflow.nextflow.version", + "$workflow.manifest.name": "$workflow.manifest.version", + } + + +************************************************************ diff --git a/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py index da033408..33d127f8 100755 --- a/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py +++ b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py @@ -75,7 +75,6 @@ def main(): versions_by_module[module] = process_versions versions_by_module["Workflow"] = { - "Nextflow": "$workflow.nextflow.version", "$workflow.manifest.name": "$workflow.manifest.version", } From de464567cb187f5eddecaa9b0e3c5f8ef3bedd69 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 17 Aug 2023 13:27:34 +0100 Subject: [PATCH 379/852] Use default snapshot for all workflows --- .../tests/main.nf.test | 2 +- .../tests/main.nf.test.snap | 27 +++++++++++++++- .../local/sra_fastq_ftp/tests/main.nf.test | 2 +- .../sra_ids_to_runinfo/tests/main.nf.test | 2 +- .../sra_merge_samplesheet/tests/main.nf.test | 2 +- .../sra_runinfo_to_ftp/tests/main.nf.test | 2 +- .../sra_to_samplesheet/tests/main.nf.test | 2 +- workflows/sra/tests/main.nf.test | 21 +----------- workflows/sra/tests/main.nf.test.snap | 16 +++++++--- .../sra_custom_ena_metadata_fields.nf.test | 19 ++--------- ...ra_custom_ena_metadata_fields.nf.test.snap | 16 +++++++--- .../tests/sra_force_sratools_download.nf.test | 19 ++--------- .../sra_force_sratools_download.nf.test.snap | 16 +++++++--- .../sra_nf_core_pipeline_atacseq.nf.test | 19 ++--------- .../sra_nf_core_pipeline_atacseq.nf.test.snap | 16 +++++++--- .../tests/sra_nf_core_pipeline_rnaseq.nf.test | 19 ++--------- .../sra_nf_core_pipeline_rnaseq.nf.test.snap | 16 +++++++--- .../sra_nf_core_pipeline_taxprofiler.nf.test | 19 ++--------- ..._nf_core_pipeline_taxprofiler.nf.test.snap | 16 +++++++--- .../sra_nf_core_pipeline_viralrecon.nf.test | 19 ++--------- ...a_nf_core_pipeline_viralrecon.nf.test.snap | 16 +++++++--- .../sra/tests/sra_skip_fastq_download.nf.test | 32 ++----------------- .../sra_skip_fastq_download.nf.test.snap | 22 +++++++++++-- 23 files changed, 150 insertions(+), 190 deletions(-) diff --git a/modules/local/multiqc_mappings_config/tests/main.nf.test b/modules/local/multiqc_mappings_config/tests/main.nf.test index 5f08ceca..3bf79537 100644 --- a/modules/local/multiqc_mappings_config/tests/main.nf.test +++ b/modules/local/multiqc_mappings_config/tests/main.nf.test @@ -24,7 +24,7 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out).match() }, + { assert snapshot(process.out).match() } ) } } diff --git a/modules/local/multiqc_mappings_config/tests/main.nf.test.snap b/modules/local/multiqc_mappings_config/tests/main.nf.test.snap index e8914aea..9cf7fb38 100644 --- a/modules/local/multiqc_mappings_config/tests/main.nf.test.snap +++ b/modules/local/multiqc_mappings_config/tests/main.nf.test.snap @@ -22,6 +22,31 @@ ] } ], - "timestamp": "2023-07-05T15:01:18+0000" + "timestamp": "2023-08-17T12:02:35+0000" + }, + "Should run without failures": { + "content": [ + { + "0": [ + [ + "multiqc_config.yml:md5,7f3cb10fff83ba9eb3e8fa6862d1290a", + "versions.yml:md5,dd4c66f0551d15510b36bb2e2b2fdd73" + ] + ], + "1": [ + "versions.yml:md5,dd4c66f0551d15510b36bb2e2b2fdd73" + ], + "versions": [ + "versions.yml:md5,dd4c66f0551d15510b36bb2e2b2fdd73" + ], + "yml": [ + [ + "multiqc_config.yml:md5,7f3cb10fff83ba9eb3e8fa6862d1290a", + "versions.yml:md5,dd4c66f0551d15510b36bb2e2b2fdd73" + ] + ] + } + ], + "timestamp": "2023-08-17T12:02:35+0000" } } \ No newline at end of file diff --git a/modules/local/sra_fastq_ftp/tests/main.nf.test b/modules/local/sra_fastq_ftp/tests/main.nf.test index 33b9b185..7892d156 100644 --- a/modules/local/sra_fastq_ftp/tests/main.nf.test +++ b/modules/local/sra_fastq_ftp/tests/main.nf.test @@ -27,7 +27,7 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out).match() }, + { assert snapshot(process.out).match() } ) } } diff --git a/modules/local/sra_ids_to_runinfo/tests/main.nf.test b/modules/local/sra_ids_to_runinfo/tests/main.nf.test index 3953f008..f8a44086 100644 --- a/modules/local/sra_ids_to_runinfo/tests/main.nf.test +++ b/modules/local/sra_ids_to_runinfo/tests/main.nf.test @@ -25,7 +25,7 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out).match() }, + { assert snapshot(process.out).match() } ) } } diff --git a/modules/local/sra_merge_samplesheet/tests/main.nf.test b/modules/local/sra_merge_samplesheet/tests/main.nf.test index 6012103e..e37039bd 100644 --- a/modules/local/sra_merge_samplesheet/tests/main.nf.test +++ b/modules/local/sra_merge_samplesheet/tests/main.nf.test @@ -25,7 +25,7 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out).match() }, + { assert snapshot(process.out).match() } ) } } diff --git a/modules/local/sra_runinfo_to_ftp/tests/main.nf.test b/modules/local/sra_runinfo_to_ftp/tests/main.nf.test index 7311f847..1558ff39 100644 --- a/modules/local/sra_runinfo_to_ftp/tests/main.nf.test +++ b/modules/local/sra_runinfo_to_ftp/tests/main.nf.test @@ -24,7 +24,7 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out).match() }, + { assert snapshot(process.out).match() } ) } } diff --git a/modules/local/sra_to_samplesheet/tests/main.nf.test b/modules/local/sra_to_samplesheet/tests/main.nf.test index 163312c7..b2ec5b11 100644 --- a/modules/local/sra_to_samplesheet/tests/main.nf.test +++ b/modules/local/sra_to_samplesheet/tests/main.nf.test @@ -27,7 +27,7 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out).match() }, + { assert snapshot(process.out).match() } ) } } diff --git a/workflows/sra/tests/main.nf.test b/workflows/sra/tests/main.nf.test index 0d6aa1a1..39a5cc3f 100644 --- a/workflows/sra/tests/main.nf.test +++ b/workflows/sra/tests/main.nf.test @@ -17,26 +17,7 @@ nextflow_pipeline { then { assertAll( { assert workflow.success }, - { assert snapshot(NftestUtils.removeNextflowVersion("$outputDir")).match("software_versions") }, - { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, - { assert snapshot( - path("$outputDir/metadata/DRR026872.runinfo_ftp.tsv"), - path("$outputDir/metadata/DRR028935.runinfo_ftp.tsv"), - path("$outputDir/metadata/ERR1109373.runinfo_ftp.tsv"), - path("$outputDir/metadata/ERR1160846.runinfo_ftp.tsv"), - path("$outputDir/metadata/GSE214215.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR12848126.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR13191702.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR14593545.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR14709033.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR9984183.runinfo_ftp.tsv")).match("metadata") - }, - { assert new File("$outputDir/metadata/GSM4907283.runinfo_ftp.tsv").exists() }, - { assert snapshot( - path("$outputDir/samplesheet/id_mappings.csv"), - path("$outputDir/samplesheet/multiqc_config.yml")).match("samplesheet") - }, - { assert new File("$outputDir/samplesheet/samplesheet.csv").exists() } + { assert snapshot(process.out).match() } ) } } diff --git a/workflows/sra/tests/main.nf.test.snap b/workflows/sra/tests/main.nf.test.snap index dcdb43b5..88ea9654 100644 --- a/workflows/sra/tests/main.nf.test.snap +++ b/workflows/sra/tests/main.nf.test.snap @@ -1,4 +1,12 @@ { + "Parameters: default": { + "content": [ + { + + } + ], + "timestamp": "2023-08-17T12:09:45+0000" + }, "metadata": { "content": [ "DRR026872.runinfo_ftp.tsv:md5,73606f6a05c45b077809da43ca638b5f", @@ -12,20 +20,20 @@ "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", "SRR9984183.runinfo_ftp.tsv:md5,53ab34ff3612b0e2c7d60476822787be" ], - "timestamp": "2023-08-06T23:48:50+0000" + "timestamp": "2023-08-17T12:09:45+0000" }, "samplesheet": { "content": [ "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565", "multiqc_config.yml:md5,a97047e12b0ea3f46d285629e4053548" ], - "timestamp": "2023-08-06T23:48:50+0000" + "timestamp": "2023-08-17T12:09:45+0000" }, "software_versions": { "content": [ "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" ], - "timestamp": "2023-08-06T23:48:50+0000" + "timestamp": "2023-08-17T12:09:45+0000" }, "fastq": { "content": [ @@ -75,6 +83,6 @@ "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" ] ], - "timestamp": "2023-08-06T23:48:50+0000" + "timestamp": "2023-08-17T12:09:45+0000" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test index 173b9fbd..6e27c4a9 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test @@ -6,7 +6,7 @@ nextflow_pipeline { tag "workflows_sra" tag "sra_custom_ena_metadata_fields" - test("Parameters: '--nf_core_pipeline rnaseq --ena_metadata_fields ... --sample_mapping_fields ...'") { + test("Parameters: --nf_core_pipeline rnaseq --ena_metadata_fields ... --sample_mapping_fields ...") { when { params { @@ -20,22 +20,7 @@ nextflow_pipeline { then { assertAll( { assert workflow.success }, - { assert snapshot(NftestUtils.removeNextflowVersion("$outputDir")).match("software_versions") }, - { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, - { assert snapshot(path("$outputDir/metadata/DRR026872.runinfo_ftp.tsv"), - path("$outputDir/metadata/DRR028935.runinfo_ftp.tsv"), - path("$outputDir/metadata/ERR1109373.runinfo_ftp.tsv"), - path("$outputDir/metadata/ERR1160846.runinfo_ftp.tsv"), - path("$outputDir/metadata/GSE214215.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR12848126.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR13191702.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR14593545.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR14709033.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR9984183.runinfo_ftp.tsv")).match("metadata") }, - { assert new File("$outputDir/metadata/GSM4907283.runinfo_ftp.tsv").exists() }, - { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), - path("$outputDir/samplesheet/multiqc_config.yml")).match("samplesheet") }, - { assert new File("$outputDir/samplesheet/samplesheet.csv").exists() } + { assert snapshot(process.out).match() } ) } } diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap index bfa3c9cd..55c39d4f 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap @@ -12,20 +12,28 @@ "SRR14709033.runinfo_ftp.tsv:md5,2385a9cc5e320e78b02743c45d1338f1", "SRR9984183.runinfo_ftp.tsv:md5,f1ed9fc572d2e0d145be7f547f6d1236" ], - "timestamp": "2023-07-03T23:38:27+0000" + "timestamp": "2023-08-17T12:11:42+0000" }, "samplesheet": { "content": [ "id_mappings.csv:md5,8473773df806859c6af7acafcfe5aa6f", "multiqc_config.yml:md5,6f6189ee58855de81eaf82ad86e21040" ], - "timestamp": "2023-07-03T23:38:27+0000" + "timestamp": "2023-08-17T12:11:42+0000" }, "software_versions": { "content": [ "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" ], - "timestamp": "2023-07-03T23:38:27+0000" + "timestamp": "2023-08-17T12:11:42+0000" + }, + "Parameters: '--nf_core_pipeline rnaseq --ena_metadata_fields ... --sample_mapping_fields ...'": { + "content": [ + { + + } + ], + "timestamp": "2023-08-17T12:11:42+0000" }, "fastq": { "content": [ @@ -75,6 +83,6 @@ "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" ] ], - "timestamp": "2023-07-03T23:38:27+0000" + "timestamp": "2023-08-17T12:11:42+0000" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test b/workflows/sra/tests/sra_force_sratools_download.nf.test index a5c6afa6..1b501975 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test @@ -6,7 +6,7 @@ nextflow_pipeline { tag "workflows_sra" tag "sra_force_sratools_download" - test("Parameters: '--force_sratools_download'") { + test("Parameters: --force_sratools_download") { when { params { @@ -18,22 +18,7 @@ nextflow_pipeline { then { assertAll( { assert workflow.success }, - { assert snapshot(NftestUtils.removeNextflowVersion("$outputDir")).match("software_versions") }, - { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, - { assert snapshot(path("$outputDir/metadata/DRR026872.runinfo_ftp.tsv"), - path("$outputDir/metadata/DRR028935.runinfo_ftp.tsv"), - path("$outputDir/metadata/ERR1109373.runinfo_ftp.tsv"), - path("$outputDir/metadata/ERR1160846.runinfo_ftp.tsv"), - path("$outputDir/metadata/GSE214215.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR12848126.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR13191702.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR14593545.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR14709033.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR9984183.runinfo_ftp.tsv")).match("metadata") }, - { assert new File("$outputDir/metadata/GSM4907283.runinfo_ftp.tsv").exists() }, - { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), - path("$outputDir/samplesheet/multiqc_config.yml")).match("samplesheet") }, - { assert new File("$outputDir/samplesheet/samplesheet.csv").exists() } + { assert snapshot(process.out).match() } ) } } diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test.snap b/workflows/sra/tests/sra_force_sratools_download.nf.test.snap index bbec9969..d5d694da 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test.snap +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test.snap @@ -1,4 +1,12 @@ { + "Parameters: '--force_sratools_download'": { + "content": [ + { + + } + ], + "timestamp": "2023-08-17T12:15:55+0000" + }, "metadata": { "content": [ "DRR026872.runinfo_ftp.tsv:md5,73606f6a05c45b077809da43ca638b5f", @@ -12,20 +20,20 @@ "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", "SRR9984183.runinfo_ftp.tsv:md5,53ab34ff3612b0e2c7d60476822787be" ], - "timestamp": "2023-08-06T23:43:45+0000" + "timestamp": "2023-08-17T12:15:55+0000" }, "samplesheet": { "content": [ "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565", "multiqc_config.yml:md5,a97047e12b0ea3f46d285629e4053548" ], - "timestamp": "2023-08-06T23:43:45+0000" + "timestamp": "2023-08-17T12:15:55+0000" }, "software_versions": { "content": [ "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" ], - "timestamp": "2023-08-06T23:43:45+0000" + "timestamp": "2023-08-17T12:15:55+0000" }, "fastq": { "content": [ @@ -54,6 +62,6 @@ "SRX9626017_SRR13191702_1.fastq.gz:md5,627a90afcd9f3cfc7f5f91074f9a2df7", "SRX9626017_SRR13191702_2.fastq.gz:md5,3d9b2c68a8ad1547105b17de81b2d9af" ], - "timestamp": "2023-08-06T23:43:45+0000" + "timestamp": "2023-08-17T12:15:55+0000" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test index 4286327f..bda1d724 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test @@ -6,7 +6,7 @@ nextflow_pipeline { tag "workflows_sra" tag "sra_nf_core_pipeline_atacseq" - test("Parameters: '--nf_core_pipeline atacseq'") { + test("Parameters: --nf_core_pipeline atacseq") { when { params { @@ -18,22 +18,7 @@ nextflow_pipeline { then { assertAll( { assert workflow.success }, - { assert snapshot(NftestUtils.removeNextflowVersion("$outputDir")).match("software_versions") }, - { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, - { assert snapshot(path("$outputDir/metadata/DRR026872.runinfo_ftp.tsv"), - path("$outputDir/metadata/DRR028935.runinfo_ftp.tsv"), - path("$outputDir/metadata/ERR1109373.runinfo_ftp.tsv"), - path("$outputDir/metadata/ERR1160846.runinfo_ftp.tsv"), - path("$outputDir/metadata/GSE214215.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR12848126.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR13191702.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR14593545.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR14709033.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR9984183.runinfo_ftp.tsv")).match("metadata") }, - { assert new File("$outputDir/metadata/GSM4907283.runinfo_ftp.tsv").exists() }, - { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), - path("$outputDir/samplesheet/multiqc_config.yml")).match("samplesheet") }, - { assert new File("$outputDir/samplesheet/samplesheet.csv").exists() } + { assert snapshot(process.out).match() } ) } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap index a9dd40a0..c99f258e 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap @@ -12,20 +12,28 @@ "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", "SRR9984183.runinfo_ftp.tsv:md5,53ab34ff3612b0e2c7d60476822787be" ], - "timestamp": "2023-08-06T23:38:47+0000" + "timestamp": "2023-08-17T12:21:36+0000" }, "samplesheet": { "content": [ "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565", "multiqc_config.yml:md5,a97047e12b0ea3f46d285629e4053548" ], - "timestamp": "2023-08-06T23:38:47+0000" + "timestamp": "2023-08-17T12:21:36+0000" }, "software_versions": { "content": [ "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" ], - "timestamp": "2023-08-06T23:38:47+0000" + "timestamp": "2023-08-17T12:21:36+0000" + }, + "Parameters: '--nf_core_pipeline atacseq'": { + "content": [ + { + + } + ], + "timestamp": "2023-08-17T12:21:36+0000" }, "fastq": { "content": [ @@ -75,6 +83,6 @@ "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" ] ], - "timestamp": "2023-08-06T23:38:47+0000" + "timestamp": "2023-08-17T12:21:36+0000" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test index c948e7dc..438b7f55 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test @@ -6,7 +6,7 @@ nextflow_pipeline { tag "workflows_sra" tag "sra_nf_core_pipeline_rnaseq" - test("Parameters: '--nf_core_pipeline rnaseq'") { + test("Parameters: --nf_core_pipeline rnaseq") { when { params { @@ -18,22 +18,7 @@ nextflow_pipeline { then { assertAll( { assert workflow.success }, - { assert snapshot(NftestUtils.removeNextflowVersion("$outputDir")).match("software_versions") }, - { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, - { assert snapshot(path("$outputDir/metadata/DRR026872.runinfo_ftp.tsv"), - path("$outputDir/metadata/DRR028935.runinfo_ftp.tsv"), - path("$outputDir/metadata/ERR1109373.runinfo_ftp.tsv"), - path("$outputDir/metadata/ERR1160846.runinfo_ftp.tsv"), - path("$outputDir/metadata/GSE214215.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR12848126.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR13191702.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR14593545.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR14709033.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR9984183.runinfo_ftp.tsv")).match("metadata") }, - { assert new File("$outputDir/metadata/GSM4907283.runinfo_ftp.tsv").exists() }, - { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), - path("$outputDir/samplesheet/multiqc_config.yml")).match("samplesheet") }, - { assert new File("$outputDir/samplesheet/samplesheet.csv").exists() } + { assert snapshot(process.out).match() } ) } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap index 1e3e8a5b..1da0381a 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap @@ -12,20 +12,28 @@ "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", "SRR9984183.runinfo_ftp.tsv:md5,53ab34ff3612b0e2c7d60476822787be" ], - "timestamp": "2023-08-06T23:50:46+0000" + "timestamp": "2023-08-17T12:19:51+0000" }, "samplesheet": { "content": [ "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565", "multiqc_config.yml:md5,a97047e12b0ea3f46d285629e4053548" ], - "timestamp": "2023-08-06T23:50:46+0000" + "timestamp": "2023-08-17T12:19:51+0000" }, "software_versions": { "content": [ "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" ], - "timestamp": "2023-08-06T23:50:46+0000" + "timestamp": "2023-08-17T12:19:51+0000" + }, + "Parameters: '--nf_core_pipeline rnaseq'": { + "content": [ + { + + } + ], + "timestamp": "2023-08-17T12:19:51+0000" }, "fastq": { "content": [ @@ -75,6 +83,6 @@ "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" ] ], - "timestamp": "2023-08-06T23:50:46+0000" + "timestamp": "2023-08-17T12:19:51+0000" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test index ab39f52f..301938c4 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test @@ -6,7 +6,7 @@ nextflow_pipeline { tag "workflows_sra" tag "sra_nf_core_pipeline_taxprofiler" - test("Parameters: '--nf_core_pipeline taxprofiler'") { + test("Parameters: --nf_core_pipeline taxprofiler") { when { params { @@ -18,22 +18,7 @@ nextflow_pipeline { then { assertAll( { assert workflow.success }, - { assert snapshot(NftestUtils.removeNextflowVersion("$outputDir")).match("software_versions") }, - { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, - { assert snapshot(path("$outputDir/metadata/DRR026872.runinfo_ftp.tsv"), - path("$outputDir/metadata/DRR028935.runinfo_ftp.tsv"), - path("$outputDir/metadata/ERR1109373.runinfo_ftp.tsv"), - path("$outputDir/metadata/ERR1160846.runinfo_ftp.tsv"), - path("$outputDir/metadata/GSE214215.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR12848126.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR13191702.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR14593545.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR14709033.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR9984183.runinfo_ftp.tsv")).match("metadata") }, - { assert new File("$outputDir/metadata/GSM4907283.runinfo_ftp.tsv").exists() }, - { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), - path("$outputDir/samplesheet/multiqc_config.yml")).match("samplesheet") }, - { assert new File("$outputDir/samplesheet/samplesheet.csv").exists() } + { assert snapshot(process.out).match() } ) } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap index b4fe3748..85f3957b 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap @@ -12,20 +12,28 @@ "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", "SRR9984183.runinfo_ftp.tsv:md5,53ab34ff3612b0e2c7d60476822787be" ], - "timestamp": "2023-08-06T23:40:33+0000" + "timestamp": "2023-08-17T12:24:34+0000" }, "samplesheet": { "content": [ "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565", "multiqc_config.yml:md5,a97047e12b0ea3f46d285629e4053548" ], - "timestamp": "2023-08-06T23:40:33+0000" + "timestamp": "2023-08-17T12:24:34+0000" }, "software_versions": { "content": [ "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" ], - "timestamp": "2023-08-06T23:40:33+0000" + "timestamp": "2023-08-17T12:24:34+0000" + }, + "Parameters: --nf_core_pipeline taxprofiler": { + "content": [ + { + + } + ], + "timestamp": "2023-08-17T12:24:34+0000" }, "fastq": { "content": [ @@ -75,6 +83,6 @@ "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" ] ], - "timestamp": "2023-08-06T23:40:33+0000" + "timestamp": "2023-08-17T12:24:34+0000" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test index c80a092a..892a7c3a 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test @@ -6,7 +6,7 @@ nextflow_pipeline { tag "workflows_sra" tag "sra_nf_core_pipeline_viralrecon" - test("Parameters: '--nf_core_pipeline viralrecon'") { + test("Parameters: --nf_core_pipeline viralrecon") { when { params { @@ -18,22 +18,7 @@ nextflow_pipeline { then { assertAll( { assert workflow.success }, - { assert snapshot(NftestUtils.removeNextflowVersion("$outputDir")).match("software_versions") }, - { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, - { assert snapshot(path("$outputDir/metadata/DRR026872.runinfo_ftp.tsv"), - path("$outputDir/metadata/DRR028935.runinfo_ftp.tsv"), - path("$outputDir/metadata/ERR1109373.runinfo_ftp.tsv"), - path("$outputDir/metadata/ERR1160846.runinfo_ftp.tsv"), - path("$outputDir/metadata/GSE214215.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR12848126.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR13191702.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR14593545.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR14709033.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR9984183.runinfo_ftp.tsv")).match("metadata") }, - { assert new File("$outputDir/metadata/GSM4907283.runinfo_ftp.tsv").exists() }, - { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), - path("$outputDir/samplesheet/multiqc_config.yml")).match("samplesheet") }, - { assert new File("$outputDir/samplesheet/samplesheet.csv").exists() } + { assert snapshot(process.out).match() } ) } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap index 51b0ea51..13c59b5d 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap @@ -12,20 +12,28 @@ "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", "SRR9984183.runinfo_ftp.tsv:md5,53ab34ff3612b0e2c7d60476822787be" ], - "timestamp": "2023-08-06T23:34:45+0000" + "timestamp": "2023-08-17T12:26:57+0000" }, "samplesheet": { "content": [ "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565", "multiqc_config.yml:md5,a97047e12b0ea3f46d285629e4053548" ], - "timestamp": "2023-08-06T23:34:45+0000" + "timestamp": "2023-08-17T12:26:57+0000" + }, + "Parameters: --nf_core_pipeline viralrecon": { + "content": [ + { + + } + ], + "timestamp": "2023-08-17T12:26:57+0000" }, "software_versions": { "content": [ "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" ], - "timestamp": "2023-08-06T23:34:45+0000" + "timestamp": "2023-08-17T12:26:57+0000" }, "fastq": { "content": [ @@ -75,6 +83,6 @@ "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" ] ], - "timestamp": "2023-08-06T23:34:45+0000" + "timestamp": "2023-08-17T12:26:57+0000" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test b/workflows/sra/tests/sra_skip_fastq_download.nf.test index 9a274731..7d218cf7 100644 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test @@ -6,7 +6,7 @@ nextflow_pipeline { tag "workflows_sra" tag "sra_skip_fastq_download" - test("Parameters: '--skip_fastq_download'") { + test("Parameters: --skip_fastq_download") { when { params { @@ -18,35 +18,7 @@ nextflow_pipeline { then { assertAll( { assert workflow.success }, - { assert snapshot(NftestUtils.removeNextflowVersion("$outputDir")).match("software_versions") }, - { assert snapshot(path("$outputDir/metadata/DRR026872.runinfo_ftp.tsv"), - path("$outputDir/metadata/DRR028935.runinfo_ftp.tsv"), - path("$outputDir/metadata/ERR1109373.runinfo_ftp.tsv"), - path("$outputDir/metadata/ERR1160846.runinfo_ftp.tsv"), - path("$outputDir/metadata/GSE214215.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR12848126.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR13191702.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR14593545.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR14709033.runinfo_ftp.tsv"), - path("$outputDir/metadata/SRR9984183.runinfo_ftp.tsv")).match("metadata") }, - { assert new File("$outputDir/metadata/GSM4907283.runinfo_ftp.tsv").exists() }, - { assert snapshot(path("$outputDir/samplesheet/id_mappings.csv"), - path("$outputDir/samplesheet/multiqc_config.yml")).match("samplesheet") }, - { assert new File("$outputDir/samplesheet/samplesheet.csv").exists() }, - { assert !new File("$outputDir/fastq/DRX024467_DRR026872.fastq.gz").exists() }, - { assert !new File("$outputDir/fastq/DRX026011_DRR028935_1.fastq.gz").exists() }, - { assert !new File("$outputDir/fastq/DRX026011_DRR028935_2.fastq.gz").exists() }, - { assert !new File("$outputDir/fastq/ERX1188904_ERR1109373_1.fastq.gz").exists() }, - { assert !new File("$outputDir/fastq/ERX1188904_ERR1109373_2.fastq.gz").exists() }, - { assert !new File("$outputDir/fastq/ERX1234253_ERR1160846.fastq.gz").exists() }, - { assert !new File("$outputDir/fastq/SRX10940790_SRR14593545_1.fastq.gz").exists() }, - { assert !new File("$outputDir/fastq/SRX10940790_SRR14593545_2.fastq.gz").exists() }, - { assert !new File("$outputDir/fastq/SRX11047067_SRR14709033.fastq.gz").exists() }, - { assert !new File("$outputDir/fastq/SRX6725035_SRR9984183.fastq.gz").exists() }, - { assert !new File("$outputDir/fastq/SRX9315476_SRR12848126_1.fastq.gz").exists() }, - { assert !new File("$outputDir/fastq/SRX9315476_SRR12848126_2.fastq.gz").exists() }, - { assert !new File("$outputDir/fastq/SRX9626017_SRR13191702_1.fastq.gz").exists() }, - { assert !new File("$outputDir/fastq/SRX9626017_SRR13191702_2.fastq.gz").exists() } + { assert snapshot(process.out).match() } ) } } diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap b/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap index 7f71a838..d004d5d2 100644 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap @@ -1,4 +1,12 @@ { + "Parameters: '--skip_fastq_download'": { + "content": [ + { + + } + ], + "timestamp": "2023-08-17T12:25:19+0000" + }, "metadata": { "content": [ "DRR026872.runinfo_ftp.tsv:md5,73606f6a05c45b077809da43ca638b5f", @@ -12,19 +20,27 @@ "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", "SRR9984183.runinfo_ftp.tsv:md5,53ab34ff3612b0e2c7d60476822787be" ], - "timestamp": "2023-08-06T23:37:00+0000" + "timestamp": "2023-08-17T12:25:19+0000" }, "samplesheet": { "content": [ "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565", "multiqc_config.yml:md5,a97047e12b0ea3f46d285629e4053548" ], - "timestamp": "2023-08-06T23:37:00+0000" + "timestamp": "2023-08-17T12:25:19+0000" }, "software_versions": { "content": [ "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" ], - "timestamp": "2023-08-06T23:37:00+0000" + "timestamp": "2023-08-17T12:25:19+0000" + }, + "Parameters: --skip_fastq_download": { + "content": [ + { + + } + ], + "timestamp": "2023-08-17T12:25:19+0000" } } \ No newline at end of file From dd94d03ece17a14b09f89fe3058213ee9eb666d1 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Wed, 23 Aug 2023 14:00:50 +0200 Subject: [PATCH 380/852] remove public aws ecr profile --- conf/public_aws_ecr.config | 33 --------------------------------- nextflow.config | 3 --- 2 files changed, 36 deletions(-) delete mode 100644 conf/public_aws_ecr.config diff --git a/conf/public_aws_ecr.config b/conf/public_aws_ecr.config deleted file mode 100644 index 14b577d7..00000000 --- a/conf/public_aws_ecr.config +++ /dev/null @@ -1,33 +0,0 @@ -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - AWS ECR Config -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Config to set public AWS ECR images wherever possible - This improves speed when running on AWS infrastructure. - Use this as an example template when using your own private registry. ----------------------------------------------------------------------------------------- -*/ - -docker.registry = 'public.ecr.aws' -podman.registry = 'public.ecr.aws' - -process { - withName: '.*:SRA_IDS_TO_RUNINFO' { - container = 'quay.io/biocontainers/python:3.9--1' - } - withName: '.*:SRA_RUNINFO_TO_FTP' { - container = 'quay.io/biocontainers/python:3.9--1' - } - withName: '.*:MULTIQC_MAPPINGS_CONFIG' { - container = 'quay.io/biocontainers/python:3.9--1' - } - withName: '.*:SRATOOLS_FASTERQDUMP' { - container = 'quay.io/biocontainers/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:6a9ff0e76ec016c3d0d27e0c0d362339f2d787e6-0' - } - withName: '.*:SRA_MERGE_SAMPLESHEET' { - container = 'quay.io/nf-core/ubuntu:20.04' - } - withName: '.*:SYNAPSE_MERGE_SAMPLESHEET' { - container = 'quay.io/nf-core/ubuntu:20.04' - } -} diff --git a/nextflow.config b/nextflow.config index 6eb5c18d..7b693a85 100644 --- a/nextflow.config +++ b/nextflow.config @@ -159,9 +159,6 @@ profiles { executor.cpus = 16 executor.memory = 60.GB } - public_aws_ecr { - includeConfig 'conf/public_aws_ecr.config' - } test { includeConfig 'conf/test.config' } test_synapse { includeConfig 'conf/test_synapse.config' } test_full { includeConfig 'conf/test_full.config' } From 1c5a396d686d53d58833c1be10c9b555ffb0c1e0 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Wed, 23 Aug 2023 14:06:42 +0200 Subject: [PATCH 381/852] split up config files to be more modular --- conf/modules/base.config | 32 +++++++++ conf/{modules.config => modules/sra.config} | 79 --------------------- conf/modules/synapse.config | 69 ++++++++++++++++++ nextflow.config | 4 +- 4 files changed, 104 insertions(+), 80 deletions(-) create mode 100644 conf/modules/base.config rename conf/{modules.config => modules/sra.config} (58%) create mode 100644 conf/modules/synapse.config diff --git a/conf/modules/base.config b/conf/modules/base.config new file mode 100644 index 00000000..d7eb6c86 --- /dev/null +++ b/conf/modules/base.config @@ -0,0 +1,32 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Config file for defining DSL2 per module options and publishing paths +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Available keys to override module options: + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. +---------------------------------------------------------------------------------------- +*/ + +// +// Generic process options for all workflows +// +process { + + publishDir = [ + path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + + withName: CUSTOM_DUMPSOFTWAREVERSIONS { + publishDir = [ + path: { "${params.outdir}/pipeline_info" }, + mode: params.publish_dir_mode, + pattern: '*_versions.yml' + ] + } + +} diff --git a/conf/modules.config b/conf/modules/sra.config similarity index 58% rename from conf/modules.config rename to conf/modules/sra.config index f5cb1c77..e6e9d168 100644 --- a/conf/modules.config +++ b/conf/modules/sra.config @@ -10,27 +10,6 @@ ---------------------------------------------------------------------------------------- */ -// -// Generic process options for all workflows -// -process { - - publishDir = [ - path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - - withName: CUSTOM_DUMPSOFTWAREVERSIONS { - publishDir = [ - path: { "${params.outdir}/pipeline_info" }, - mode: params.publish_dir_mode, - pattern: '*_versions.yml' - ] - } - -} - // // Process options for the SRA workflow // @@ -111,61 +90,3 @@ if (params.input_type == 'sra') { } } - -// -// Process options for the Synapse workflow -// -if (params.input_type == 'synapse') { - - process { - - withName: SYNAPSE_LIST { - ext.args = '--long' - publishDir = [ - path: { "${params.outdir}/metadata" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: SYNAPSE_GET { - publishDir = [ - [ - path: { "${params.outdir}/fastq" }, - mode: params.publish_dir_mode, - pattern: "*.fastq.gz" - ], - [ - path: { "${params.outdir}/fastq/md5" }, - mode: params.publish_dir_mode, - pattern: "*.md5" - ] - ] - } - - withName: SYNAPSE_SHOW { - publishDir = [ - path: { "${params.outdir}/metadata" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: SYNAPSE_TO_SAMPLESHEET { - publishDir = [ - path: { "${params.outdir}/samplesheet" }, - enabled: false - ] - } - - withName: SYNAPSE_MERGE_SAMPLESHEET { - publishDir = [ - path: { "${params.outdir}/samplesheet" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - } - -} diff --git a/conf/modules/synapse.config b/conf/modules/synapse.config new file mode 100644 index 00000000..bcca94db --- /dev/null +++ b/conf/modules/synapse.config @@ -0,0 +1,69 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Config file for defining DSL2 per module options and publishing paths +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Available keys to override module options: + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. +---------------------------------------------------------------------------------------- +*/ + +// +// Process options for the Synapse workflow +// +if (params.input_type == 'synapse') { + + process { + + withName: SYNAPSE_LIST { + ext.args = '--long' + publishDir = [ + path: { "${params.outdir}/metadata" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: SYNAPSE_GET { + publishDir = [ + [ + path: { "${params.outdir}/fastq" }, + mode: params.publish_dir_mode, + pattern: "*.fastq.gz" + ], + [ + path: { "${params.outdir}/fastq/md5" }, + mode: params.publish_dir_mode, + pattern: "*.md5" + ] + ] + } + + withName: SYNAPSE_SHOW { + publishDir = [ + path: { "${params.outdir}/metadata" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: SYNAPSE_TO_SAMPLESHEET { + publishDir = [ + path: { "${params.outdir}/samplesheet" }, + enabled: false + ] + } + + withName: SYNAPSE_MERGE_SAMPLESHEET { + publishDir = [ + path: { "${params.outdir}/samplesheet" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + } + +} diff --git a/nextflow.config b/nextflow.config index 6eb5c18d..486c058c 100644 --- a/nextflow.config +++ b/nextflow.config @@ -217,7 +217,9 @@ manifest { } // Load modules.config for DSL2 module specific options -includeConfig 'conf/modules.config' +includeConfig 'conf/modules/base.config' +includeConfig 'conf/modules/sra.config' +includeConfig 'conf/modules/synapse.config' // Function to ensure that resource requirements don't go beyond // a maximum limit From 9c5fadbd335d3f84064516d3bc1b93a06dc4baa9 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Wed, 23 Aug 2023 15:33:13 +0200 Subject: [PATCH 382/852] no cascade inclusion of config files --- conf/test.config | 3 --- nextflow.config | 5 ++++- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/conf/test.config b/conf/test.config index 0bc98595..3c58e9cf 100644 --- a/conf/test.config +++ b/conf/test.config @@ -22,6 +22,3 @@ params { // Input data input = 'https://raw.githubusercontent.com/nf-core/test-datasets/fetchngs/sra_ids_test.csv' } - -// Load test_data.config for nf-tests -includeConfig 'test_data.config' diff --git a/nextflow.config b/nextflow.config index 7b693a85..578b233d 100644 --- a/nextflow.config +++ b/nextflow.config @@ -159,7 +159,10 @@ profiles { executor.cpus = 16 executor.memory = 60.GB } - test { includeConfig 'conf/test.config' } + test { + includeConfig 'conf/test.config' + includeConfig 'conf/test_data.config' + } test_synapse { includeConfig 'conf/test_synapse.config' } test_full { includeConfig 'conf/test_full.config' } } From 5073409171943f07d0248f8bc15dc2db52e13bef Mon Sep 17 00:00:00 2001 From: maxulysse Date: Wed, 23 Aug 2023 15:33:46 +0200 Subject: [PATCH 383/852] use schema_ignore_params to remove warnings --- conf/test.config | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conf/test.config b/conf/test.config index 3c58e9cf..6a9d5d38 100644 --- a/conf/test.config +++ b/conf/test.config @@ -21,4 +21,6 @@ params { // Input data input = 'https://raw.githubusercontent.com/nf-core/test-datasets/fetchngs/sra_ids_test.csv' + + schema_ignore_params = 'fastq_ftp_ids,genomes,merge_samplesheet_ids,test_data,test_data_base' } From bc7fd25c21e1a058d00870513d1eb742847d3b0f Mon Sep 17 00:00:00 2001 From: maxulysse Date: Wed, 23 Aug 2023 16:21:07 +0200 Subject: [PATCH 384/852] fix lint --- .nf-core.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.nf-core.yml b/.nf-core.yml index 253f86e2..269ee3ed 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,5 +1,8 @@ repository_type: pipeline lint: + actions_ci: false + files_exist: + - conf/modules.config files_unchanged: - .github/CONTRIBUTING.md - .github/ISSUE_TEMPLATE/bug_report.yml @@ -7,7 +10,6 @@ lint: - assets/sendmail_template.txt - lib/NfcoreTemplate.groovy - .gitattributes - actions_ci: false multiqc_config: false nextflow_config: - "params.validationShowHiddenParams" From 81324d23467f153484ffbb4f65f465f118d071c7 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Mon, 21 Aug 2023 18:05:36 +0100 Subject: [PATCH 385/852] Adds emit statement for FASTQs and metadata to SRA workflow --- CHANGELOG.md | 1 + .../sra_to_samplesheet/tests/main.nf.test.snap | 18 +++++++++--------- workflows/sra/main.nf | 18 ++++++++++++++---- 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 146b93b6..8573dea7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements ### Enhancements & fixes - [#166](https://github.com/nf-core/fetchngs/issues/175) - Add NF-TEST pipeline end-to-end tests for existing CI tests +- Emits all files in workflow for testing and enabling workflow to be imported when supported by Nextflow ## [[1.10.0](https://github.com/nf-core/fetchngs/releases/tag/1.10.0)] - 2023-05-16 diff --git a/modules/local/sra_to_samplesheet/tests/main.nf.test.snap b/modules/local/sra_to_samplesheet/tests/main.nf.test.snap index 8b5f4947..e60c646a 100644 --- a/modules/local/sra_to_samplesheet/tests/main.nf.test.snap +++ b/modules/local/sra_to_samplesheet/tests/main.nf.test.snap @@ -19,8 +19,8 @@ "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_1": "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "fastq_2": "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9", + "fastq_1": "./results/fastq/ERX1188904_ERR1109373_1.fastq.gz", + "fastq_2": "./results/fastq/ERX1188904_ERR1109373_2.fastq.gz", "md5_1": "9fd57225d6c07a31843276d6df9b15c0", "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", "single_end": false @@ -45,8 +45,8 @@ "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_1": "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "fastq_2": "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9", + "fastq_1": "./results/fastq/ERX1188904_ERR1109373_1.fastq.gz", + "fastq_2": "./results/fastq/ERX1188904_ERR1109373_2.fastq.gz", "md5_1": "9fd57225d6c07a31843276d6df9b15c0", "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", "single_end": false @@ -71,8 +71,8 @@ "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_1": "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "fastq_2": "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9", + "fastq_1": "./results/fastq/ERX1188904_ERR1109373_1.fastq.gz", + "fastq_2": "./results/fastq/ERX1188904_ERR1109373_2.fastq.gz", "md5_1": "9fd57225d6c07a31843276d6df9b15c0", "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", "single_end": false @@ -97,8 +97,8 @@ "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_1": "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "fastq_2": "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9", + "fastq_1": "./results/fastq/ERX1188904_ERR1109373_1.fastq.gz", + "fastq_2": "./results/fastq/ERX1188904_ERR1109373_2.fastq.gz", "md5_1": "9fd57225d6c07a31843276d6df9b15c0", "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", "single_end": false @@ -108,6 +108,6 @@ ] } ], - "timestamp": "2023-08-17T10:55:52+0000" + "timestamp": "2023-08-23T09:38:15+0000" } } \ No newline at end of file diff --git a/workflows/sra/main.nf b/workflows/sra/main.nf index 512a73d4..3ca9b33e 100644 --- a/workflows/sra/main.nf +++ b/workflows/sra/main.nf @@ -81,6 +81,8 @@ workflow SRA { .set { ch_sra_metadata } ch_versions = ch_versions.mix(SRA_RUNINFO_TO_FTP.out.versions.first()) + fastq_files = Channel.empty() + if (!params.skip_fastq_download) { ch_sra_metadata @@ -111,10 +113,13 @@ workflow SRA { ) ch_versions = ch_versions.mix(FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS.out.versions.first()) - SRA_FASTQ_FTP - .out - .fastq - .mix(FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS.out.reads) + // Isolate FASTQ channel which will be added to emit block + fastq_files = fastq_files.mix( + SRA_FASTQ_FTP.out.fastq, + FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS.out.reads + ) + + fastq_files .map { meta, fastq -> def reads = fastq instanceof List ? fastq.flatten() : [ fastq ] @@ -161,6 +166,11 @@ workflow SRA { CUSTOM_DUMPSOFTWAREVERSIONS ( ch_versions.unique().collectFile(name: 'collated_versions.yml') ) + + emit: + fastq = fastq_files + samplesheet = SRA_MERGE_SAMPLESHEET.out.samplesheet + mapping = SRA_MERGE_SAMPLESHEET.out.mappings } /* From 82fa5000fe8a468a4e202f5765d78b12a93c7e0f Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Thu, 24 Aug 2023 15:50:52 +0200 Subject: [PATCH 386/852] Update nextflow.config Co-authored-by: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> --- nextflow.config | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/nextflow.config b/nextflow.config index 486c058c..6b7463d3 100644 --- a/nextflow.config +++ b/nextflow.config @@ -218,8 +218,12 @@ manifest { // Load modules.config for DSL2 module specific options includeConfig 'conf/modules/base.config' -includeConfig 'conf/modules/sra.config' -includeConfig 'conf/modules/synapse.config' +if ( params.input_type == 'sra' ) { + includeConfig 'conf/modules/sra.config' +} +if ( params.input_type == 'synapse' ) { + includeConfig 'conf/modules/synapse.config' +} // Function to ensure that resource requirements don't go beyond // a maximum limit From 011addc3cf5d6ad036adc435cd30eaf88df2582d Mon Sep 17 00:00:00 2001 From: maxulysse Date: Thu, 24 Aug 2023 15:52:05 +0200 Subject: [PATCH 387/852] remove if statement --- conf/modules/sra.config | 122 +++++++++++++++++------------------- conf/modules/synapse.config | 83 ++++++++++++------------ 2 files changed, 99 insertions(+), 106 deletions(-) diff --git a/conf/modules/sra.config b/conf/modules/sra.config index e6e9d168..15802b41 100644 --- a/conf/modules/sra.config +++ b/conf/modules/sra.config @@ -13,80 +13,76 @@ // // Process options for the SRA workflow // -if (params.input_type == 'sra') { +process { - process { - - withName: SRA_IDS_TO_RUNINFO { - publishDir = [ - path: { "${params.outdir}/metadata" }, - enabled: false - ] - } - - withName: SRA_RUNINFO_TO_FTP { - publishDir = [ - path: { "${params.outdir}/metadata" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: SRA_FASTQ_FTP { - ext.args = '--retry 5 --continue-at - --max-time 1200' - publishDir = [ - [ - path: { "${params.outdir}/fastq" }, - mode: params.publish_dir_mode, - pattern: "*.fastq.gz" - ], - [ - path: { "${params.outdir}/fastq/md5" }, - mode: params.publish_dir_mode, - pattern: "*.md5" - ] - ] - } + withName: SRA_IDS_TO_RUNINFO { + publishDir = [ + path: { "${params.outdir}/metadata" }, + enabled: false + ] + } - withName: SRATOOLS_PREFETCH { - publishDir = [ - path: { "${params.outdir}/sra" }, - enabled: false - ] - } + withName: SRA_RUNINFO_TO_FTP { + publishDir = [ + path: { "${params.outdir}/metadata" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } - withName: SRATOOLS_FASTERQDUMP { - ext.args = '--split-files --include-technical' - publishDir = [ + withName: SRA_FASTQ_FTP { + ext.args = '--retry 5 --continue-at - --max-time 1200' + publishDir = [ + [ path: { "${params.outdir}/fastq" }, mode: params.publish_dir_mode, pattern: "*.fastq.gz" + ], + [ + path: { "${params.outdir}/fastq/md5" }, + mode: params.publish_dir_mode, + pattern: "*.md5" ] - } + ] + } - withName: SRA_TO_SAMPLESHEET { - publishDir = [ - path: { "${params.outdir}/samplesheet" }, - enabled: false - ] - } + withName: SRATOOLS_PREFETCH { + publishDir = [ + path: { "${params.outdir}/sra" }, + enabled: false + ] + } - withName: SRA_MERGE_SAMPLESHEET { - publishDir = [ - path: { "${params.outdir}/samplesheet" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } + withName: SRATOOLS_FASTERQDUMP { + ext.args = '--split-files --include-technical' + publishDir = [ + path: { "${params.outdir}/fastq" }, + mode: params.publish_dir_mode, + pattern: "*.fastq.gz" + ] + } - withName: MULTIQC_MAPPINGS_CONFIG { - publishDir = [ - path: { "${params.outdir}/samplesheet" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } + withName: SRA_TO_SAMPLESHEET { + publishDir = [ + path: { "${params.outdir}/samplesheet" }, + enabled: false + ] + } + + withName: SRA_MERGE_SAMPLESHEET { + publishDir = [ + path: { "${params.outdir}/samplesheet" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: MULTIQC_MAPPINGS_CONFIG { + publishDir = [ + path: { "${params.outdir}/samplesheet" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] } } diff --git a/conf/modules/synapse.config b/conf/modules/synapse.config index bcca94db..2f52aa6f 100644 --- a/conf/modules/synapse.config +++ b/conf/modules/synapse.config @@ -13,57 +13,54 @@ // // Process options for the Synapse workflow // -if (params.input_type == 'synapse') { - process { +process { - withName: SYNAPSE_LIST { - ext.args = '--long' - publishDir = [ - path: { "${params.outdir}/metadata" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: SYNAPSE_GET { - publishDir = [ - [ - path: { "${params.outdir}/fastq" }, - mode: params.publish_dir_mode, - pattern: "*.fastq.gz" - ], - [ - path: { "${params.outdir}/fastq/md5" }, - mode: params.publish_dir_mode, - pattern: "*.md5" - ] - ] - } + withName: SYNAPSE_LIST { + ext.args = '--long' + publishDir = [ + path: { "${params.outdir}/metadata" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } - withName: SYNAPSE_SHOW { - publishDir = [ - path: { "${params.outdir}/metadata" }, + withName: SYNAPSE_GET { + publishDir = [ + [ + path: { "${params.outdir}/fastq" }, + mode: params.publish_dir_mode, + pattern: "*.fastq.gz" + ], + [ + path: { "${params.outdir}/fastq/md5" }, mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + pattern: "*.md5" ] - } + ] + } - withName: SYNAPSE_TO_SAMPLESHEET { - publishDir = [ - path: { "${params.outdir}/samplesheet" }, - enabled: false - ] - } + withName: SYNAPSE_SHOW { + publishDir = [ + path: { "${params.outdir}/metadata" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } - withName: SYNAPSE_MERGE_SAMPLESHEET { - publishDir = [ - path: { "${params.outdir}/samplesheet" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } + withName: SYNAPSE_TO_SAMPLESHEET { + publishDir = [ + path: { "${params.outdir}/samplesheet" }, + enabled: false + ] + } + withName: SYNAPSE_MERGE_SAMPLESHEET { + publishDir = [ + path: { "${params.outdir}/samplesheet" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] } } From 464397c9225cccb293240cfefcf0fded5915a985 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Thu, 24 Aug 2023 15:07:04 +0100 Subject: [PATCH 388/852] Add emit statement to synpase workflow --- workflows/sra/main.nf | 8 +++++--- workflows/synapse/main.nf | 5 +++++ workflows/synapse/tests/main.nf.test.snap | 16 ++++++++++++++++ 3 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 workflows/synapse/tests/main.nf.test.snap diff --git a/workflows/sra/main.nf b/workflows/sra/main.nf index 3ca9b33e..e60386f9 100644 --- a/workflows/sra/main.nf +++ b/workflows/sra/main.nf @@ -168,9 +168,11 @@ workflow SRA { ) emit: - fastq = fastq_files - samplesheet = SRA_MERGE_SAMPLESHEET.out.samplesheet - mapping = SRA_MERGE_SAMPLESHEET.out.mappings + fastq = fastq_files + samplesheet = SRA_MERGE_SAMPLESHEET.out.samplesheet + mapping = SRA_MERGE_SAMPLESHEET.out.mappings + multiqc_config = MULTIQC_MAPPINGS_CONFIG.out.yml + versions = ch_versions.unique() } /* diff --git a/workflows/synapse/main.nf b/workflows/synapse/main.nf index f8cbeba1..0753a521 100644 --- a/workflows/synapse/main.nf +++ b/workflows/synapse/main.nf @@ -133,6 +133,11 @@ workflow SYNAPSE { CUSTOM_DUMPSOFTWAREVERSIONS ( ch_versions.unique().collectFile(name: 'collated_versions.yml') ) + + emit: + fastq = ch_fastq + samplesheet = SYNAPSE_MERGE_SAMPLESHEET.out.samplesheet + versions = ch_versions.unique() } /* diff --git a/workflows/synapse/tests/main.nf.test.snap b/workflows/synapse/tests/main.nf.test.snap new file mode 100644 index 00000000..8528f776 --- /dev/null +++ b/workflows/synapse/tests/main.nf.test.snap @@ -0,0 +1,16 @@ +{ + "samplesheet": { + "content": [ + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565", + "multiqc_config.yml:md5,a97047e12b0ea3f46d285629e4053548", + "samplesheet.csv:md5,9b3c35e8af74e9af194baa2498aaf4d4" + ], + "timestamp": "2023-08-24T14:05:07+0000" + }, + "software_versions": { + "content": [ + "software_versions.yml:md5,f37983a6b1ce2334fe62fa188b31ca51" + ], + "timestamp": "2023-08-24T14:05:07+0000" + } +} \ No newline at end of file From 97af5cd85d6c20127c16dee4b3f158867943bbbf Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Thu, 24 Aug 2023 15:53:28 +0100 Subject: [PATCH 389/852] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8573dea7..20dd21f8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,7 +18,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements ### Enhancements & fixes - [#166](https://github.com/nf-core/fetchngs/issues/175) - Add NF-TEST pipeline end-to-end tests for existing CI tests -- Emits all files in workflow for testing and enabling workflow to be imported when supported by Nextflow +- [#184](https://github.com/nf-core/fetchngs/pull/184/files) Emits all files in workflow for testing and enabling workflow to be imported (not supported by Nextflow) ## [[1.10.0](https://github.com/nf-core/fetchngs/releases/tag/1.10.0)] - 2023-05-16 From c7ab8b8bb2240d0d27a341e0ea20b4efec3f4913 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Thu, 24 Aug 2023 18:07:07 +0200 Subject: [PATCH 390/852] move out multiqc and versions --- main.nf | 42 ++++++++++++++++++++++++++++++++++++ workflows/sra/main.nf | 45 +++++---------------------------------- workflows/synapse/main.nf | 15 ------------- 3 files changed, 47 insertions(+), 55 deletions(-) diff --git a/main.nf b/main.nf index 6da732be..e9bce9cd 100644 --- a/main.nf +++ b/main.nf @@ -31,6 +31,15 @@ Channel .unique() .set { ch_ids } +/* +======================================================================================== + IMPORT MODULES/SUBWORKFLOWS +======================================================================================== +*/ + +include { CUSTOM_DUMPSOFTWAREVERSIONS } from './modules/nf-core/custom/dumpsoftwareversions' +include { MULTIQC_MAPPINGS_CONFIG } from './modules/local/multiqc_mappings_config' + /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ NAMED WORKFLOW FOR PIPELINE @@ -62,18 +71,37 @@ if (params.input_type == input_type) { // workflow NFCORE_FETCHNGS { + ch_versions = Channel.empty() + // // WORKFLOW: Download FastQ files for SRA / ENA / GEO / DDBJ ids // if (params.input_type == 'sra') { SRA ( ch_ids ) + // + // MODULE: Create a MutiQC config file with sample name mappings + // + if (params.sample_mapping_fields) { + MULTIQC_MAPPINGS_CONFIG (SRA.out.mappings) + ch_versions = SRA.out.versions.mix(MULTIQC_MAPPINGS_CONFIG.out.versions) + } + + // + // MODULE: Dump software versions for all tools used in the workflow + // + // // WORKFLOW: Download FastQ files for Synapse ids // } else if (params.input_type == 'synapse') { SYNAPSE ( ch_ids ) + ch_versions = SYNAPSE.out.versions } + + CUSTOM_DUMPSOFTWAREVERSIONS ( + ch_versions.unique().collectFile(name: 'collated_versions.yml') + ) } /* @@ -90,6 +118,20 @@ workflow { NFCORE_FETCHNGS () } +/* +======================================================================================== + COMPLETION EMAIL AND SUMMARY +======================================================================================== +*/ + +workflow.onComplete { + if (params.email || params.email_on_fail) { + NfcoreTemplate.email(workflow, params, summary_params, projectDir, log) + } + NfcoreTemplate.summary(workflow, params, log) + WorkflowSra.curateSamplesheetWarn(log) +} + /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ THE END diff --git a/workflows/sra/main.nf b/workflows/sra/main.nf index e60386f9..d4612cd0 100644 --- a/workflows/sra/main.nf +++ b/workflows/sra/main.nf @@ -24,7 +24,6 @@ include { SRA_RUNINFO_TO_FTP } from '../../modules/local/sra_runinfo_to_ftp include { SRA_FASTQ_FTP } from '../../modules/local/sra_fastq_ftp' include { SRA_TO_SAMPLESHEET } from '../../modules/local/sra_to_samplesheet' include { SRA_MERGE_SAMPLESHEET } from '../../modules/local/sra_merge_samplesheet' -include { MULTIQC_MAPPINGS_CONFIG } from '../../modules/local/multiqc_mappings_config' /* ======================================================================================== @@ -32,8 +31,6 @@ include { MULTIQC_MAPPINGS_CONFIG } from '../../modules/local/multiqc_mappings_c ======================================================================================== */ -include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../../modules/nf-core/custom/dumpsoftwareversions' - include { FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS } from '../../subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools' /* @@ -86,9 +83,9 @@ workflow SRA { if (!params.skip_fastq_download) { ch_sra_metadata - .map { - meta -> - [ meta, [ meta.fastq_1, meta.fastq_2 ] ] + .map { + meta -> + [ meta, [ meta.fastq_1, meta.fastq_2 ] ] } .branch { ftp: it[0].fastq_1 && !params.force_sratools_download @@ -120,7 +117,7 @@ workflow SRA { ) fastq_files - .map { + .map { meta, fastq -> def reads = fastq instanceof List ? fastq.flatten() : [ fastq ] def meta_clone = meta.clone() @@ -150,45 +147,13 @@ workflow SRA { ) ch_versions = ch_versions.mix(SRA_MERGE_SAMPLESHEET.out.versions) - // - // MODULE: Create a MutiQC config file with sample name mappings - // - if (params.sample_mapping_fields) { - MULTIQC_MAPPINGS_CONFIG ( - SRA_MERGE_SAMPLESHEET.out.mappings - ) - ch_versions = ch_versions.mix(MULTIQC_MAPPINGS_CONFIG.out.versions) - } - - // - // MODULE: Dump software versions for all tools used in the workflow - // - CUSTOM_DUMPSOFTWAREVERSIONS ( - ch_versions.unique().collectFile(name: 'collated_versions.yml') - ) - emit: fastq = fastq_files samplesheet = SRA_MERGE_SAMPLESHEET.out.samplesheet - mapping = SRA_MERGE_SAMPLESHEET.out.mappings - multiqc_config = MULTIQC_MAPPINGS_CONFIG.out.yml + mappings = SRA_MERGE_SAMPLESHEET.out.mappings versions = ch_versions.unique() } -/* -======================================================================================== - COMPLETION EMAIL AND SUMMARY -======================================================================================== -*/ - -workflow.onComplete { - if (params.email || params.email_on_fail) { - NfcoreTemplate.email(workflow, params, summary_params, projectDir, log) - } - NfcoreTemplate.summary(workflow, params, log) - WorkflowSra.curateSamplesheetWarn(log) -} - /* ======================================================================================== THE END diff --git a/workflows/synapse/main.nf b/workflows/synapse/main.nf index 0753a521..34c3e315 100644 --- a/workflows/synapse/main.nf +++ b/workflows/synapse/main.nf @@ -25,14 +25,6 @@ include { SYNAPSE_GET } from '../../modules/local/synapse_get' include { SYNAPSE_TO_SAMPLESHEET } from '../../modules/local/synapse_to_samplesheet' include { SYNAPSE_MERGE_SAMPLESHEET } from '../../modules/local/synapse_merge_samplesheet' -/* -======================================================================================== - IMPORT NF-CORE MODULES/SUBWORKFLOWS -======================================================================================== -*/ - -include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../../modules/nf-core/custom/dumpsoftwareversions' - /* ======================================================================================== RUN MAIN WORKFLOW @@ -127,13 +119,6 @@ workflow SYNAPSE { ) ch_versions = ch_versions.mix(SYNAPSE_MERGE_SAMPLESHEET.out.versions) - // - // MODULE: Dump software versions for all tools used in the workflow - // - CUSTOM_DUMPSOFTWAREVERSIONS ( - ch_versions.unique().collectFile(name: 'collated_versions.yml') - ) - emit: fastq = ch_fastq samplesheet = SYNAPSE_MERGE_SAMPLESHEET.out.samplesheet From 372f9e434af68b1a854e8a68a8bec73510ca8ab9 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Thu, 24 Aug 2023 18:10:41 +0200 Subject: [PATCH 391/852] enable tests in refactor --- .github/workflows/ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 451613fb..2a30309b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,10 +4,12 @@ on: push: branches: - dev + - refactor pull_request: branches: - dev - master + - refactor release: types: - "published" From 5dab8d0fa3e790ecb7baaced1fe08c9d01e994ec Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Thu, 24 Aug 2023 18:16:24 +0200 Subject: [PATCH 392/852] Apply suggestions from code review --- main.nf | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/main.nf b/main.nf index e9bce9cd..0f48d3c8 100644 --- a/main.nf +++ b/main.nf @@ -86,11 +86,6 @@ workflow NFCORE_FETCHNGS { MULTIQC_MAPPINGS_CONFIG (SRA.out.mappings) ch_versions = SRA.out.versions.mix(MULTIQC_MAPPINGS_CONFIG.out.versions) } - - // - // MODULE: Dump software versions for all tools used in the workflow - // - // // WORKFLOW: Download FastQ files for Synapse ids // @@ -99,6 +94,9 @@ workflow NFCORE_FETCHNGS { ch_versions = SYNAPSE.out.versions } + // + // MODULE: Dump software versions for all tools used in the workflow + // CUSTOM_DUMPSOFTWAREVERSIONS ( ch_versions.unique().collectFile(name: 'collated_versions.yml') ) From aff72b7ecc372162ba88759c2033fe601885c16d Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Thu, 24 Aug 2023 18:43:03 +0200 Subject: [PATCH 393/852] Apply suggestions from code review Co-authored-by: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> --- main.nf | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/main.nf b/main.nf index 0f48d3c8..2b852884 100644 --- a/main.nf +++ b/main.nf @@ -78,20 +78,25 @@ workflow NFCORE_FETCHNGS { // if (params.input_type == 'sra') { SRA ( ch_ids ) + ch_versions = ch_versions.mix(SRA.out.versions) + } // - // MODULE: Create a MutiQC config file with sample name mappings + // MODULE: Create a MultiQC config file with sample name mappings // if (params.sample_mapping_fields) { MULTIQC_MAPPINGS_CONFIG (SRA.out.mappings) - ch_versions = SRA.out.versions.mix(MULTIQC_MAPPINGS_CONFIG.out.versions) + ch_versions = ch_versions.mix( + SRA.out.versions, + MULTIQC_MAPPINGS_CONFIG.out.versions + ) } // // WORKFLOW: Download FastQ files for Synapse ids // } else if (params.input_type == 'synapse') { SYNAPSE ( ch_ids ) - ch_versions = SYNAPSE.out.versions + ch_versions = ch_versions.mix(SYNAPSE.out.versions) } // From 7f6439c1e6affd62bc13f76e63fd48ce6e262a75 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Thu, 24 Aug 2023 18:46:00 +0200 Subject: [PATCH 394/852] fix syntax --- main.nf | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/main.nf b/main.nf index 2b852884..5311164f 100644 --- a/main.nf +++ b/main.nf @@ -79,17 +79,12 @@ workflow NFCORE_FETCHNGS { if (params.input_type == 'sra') { SRA ( ch_ids ) ch_versions = ch_versions.mix(SRA.out.versions) - } - // // MODULE: Create a MultiQC config file with sample name mappings // if (params.sample_mapping_fields) { MULTIQC_MAPPINGS_CONFIG (SRA.out.mappings) - ch_versions = ch_versions.mix( - SRA.out.versions, - MULTIQC_MAPPINGS_CONFIG.out.versions - ) + ch_versions = ch_versions.mix(MULTIQC_MAPPINGS_CONFIG.out.versions) } // // WORKFLOW: Download FastQ files for Synapse ids From 6355a331d97c8f12815926901404760feed3238c Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 25 Aug 2023 10:36:33 +0200 Subject: [PATCH 395/852] small refactor --- main.nf | 65 ++++++++++++++++++--------------------- workflows/synapse/main.nf | 14 --------- 2 files changed, 30 insertions(+), 49 deletions(-) diff --git a/main.nf b/main.nf index 5311164f..edb54fd8 100644 --- a/main.nf +++ b/main.nf @@ -1,20 +1,20 @@ #!/usr/bin/env nextflow /* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +======================================================================================== nf-core/fetchngs -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +======================================================================================== Github : https://github.com/nf-core/fetchngs Website: https://nf-co.re/fetchngs Slack : https://nfcore.slack.com/channels/fetchngs ----------------------------------------------------------------------------------------- +======================================================================================== */ nextflow.enable.dsl = 2 /* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +======================================================================================== VALIDATE & PRINT PARAMETER SUMMARY -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +======================================================================================== */ WorkflowMain.initialise(workflow, params, log) @@ -24,16 +24,21 @@ ch_input = file(params.input, checkIfExists: true) if (ch_input.isEmpty()) {exit 1, "File provided with --input is empty: ${ch_input.getName()}!"} // Read in ids from --input file -Channel - .from(file(params.input, checkIfExists: true)) +ch_ids = Channel.from(file(params.input, checkIfExists: true)) .splitCsv(header:false, sep:'', strip:true) .map { it[0] } .unique() - .set { ch_ids } + +// Auto-detect input type +def input_type = '' +if (WorkflowMain.isSraId(ch_input)) { input_type = 'sra' } +else if (WorkflowMain.isSynapseId(ch_input)) { input_type = 'synapse' } +else { exit 1, 'Ids provided via --input not recognised please make sure they are either SRA / ENA / GEO / DDBJ or Synapse ids!' } +if (params.input_type != input_type) { exit 1, "Ids auto-detected as ${input_type}. Please provide '--input_type ${input_type}' as a parameter to the pipeline!" } /* ======================================================================================== - IMPORT MODULES/SUBWORKFLOWS + IMPORT MODULES ======================================================================================== */ @@ -41,30 +46,19 @@ include { CUSTOM_DUMPSOFTWAREVERSIONS } from './modules/nf-core/custom/dumpsoftw include { MULTIQC_MAPPINGS_CONFIG } from './modules/local/multiqc_mappings_config' /* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - NAMED WORKFLOW FOR PIPELINE -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +======================================================================================== + IMPORT WORKFLOWS +======================================================================================== */ -// Auto-detect input id type -def input_type = '' -if (WorkflowMain.isSraId(ch_input)) { - input_type = 'sra' -} else if (WorkflowMain.isSynapseId(ch_input)) { - input_type = 'synapse' -} else { - exit 1, 'Ids provided via --input not recognised please make sure they are either SRA / ENA / GEO / DDBJ or Synapse ids!' -} +if (params.input_type == 'sra') include { SRA } from './workflows/sra' +if (params.input_type == 'synapse') include { SYNAPSE } from './workflows/synapse' -if (params.input_type == input_type) { - if (params.input_type == 'sra') { - include { SRA } from './workflows/sra' - } else if (params.input_type == 'synapse') { - include { SYNAPSE } from './workflows/synapse' - } -} else { - exit 1, "Ids auto-detected as ${input_type}. Please provide '--input_type ${input_type}' as a parameter to the pipeline!" -} +/* +======================================================================================== + NAMED WORKFLOW FOR PIPELINE +======================================================================================== +*/ // // WORKFLOW: Run main nf-core/fetchngs analysis pipeline depending on type of identifier provided @@ -77,13 +71,13 @@ workflow NFCORE_FETCHNGS { // WORKFLOW: Download FastQ files for SRA / ENA / GEO / DDBJ ids // if (params.input_type == 'sra') { - SRA ( ch_ids ) + SRA(ch_ids) ch_versions = ch_versions.mix(SRA.out.versions) // // MODULE: Create a MultiQC config file with sample name mappings // if (params.sample_mapping_fields) { - MULTIQC_MAPPINGS_CONFIG (SRA.out.mappings) + MULTIQC_MAPPINGS_CONFIG(SRA.out.mappings) ch_versions = ch_versions.mix(MULTIQC_MAPPINGS_CONFIG.out.versions) } // @@ -127,11 +121,12 @@ workflow.onComplete { NfcoreTemplate.email(workflow, params, summary_params, projectDir, log) } NfcoreTemplate.summary(workflow, params, log) - WorkflowSra.curateSamplesheetWarn(log) + if (params.input_type == 'sra') { WorkflowSra.curateSamplesheetWarn(log) } + if (params.input_type == 'synapse') { WorkflowSynapse.curateSamplesheetWarn(log) } } /* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +======================================================================================== THE END -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +======================================================================================== */ diff --git a/workflows/synapse/main.nf b/workflows/synapse/main.nf index 34c3e315..04bb32cb 100644 --- a/workflows/synapse/main.nf +++ b/workflows/synapse/main.nf @@ -125,20 +125,6 @@ workflow SYNAPSE { versions = ch_versions.unique() } -/* -======================================================================================== - COMPLETION EMAIL AND SUMMARY -======================================================================================== -*/ - -workflow.onComplete { - if (params.email || params.email_on_fail) { - NfcoreTemplate.email(workflow, params, summary_params, projectDir, log) - } - NfcoreTemplate.summary(workflow, params, log) - WorkflowSynapse.curateSamplesheetWarn(log) -} - /* ======================================================================================== THE END From ef03d06a9ec70aecc56d792a754bd900af0eb5d3 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 25 Aug 2023 10:46:38 +0200 Subject: [PATCH 396/852] staging --- workflows/sra/tests/main.nf.test | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/workflows/sra/tests/main.nf.test b/workflows/sra/tests/main.nf.test index 39a5cc3f..68ba7b58 100644 --- a/workflows/sra/tests/main.nf.test +++ b/workflows/sra/tests/main.nf.test @@ -1,7 +1,8 @@ -nextflow_pipeline { +nextflow_workflow { - name "Test workflow: sra.nf" - script "main.nf" + name "Test workflow: sra/main.nf" + script "workflows/sra/main.nf" + workflow "SRA" tag "workflows" tag "workflows_sra" tag "sra_default_parameters" From 1be5ebca09466fe99306fd638dccb9e529652324 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 25 Aug 2023 10:51:52 +0200 Subject: [PATCH 397/852] validate input in main.nf --- main.nf | 32 +++++++++++++++++++++++++++++++- workflows/sra/main.nf | 15 --------------- workflows/synapse/main.nf | 18 ++---------------- 3 files changed, 33 insertions(+), 32 deletions(-) diff --git a/main.nf b/main.nf index edb54fd8..ef79d02b 100644 --- a/main.nf +++ b/main.nf @@ -36,6 +36,36 @@ else if (WorkflowMain.isSynapseId(ch_input)) { input_type = 'synapse' } else { exit 1, 'Ids provided via --input not recognised please make sure they are either SRA / ENA / GEO / DDBJ or Synapse ids!' } if (params.input_type != input_type) { exit 1, "Ids auto-detected as ${input_type}. Please provide '--input_type ${input_type}' as a parameter to the pipeline!" } +/* +======================================================================================== + VALIDATE INPUTS +======================================================================================== +*/ + +if (params.input_type == 'sra') { + def valid_params = [ + ena_metadata_fields : ['run_accession', 'experiment_accession', 'library_layout', 'fastq_ftp', 'fastq_md5'] + ] + + def summary_params = NfcoreSchema.paramsSummaryMap(workflow, params) + + // Validate input parameters + WorkflowSra.initialise(params, valid_params) +} + +if (params.input_type == 'synapse') { + + def summary_params = NfcoreSchema.paramsSummaryMap(workflow, params) + + // Create channel for synapse config + if (params.synapse_config) { + ch_synapse_config = file(params.synapse_config, checkIfExists: true) + } else { + exit 1, 'Please provide a Synapse config file for download authentication!' + } + +} + /* ======================================================================================== IMPORT MODULES @@ -84,7 +114,7 @@ workflow NFCORE_FETCHNGS { // WORKFLOW: Download FastQ files for Synapse ids // } else if (params.input_type == 'synapse') { - SYNAPSE ( ch_ids ) + SYNAPSE(ch_ids, ch_synapse_config) ch_versions = ch_versions.mix(SYNAPSE.out.versions) } diff --git a/workflows/sra/main.nf b/workflows/sra/main.nf index d4612cd0..d999d998 100644 --- a/workflows/sra/main.nf +++ b/workflows/sra/main.nf @@ -1,18 +1,3 @@ -/* -======================================================================================== - VALIDATE INPUTS -======================================================================================== -*/ - -def valid_params = [ - ena_metadata_fields : ['run_accession', 'experiment_accession', 'library_layout', 'fastq_ftp', 'fastq_md5'] -] - -def summary_params = NfcoreSchema.paramsSummaryMap(workflow, params) - -// Validate input parameters -WorkflowSra.initialise(params, valid_params) - /* ======================================================================================== IMPORT LOCAL MODULES/SUBWORKFLOWS diff --git a/workflows/synapse/main.nf b/workflows/synapse/main.nf index 04bb32cb..30d05f4f 100644 --- a/workflows/synapse/main.nf +++ b/workflows/synapse/main.nf @@ -1,18 +1,3 @@ -/* -======================================================================================== - VALIDATE INPUTS -======================================================================================== -*/ - -def summary_params = NfcoreSchema.paramsSummaryMap(workflow, params) - -// Create channel for synapse config -if (params.synapse_config) { - ch_synapse_config = file(params.synapse_config, checkIfExists: true) -} else { - exit 1, 'Please provide a Synapse config file for download authentication!' -} - /* ======================================================================================== IMPORT LOCAL MODULES/SUBWORKFLOWS @@ -34,7 +19,8 @@ include { SYNAPSE_MERGE_SAMPLESHEET } from '../../modules/local/synapse_merge_sa workflow SYNAPSE { take: - ids // channel: [ ids ] + ids // channel: [ ids ] + ch_synapse_config // channel: [ synapse_config ] main: ch_versions = Channel.empty() From 698fab108f7638736768cb9a67140ce6801bd3ad Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 25 Aug 2023 11:08:13 +0200 Subject: [PATCH 398/852] use error --- main.nf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/main.nf b/main.nf index ef79d02b..7575eeb8 100644 --- a/main.nf +++ b/main.nf @@ -21,7 +21,7 @@ WorkflowMain.initialise(workflow, params, log) // Check if --input file is empty ch_input = file(params.input, checkIfExists: true) -if (ch_input.isEmpty()) {exit 1, "File provided with --input is empty: ${ch_input.getName()}!"} +if (ch_input.isEmpty()) { error("File provided with --input is empty: ${ch_input.getName()}!") } // Read in ids from --input file ch_ids = Channel.from(file(params.input, checkIfExists: true)) @@ -33,8 +33,8 @@ ch_ids = Channel.from(file(params.input, checkIfExists: true)) def input_type = '' if (WorkflowMain.isSraId(ch_input)) { input_type = 'sra' } else if (WorkflowMain.isSynapseId(ch_input)) { input_type = 'synapse' } -else { exit 1, 'Ids provided via --input not recognised please make sure they are either SRA / ENA / GEO / DDBJ or Synapse ids!' } -if (params.input_type != input_type) { exit 1, "Ids auto-detected as ${input_type}. Please provide '--input_type ${input_type}' as a parameter to the pipeline!" } +else { error('Ids provided via --input not recognised please make sure they are either SRA / ENA / GEO / DDBJ or Synapse ids!') } +if (params.input_type != input_type) { error("Ids auto-detected as ${input_type}. Please provide '--input_type ${input_type}' as a parameter to the pipeline!") } /* ======================================================================================== @@ -61,7 +61,7 @@ if (params.input_type == 'synapse') { if (params.synapse_config) { ch_synapse_config = file(params.synapse_config, checkIfExists: true) } else { - exit 1, 'Please provide a Synapse config file for download authentication!' + error('Please provide a Synapse config file for download authentication!') } } From e83e909954168129e5f94ddae48493fff505c05d Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 25 Aug 2023 12:14:32 +0200 Subject: [PATCH 399/852] use workflow testing --- workflows/sra/tests/main.nf.test | 6 +- workflows/sra/tests/main.nf.test.snap | 80 +-------------------------- 2 files changed, 5 insertions(+), 81 deletions(-) diff --git a/workflows/sra/tests/main.nf.test b/workflows/sra/tests/main.nf.test index 68ba7b58..22ed6744 100644 --- a/workflows/sra/tests/main.nf.test +++ b/workflows/sra/tests/main.nf.test @@ -10,8 +10,10 @@ nextflow_workflow { test("Parameters: default") { when { - params { - outdir = "$outputDir" + workflow { + """ + input[0] = Channel.from('DRR026872','DRR028935','ERR1109373','ERR1160846','GSE214215','GSM4907283','SRR12848126','SRR13191702','SRR14593545','SRR14709033','SRR9984183') + """ } } diff --git a/workflows/sra/tests/main.nf.test.snap b/workflows/sra/tests/main.nf.test.snap index 88ea9654..3261e286 100644 --- a/workflows/sra/tests/main.nf.test.snap +++ b/workflows/sra/tests/main.nf.test.snap @@ -5,84 +5,6 @@ } ], - "timestamp": "2023-08-17T12:09:45+0000" - }, - "metadata": { - "content": [ - "DRR026872.runinfo_ftp.tsv:md5,73606f6a05c45b077809da43ca638b5f", - "DRR028935.runinfo_ftp.tsv:md5,f79eefcea5db346f76f76f87df7f8dd2", - "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", - "ERR1160846.runinfo_ftp.tsv:md5,1b2dc1a64117de20b2164724836da345", - "GSE214215.runinfo_ftp.tsv:md5,23a580c89ee7bf681ca3ffa26aa1837f", - "SRR12848126.runinfo_ftp.tsv:md5,5d1e6bfd3d4077d1e66378c58e44975d", - "SRR13191702.runinfo_ftp.tsv:md5,409e262bb41bb6103315126db4d0dd1d", - "SRR14593545.runinfo_ftp.tsv:md5,62015706ac156693ba3d86ed050cab54", - "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", - "SRR9984183.runinfo_ftp.tsv:md5,53ab34ff3612b0e2c7d60476822787be" - ], - "timestamp": "2023-08-17T12:09:45+0000" - }, - "samplesheet": { - "content": [ - "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565", - "multiqc_config.yml:md5,a97047e12b0ea3f46d285629e4053548" - ], - "timestamp": "2023-08-17T12:09:45+0000" - }, - "software_versions": { - "content": [ - "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" - ], - "timestamp": "2023-08-17T12:09:45+0000" - }, - "fastq": { - "content": [ - "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791", - "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", - "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30", - "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9", - "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6", - "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", - "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2", - "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda", - "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64", - "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83", - "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544", - "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", - "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79", - "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", - "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962", - "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", - "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76", - "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", - "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88", - "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", - "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04", - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98", - [ - "DRX024467_DRR026872.fastq.gz.md5:md5,dacaeba3498fb8f405411a22cdb4b40d", - "DRX026011_DRR028935_1.fastq.gz.md5:md5,a47018c5972ba4c11539d0d6bc25eda9", - "DRX026011_DRR028935_2.fastq.gz.md5:md5,f477bbef548fbed665734ebf084eea2f", - "ERX1188904_ERR1109373_1.fastq.gz.md5:md5,50c1c3108631dc32a3151b67e0260d86", - "ERX1188904_ERR1109373_2.fastq.gz.md5:md5,1f22463d410e91a288c83d43654b2499", - "ERX1234253_ERR1160846.fastq.gz.md5:md5,513a8437ad331fc512b088b3750aa1ff", - "SRX17709227_SRR21711856.fastq.gz.md5:md5,13a38fbef27c3e15867d80887145ae75", - "SRX17709228_SRR21711855.fastq.gz.md5:md5,1e871ddd9e92e1866e0c64d36eb5ec85", - "SRX6725035_SRR9984183.fastq.gz.md5:md5,84f59dbb76c9b5eab7e14d90ced352c4", - "SRX9504942_SRR13055517_1.fastq.gz.md5:md5,a03f7f374dc401047b6f6ccaec3885cc", - "SRX9504942_SRR13055517_2.fastq.gz.md5:md5,facaf207753e977327e7b7df7bb8ace0", - "SRX9504942_SRR13055518_1.fastq.gz.md5:md5,5cf412cd62aadaa4838d9eabb5b44368", - "SRX9504942_SRR13055518_2.fastq.gz.md5:md5,93292b826afc72b23be93df26dd710c8", - "SRX9504942_SRR13055519_1.fastq.gz.md5:md5,f6ad6e2610397147a0a55c651de3992f", - "SRX9504942_SRR13055519_2.fastq.gz.md5:md5,2fe7dd4bcc1e7e61c6f54ef50cf961f3", - "SRX9504942_SRR13055520_1.fastq.gz.md5:md5,ab195b37746a3424a1099d9f8cc58de8", - "SRX9504942_SRR13055520_2.fastq.gz.md5:md5,10c448e23f1f7e7af61ec1204f8fc882", - "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", - "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" - ] - ], - "timestamp": "2023-08-17T12:09:45+0000" + "timestamp": "2023-08-25T10:11:12+0000" } } \ No newline at end of file From 883a191ec257032a2714ce4683c742a719e33a66 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 25 Aug 2023 13:27:52 +0200 Subject: [PATCH 400/852] update snapshot --- workflows/sra/tests/main.nf.test | 5 +- workflows/sra/tests/main.nf.test.snap | 1347 ++++++++++++++++++++++++- 2 files changed, 1349 insertions(+), 3 deletions(-) diff --git a/workflows/sra/tests/main.nf.test b/workflows/sra/tests/main.nf.test index 22ed6744..2652eb80 100644 --- a/workflows/sra/tests/main.nf.test +++ b/workflows/sra/tests/main.nf.test @@ -15,12 +15,15 @@ nextflow_workflow { input[0] = Channel.from('DRR026872','DRR028935','ERR1109373','ERR1160846','GSE214215','GSM4907283','SRR12848126','SRR13191702','SRR14593545','SRR14709033','SRR9984183') """ } + params { + outdir = "$outputDir" + } } then { assertAll( { assert workflow.success }, - { assert snapshot(process.out).match() } + { assert snapshot(workflow.out).match() } ) } } diff --git a/workflows/sra/tests/main.nf.test.snap b/workflows/sra/tests/main.nf.test.snap index 3261e286..a0cfc3f8 100644 --- a/workflows/sra/tests/main.nf.test.snap +++ b/workflows/sra/tests/main.nf.test.snap @@ -2,9 +2,1352 @@ "Parameters: default": { "content": [ { - + "0": [ + [ + { + "id": "DRX024467_DRR026872", + "run_accession": "DRR026872", + "experiment_accession": "DRX024467", + "sample_accession": "SAMD00023098", + "secondary_sample_accession": "DRS033740", + "study_accession": "PRJDB4356", + "secondary_study_accession": "DRP003256", + "submission_accession": "DRA002758", + "run_alias": "DRR026872", + "experiment_alias": "DRX024467", + "sample_alias": "SAMD00023098", + "study_alias": "DRP003256", + "library_layout": "SINGLE", + "library_selection": "Restriction Digest", + "library_source": "GENOMIC", + "library_strategy": "OTHER", + "library_name": "IpeRAD1_3", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "62550", + "read_count": "417", + "tax_id": "35883", + "scientific_name": "Ipomoea nil", + "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", + "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", + "study_title": "The Japanese morning glory genome sequence", + "sample_description": "Keywords: GSC:MIxS MIGS:6.0", + "fastq_md5": "515e5448c55e054113c4a22df5f62791", + "fastq_bytes": "38447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_2": "", + "md5_1": "515e5448c55e054113c4a22df5f62791", + "md5_2": "", + "single_end": true + }, + "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" + ], + [ + { + "id": "SRX6725035_SRR9984183", + "run_accession": "SRR9984183", + "experiment_accession": "SRX6725035", + "sample_accession": "SAMN12581720", + "secondary_sample_accession": "SRS5277011", + "study_accession": "PRJNA560329", + "secondary_study_accession": "SRP218535", + "submission_accession": "SRA942061", + "run_alias": "Emb289P1_bin131.fastq", + "experiment_alias": "Emb289P1_bin131", + "sample_alias": "Emb289P1_bin131", + "study_alias": "PRJNA560329", + "library_layout": "SINGLE", + "library_selection": "RANDOM", + "library_source": "METAGENOMIC", + "library_strategy": "WGS", + "library_name": "Emb289P1_bin131", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "1996273", + "read_count": "58", + "tax_id": "2660712", + "scientific_name": "Defluviitaleaceae bacterium", + "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", + "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", + "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", + "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", + "fastq_md5": "0b512d2dc31685983456bd56fd836544", + "fastq_bytes": "605358", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_2": "", + "md5_1": "0b512d2dc31685983456bd56fd836544", + "md5_2": "", + "single_end": true + }, + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" + ], + [ + { + "id": "ERX1234253_ERR1160846", + "run_accession": "ERR1160846", + "experiment_accession": "ERX1234253", + "sample_accession": "SAMEA3687214", + "secondary_sample_accession": "ERS994363", + "study_accession": "PRJEB11419", + "secondary_study_accession": "ERP012803", + "submission_accession": "ERA541392", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "study_alias": "qiita_sid_10317", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "10317.BLANK.93.3E.r22", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "35658", + "read_count": "283", + "tax_id": "256318", + "scientific_name": "metagenome", + "sample_title": "10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "study_title": "American Gut Project", + "sample_description": "American Gut control", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_2": "", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "single_end": true + }, + "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" + ], + [ + { + "id": "SRX11047067_SRR14709033", + "run_accession": "SRR14709033", + "experiment_accession": "SRX11047067", + "sample_accession": "SAMN19373034", + "secondary_sample_accession": "SRS9115923", + "study_accession": "PRJNA733285", + "secondary_study_accession": "SRP322267", + "submission_accession": "SRA1239521", + "run_alias": "Sebastes_levis-2.fastq", + "experiment_alias": "Sebastes_macdonaldi-1", + "sample_alias": "S._macdonaldi-1", + "study_alias": "PRJNA733285", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "Sebastes_macdonaldi-1", + "instrument_model": "AB 5500 Genetic Analyzer", + "instrument_platform": "ABI_SOLID", + "base_count": "153", + "read_count": "1", + "tax_id": "394693", + "scientific_name": "Sebastes macdonaldi", + "sample_title": "Sebastes_macdonaldi-1", + "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", + "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", + "sample_description": "Sebastes_macdonaldi-1", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": true + }, + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" + ], + [ + { + "id": "SRX9626017_SRR13191702", + "run_accession": "SRR13191702", + "experiment_accession": "SRX9626017", + "sample_accession": "SAMN16980141", + "secondary_sample_accession": "SRS7827211", + "study_accession": "PRJNA682076", + "secondary_study_accession": "SRP295653", + "submission_accession": "SRA1166126", + "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", + "experiment_alias": "S.170804.00784", + "sample_alias": "S.170804.00784_662", + "study_alias": "PRJNA682076", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "S.170804.00784", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "45682", + "read_count": "91", + "tax_id": "408170", + "scientific_name": "human gut metagenome", + "sample_title": "Metagenome or environmental sample from human gut metagenome", + "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "sample_description": "Metagenome or environmental sample from human gut metagenome", + "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", + "fastq_bytes": "15420;16324", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98", + "single_end": false + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + ] + ], + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "sample_accession": "SAMEA3643867", + "secondary_sample_accession": "ERS951016", + "study_accession": "PRJEB11633", + "secondary_study_accession": "ERP013030", + "submission_accession": "ERA528939", + "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", + "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", + "sample_alias": "sample_56", + "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", + "library_layout": "PAIRED", + "library_selection": "RT-PCR", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "unspecified", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "29700", + "read_count": "169", + "tax_id": "63433", + "scientific_name": "Leptopilina boulardi", + "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing", + "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", + "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_bytes": "3221;8151;8118", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, + [ + "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" + ] + ], + [ + { + "id": "DRX026011_DRR028935", + "run_accession": "DRR028935", + "experiment_accession": "DRX026011", + "sample_accession": "SAMD00024405", + "secondary_sample_accession": "DRS019431", + "study_accession": "PRJDB3420", + "secondary_study_accession": "DRP002616", + "submission_accession": "DRA002949", + "run_alias": "DRR028935", + "experiment_alias": "DRX026011", + "sample_alias": "SAMD00024405", + "study_alias": "DRP002616", + "library_layout": "PAIRED", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "day0_BbSQE-I", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "194930", + "read_count": "965", + "tax_id": "1202541", + "scientific_name": "Botryococcus braunii Showa", + "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", + "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", + "sample_description": "Liquid culture", + "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", + "fastq_bytes": "60275;61610", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "md5_1": "cc01df82a9354bb6b3be93483b20c35a", + "md5_2": "941c9998d746416dad53c94c480ddf30", + "single_end": false + }, + [ + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" + ] + ], + [ + { + "id": "SRX10940790_SRR14593545", + "run_accession": "SRR14593545", + "experiment_accession": "SRX10940790", + "sample_accession": "SAMN19097423", + "secondary_sample_accession": "SRS9020442", + "study_accession": "PRJNA728650", + "secondary_study_accession": "SRP319413", + "submission_accession": "SRA1234280", + "run_alias": "577-6_530058_19-037147 Goat_F.ab1", + "experiment_alias": "PRNP_2765", + "sample_alias": "prp_2765", + "study_alias": "PRJNA728650", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "PRNP_2765", + "instrument_model": "AB 3500xL Genetic Analyzer", + "instrument_platform": "CAPILLARY", + "base_count": "828", + "read_count": "1", + "tax_id": "9925", + "scientific_name": "Capra hircus", + "sample_title": "MIGS Eukaryotic sample from Capra hircus", + "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", + "study_title": "Capra hircus Raw sequence reads", + "sample_description": "Keywords: GSC:MIxS MIGS:5.0", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" + ] + ], + [ + { + "id": "SRX9504942_SRR13055517", + "run_accession": "SRR13055517", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r1", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2246028", + "read_count": "29553", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", + "fastq_bytes": "721167;723753", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", + "md5_2": "18dbe96e7f58b63406d9058938df1962", + "single_end": false + }, + [ + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" + ] + ], + [ + { + "id": "SRX9504942_SRR13055520", + "run_accession": "SRR13055520", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r4", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2214488", + "read_count": "29138", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", + "fastq_bytes": "709867;716862", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "md5_1": "795d460abff6009c7f5ff7c14b773fbe", + "md5_2": "c3f34379356b28d6dac7212abc1a0a04", + "single_end": false + }, + [ + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" + ] + ], + [ + { + "id": "SRX9504942_SRR13055518", + "run_accession": "SRR13055518", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r2", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2235236", + "read_count": "29411", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", + "fastq_bytes": "717693;723429", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "md5_1": "5ec894d863fcefe394470a0925aefde4", + "md5_2": "aead170df9851773d5202b5760c76d76", + "single_end": false + }, + [ + "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" + ] + ], + [ + { + "id": "SRX9504942_SRR13055519", + "run_accession": "SRR13055519", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r3", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2232728", + "read_count": "29378", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", + "fastq_bytes": "714907;721705", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", + "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", + "single_end": false + }, + [ + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" + ] + ], + [ + { + "id": "SRX9315476_SRR12848126", + "run_accession": "SRR12848126", + "experiment_accession": "SRX9315476", + "sample_accession": "SAMN16455283", + "secondary_sample_accession": "SRS7540262", + "study_accession": "PRJNA670070", + "secondary_study_accession": "SRP287769", + "submission_accession": "SRA1145417", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "experiment_alias": "F11-N1-05", + "sample_alias": "F11-N1-05", + "study_alias": "PRJNA670070", + "library_layout": "PAIRED", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "library_name": "F11-N1-05", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "base_count": "431758", + "read_count": "2954", + "tax_id": "10092", + "scientific_name": "Mus musculus domesticus", + "sample_title": "Longshanks_F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "sample_description": "F11-N1-05", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" + ] + ], + [ + { + "id": "SRX17709227_SRR21711856", + "run_accession": "SRR21711856", + "experiment_accession": "SRX17709227", + "sample_accession": "SAMN31021823", + "secondary_sample_accession": "SRS15239723", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601460_r1", + "experiment_alias": "GSM6601460_r1", + "sample_alias": "GSM6601460", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601460", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "573417800", + "read_count": "11468356", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "sham-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "sham-treated worms in day 5", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_2": "", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "single_end": true + }, + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" + ], + [ + { + "id": "SRX17709228_SRR21711855", + "run_accession": "SRR21711855", + "experiment_accession": "SRX17709228", + "sample_accession": "SAMN31021822", + "secondary_sample_accession": "SRS15239724", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601461_r1", + "experiment_alias": "GSM6601461_r1", + "sample_alias": "GSM6601461", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601461", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "677912850", + "read_count": "13558257", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "PM2.5-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "PM2.5-treated worms in day 5", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_2": "", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "single_end": true + }, + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" + ] + ], + "1": [ + "samplesheet.csv:md5,dbd0e9c1683c603c681184a13f5b7341" + ], + "2": [ + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + ], + "3": [ + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + ], + "fastq": [ + [ + { + "id": "DRX024467_DRR026872", + "run_accession": "DRR026872", + "experiment_accession": "DRX024467", + "sample_accession": "SAMD00023098", + "secondary_sample_accession": "DRS033740", + "study_accession": "PRJDB4356", + "secondary_study_accession": "DRP003256", + "submission_accession": "DRA002758", + "run_alias": "DRR026872", + "experiment_alias": "DRX024467", + "sample_alias": "SAMD00023098", + "study_alias": "DRP003256", + "library_layout": "SINGLE", + "library_selection": "Restriction Digest", + "library_source": "GENOMIC", + "library_strategy": "OTHER", + "library_name": "IpeRAD1_3", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "62550", + "read_count": "417", + "tax_id": "35883", + "scientific_name": "Ipomoea nil", + "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", + "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", + "study_title": "The Japanese morning glory genome sequence", + "sample_description": "Keywords: GSC:MIxS MIGS:6.0", + "fastq_md5": "515e5448c55e054113c4a22df5f62791", + "fastq_bytes": "38447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_2": "", + "md5_1": "515e5448c55e054113c4a22df5f62791", + "md5_2": "", + "single_end": true + }, + "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" + ], + [ + { + "id": "SRX6725035_SRR9984183", + "run_accession": "SRR9984183", + "experiment_accession": "SRX6725035", + "sample_accession": "SAMN12581720", + "secondary_sample_accession": "SRS5277011", + "study_accession": "PRJNA560329", + "secondary_study_accession": "SRP218535", + "submission_accession": "SRA942061", + "run_alias": "Emb289P1_bin131.fastq", + "experiment_alias": "Emb289P1_bin131", + "sample_alias": "Emb289P1_bin131", + "study_alias": "PRJNA560329", + "library_layout": "SINGLE", + "library_selection": "RANDOM", + "library_source": "METAGENOMIC", + "library_strategy": "WGS", + "library_name": "Emb289P1_bin131", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "1996273", + "read_count": "58", + "tax_id": "2660712", + "scientific_name": "Defluviitaleaceae bacterium", + "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", + "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", + "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", + "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", + "fastq_md5": "0b512d2dc31685983456bd56fd836544", + "fastq_bytes": "605358", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_2": "", + "md5_1": "0b512d2dc31685983456bd56fd836544", + "md5_2": "", + "single_end": true + }, + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" + ], + [ + { + "id": "ERX1234253_ERR1160846", + "run_accession": "ERR1160846", + "experiment_accession": "ERX1234253", + "sample_accession": "SAMEA3687214", + "secondary_sample_accession": "ERS994363", + "study_accession": "PRJEB11419", + "secondary_study_accession": "ERP012803", + "submission_accession": "ERA541392", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "study_alias": "qiita_sid_10317", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "10317.BLANK.93.3E.r22", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "35658", + "read_count": "283", + "tax_id": "256318", + "scientific_name": "metagenome", + "sample_title": "10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "study_title": "American Gut Project", + "sample_description": "American Gut control", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_2": "", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "single_end": true + }, + "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" + ], + [ + { + "id": "SRX11047067_SRR14709033", + "run_accession": "SRR14709033", + "experiment_accession": "SRX11047067", + "sample_accession": "SAMN19373034", + "secondary_sample_accession": "SRS9115923", + "study_accession": "PRJNA733285", + "secondary_study_accession": "SRP322267", + "submission_accession": "SRA1239521", + "run_alias": "Sebastes_levis-2.fastq", + "experiment_alias": "Sebastes_macdonaldi-1", + "sample_alias": "S._macdonaldi-1", + "study_alias": "PRJNA733285", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "Sebastes_macdonaldi-1", + "instrument_model": "AB 5500 Genetic Analyzer", + "instrument_platform": "ABI_SOLID", + "base_count": "153", + "read_count": "1", + "tax_id": "394693", + "scientific_name": "Sebastes macdonaldi", + "sample_title": "Sebastes_macdonaldi-1", + "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", + "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", + "sample_description": "Sebastes_macdonaldi-1", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": true + }, + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" + ], + [ + { + "id": "SRX9626017_SRR13191702", + "run_accession": "SRR13191702", + "experiment_accession": "SRX9626017", + "sample_accession": "SAMN16980141", + "secondary_sample_accession": "SRS7827211", + "study_accession": "PRJNA682076", + "secondary_study_accession": "SRP295653", + "submission_accession": "SRA1166126", + "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", + "experiment_alias": "S.170804.00784", + "sample_alias": "S.170804.00784_662", + "study_alias": "PRJNA682076", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "S.170804.00784", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "45682", + "read_count": "91", + "tax_id": "408170", + "scientific_name": "human gut metagenome", + "sample_title": "Metagenome or environmental sample from human gut metagenome", + "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "sample_description": "Metagenome or environmental sample from human gut metagenome", + "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", + "fastq_bytes": "15420;16324", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98", + "single_end": false + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + ] + ], + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "sample_accession": "SAMEA3643867", + "secondary_sample_accession": "ERS951016", + "study_accession": "PRJEB11633", + "secondary_study_accession": "ERP013030", + "submission_accession": "ERA528939", + "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", + "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", + "sample_alias": "sample_56", + "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", + "library_layout": "PAIRED", + "library_selection": "RT-PCR", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "unspecified", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "29700", + "read_count": "169", + "tax_id": "63433", + "scientific_name": "Leptopilina boulardi", + "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing", + "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", + "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_bytes": "3221;8151;8118", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, + [ + "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" + ] + ], + [ + { + "id": "DRX026011_DRR028935", + "run_accession": "DRR028935", + "experiment_accession": "DRX026011", + "sample_accession": "SAMD00024405", + "secondary_sample_accession": "DRS019431", + "study_accession": "PRJDB3420", + "secondary_study_accession": "DRP002616", + "submission_accession": "DRA002949", + "run_alias": "DRR028935", + "experiment_alias": "DRX026011", + "sample_alias": "SAMD00024405", + "study_alias": "DRP002616", + "library_layout": "PAIRED", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "day0_BbSQE-I", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "194930", + "read_count": "965", + "tax_id": "1202541", + "scientific_name": "Botryococcus braunii Showa", + "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", + "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", + "sample_description": "Liquid culture", + "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", + "fastq_bytes": "60275;61610", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "md5_1": "cc01df82a9354bb6b3be93483b20c35a", + "md5_2": "941c9998d746416dad53c94c480ddf30", + "single_end": false + }, + [ + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" + ] + ], + [ + { + "id": "SRX10940790_SRR14593545", + "run_accession": "SRR14593545", + "experiment_accession": "SRX10940790", + "sample_accession": "SAMN19097423", + "secondary_sample_accession": "SRS9020442", + "study_accession": "PRJNA728650", + "secondary_study_accession": "SRP319413", + "submission_accession": "SRA1234280", + "run_alias": "577-6_530058_19-037147 Goat_F.ab1", + "experiment_alias": "PRNP_2765", + "sample_alias": "prp_2765", + "study_alias": "PRJNA728650", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "PRNP_2765", + "instrument_model": "AB 3500xL Genetic Analyzer", + "instrument_platform": "CAPILLARY", + "base_count": "828", + "read_count": "1", + "tax_id": "9925", + "scientific_name": "Capra hircus", + "sample_title": "MIGS Eukaryotic sample from Capra hircus", + "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", + "study_title": "Capra hircus Raw sequence reads", + "sample_description": "Keywords: GSC:MIxS MIGS:5.0", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" + ] + ], + [ + { + "id": "SRX9504942_SRR13055517", + "run_accession": "SRR13055517", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r1", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2246028", + "read_count": "29553", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", + "fastq_bytes": "721167;723753", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", + "md5_2": "18dbe96e7f58b63406d9058938df1962", + "single_end": false + }, + [ + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" + ] + ], + [ + { + "id": "SRX9504942_SRR13055520", + "run_accession": "SRR13055520", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r4", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2214488", + "read_count": "29138", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", + "fastq_bytes": "709867;716862", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "md5_1": "795d460abff6009c7f5ff7c14b773fbe", + "md5_2": "c3f34379356b28d6dac7212abc1a0a04", + "single_end": false + }, + [ + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" + ] + ], + [ + { + "id": "SRX9504942_SRR13055518", + "run_accession": "SRR13055518", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r2", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2235236", + "read_count": "29411", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", + "fastq_bytes": "717693;723429", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "md5_1": "5ec894d863fcefe394470a0925aefde4", + "md5_2": "aead170df9851773d5202b5760c76d76", + "single_end": false + }, + [ + "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" + ] + ], + [ + { + "id": "SRX9504942_SRR13055519", + "run_accession": "SRR13055519", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r3", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2232728", + "read_count": "29378", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", + "fastq_bytes": "714907;721705", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", + "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", + "single_end": false + }, + [ + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" + ] + ], + [ + { + "id": "SRX9315476_SRR12848126", + "run_accession": "SRR12848126", + "experiment_accession": "SRX9315476", + "sample_accession": "SAMN16455283", + "secondary_sample_accession": "SRS7540262", + "study_accession": "PRJNA670070", + "secondary_study_accession": "SRP287769", + "submission_accession": "SRA1145417", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "experiment_alias": "F11-N1-05", + "sample_alias": "F11-N1-05", + "study_alias": "PRJNA670070", + "library_layout": "PAIRED", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "library_name": "F11-N1-05", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "base_count": "431758", + "read_count": "2954", + "tax_id": "10092", + "scientific_name": "Mus musculus domesticus", + "sample_title": "Longshanks_F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "sample_description": "F11-N1-05", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" + ] + ], + [ + { + "id": "SRX17709227_SRR21711856", + "run_accession": "SRR21711856", + "experiment_accession": "SRX17709227", + "sample_accession": "SAMN31021823", + "secondary_sample_accession": "SRS15239723", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601460_r1", + "experiment_alias": "GSM6601460_r1", + "sample_alias": "GSM6601460", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601460", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "573417800", + "read_count": "11468356", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "sham-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "sham-treated worms in day 5", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_2": "", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "single_end": true + }, + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" + ], + [ + { + "id": "SRX17709228_SRR21711855", + "run_accession": "SRR21711855", + "experiment_accession": "SRX17709228", + "sample_accession": "SAMN31021822", + "secondary_sample_accession": "SRS15239724", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601461_r1", + "experiment_alias": "GSM6601461_r1", + "sample_alias": "GSM6601461", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601461", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "677912850", + "read_count": "13558257", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "PM2.5-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "PM2.5-treated worms in day 5", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_2": "", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "single_end": true + }, + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" + ] + ], + "mappings": [ + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + ], + "samplesheet": [ + "samplesheet.csv:md5,dbd0e9c1683c603c681184a13f5b7341" + ], + "versions": [ + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + ] } ], - "timestamp": "2023-08-25T10:11:12+0000" + "timestamp": "2023-08-25T11:27:09+0000" } } \ No newline at end of file From da650afaf646bb4156b81ed0442d0764b7df802c Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 25 Aug 2023 14:22:05 +0200 Subject: [PATCH 401/852] restore versions --- modules.json | 3 +-- .../custom-dumpsoftwareversions.diff | 13 ------------- .../templates/dumpsoftwareversions.py | 1 + 3 files changed, 2 insertions(+), 15 deletions(-) delete mode 100644 modules/nf-core/custom/dumpsoftwareversions/custom-dumpsoftwareversions.diff diff --git a/modules.json b/modules.json index 2244addd..3137b88b 100644 --- a/modules.json +++ b/modules.json @@ -8,8 +8,7 @@ "custom/dumpsoftwareversions": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"], - "patch": "modules/nf-core/custom/dumpsoftwareversions/custom-dumpsoftwareversions.diff" + "installed_by": ["modules"] }, "custom/sratoolsncbisettings": { "branch": "master", diff --git a/modules/nf-core/custom/dumpsoftwareversions/custom-dumpsoftwareversions.diff b/modules/nf-core/custom/dumpsoftwareversions/custom-dumpsoftwareversions.diff deleted file mode 100644 index a7893b24..00000000 --- a/modules/nf-core/custom/dumpsoftwareversions/custom-dumpsoftwareversions.diff +++ /dev/null @@ -1,13 +0,0 @@ -Changes in module 'nf-core/custom/dumpsoftwareversions' ---- modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py -+++ modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py -@@ -75,7 +75,6 @@ - versions_by_module[module] = process_versions - - versions_by_module["Workflow"] = { -- "Nextflow": "$workflow.nextflow.version", - "$workflow.manifest.name": "$workflow.manifest.version", - } - - -************************************************************ diff --git a/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py index 33d127f8..da033408 100755 --- a/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py +++ b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py @@ -75,6 +75,7 @@ def main(): versions_by_module[module] = process_versions versions_by_module["Workflow"] = { + "Nextflow": "$workflow.nextflow.version", "$workflow.manifest.name": "$workflow.manifest.version", } From f2d32d25153c9058e1641243849b06fd872316f1 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 25 Aug 2023 14:22:19 +0200 Subject: [PATCH 402/852] update workflow --- workflows/sra/main.nf | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/workflows/sra/main.nf b/workflows/sra/main.nf index d999d998..44f6c6f5 100644 --- a/workflows/sra/main.nf +++ b/workflows/sra/main.nf @@ -49,18 +49,17 @@ workflow SRA { ) ch_versions = ch_versions.mix(SRA_RUNINFO_TO_FTP.out.versions.first()) - SRA_RUNINFO_TO_FTP + ch_sra_metadata = SRA_RUNINFO_TO_FTP .out .tsv .splitCsv(header:true, sep:'\t') - .map { - meta -> - def meta_clone = meta.clone() - meta_clone.single_end = meta_clone.single_end.toBoolean() - return meta_clone + .map{ meta -> + def meta_clone = meta.clone() + meta_clone.single_end = meta_clone.single_end.toBoolean() + return meta_clone } .unique() - .set { ch_sra_metadata } + ch_versions = ch_versions.mix(SRA_RUNINFO_TO_FTP.out.versions.first()) fastq_files = Channel.empty() @@ -101,16 +100,17 @@ workflow SRA { FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS.out.reads ) - fastq_files - .map { - meta, fastq -> - def reads = fastq instanceof List ? fastq.flatten() : [ fastq ] - def meta_clone = meta.clone() - meta_clone.fastq_1 = reads[0] ? "${params.outdir}/fastq/${reads[0].getName()}" : '' - meta_clone.fastq_2 = reads[1] && !meta.single_end ? "${params.outdir}/fastq/${reads[1].getName()}" : '' - return meta_clone - } - .set { ch_sra_metadata } + ch_sra_metadata = fastq_files.map { meta, fastq -> + def reads = fastq instanceof List ? fastq.flatten() : [ fastq ] + def meta_clone = meta.clone() + + meta_clone.fastq_1 = reads[0] ? "${params.outdir}/fastq/${reads[0].getName()}" : '' + meta_clone.fastq_2 = reads[1] && !meta.single_end ? "${params.outdir}/fastq/${reads[1].getName()}" : '' + + return meta_clone + } + + fastq_only_files = fastq_files.map { meta, fastq -> [fastq] } } // @@ -133,10 +133,10 @@ workflow SRA { ch_versions = ch_versions.mix(SRA_MERGE_SAMPLESHEET.out.versions) emit: - fastq = fastq_files - samplesheet = SRA_MERGE_SAMPLESHEET.out.samplesheet - mappings = SRA_MERGE_SAMPLESHEET.out.mappings - versions = ch_versions.unique() + fastq = fastq_only_files + samplesheet = SRA_MERGE_SAMPLESHEET.out.samplesheet + mappings = SRA_MERGE_SAMPLESHEET.out.mappings + versions = ch_versions.unique() } /* From 3018118620e39e313c4e9c9991981e128fff4bdc Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 25 Aug 2023 14:22:46 +0200 Subject: [PATCH 403/852] update snapshot --- workflows/sra/tests/main.nf.test.snap | 1282 ++----------------------- 1 file changed, 56 insertions(+), 1226 deletions(-) diff --git a/workflows/sra/tests/main.nf.test.snap b/workflows/sra/tests/main.nf.test.snap index a0cfc3f8..5d4aeaf2 100644 --- a/workflows/sra/tests/main.nf.test.snap +++ b/workflows/sra/tests/main.nf.test.snap @@ -4,661 +4,76 @@ { "0": [ [ - { - "id": "DRX024467_DRR026872", - "run_accession": "DRR026872", - "experiment_accession": "DRX024467", - "sample_accession": "SAMD00023098", - "secondary_sample_accession": "DRS033740", - "study_accession": "PRJDB4356", - "secondary_study_accession": "DRP003256", - "submission_accession": "DRA002758", - "run_alias": "DRR026872", - "experiment_alias": "DRX024467", - "sample_alias": "SAMD00023098", - "study_alias": "DRP003256", - "library_layout": "SINGLE", - "library_selection": "Restriction Digest", - "library_source": "GENOMIC", - "library_strategy": "OTHER", - "library_name": "IpeRAD1_3", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "62550", - "read_count": "417", - "tax_id": "35883", - "scientific_name": "Ipomoea nil", - "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", - "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", - "study_title": "The Japanese morning glory genome sequence", - "sample_description": "Keywords: GSC:MIxS MIGS:6.0", - "fastq_md5": "515e5448c55e054113c4a22df5f62791", - "fastq_bytes": "38447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_2": "", - "md5_1": "515e5448c55e054113c4a22df5f62791", - "md5_2": "", - "single_end": true - }, - "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" - ], - [ - { - "id": "SRX6725035_SRR9984183", - "run_accession": "SRR9984183", - "experiment_accession": "SRX6725035", - "sample_accession": "SAMN12581720", - "secondary_sample_accession": "SRS5277011", - "study_accession": "PRJNA560329", - "secondary_study_accession": "SRP218535", - "submission_accession": "SRA942061", - "run_alias": "Emb289P1_bin131.fastq", - "experiment_alias": "Emb289P1_bin131", - "sample_alias": "Emb289P1_bin131", - "study_alias": "PRJNA560329", - "library_layout": "SINGLE", - "library_selection": "RANDOM", - "library_source": "METAGENOMIC", - "library_strategy": "WGS", - "library_name": "Emb289P1_bin131", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "1996273", - "read_count": "58", - "tax_id": "2660712", - "scientific_name": "Defluviitaleaceae bacterium", - "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", - "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", - "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", - "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", - "fastq_md5": "0b512d2dc31685983456bd56fd836544", - "fastq_bytes": "605358", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_2": "", - "md5_1": "0b512d2dc31685983456bd56fd836544", - "md5_2": "", - "single_end": true - }, - "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" + [ + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" + ] ], [ - { - "id": "ERX1234253_ERR1160846", - "run_accession": "ERR1160846", - "experiment_accession": "ERX1234253", - "sample_accession": "SAMEA3687214", - "secondary_sample_accession": "ERS994363", - "study_accession": "PRJEB11419", - "secondary_study_accession": "ERP012803", - "submission_accession": "ERA541392", - "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", - "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", - "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", - "study_alias": "qiita_sid_10317", - "library_layout": "SINGLE", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "library_name": "10317.BLANK.93.3E.r22", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "35658", - "read_count": "283", - "tax_id": "256318", - "scientific_name": "metagenome", - "sample_title": "10317.BLANK.93.3E.r22", - "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", - "study_title": "American Gut Project", - "sample_description": "American Gut control", - "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", - "fastq_bytes": "18077", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_2": "", - "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", - "md5_2": "", - "single_end": true - }, "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" ], [ - { - "id": "SRX11047067_SRR14709033", - "run_accession": "SRR14709033", - "experiment_accession": "SRX11047067", - "sample_accession": "SAMN19373034", - "secondary_sample_accession": "SRS9115923", - "study_accession": "PRJNA733285", - "secondary_study_accession": "SRP322267", - "submission_accession": "SRA1239521", - "run_alias": "Sebastes_levis-2.fastq", - "experiment_alias": "Sebastes_macdonaldi-1", - "sample_alias": "S._macdonaldi-1", - "study_alias": "PRJNA733285", - "library_layout": "SINGLE", - "library_selection": "PCR", - "library_source": "GENOMIC", - "library_strategy": "AMPLICON", - "library_name": "Sebastes_macdonaldi-1", - "instrument_model": "AB 5500 Genetic Analyzer", - "instrument_platform": "ABI_SOLID", - "base_count": "153", - "read_count": "1", - "tax_id": "394693", - "scientific_name": "Sebastes macdonaldi", - "sample_title": "Sebastes_macdonaldi-1", - "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", - "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", - "sample_description": "Sebastes_macdonaldi-1", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": true - }, - "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" + [ + "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" + ] ], [ - { - "id": "SRX9626017_SRR13191702", - "run_accession": "SRR13191702", - "experiment_accession": "SRX9626017", - "sample_accession": "SAMN16980141", - "secondary_sample_accession": "SRS7827211", - "study_accession": "PRJNA682076", - "secondary_study_accession": "SRP295653", - "submission_accession": "SRA1166126", - "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", - "experiment_alias": "S.170804.00784", - "sample_alias": "S.170804.00784_662", - "study_alias": "PRJNA682076", - "library_layout": "PAIRED", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "library_name": "S.170804.00784", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "45682", - "read_count": "91", - "tax_id": "408170", - "scientific_name": "human gut metagenome", - "sample_title": "Metagenome or environmental sample from human gut metagenome", - "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "sample_description": "Metagenome or environmental sample from human gut metagenome", - "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", - "fastq_bytes": "15420;16324", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "md5_1": "89c5be920021a035084d8aeb74f32df7", - "md5_2": "56271be38a80db78ef3bdfc5d9909b98", - "single_end": false - }, [ "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" ] ], [ - { - "id": "ERX1188904_ERR1109373", - "run_accession": "ERR1109373", - "experiment_accession": "ERX1188904", - "sample_accession": "SAMEA3643867", - "secondary_sample_accession": "ERS951016", - "study_accession": "PRJEB11633", - "secondary_study_accession": "ERP013030", - "submission_accession": "ERA528939", - "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", - "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", - "sample_alias": "sample_56", - "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", - "library_layout": "PAIRED", - "library_selection": "RT-PCR", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "unspecified", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "29700", - "read_count": "169", - "tax_id": "63433", - "scientific_name": "Leptopilina boulardi", - "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing", - "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", - "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", - "fastq_bytes": "3221;8151;8118", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "md5_1": "9fd57225d6c07a31843276d6df9b15c0", - "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", - "single_end": false - }, - [ - "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" - ] + "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" ], [ - { - "id": "DRX026011_DRR028935", - "run_accession": "DRR028935", - "experiment_accession": "DRX026011", - "sample_accession": "SAMD00024405", - "secondary_sample_accession": "DRS019431", - "study_accession": "PRJDB3420", - "secondary_study_accession": "DRP002616", - "submission_accession": "DRA002949", - "run_alias": "DRR028935", - "experiment_alias": "DRX026011", - "sample_alias": "SAMD00024405", - "study_alias": "DRP002616", - "library_layout": "PAIRED", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "day0_BbSQE-I", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "194930", - "read_count": "965", - "tax_id": "1202541", - "scientific_name": "Botryococcus braunii Showa", - "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", - "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", - "sample_description": "Liquid culture", - "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", - "fastq_bytes": "60275;61610", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "md5_1": "cc01df82a9354bb6b3be93483b20c35a", - "md5_2": "941c9998d746416dad53c94c480ddf30", - "single_end": false - }, - [ - "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", - "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" - ] + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" ], [ - { - "id": "SRX10940790_SRR14593545", - "run_accession": "SRR14593545", - "experiment_accession": "SRX10940790", - "sample_accession": "SAMN19097423", - "secondary_sample_accession": "SRS9020442", - "study_accession": "PRJNA728650", - "secondary_study_accession": "SRP319413", - "submission_accession": "SRA1234280", - "run_alias": "577-6_530058_19-037147 Goat_F.ab1", - "experiment_alias": "PRNP_2765", - "sample_alias": "prp_2765", - "study_alias": "PRJNA728650", - "library_layout": "PAIRED", - "library_selection": "PCR", - "library_source": "GENOMIC", - "library_strategy": "AMPLICON", - "library_name": "PRNP_2765", - "instrument_model": "AB 3500xL Genetic Analyzer", - "instrument_platform": "CAPILLARY", - "base_count": "828", - "read_count": "1", - "tax_id": "9925", - "scientific_name": "Capra hircus", - "sample_title": "MIGS Eukaryotic sample from Capra hircus", - "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", - "study_title": "Capra hircus Raw sequence reads", - "sample_description": "Keywords: GSC:MIxS MIGS:5.0", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": false - }, - [ - "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", - "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" - ] + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" ], [ - { - "id": "SRX9504942_SRR13055517", - "run_accession": "SRR13055517", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r1", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2246028", - "read_count": "29553", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", - "fastq_bytes": "721167;723753", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", - "md5_2": "18dbe96e7f58b63406d9058938df1962", - "single_end": false - }, - [ - "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", - "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" - ] + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" + ], + [ + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" ], [ - { - "id": "SRX9504942_SRR13055520", - "run_accession": "SRR13055520", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r4", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2214488", - "read_count": "29138", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", - "fastq_bytes": "709867;716862", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "md5_1": "795d460abff6009c7f5ff7c14b773fbe", - "md5_2": "c3f34379356b28d6dac7212abc1a0a04", - "single_end": false - }, [ - "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", - "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" ] ], [ - { - "id": "SRX9504942_SRR13055518", - "run_accession": "SRR13055518", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r2", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2235236", - "read_count": "29411", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", - "fastq_bytes": "717693;723429", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "md5_1": "5ec894d863fcefe394470a0925aefde4", - "md5_2": "aead170df9851773d5202b5760c76d76", - "single_end": false - }, [ "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" ] ], [ - { - "id": "SRX9504942_SRR13055519", - "run_accession": "SRR13055519", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r3", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2232728", - "read_count": "29378", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", - "fastq_bytes": "714907;721705", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", - "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", - "single_end": false - }, [ "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" ] ], [ - { - "id": "SRX9315476_SRR12848126", - "run_accession": "SRR12848126", - "experiment_accession": "SRX9315476", - "sample_accession": "SAMN16455283", - "secondary_sample_accession": "SRS7540262", - "study_accession": "PRJNA670070", - "secondary_study_accession": "SRP287769", - "submission_accession": "SRA1145417", - "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", - "experiment_alias": "F11-N1-05", - "sample_alias": "F11-N1-05", - "study_alias": "PRJNA670070", - "library_layout": "PAIRED", - "library_selection": "RANDOM PCR", - "library_source": "GENOMIC", - "library_strategy": "Synthetic-Long-Read", - "library_name": "F11-N1-05", - "instrument_model": "Illumina HiSeq 3000", - "instrument_platform": "ILLUMINA", - "base_count": "431758", - "read_count": "2954", - "tax_id": "10092", - "scientific_name": "Mus musculus domesticus", - "sample_title": "Longshanks_F11-N1-05", - "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "sample_description": "F11-N1-05", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": false - }, [ - "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", - "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" ] ], [ - { - "id": "SRX17709227_SRR21711856", - "run_accession": "SRR21711856", - "experiment_accession": "SRX17709227", - "sample_accession": "SAMN31021823", - "secondary_sample_accession": "SRS15239723", - "study_accession": "PRJNA884373", - "secondary_study_accession": "SRP399678", - "submission_accession": "SRA1507236", - "run_alias": "GSM6601460_r1", - "experiment_alias": "GSM6601460_r1", - "sample_alias": "GSM6601460", - "study_alias": "GSE214215", - "library_layout": "SINGLE", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "GSM6601460", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "base_count": "573417800", - "read_count": "11468356", - "tax_id": "6239", - "scientific_name": "Caenorhabditis elegans", - "sample_title": "sham-treated worms in day 5", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "sample_description": "sham-treated worms in day 5", - "fastq_md5": "7cd1402155befc87be338132d1f31f64", - "fastq_bytes": "447377777", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_2": "", - "md5_1": "7cd1402155befc87be338132d1f31f64", - "md5_2": "", - "single_end": true - }, - "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" + [ + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" + ] ], [ - { - "id": "SRX17709228_SRR21711855", - "run_accession": "SRR21711855", - "experiment_accession": "SRX17709228", - "sample_accession": "SAMN31021822", - "secondary_sample_accession": "SRS15239724", - "study_accession": "PRJNA884373", - "secondary_study_accession": "SRP399678", - "submission_accession": "SRA1507236", - "run_alias": "GSM6601461_r1", - "experiment_alias": "GSM6601461_r1", - "sample_alias": "GSM6601461", - "study_alias": "GSE214215", - "library_layout": "SINGLE", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "GSM6601461", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "base_count": "677912850", - "read_count": "13558257", - "tax_id": "6239", - "scientific_name": "Caenorhabditis elegans", - "sample_title": "PM2.5-treated worms in day 5", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "sample_description": "PM2.5-treated worms in day 5", - "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", - "fastq_bytes": "529798447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_2": "", - "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", - "md5_2": "", - "single_end": true - }, - "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" + [ + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" + ] ] ], "1": [ @@ -676,661 +91,76 @@ ], "fastq": [ [ - { - "id": "DRX024467_DRR026872", - "run_accession": "DRR026872", - "experiment_accession": "DRX024467", - "sample_accession": "SAMD00023098", - "secondary_sample_accession": "DRS033740", - "study_accession": "PRJDB4356", - "secondary_study_accession": "DRP003256", - "submission_accession": "DRA002758", - "run_alias": "DRR026872", - "experiment_alias": "DRX024467", - "sample_alias": "SAMD00023098", - "study_alias": "DRP003256", - "library_layout": "SINGLE", - "library_selection": "Restriction Digest", - "library_source": "GENOMIC", - "library_strategy": "OTHER", - "library_name": "IpeRAD1_3", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "62550", - "read_count": "417", - "tax_id": "35883", - "scientific_name": "Ipomoea nil", - "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", - "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", - "study_title": "The Japanese morning glory genome sequence", - "sample_description": "Keywords: GSC:MIxS MIGS:6.0", - "fastq_md5": "515e5448c55e054113c4a22df5f62791", - "fastq_bytes": "38447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_2": "", - "md5_1": "515e5448c55e054113c4a22df5f62791", - "md5_2": "", - "single_end": true - }, - "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" - ], - [ - { - "id": "SRX6725035_SRR9984183", - "run_accession": "SRR9984183", - "experiment_accession": "SRX6725035", - "sample_accession": "SAMN12581720", - "secondary_sample_accession": "SRS5277011", - "study_accession": "PRJNA560329", - "secondary_study_accession": "SRP218535", - "submission_accession": "SRA942061", - "run_alias": "Emb289P1_bin131.fastq", - "experiment_alias": "Emb289P1_bin131", - "sample_alias": "Emb289P1_bin131", - "study_alias": "PRJNA560329", - "library_layout": "SINGLE", - "library_selection": "RANDOM", - "library_source": "METAGENOMIC", - "library_strategy": "WGS", - "library_name": "Emb289P1_bin131", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "1996273", - "read_count": "58", - "tax_id": "2660712", - "scientific_name": "Defluviitaleaceae bacterium", - "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", - "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", - "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", - "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", - "fastq_md5": "0b512d2dc31685983456bd56fd836544", - "fastq_bytes": "605358", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_2": "", - "md5_1": "0b512d2dc31685983456bd56fd836544", - "md5_2": "", - "single_end": true - }, - "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" + [ + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" + ] ], [ - { - "id": "ERX1234253_ERR1160846", - "run_accession": "ERR1160846", - "experiment_accession": "ERX1234253", - "sample_accession": "SAMEA3687214", - "secondary_sample_accession": "ERS994363", - "study_accession": "PRJEB11419", - "secondary_study_accession": "ERP012803", - "submission_accession": "ERA541392", - "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", - "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", - "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", - "study_alias": "qiita_sid_10317", - "library_layout": "SINGLE", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "library_name": "10317.BLANK.93.3E.r22", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "35658", - "read_count": "283", - "tax_id": "256318", - "scientific_name": "metagenome", - "sample_title": "10317.BLANK.93.3E.r22", - "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", - "study_title": "American Gut Project", - "sample_description": "American Gut control", - "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", - "fastq_bytes": "18077", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_2": "", - "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", - "md5_2": "", - "single_end": true - }, "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" ], [ - { - "id": "SRX11047067_SRR14709033", - "run_accession": "SRR14709033", - "experiment_accession": "SRX11047067", - "sample_accession": "SAMN19373034", - "secondary_sample_accession": "SRS9115923", - "study_accession": "PRJNA733285", - "secondary_study_accession": "SRP322267", - "submission_accession": "SRA1239521", - "run_alias": "Sebastes_levis-2.fastq", - "experiment_alias": "Sebastes_macdonaldi-1", - "sample_alias": "S._macdonaldi-1", - "study_alias": "PRJNA733285", - "library_layout": "SINGLE", - "library_selection": "PCR", - "library_source": "GENOMIC", - "library_strategy": "AMPLICON", - "library_name": "Sebastes_macdonaldi-1", - "instrument_model": "AB 5500 Genetic Analyzer", - "instrument_platform": "ABI_SOLID", - "base_count": "153", - "read_count": "1", - "tax_id": "394693", - "scientific_name": "Sebastes macdonaldi", - "sample_title": "Sebastes_macdonaldi-1", - "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", - "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", - "sample_description": "Sebastes_macdonaldi-1", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": true - }, - "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" + [ + "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" + ] ], [ - { - "id": "SRX9626017_SRR13191702", - "run_accession": "SRR13191702", - "experiment_accession": "SRX9626017", - "sample_accession": "SAMN16980141", - "secondary_sample_accession": "SRS7827211", - "study_accession": "PRJNA682076", - "secondary_study_accession": "SRP295653", - "submission_accession": "SRA1166126", - "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", - "experiment_alias": "S.170804.00784", - "sample_alias": "S.170804.00784_662", - "study_alias": "PRJNA682076", - "library_layout": "PAIRED", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "library_name": "S.170804.00784", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "45682", - "read_count": "91", - "tax_id": "408170", - "scientific_name": "human gut metagenome", - "sample_title": "Metagenome or environmental sample from human gut metagenome", - "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "sample_description": "Metagenome or environmental sample from human gut metagenome", - "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", - "fastq_bytes": "15420;16324", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "md5_1": "89c5be920021a035084d8aeb74f32df7", - "md5_2": "56271be38a80db78ef3bdfc5d9909b98", - "single_end": false - }, [ "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" ] ], [ - { - "id": "ERX1188904_ERR1109373", - "run_accession": "ERR1109373", - "experiment_accession": "ERX1188904", - "sample_accession": "SAMEA3643867", - "secondary_sample_accession": "ERS951016", - "study_accession": "PRJEB11633", - "secondary_study_accession": "ERP013030", - "submission_accession": "ERA528939", - "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", - "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", - "sample_alias": "sample_56", - "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", - "library_layout": "PAIRED", - "library_selection": "RT-PCR", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "unspecified", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "29700", - "read_count": "169", - "tax_id": "63433", - "scientific_name": "Leptopilina boulardi", - "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing", - "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", - "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", - "fastq_bytes": "3221;8151;8118", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "md5_1": "9fd57225d6c07a31843276d6df9b15c0", - "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", - "single_end": false - }, - [ - "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" - ] + "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" ], [ - { - "id": "DRX026011_DRR028935", - "run_accession": "DRR028935", - "experiment_accession": "DRX026011", - "sample_accession": "SAMD00024405", - "secondary_sample_accession": "DRS019431", - "study_accession": "PRJDB3420", - "secondary_study_accession": "DRP002616", - "submission_accession": "DRA002949", - "run_alias": "DRR028935", - "experiment_alias": "DRX026011", - "sample_alias": "SAMD00024405", - "study_alias": "DRP002616", - "library_layout": "PAIRED", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "day0_BbSQE-I", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "194930", - "read_count": "965", - "tax_id": "1202541", - "scientific_name": "Botryococcus braunii Showa", - "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", - "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", - "sample_description": "Liquid culture", - "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", - "fastq_bytes": "60275;61610", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "md5_1": "cc01df82a9354bb6b3be93483b20c35a", - "md5_2": "941c9998d746416dad53c94c480ddf30", - "single_end": false - }, - [ - "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", - "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" - ] + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" ], [ - { - "id": "SRX10940790_SRR14593545", - "run_accession": "SRR14593545", - "experiment_accession": "SRX10940790", - "sample_accession": "SAMN19097423", - "secondary_sample_accession": "SRS9020442", - "study_accession": "PRJNA728650", - "secondary_study_accession": "SRP319413", - "submission_accession": "SRA1234280", - "run_alias": "577-6_530058_19-037147 Goat_F.ab1", - "experiment_alias": "PRNP_2765", - "sample_alias": "prp_2765", - "study_alias": "PRJNA728650", - "library_layout": "PAIRED", - "library_selection": "PCR", - "library_source": "GENOMIC", - "library_strategy": "AMPLICON", - "library_name": "PRNP_2765", - "instrument_model": "AB 3500xL Genetic Analyzer", - "instrument_platform": "CAPILLARY", - "base_count": "828", - "read_count": "1", - "tax_id": "9925", - "scientific_name": "Capra hircus", - "sample_title": "MIGS Eukaryotic sample from Capra hircus", - "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", - "study_title": "Capra hircus Raw sequence reads", - "sample_description": "Keywords: GSC:MIxS MIGS:5.0", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": false - }, - [ - "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", - "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" - ] + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" ], [ - { - "id": "SRX9504942_SRR13055517", - "run_accession": "SRR13055517", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r1", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2246028", - "read_count": "29553", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", - "fastq_bytes": "721167;723753", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", - "md5_2": "18dbe96e7f58b63406d9058938df1962", - "single_end": false - }, - [ - "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", - "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" - ] + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" + ], + [ + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" ], [ - { - "id": "SRX9504942_SRR13055520", - "run_accession": "SRR13055520", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r4", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2214488", - "read_count": "29138", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", - "fastq_bytes": "709867;716862", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "md5_1": "795d460abff6009c7f5ff7c14b773fbe", - "md5_2": "c3f34379356b28d6dac7212abc1a0a04", - "single_end": false - }, [ - "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", - "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" ] ], [ - { - "id": "SRX9504942_SRR13055518", - "run_accession": "SRR13055518", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r2", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2235236", - "read_count": "29411", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", - "fastq_bytes": "717693;723429", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "md5_1": "5ec894d863fcefe394470a0925aefde4", - "md5_2": "aead170df9851773d5202b5760c76d76", - "single_end": false - }, [ "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" ] ], [ - { - "id": "SRX9504942_SRR13055519", - "run_accession": "SRR13055519", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r3", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2232728", - "read_count": "29378", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", - "fastq_bytes": "714907;721705", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", - "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", - "single_end": false - }, [ "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" ] ], [ - { - "id": "SRX9315476_SRR12848126", - "run_accession": "SRR12848126", - "experiment_accession": "SRX9315476", - "sample_accession": "SAMN16455283", - "secondary_sample_accession": "SRS7540262", - "study_accession": "PRJNA670070", - "secondary_study_accession": "SRP287769", - "submission_accession": "SRA1145417", - "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", - "experiment_alias": "F11-N1-05", - "sample_alias": "F11-N1-05", - "study_alias": "PRJNA670070", - "library_layout": "PAIRED", - "library_selection": "RANDOM PCR", - "library_source": "GENOMIC", - "library_strategy": "Synthetic-Long-Read", - "library_name": "F11-N1-05", - "instrument_model": "Illumina HiSeq 3000", - "instrument_platform": "ILLUMINA", - "base_count": "431758", - "read_count": "2954", - "tax_id": "10092", - "scientific_name": "Mus musculus domesticus", - "sample_title": "Longshanks_F11-N1-05", - "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "sample_description": "F11-N1-05", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": false - }, [ - "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", - "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" ] ], [ - { - "id": "SRX17709227_SRR21711856", - "run_accession": "SRR21711856", - "experiment_accession": "SRX17709227", - "sample_accession": "SAMN31021823", - "secondary_sample_accession": "SRS15239723", - "study_accession": "PRJNA884373", - "secondary_study_accession": "SRP399678", - "submission_accession": "SRA1507236", - "run_alias": "GSM6601460_r1", - "experiment_alias": "GSM6601460_r1", - "sample_alias": "GSM6601460", - "study_alias": "GSE214215", - "library_layout": "SINGLE", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "GSM6601460", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "base_count": "573417800", - "read_count": "11468356", - "tax_id": "6239", - "scientific_name": "Caenorhabditis elegans", - "sample_title": "sham-treated worms in day 5", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "sample_description": "sham-treated worms in day 5", - "fastq_md5": "7cd1402155befc87be338132d1f31f64", - "fastq_bytes": "447377777", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_2": "", - "md5_1": "7cd1402155befc87be338132d1f31f64", - "md5_2": "", - "single_end": true - }, - "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" + [ + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" + ] ], [ - { - "id": "SRX17709228_SRR21711855", - "run_accession": "SRR21711855", - "experiment_accession": "SRX17709228", - "sample_accession": "SAMN31021822", - "secondary_sample_accession": "SRS15239724", - "study_accession": "PRJNA884373", - "secondary_study_accession": "SRP399678", - "submission_accession": "SRA1507236", - "run_alias": "GSM6601461_r1", - "experiment_alias": "GSM6601461_r1", - "sample_alias": "GSM6601461", - "study_alias": "GSE214215", - "library_layout": "SINGLE", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "GSM6601461", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "base_count": "677912850", - "read_count": "13558257", - "tax_id": "6239", - "scientific_name": "Caenorhabditis elegans", - "sample_title": "PM2.5-treated worms in day 5", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "sample_description": "PM2.5-treated worms in day 5", - "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", - "fastq_bytes": "529798447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_2": "", - "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", - "md5_2": "", - "single_end": true - }, - "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" + [ + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" + ] ] ], "mappings": [ @@ -1348,6 +178,6 @@ ] } ], - "timestamp": "2023-08-25T11:27:09+0000" + "timestamp": "2023-08-25T12:20:20+0000" } -} \ No newline at end of file +} From 2010d7f2c5661ce0b1b64f3c0a47ef0f31a39945 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 25 Aug 2023 14:56:39 +0200 Subject: [PATCH 404/852] just one id to test --- workflows/sra/tests/main.nf.test | 2 +- workflows/sra/tests/main.nf.test.snap | 154 ++------------------------ 2 files changed, 9 insertions(+), 147 deletions(-) diff --git a/workflows/sra/tests/main.nf.test b/workflows/sra/tests/main.nf.test index 2652eb80..6c4ecf17 100644 --- a/workflows/sra/tests/main.nf.test +++ b/workflows/sra/tests/main.nf.test @@ -12,7 +12,7 @@ nextflow_workflow { when { workflow { """ - input[0] = Channel.from('DRR026872','DRR028935','ERR1109373','ERR1160846','GSE214215','GSM4907283','SRR12848126','SRR13191702','SRR14593545','SRR14709033','SRR9984183') + input[0] = Channel.from('DRR026872') """ } params { diff --git a/workflows/sra/tests/main.nf.test.snap b/workflows/sra/tests/main.nf.test.snap index 5d4aeaf2..0d94075c 100644 --- a/workflows/sra/tests/main.nf.test.snap +++ b/workflows/sra/tests/main.nf.test.snap @@ -3,181 +3,43 @@ "content": [ { "0": [ - [ - [ - "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", - "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" - ] - ], - [ - "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" - ], - [ - [ - "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" - ] - ], - [ - [ - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" - ] - ], [ "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" - ], - [ - "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" - ], - [ - "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" - ], - [ - "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" - ], - [ - "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" - ], - [ - [ - "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", - "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" - ] - ], - [ - [ - "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", - "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" - ] - ], - [ - [ - "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", - "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" - ] - ], - [ - [ - "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", - "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" - ] - ], - [ - [ - "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", - "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" - ] - ], - [ - [ - "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", - "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" - ] ] ], "1": [ - "samplesheet.csv:md5,dbd0e9c1683c603c681184a13f5b7341" + "samplesheet.csv:md5,0f35f9485a633d9c581903abd611b646" ], "2": [ - "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + "id_mappings.csv:md5,71ebb4334e4a319a1a007370e36c98f7" ], "3": [ - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" ], "fastq": [ - [ - [ - "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", - "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" - ] - ], - [ - "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" - ], - [ - [ - "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" - ] - ], - [ - [ - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" - ] - ], [ "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" - ], - [ - "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" - ], - [ - "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" - ], - [ - "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" - ], - [ - "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" - ], - [ - [ - "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", - "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" - ] - ], - [ - [ - "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", - "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" - ] - ], - [ - [ - "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", - "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" - ] - ], - [ - [ - "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", - "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" - ] - ], - [ - [ - "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", - "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" - ] - ], - [ - [ - "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", - "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" - ] ] ], "mappings": [ - "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + "id_mappings.csv:md5,71ebb4334e4a319a1a007370e36c98f7" ], "samplesheet": [ - "samplesheet.csv:md5,dbd0e9c1683c603c681184a13f5b7341" + "samplesheet.csv:md5,0f35f9485a633d9c581903abd611b646" ], "versions": [ - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" ] } ], - "timestamp": "2023-08-25T12:20:20+0000" + "timestamp": "2023-08-25T12:56:07+0000" } -} +} \ No newline at end of file From f5d904030a96166699cef738438f17922afebbf3 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 25 Aug 2023 15:17:43 +0200 Subject: [PATCH 405/852] one emit statement at a time --- workflows/sra/main.nf | 3 --- workflows/sra/tests/main.nf.test | 2 +- workflows/sra/tests/main.nf.test.snap | 22 ++++++---------------- 3 files changed, 7 insertions(+), 20 deletions(-) diff --git a/workflows/sra/main.nf b/workflows/sra/main.nf index 44f6c6f5..8acb3da6 100644 --- a/workflows/sra/main.nf +++ b/workflows/sra/main.nf @@ -109,8 +109,6 @@ workflow SRA { return meta_clone } - - fastq_only_files = fastq_files.map { meta, fastq -> [fastq] } } // @@ -133,7 +131,6 @@ workflow SRA { ch_versions = ch_versions.mix(SRA_MERGE_SAMPLESHEET.out.versions) emit: - fastq = fastq_only_files samplesheet = SRA_MERGE_SAMPLESHEET.out.samplesheet mappings = SRA_MERGE_SAMPLESHEET.out.mappings versions = ch_versions.unique() diff --git a/workflows/sra/tests/main.nf.test b/workflows/sra/tests/main.nf.test index 6c4ecf17..2652eb80 100644 --- a/workflows/sra/tests/main.nf.test +++ b/workflows/sra/tests/main.nf.test @@ -12,7 +12,7 @@ nextflow_workflow { when { workflow { """ - input[0] = Channel.from('DRR026872') + input[0] = Channel.from('DRR026872','DRR028935','ERR1109373','ERR1160846','GSE214215','GSM4907283','SRR12848126','SRR13191702','SRR14593545','SRR14709033','SRR9984183') """ } params { diff --git a/workflows/sra/tests/main.nf.test.snap b/workflows/sra/tests/main.nf.test.snap index 0d94075c..a552d171 100644 --- a/workflows/sra/tests/main.nf.test.snap +++ b/workflows/sra/tests/main.nf.test.snap @@ -3,33 +3,23 @@ "content": [ { "0": [ - [ - "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" - ] + "samplesheet.csv:md5,dbd0e9c1683c603c681184a13f5b7341" ], "1": [ - "samplesheet.csv:md5,0f35f9485a633d9c581903abd611b646" + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" ], "2": [ - "id_mappings.csv:md5,71ebb4334e4a319a1a007370e36c98f7" - ], - "3": [ "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" ], - "fastq": [ - [ - "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" - ] - ], "mappings": [ - "id_mappings.csv:md5,71ebb4334e4a319a1a007370e36c98f7" + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" ], "samplesheet": [ - "samplesheet.csv:md5,0f35f9485a633d9c581903abd611b646" + "samplesheet.csv:md5,dbd0e9c1683c603c681184a13f5b7341" ], "versions": [ "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", @@ -40,6 +30,6 @@ ] } ], - "timestamp": "2023-08-25T12:56:07+0000" + "timestamp": "2023-08-25T13:15:46+0000" } -} \ No newline at end of file +} From ac35bc092fcbbf57e95abf1112567fb272ca2b12 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 25 Aug 2023 16:47:43 +0200 Subject: [PATCH 406/852] polish --- main.nf | 16 +++-------- workflows/sra/main.nf | 3 ++- workflows/sra/tests/main.nf.test | 2 +- workflows/sra/tests/main.nf.test.snap | 38 ++++++--------------------- 4 files changed, 15 insertions(+), 44 deletions(-) diff --git a/main.nf b/main.nf index 7575eeb8..ad72ea4a 100644 --- a/main.nf +++ b/main.nf @@ -97,33 +97,25 @@ workflow NFCORE_FETCHNGS { ch_versions = Channel.empty() - // // WORKFLOW: Download FastQ files for SRA / ENA / GEO / DDBJ ids - // if (params.input_type == 'sra') { SRA(ch_ids) ch_versions = ch_versions.mix(SRA.out.versions) - // - // MODULE: Create a MultiQC config file with sample name mappings - // + + // MODULE: Create a MultiQC config file with sample name mappings if (params.sample_mapping_fields) { MULTIQC_MAPPINGS_CONFIG(SRA.out.mappings) ch_versions = ch_versions.mix(MULTIQC_MAPPINGS_CONFIG.out.versions) } - // + // WORKFLOW: Download FastQ files for Synapse ids - // } else if (params.input_type == 'synapse') { SYNAPSE(ch_ids, ch_synapse_config) ch_versions = ch_versions.mix(SYNAPSE.out.versions) } - // // MODULE: Dump software versions for all tools used in the workflow - // - CUSTOM_DUMPSOFTWAREVERSIONS ( - ch_versions.unique().collectFile(name: 'collated_versions.yml') - ) + CUSTOM_DUMPSOFTWAREVERSIONS(ch_versions.unique().collectFile(name: 'collated_versions.yml')) } /* diff --git a/workflows/sra/main.nf b/workflows/sra/main.nf index 8acb3da6..c1583956 100644 --- a/workflows/sra/main.nf +++ b/workflows/sra/main.nf @@ -12,7 +12,7 @@ include { SRA_MERGE_SAMPLESHEET } from '../../modules/local/sra_merge_samplesh /* ======================================================================================== - IMPORT NF-CORE MODULES/SUBWORKFLOWS + IMPORT NF-CORE SUBWORKFLOWS ======================================================================================== */ @@ -131,6 +131,7 @@ workflow SRA { ch_versions = ch_versions.mix(SRA_MERGE_SAMPLESHEET.out.versions) emit: + fastq = fastq_files samplesheet = SRA_MERGE_SAMPLESHEET.out.samplesheet mappings = SRA_MERGE_SAMPLESHEET.out.mappings versions = ch_versions.unique() diff --git a/workflows/sra/tests/main.nf.test b/workflows/sra/tests/main.nf.test index 2652eb80..92b482bd 100644 --- a/workflows/sra/tests/main.nf.test +++ b/workflows/sra/tests/main.nf.test @@ -23,7 +23,7 @@ nextflow_workflow { then { assertAll( { assert workflow.success }, - { assert snapshot(workflow.out).match() } + { assert snapshot(workflow.out.mappings, workflow.out.samplesheet).match() } ) } } diff --git a/workflows/sra/tests/main.nf.test.snap b/workflows/sra/tests/main.nf.test.snap index a552d171..8f577ef1 100644 --- a/workflows/sra/tests/main.nf.test.snap +++ b/workflows/sra/tests/main.nf.test.snap @@ -1,35 +1,13 @@ { "Parameters: default": { "content": [ - { - "0": [ - "samplesheet.csv:md5,dbd0e9c1683c603c681184a13f5b7341" - ], - "1": [ - "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" - ], - "2": [ - "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", - "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", - "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" - ], - "mappings": [ - "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" - ], - "samplesheet": [ - "samplesheet.csv:md5,dbd0e9c1683c603c681184a13f5b7341" - ], - "versions": [ - "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", - "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", - "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" - ] - } + [ + "id_mappings.csv:md5,71ebb4334e4a319a1a007370e36c98f7" + ], + [ + "samplesheet.csv:md5,0f35f9485a633d9c581903abd611b646" + ] ], - "timestamp": "2023-08-25T13:15:46+0000" + "timestamp": "2023-08-25T14:23:33+0000" } -} +} \ No newline at end of file From 2efa57f90ccd4f42c5cb298e3c638493d2d03fb9 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 25 Aug 2023 17:07:44 +0200 Subject: [PATCH 407/852] update snapshot --- workflows/sra/main.nf | 3 +- workflows/sra/tests/main.nf.test | 2 +- workflows/sra/tests/main.nf.test.snap | 1374 ++++++++++++++++++++++++- 3 files changed, 1369 insertions(+), 10 deletions(-) diff --git a/workflows/sra/main.nf b/workflows/sra/main.nf index c1583956..8d5149d2 100644 --- a/workflows/sra/main.nf +++ b/workflows/sra/main.nf @@ -66,7 +66,7 @@ workflow SRA { if (!params.skip_fastq_download) { - ch_sra_metadata + ch_sra_reads = ch_sra_metadata .map { meta -> [ meta, [ meta.fastq_1, meta.fastq_2 ] ] @@ -75,7 +75,6 @@ workflow SRA { ftp: it[0].fastq_1 && !params.force_sratools_download sra: !it[0].fastq_1 || params.force_sratools_download } - .set { ch_sra_reads } // // MODULE: If FTP link is provided in run information then download FastQ directly via FTP and validate with md5sums diff --git a/workflows/sra/tests/main.nf.test b/workflows/sra/tests/main.nf.test index 92b482bd..2652eb80 100644 --- a/workflows/sra/tests/main.nf.test +++ b/workflows/sra/tests/main.nf.test @@ -23,7 +23,7 @@ nextflow_workflow { then { assertAll( { assert workflow.success }, - { assert snapshot(workflow.out.mappings, workflow.out.samplesheet).match() } + { assert snapshot(workflow.out).match() } ) } } diff --git a/workflows/sra/tests/main.nf.test.snap b/workflows/sra/tests/main.nf.test.snap index 8f577ef1..3db02451 100644 --- a/workflows/sra/tests/main.nf.test.snap +++ b/workflows/sra/tests/main.nf.test.snap @@ -1,13 +1,1373 @@ { "Parameters: default": { "content": [ - [ - "id_mappings.csv:md5,71ebb4334e4a319a1a007370e36c98f7" - ], - [ - "samplesheet.csv:md5,0f35f9485a633d9c581903abd611b646" - ] + { + "stderr": [ + + ], + "errorReport": null, + "exitStatus": 0, + "out": { + "0": [ + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "sample_accession": "SAMEA3643867", + "secondary_sample_accession": "ERS951016", + "study_accession": "PRJEB11633", + "secondary_study_accession": "ERP013030", + "submission_accession": "ERA528939", + "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", + "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", + "sample_alias": "sample_56", + "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", + "library_layout": "PAIRED", + "library_selection": "RT-PCR", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "unspecified", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "29700", + "read_count": "169", + "tax_id": "63433", + "scientific_name": "Leptopilina boulardi", + "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing", + "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", + "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_bytes": "3221;8151;8118", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, + [ + "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" + ] + ], + [ + { + "id": "SRX9504942_SRR13055517", + "run_accession": "SRR13055517", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r1", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2246028", + "read_count": "29553", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", + "fastq_bytes": "721167;723753", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", + "md5_2": "18dbe96e7f58b63406d9058938df1962", + "single_end": false + }, + [ + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" + ] + ], + [ + { + "id": "SRX9504942_SRR13055518", + "run_accession": "SRR13055518", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r2", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2235236", + "read_count": "29411", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", + "fastq_bytes": "717693;723429", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "md5_1": "5ec894d863fcefe394470a0925aefde4", + "md5_2": "aead170df9851773d5202b5760c76d76", + "single_end": false + }, + [ + "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" + ] + ], + [ + { + "id": "SRX9504942_SRR13055519", + "run_accession": "SRR13055519", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r3", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2232728", + "read_count": "29378", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", + "fastq_bytes": "714907;721705", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", + "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", + "single_end": false + }, + [ + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" + ] + ], + [ + { + "id": "DRX024467_DRR026872", + "run_accession": "DRR026872", + "experiment_accession": "DRX024467", + "sample_accession": "SAMD00023098", + "secondary_sample_accession": "DRS033740", + "study_accession": "PRJDB4356", + "secondary_study_accession": "DRP003256", + "submission_accession": "DRA002758", + "run_alias": "DRR026872", + "experiment_alias": "DRX024467", + "sample_alias": "SAMD00023098", + "study_alias": "DRP003256", + "library_layout": "SINGLE", + "library_selection": "Restriction Digest", + "library_source": "GENOMIC", + "library_strategy": "OTHER", + "library_name": "IpeRAD1_3", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "62550", + "read_count": "417", + "tax_id": "35883", + "scientific_name": "Ipomoea nil", + "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", + "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", + "study_title": "The Japanese morning glory genome sequence", + "sample_description": "Keywords: GSC:MIxS MIGS:6.0", + "fastq_md5": "515e5448c55e054113c4a22df5f62791", + "fastq_bytes": "38447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_2": "", + "md5_1": "515e5448c55e054113c4a22df5f62791", + "md5_2": "", + "single_end": true + }, + "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" + ], + [ + { + "id": "SRX6725035_SRR9984183", + "run_accession": "SRR9984183", + "experiment_accession": "SRX6725035", + "sample_accession": "SAMN12581720", + "secondary_sample_accession": "SRS5277011", + "study_accession": "PRJNA560329", + "secondary_study_accession": "SRP218535", + "submission_accession": "SRA942061", + "run_alias": "Emb289P1_bin131.fastq", + "experiment_alias": "Emb289P1_bin131", + "sample_alias": "Emb289P1_bin131", + "study_alias": "PRJNA560329", + "library_layout": "SINGLE", + "library_selection": "RANDOM", + "library_source": "METAGENOMIC", + "library_strategy": "WGS", + "library_name": "Emb289P1_bin131", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "1996273", + "read_count": "58", + "tax_id": "2660712", + "scientific_name": "Defluviitaleaceae bacterium", + "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", + "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", + "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", + "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", + "fastq_md5": "0b512d2dc31685983456bd56fd836544", + "fastq_bytes": "605358", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_2": "", + "md5_1": "0b512d2dc31685983456bd56fd836544", + "md5_2": "", + "single_end": true + }, + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" + ], + [ + { + "id": "SRX9504942_SRR13055520", + "run_accession": "SRR13055520", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r4", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2214488", + "read_count": "29138", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", + "fastq_bytes": "709867;716862", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "md5_1": "795d460abff6009c7f5ff7c14b773fbe", + "md5_2": "c3f34379356b28d6dac7212abc1a0a04", + "single_end": false + }, + [ + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" + ] + ], + [ + { + "id": "SRX9626017_SRR13191702", + "run_accession": "SRR13191702", + "experiment_accession": "SRX9626017", + "sample_accession": "SAMN16980141", + "secondary_sample_accession": "SRS7827211", + "study_accession": "PRJNA682076", + "secondary_study_accession": "SRP295653", + "submission_accession": "SRA1166126", + "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", + "experiment_alias": "S.170804.00784", + "sample_alias": "S.170804.00784_662", + "study_alias": "PRJNA682076", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "S.170804.00784", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "45682", + "read_count": "91", + "tax_id": "408170", + "scientific_name": "human gut metagenome", + "sample_title": "Metagenome or environmental sample from human gut metagenome", + "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "sample_description": "Metagenome or environmental sample from human gut metagenome", + "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", + "fastq_bytes": "15420;16324", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98", + "single_end": false + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + ] + ], + [ + { + "id": "ERX1234253_ERR1160846", + "run_accession": "ERR1160846", + "experiment_accession": "ERX1234253", + "sample_accession": "SAMEA3687214", + "secondary_sample_accession": "ERS994363", + "study_accession": "PRJEB11419", + "secondary_study_accession": "ERP012803", + "submission_accession": "ERA541392", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "study_alias": "qiita_sid_10317", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "10317.BLANK.93.3E.r22", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "35658", + "read_count": "283", + "tax_id": "256318", + "scientific_name": "metagenome", + "sample_title": "10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "study_title": "American Gut Project", + "sample_description": "American Gut control", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_2": "", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "single_end": true + }, + "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" + ], + [ + { + "id": "SRX11047067_SRR14709033", + "run_accession": "SRR14709033", + "experiment_accession": "SRX11047067", + "sample_accession": "SAMN19373034", + "secondary_sample_accession": "SRS9115923", + "study_accession": "PRJNA733285", + "secondary_study_accession": "SRP322267", + "submission_accession": "SRA1239521", + "run_alias": "Sebastes_levis-2.fastq", + "experiment_alias": "Sebastes_macdonaldi-1", + "sample_alias": "S._macdonaldi-1", + "study_alias": "PRJNA733285", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "Sebastes_macdonaldi-1", + "instrument_model": "AB 5500 Genetic Analyzer", + "instrument_platform": "ABI_SOLID", + "base_count": "153", + "read_count": "1", + "tax_id": "394693", + "scientific_name": "Sebastes macdonaldi", + "sample_title": "Sebastes_macdonaldi-1", + "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", + "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", + "sample_description": "Sebastes_macdonaldi-1", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": true + }, + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" + ], + [ + { + "id": "SRX10940790_SRR14593545", + "run_accession": "SRR14593545", + "experiment_accession": "SRX10940790", + "sample_accession": "SAMN19097423", + "secondary_sample_accession": "SRS9020442", + "study_accession": "PRJNA728650", + "secondary_study_accession": "SRP319413", + "submission_accession": "SRA1234280", + "run_alias": "577-6_530058_19-037147 Goat_F.ab1", + "experiment_alias": "PRNP_2765", + "sample_alias": "prp_2765", + "study_alias": "PRJNA728650", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "PRNP_2765", + "instrument_model": "AB 3500xL Genetic Analyzer", + "instrument_platform": "CAPILLARY", + "base_count": "828", + "read_count": "1", + "tax_id": "9925", + "scientific_name": "Capra hircus", + "sample_title": "MIGS Eukaryotic sample from Capra hircus", + "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", + "study_title": "Capra hircus Raw sequence reads", + "sample_description": "Keywords: GSC:MIxS MIGS:5.0", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" + ] + ], + [ + { + "id": "DRX026011_DRR028935", + "run_accession": "DRR028935", + "experiment_accession": "DRX026011", + "sample_accession": "SAMD00024405", + "secondary_sample_accession": "DRS019431", + "study_accession": "PRJDB3420", + "secondary_study_accession": "DRP002616", + "submission_accession": "DRA002949", + "run_alias": "DRR028935", + "experiment_alias": "DRX026011", + "sample_alias": "SAMD00024405", + "study_alias": "DRP002616", + "library_layout": "PAIRED", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "day0_BbSQE-I", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "194930", + "read_count": "965", + "tax_id": "1202541", + "scientific_name": "Botryococcus braunii Showa", + "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", + "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", + "sample_description": "Liquid culture", + "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", + "fastq_bytes": "60275;61610", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "md5_1": "cc01df82a9354bb6b3be93483b20c35a", + "md5_2": "941c9998d746416dad53c94c480ddf30", + "single_end": false + }, + [ + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" + ] + ], + [ + { + "id": "SRX9315476_SRR12848126", + "run_accession": "SRR12848126", + "experiment_accession": "SRX9315476", + "sample_accession": "SAMN16455283", + "secondary_sample_accession": "SRS7540262", + "study_accession": "PRJNA670070", + "secondary_study_accession": "SRP287769", + "submission_accession": "SRA1145417", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "experiment_alias": "F11-N1-05", + "sample_alias": "F11-N1-05", + "study_alias": "PRJNA670070", + "library_layout": "PAIRED", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "library_name": "F11-N1-05", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "base_count": "431758", + "read_count": "2954", + "tax_id": "10092", + "scientific_name": "Mus musculus domesticus", + "sample_title": "Longshanks_F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "sample_description": "F11-N1-05", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" + ] + ], + [ + { + "id": "SRX17709227_SRR21711856", + "run_accession": "SRR21711856", + "experiment_accession": "SRX17709227", + "sample_accession": "SAMN31021823", + "secondary_sample_accession": "SRS15239723", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601460_r1", + "experiment_alias": "GSM6601460_r1", + "sample_alias": "GSM6601460", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601460", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "573417800", + "read_count": "11468356", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "sham-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "sham-treated worms in day 5", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_2": "", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "single_end": true + }, + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" + ], + [ + { + "id": "SRX17709228_SRR21711855", + "run_accession": "SRR21711855", + "experiment_accession": "SRX17709228", + "sample_accession": "SAMN31021822", + "secondary_sample_accession": "SRS15239724", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601461_r1", + "experiment_alias": "GSM6601461_r1", + "sample_alias": "GSM6601461", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601461", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "677912850", + "read_count": "13558257", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "PM2.5-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "PM2.5-treated worms in day 5", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_2": "", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "single_end": true + }, + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" + ] + ], + "1": [ + "samplesheet.csv:md5,dbd0e9c1683c603c681184a13f5b7341" + ], + "2": [ + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + ], + "3": [ + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + ], + "fastq": [ + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "sample_accession": "SAMEA3643867", + "secondary_sample_accession": "ERS951016", + "study_accession": "PRJEB11633", + "secondary_study_accession": "ERP013030", + "submission_accession": "ERA528939", + "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", + "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", + "sample_alias": "sample_56", + "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", + "library_layout": "PAIRED", + "library_selection": "RT-PCR", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "unspecified", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "29700", + "read_count": "169", + "tax_id": "63433", + "scientific_name": "Leptopilina boulardi", + "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing", + "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", + "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_bytes": "3221;8151;8118", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, + [ + "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" + ] + ], + [ + { + "id": "SRX9504942_SRR13055517", + "run_accession": "SRR13055517", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r1", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2246028", + "read_count": "29553", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", + "fastq_bytes": "721167;723753", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", + "md5_2": "18dbe96e7f58b63406d9058938df1962", + "single_end": false + }, + [ + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" + ] + ], + [ + { + "id": "SRX9504942_SRR13055518", + "run_accession": "SRR13055518", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r2", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2235236", + "read_count": "29411", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", + "fastq_bytes": "717693;723429", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "md5_1": "5ec894d863fcefe394470a0925aefde4", + "md5_2": "aead170df9851773d5202b5760c76d76", + "single_end": false + }, + [ + "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" + ] + ], + [ + { + "id": "SRX9504942_SRR13055519", + "run_accession": "SRR13055519", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r3", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2232728", + "read_count": "29378", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", + "fastq_bytes": "714907;721705", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", + "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", + "single_end": false + }, + [ + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" + ] + ], + [ + { + "id": "DRX024467_DRR026872", + "run_accession": "DRR026872", + "experiment_accession": "DRX024467", + "sample_accession": "SAMD00023098", + "secondary_sample_accession": "DRS033740", + "study_accession": "PRJDB4356", + "secondary_study_accession": "DRP003256", + "submission_accession": "DRA002758", + "run_alias": "DRR026872", + "experiment_alias": "DRX024467", + "sample_alias": "SAMD00023098", + "study_alias": "DRP003256", + "library_layout": "SINGLE", + "library_selection": "Restriction Digest", + "library_source": "GENOMIC", + "library_strategy": "OTHER", + "library_name": "IpeRAD1_3", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "62550", + "read_count": "417", + "tax_id": "35883", + "scientific_name": "Ipomoea nil", + "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", + "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", + "study_title": "The Japanese morning glory genome sequence", + "sample_description": "Keywords: GSC:MIxS MIGS:6.0", + "fastq_md5": "515e5448c55e054113c4a22df5f62791", + "fastq_bytes": "38447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_2": "", + "md5_1": "515e5448c55e054113c4a22df5f62791", + "md5_2": "", + "single_end": true + }, + "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" + ], + [ + { + "id": "SRX6725035_SRR9984183", + "run_accession": "SRR9984183", + "experiment_accession": "SRX6725035", + "sample_accession": "SAMN12581720", + "secondary_sample_accession": "SRS5277011", + "study_accession": "PRJNA560329", + "secondary_study_accession": "SRP218535", + "submission_accession": "SRA942061", + "run_alias": "Emb289P1_bin131.fastq", + "experiment_alias": "Emb289P1_bin131", + "sample_alias": "Emb289P1_bin131", + "study_alias": "PRJNA560329", + "library_layout": "SINGLE", + "library_selection": "RANDOM", + "library_source": "METAGENOMIC", + "library_strategy": "WGS", + "library_name": "Emb289P1_bin131", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "1996273", + "read_count": "58", + "tax_id": "2660712", + "scientific_name": "Defluviitaleaceae bacterium", + "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", + "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", + "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", + "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", + "fastq_md5": "0b512d2dc31685983456bd56fd836544", + "fastq_bytes": "605358", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_2": "", + "md5_1": "0b512d2dc31685983456bd56fd836544", + "md5_2": "", + "single_end": true + }, + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" + ], + [ + { + "id": "SRX9504942_SRR13055520", + "run_accession": "SRR13055520", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r4", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2214488", + "read_count": "29138", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", + "fastq_bytes": "709867;716862", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "md5_1": "795d460abff6009c7f5ff7c14b773fbe", + "md5_2": "c3f34379356b28d6dac7212abc1a0a04", + "single_end": false + }, + [ + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" + ] + ], + [ + { + "id": "SRX9626017_SRR13191702", + "run_accession": "SRR13191702", + "experiment_accession": "SRX9626017", + "sample_accession": "SAMN16980141", + "secondary_sample_accession": "SRS7827211", + "study_accession": "PRJNA682076", + "secondary_study_accession": "SRP295653", + "submission_accession": "SRA1166126", + "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", + "experiment_alias": "S.170804.00784", + "sample_alias": "S.170804.00784_662", + "study_alias": "PRJNA682076", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "S.170804.00784", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "45682", + "read_count": "91", + "tax_id": "408170", + "scientific_name": "human gut metagenome", + "sample_title": "Metagenome or environmental sample from human gut metagenome", + "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "sample_description": "Metagenome or environmental sample from human gut metagenome", + "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", + "fastq_bytes": "15420;16324", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98", + "single_end": false + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + ] + ], + [ + { + "id": "ERX1234253_ERR1160846", + "run_accession": "ERR1160846", + "experiment_accession": "ERX1234253", + "sample_accession": "SAMEA3687214", + "secondary_sample_accession": "ERS994363", + "study_accession": "PRJEB11419", + "secondary_study_accession": "ERP012803", + "submission_accession": "ERA541392", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "study_alias": "qiita_sid_10317", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "10317.BLANK.93.3E.r22", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "35658", + "read_count": "283", + "tax_id": "256318", + "scientific_name": "metagenome", + "sample_title": "10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "study_title": "American Gut Project", + "sample_description": "American Gut control", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_2": "", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "single_end": true + }, + "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" + ], + [ + { + "id": "SRX11047067_SRR14709033", + "run_accession": "SRR14709033", + "experiment_accession": "SRX11047067", + "sample_accession": "SAMN19373034", + "secondary_sample_accession": "SRS9115923", + "study_accession": "PRJNA733285", + "secondary_study_accession": "SRP322267", + "submission_accession": "SRA1239521", + "run_alias": "Sebastes_levis-2.fastq", + "experiment_alias": "Sebastes_macdonaldi-1", + "sample_alias": "S._macdonaldi-1", + "study_alias": "PRJNA733285", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "Sebastes_macdonaldi-1", + "instrument_model": "AB 5500 Genetic Analyzer", + "instrument_platform": "ABI_SOLID", + "base_count": "153", + "read_count": "1", + "tax_id": "394693", + "scientific_name": "Sebastes macdonaldi", + "sample_title": "Sebastes_macdonaldi-1", + "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", + "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", + "sample_description": "Sebastes_macdonaldi-1", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": true + }, + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" + ], + [ + { + "id": "SRX10940790_SRR14593545", + "run_accession": "SRR14593545", + "experiment_accession": "SRX10940790", + "sample_accession": "SAMN19097423", + "secondary_sample_accession": "SRS9020442", + "study_accession": "PRJNA728650", + "secondary_study_accession": "SRP319413", + "submission_accession": "SRA1234280", + "run_alias": "577-6_530058_19-037147 Goat_F.ab1", + "experiment_alias": "PRNP_2765", + "sample_alias": "prp_2765", + "study_alias": "PRJNA728650", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "PRNP_2765", + "instrument_model": "AB 3500xL Genetic Analyzer", + "instrument_platform": "CAPILLARY", + "base_count": "828", + "read_count": "1", + "tax_id": "9925", + "scientific_name": "Capra hircus", + "sample_title": "MIGS Eukaryotic sample from Capra hircus", + "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", + "study_title": "Capra hircus Raw sequence reads", + "sample_description": "Keywords: GSC:MIxS MIGS:5.0", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" + ] + ], + [ + { + "id": "DRX026011_DRR028935", + "run_accession": "DRR028935", + "experiment_accession": "DRX026011", + "sample_accession": "SAMD00024405", + "secondary_sample_accession": "DRS019431", + "study_accession": "PRJDB3420", + "secondary_study_accession": "DRP002616", + "submission_accession": "DRA002949", + "run_alias": "DRR028935", + "experiment_alias": "DRX026011", + "sample_alias": "SAMD00024405", + "study_alias": "DRP002616", + "library_layout": "PAIRED", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "day0_BbSQE-I", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "194930", + "read_count": "965", + "tax_id": "1202541", + "scientific_name": "Botryococcus braunii Showa", + "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", + "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", + "sample_description": "Liquid culture", + "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", + "fastq_bytes": "60275;61610", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "md5_1": "cc01df82a9354bb6b3be93483b20c35a", + "md5_2": "941c9998d746416dad53c94c480ddf30", + "single_end": false + }, + [ + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" + ] + ], + [ + { + "id": "SRX9315476_SRR12848126", + "run_accession": "SRR12848126", + "experiment_accession": "SRX9315476", + "sample_accession": "SAMN16455283", + "secondary_sample_accession": "SRS7540262", + "study_accession": "PRJNA670070", + "secondary_study_accession": "SRP287769", + "submission_accession": "SRA1145417", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "experiment_alias": "F11-N1-05", + "sample_alias": "F11-N1-05", + "study_alias": "PRJNA670070", + "library_layout": "PAIRED", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "library_name": "F11-N1-05", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "base_count": "431758", + "read_count": "2954", + "tax_id": "10092", + "scientific_name": "Mus musculus domesticus", + "sample_title": "Longshanks_F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "sample_description": "F11-N1-05", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" + ] + ], + [ + { + "id": "SRX17709227_SRR21711856", + "run_accession": "SRR21711856", + "experiment_accession": "SRX17709227", + "sample_accession": "SAMN31021823", + "secondary_sample_accession": "SRS15239723", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601460_r1", + "experiment_alias": "GSM6601460_r1", + "sample_alias": "GSM6601460", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601460", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "573417800", + "read_count": "11468356", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "sham-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "sham-treated worms in day 5", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_2": "", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "single_end": true + }, + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" + ], + [ + { + "id": "SRX17709228_SRR21711855", + "run_accession": "SRR21711855", + "experiment_accession": "SRX17709228", + "sample_accession": "SAMN31021822", + "secondary_sample_accession": "SRS15239724", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601461_r1", + "experiment_alias": "GSM6601461_r1", + "sample_alias": "GSM6601461", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601461", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "677912850", + "read_count": "13558257", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "PM2.5-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "PM2.5-treated worms in day 5", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_2": "", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "single_end": true + }, + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" + ] + ], + "mappings": [ + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + ], + "samplesheet": [ + "samplesheet.csv:md5,dbd0e9c1683c603c681184a13f5b7341" + ], + "versions": [ + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + ] + }, + "failed": false, + "stdout": [ + "WARN: There's no process matching config selector: CUSTOM_DUMPSOFTWAREVERSIONS", + "WARN: There's no process matching config selector: MULTIQC_MAPPINGS_CONFIG" + ], + "errorMessage": null, + "trace": { + "tasksFailed": 0, + "tasksCount": 57, + "tasksSucceeded": 57 + }, + "name": "workflow", + "success": true + } ], - "timestamp": "2023-08-25T14:23:33+0000" + "timestamp": "2023-08-25T15:06:56+0000" } } \ No newline at end of file From 20af64e3a871b01c3d97b7f04b0676cf378fd66c Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 25 Aug 2023 17:11:24 +0200 Subject: [PATCH 408/852] disable autosort channel --- nf-test.config | 3 +++ 1 file changed, 3 insertions(+) diff --git a/nf-test.config b/nf-test.config index 0799cb40..217a5138 100644 --- a/nf-test.config +++ b/nf-test.config @@ -13,4 +13,7 @@ config { // run all test with the defined docker profile from the main nextflow.config profile "" + + // Disable autosort Channels + autoSort false } From 3c2e8fee5b0cdd3db4d862bc03c866a2437fd41a Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 25 Aug 2023 17:14:35 +0200 Subject: [PATCH 409/852] update snapshot --- workflows/sra/tests/main.nf.test.snap | 2654 ++++++++++++------------- 1 file changed, 1317 insertions(+), 1337 deletions(-) diff --git a/workflows/sra/tests/main.nf.test.snap b/workflows/sra/tests/main.nf.test.snap index 3db02451..3eab5807 100644 --- a/workflows/sra/tests/main.nf.test.snap +++ b/workflows/sra/tests/main.nf.test.snap @@ -2,1372 +2,1352 @@ "Parameters: default": { "content": [ { - "stderr": [ - - ], - "errorReport": null, - "exitStatus": 0, - "out": { - "0": [ - [ - { - "id": "ERX1188904_ERR1109373", - "run_accession": "ERR1109373", - "experiment_accession": "ERX1188904", - "sample_accession": "SAMEA3643867", - "secondary_sample_accession": "ERS951016", - "study_accession": "PRJEB11633", - "secondary_study_accession": "ERP013030", - "submission_accession": "ERA528939", - "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", - "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", - "sample_alias": "sample_56", - "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", - "library_layout": "PAIRED", - "library_selection": "RT-PCR", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "unspecified", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "29700", - "read_count": "169", - "tax_id": "63433", - "scientific_name": "Leptopilina boulardi", - "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing", - "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", - "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", - "fastq_bytes": "3221;8151;8118", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "md5_1": "9fd57225d6c07a31843276d6df9b15c0", - "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", - "single_end": false - }, - [ - "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" - ] - ], - [ - { - "id": "SRX9504942_SRR13055517", - "run_accession": "SRR13055517", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r1", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2246028", - "read_count": "29553", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", - "fastq_bytes": "721167;723753", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", - "md5_2": "18dbe96e7f58b63406d9058938df1962", - "single_end": false - }, - [ - "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", - "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" - ] - ], - [ - { - "id": "SRX9504942_SRR13055518", - "run_accession": "SRR13055518", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r2", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2235236", - "read_count": "29411", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", - "fastq_bytes": "717693;723429", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "md5_1": "5ec894d863fcefe394470a0925aefde4", - "md5_2": "aead170df9851773d5202b5760c76d76", - "single_end": false - }, - [ - "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", - "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" - ] - ], - [ - { - "id": "SRX9504942_SRR13055519", - "run_accession": "SRR13055519", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r3", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2232728", - "read_count": "29378", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", - "fastq_bytes": "714907;721705", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", - "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", - "single_end": false - }, - [ - "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", - "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" - ] - ], - [ - { - "id": "DRX024467_DRR026872", - "run_accession": "DRR026872", - "experiment_accession": "DRX024467", - "sample_accession": "SAMD00023098", - "secondary_sample_accession": "DRS033740", - "study_accession": "PRJDB4356", - "secondary_study_accession": "DRP003256", - "submission_accession": "DRA002758", - "run_alias": "DRR026872", - "experiment_alias": "DRX024467", - "sample_alias": "SAMD00023098", - "study_alias": "DRP003256", - "library_layout": "SINGLE", - "library_selection": "Restriction Digest", - "library_source": "GENOMIC", - "library_strategy": "OTHER", - "library_name": "IpeRAD1_3", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "62550", - "read_count": "417", - "tax_id": "35883", - "scientific_name": "Ipomoea nil", - "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", - "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", - "study_title": "The Japanese morning glory genome sequence", - "sample_description": "Keywords: GSC:MIxS MIGS:6.0", - "fastq_md5": "515e5448c55e054113c4a22df5f62791", - "fastq_bytes": "38447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_2": "", - "md5_1": "515e5448c55e054113c4a22df5f62791", - "md5_2": "", - "single_end": true - }, - "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" - ], - [ - { - "id": "SRX6725035_SRR9984183", - "run_accession": "SRR9984183", - "experiment_accession": "SRX6725035", - "sample_accession": "SAMN12581720", - "secondary_sample_accession": "SRS5277011", - "study_accession": "PRJNA560329", - "secondary_study_accession": "SRP218535", - "submission_accession": "SRA942061", - "run_alias": "Emb289P1_bin131.fastq", - "experiment_alias": "Emb289P1_bin131", - "sample_alias": "Emb289P1_bin131", - "study_alias": "PRJNA560329", - "library_layout": "SINGLE", - "library_selection": "RANDOM", - "library_source": "METAGENOMIC", - "library_strategy": "WGS", - "library_name": "Emb289P1_bin131", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "1996273", - "read_count": "58", - "tax_id": "2660712", - "scientific_name": "Defluviitaleaceae bacterium", - "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", - "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", - "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", - "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", - "fastq_md5": "0b512d2dc31685983456bd56fd836544", - "fastq_bytes": "605358", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_2": "", - "md5_1": "0b512d2dc31685983456bd56fd836544", - "md5_2": "", - "single_end": true - }, - "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" - ], + "0": [ + [ + { + "id": "DRX024467_DRR026872", + "run_accession": "DRR026872", + "experiment_accession": "DRX024467", + "sample_accession": "SAMD00023098", + "secondary_sample_accession": "DRS033740", + "study_accession": "PRJDB4356", + "secondary_study_accession": "DRP003256", + "submission_accession": "DRA002758", + "run_alias": "DRR026872", + "experiment_alias": "DRX024467", + "sample_alias": "SAMD00023098", + "study_alias": "DRP003256", + "library_layout": "SINGLE", + "library_selection": "Restriction Digest", + "library_source": "GENOMIC", + "library_strategy": "OTHER", + "library_name": "IpeRAD1_3", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "62550", + "read_count": "417", + "tax_id": "35883", + "scientific_name": "Ipomoea nil", + "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", + "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", + "study_title": "The Japanese morning glory genome sequence", + "sample_description": "Keywords: GSC:MIxS MIGS:6.0", + "fastq_md5": "515e5448c55e054113c4a22df5f62791", + "fastq_bytes": "38447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_2": "", + "md5_1": "515e5448c55e054113c4a22df5f62791", + "md5_2": "", + "single_end": true + }, + "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" + ], + [ + { + "id": "ERX1234253_ERR1160846", + "run_accession": "ERR1160846", + "experiment_accession": "ERX1234253", + "sample_accession": "SAMEA3687214", + "secondary_sample_accession": "ERS994363", + "study_accession": "PRJEB11419", + "secondary_study_accession": "ERP012803", + "submission_accession": "ERA541392", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "study_alias": "qiita_sid_10317", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "10317.BLANK.93.3E.r22", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "35658", + "read_count": "283", + "tax_id": "256318", + "scientific_name": "metagenome", + "sample_title": "10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "study_title": "American Gut Project", + "sample_description": "American Gut control", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_2": "", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "single_end": true + }, + "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" + ], + [ + { + "id": "DRX026011_DRR028935", + "run_accession": "DRR028935", + "experiment_accession": "DRX026011", + "sample_accession": "SAMD00024405", + "secondary_sample_accession": "DRS019431", + "study_accession": "PRJDB3420", + "secondary_study_accession": "DRP002616", + "submission_accession": "DRA002949", + "run_alias": "DRR028935", + "experiment_alias": "DRX026011", + "sample_alias": "SAMD00024405", + "study_alias": "DRP002616", + "library_layout": "PAIRED", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "day0_BbSQE-I", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "194930", + "read_count": "965", + "tax_id": "1202541", + "scientific_name": "Botryococcus braunii Showa", + "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", + "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", + "sample_description": "Liquid culture", + "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", + "fastq_bytes": "60275;61610", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "md5_1": "cc01df82a9354bb6b3be93483b20c35a", + "md5_2": "941c9998d746416dad53c94c480ddf30", + "single_end": false + }, [ - { - "id": "SRX9504942_SRR13055520", - "run_accession": "SRR13055520", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r4", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2214488", - "read_count": "29138", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", - "fastq_bytes": "709867;716862", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "md5_1": "795d460abff6009c7f5ff7c14b773fbe", - "md5_2": "c3f34379356b28d6dac7212abc1a0a04", - "single_end": false - }, - [ - "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", - "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" - ] - ], + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" + ] + ], + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "sample_accession": "SAMEA3643867", + "secondary_sample_accession": "ERS951016", + "study_accession": "PRJEB11633", + "secondary_study_accession": "ERP013030", + "submission_accession": "ERA528939", + "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", + "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", + "sample_alias": "sample_56", + "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", + "library_layout": "PAIRED", + "library_selection": "RT-PCR", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "unspecified", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "29700", + "read_count": "169", + "tax_id": "63433", + "scientific_name": "Leptopilina boulardi", + "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing", + "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", + "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_bytes": "3221;8151;8118", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, [ - { - "id": "SRX9626017_SRR13191702", - "run_accession": "SRR13191702", - "experiment_accession": "SRX9626017", - "sample_accession": "SAMN16980141", - "secondary_sample_accession": "SRS7827211", - "study_accession": "PRJNA682076", - "secondary_study_accession": "SRP295653", - "submission_accession": "SRA1166126", - "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", - "experiment_alias": "S.170804.00784", - "sample_alias": "S.170804.00784_662", - "study_alias": "PRJNA682076", - "library_layout": "PAIRED", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "library_name": "S.170804.00784", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "45682", - "read_count": "91", - "tax_id": "408170", - "scientific_name": "human gut metagenome", - "sample_title": "Metagenome or environmental sample from human gut metagenome", - "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "sample_description": "Metagenome or environmental sample from human gut metagenome", - "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", - "fastq_bytes": "15420;16324", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "md5_1": "89c5be920021a035084d8aeb74f32df7", - "md5_2": "56271be38a80db78ef3bdfc5d9909b98", - "single_end": false - }, - [ - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" - ] - ], + "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" + ] + ], + [ + { + "id": "SRX9504942_SRR13055519", + "run_accession": "SRR13055519", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r3", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2232728", + "read_count": "29378", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", + "fastq_bytes": "714907;721705", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", + "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", + "single_end": false + }, [ - { - "id": "ERX1234253_ERR1160846", - "run_accession": "ERR1160846", - "experiment_accession": "ERX1234253", - "sample_accession": "SAMEA3687214", - "secondary_sample_accession": "ERS994363", - "study_accession": "PRJEB11419", - "secondary_study_accession": "ERP012803", - "submission_accession": "ERA541392", - "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", - "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", - "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", - "study_alias": "qiita_sid_10317", - "library_layout": "SINGLE", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "library_name": "10317.BLANK.93.3E.r22", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "35658", - "read_count": "283", - "tax_id": "256318", - "scientific_name": "metagenome", - "sample_title": "10317.BLANK.93.3E.r22", - "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", - "study_title": "American Gut Project", - "sample_description": "American Gut control", - "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", - "fastq_bytes": "18077", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_2": "", - "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", - "md5_2": "", - "single_end": true - }, - "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" - ], + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" + ] + ], + [ + { + "id": "SRX9504942_SRR13055517", + "run_accession": "SRR13055517", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r1", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2246028", + "read_count": "29553", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", + "fastq_bytes": "721167;723753", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", + "md5_2": "18dbe96e7f58b63406d9058938df1962", + "single_end": false + }, [ - { - "id": "SRX11047067_SRR14709033", - "run_accession": "SRR14709033", - "experiment_accession": "SRX11047067", - "sample_accession": "SAMN19373034", - "secondary_sample_accession": "SRS9115923", - "study_accession": "PRJNA733285", - "secondary_study_accession": "SRP322267", - "submission_accession": "SRA1239521", - "run_alias": "Sebastes_levis-2.fastq", - "experiment_alias": "Sebastes_macdonaldi-1", - "sample_alias": "S._macdonaldi-1", - "study_alias": "PRJNA733285", - "library_layout": "SINGLE", - "library_selection": "PCR", - "library_source": "GENOMIC", - "library_strategy": "AMPLICON", - "library_name": "Sebastes_macdonaldi-1", - "instrument_model": "AB 5500 Genetic Analyzer", - "instrument_platform": "ABI_SOLID", - "base_count": "153", - "read_count": "1", - "tax_id": "394693", - "scientific_name": "Sebastes macdonaldi", - "sample_title": "Sebastes_macdonaldi-1", - "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", - "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", - "sample_description": "Sebastes_macdonaldi-1", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": true - }, - "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" - ], + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" + ] + ], + [ + { + "id": "SRX9504942_SRR13055518", + "run_accession": "SRR13055518", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r2", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2235236", + "read_count": "29411", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", + "fastq_bytes": "717693;723429", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "md5_1": "5ec894d863fcefe394470a0925aefde4", + "md5_2": "aead170df9851773d5202b5760c76d76", + "single_end": false + }, [ - { - "id": "SRX10940790_SRR14593545", - "run_accession": "SRR14593545", - "experiment_accession": "SRX10940790", - "sample_accession": "SAMN19097423", - "secondary_sample_accession": "SRS9020442", - "study_accession": "PRJNA728650", - "secondary_study_accession": "SRP319413", - "submission_accession": "SRA1234280", - "run_alias": "577-6_530058_19-037147 Goat_F.ab1", - "experiment_alias": "PRNP_2765", - "sample_alias": "prp_2765", - "study_alias": "PRJNA728650", - "library_layout": "PAIRED", - "library_selection": "PCR", - "library_source": "GENOMIC", - "library_strategy": "AMPLICON", - "library_name": "PRNP_2765", - "instrument_model": "AB 3500xL Genetic Analyzer", - "instrument_platform": "CAPILLARY", - "base_count": "828", - "read_count": "1", - "tax_id": "9925", - "scientific_name": "Capra hircus", - "sample_title": "MIGS Eukaryotic sample from Capra hircus", - "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", - "study_title": "Capra hircus Raw sequence reads", - "sample_description": "Keywords: GSC:MIxS MIGS:5.0", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": false - }, - [ - "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", - "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" - ] - ], + "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" + ] + ], + [ + { + "id": "SRX9504942_SRR13055520", + "run_accession": "SRR13055520", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r4", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2214488", + "read_count": "29138", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", + "fastq_bytes": "709867;716862", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "md5_1": "795d460abff6009c7f5ff7c14b773fbe", + "md5_2": "c3f34379356b28d6dac7212abc1a0a04", + "single_end": false + }, [ - { - "id": "DRX026011_DRR028935", - "run_accession": "DRR028935", - "experiment_accession": "DRX026011", - "sample_accession": "SAMD00024405", - "secondary_sample_accession": "DRS019431", - "study_accession": "PRJDB3420", - "secondary_study_accession": "DRP002616", - "submission_accession": "DRA002949", - "run_alias": "DRR028935", - "experiment_alias": "DRX026011", - "sample_alias": "SAMD00024405", - "study_alias": "DRP002616", - "library_layout": "PAIRED", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "day0_BbSQE-I", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "194930", - "read_count": "965", - "tax_id": "1202541", - "scientific_name": "Botryococcus braunii Showa", - "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", - "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", - "sample_description": "Liquid culture", - "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", - "fastq_bytes": "60275;61610", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "md5_1": "cc01df82a9354bb6b3be93483b20c35a", - "md5_2": "941c9998d746416dad53c94c480ddf30", - "single_end": false - }, - [ - "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", - "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" - ] - ], + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" + ] + ], + [ + { + "id": "SRX9626017_SRR13191702", + "run_accession": "SRR13191702", + "experiment_accession": "SRX9626017", + "sample_accession": "SAMN16980141", + "secondary_sample_accession": "SRS7827211", + "study_accession": "PRJNA682076", + "secondary_study_accession": "SRP295653", + "submission_accession": "SRA1166126", + "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", + "experiment_alias": "S.170804.00784", + "sample_alias": "S.170804.00784_662", + "study_alias": "PRJNA682076", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "S.170804.00784", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "45682", + "read_count": "91", + "tax_id": "408170", + "scientific_name": "human gut metagenome", + "sample_title": "Metagenome or environmental sample from human gut metagenome", + "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "sample_description": "Metagenome or environmental sample from human gut metagenome", + "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", + "fastq_bytes": "15420;16324", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98", + "single_end": false + }, [ - { - "id": "SRX9315476_SRR12848126", - "run_accession": "SRR12848126", - "experiment_accession": "SRX9315476", - "sample_accession": "SAMN16455283", - "secondary_sample_accession": "SRS7540262", - "study_accession": "PRJNA670070", - "secondary_study_accession": "SRP287769", - "submission_accession": "SRA1145417", - "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", - "experiment_alias": "F11-N1-05", - "sample_alias": "F11-N1-05", - "study_alias": "PRJNA670070", - "library_layout": "PAIRED", - "library_selection": "RANDOM PCR", - "library_source": "GENOMIC", - "library_strategy": "Synthetic-Long-Read", - "library_name": "F11-N1-05", - "instrument_model": "Illumina HiSeq 3000", - "instrument_platform": "ILLUMINA", - "base_count": "431758", - "read_count": "2954", - "tax_id": "10092", - "scientific_name": "Mus musculus domesticus", - "sample_title": "Longshanks_F11-N1-05", - "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "sample_description": "F11-N1-05", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": false - }, - [ - "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", - "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" - ] - ], + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + ] + ], + [ + { + "id": "SRX6725035_SRR9984183", + "run_accession": "SRR9984183", + "experiment_accession": "SRX6725035", + "sample_accession": "SAMN12581720", + "secondary_sample_accession": "SRS5277011", + "study_accession": "PRJNA560329", + "secondary_study_accession": "SRP218535", + "submission_accession": "SRA942061", + "run_alias": "Emb289P1_bin131.fastq", + "experiment_alias": "Emb289P1_bin131", + "sample_alias": "Emb289P1_bin131", + "study_alias": "PRJNA560329", + "library_layout": "SINGLE", + "library_selection": "RANDOM", + "library_source": "METAGENOMIC", + "library_strategy": "WGS", + "library_name": "Emb289P1_bin131", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "1996273", + "read_count": "58", + "tax_id": "2660712", + "scientific_name": "Defluviitaleaceae bacterium", + "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", + "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", + "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", + "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", + "fastq_md5": "0b512d2dc31685983456bd56fd836544", + "fastq_bytes": "605358", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_2": "", + "md5_1": "0b512d2dc31685983456bd56fd836544", + "md5_2": "", + "single_end": true + }, + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" + ], + [ + { + "id": "SRX11047067_SRR14709033", + "run_accession": "SRR14709033", + "experiment_accession": "SRX11047067", + "sample_accession": "SAMN19373034", + "secondary_sample_accession": "SRS9115923", + "study_accession": "PRJNA733285", + "secondary_study_accession": "SRP322267", + "submission_accession": "SRA1239521", + "run_alias": "Sebastes_levis-2.fastq", + "experiment_alias": "Sebastes_macdonaldi-1", + "sample_alias": "S._macdonaldi-1", + "study_alias": "PRJNA733285", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "Sebastes_macdonaldi-1", + "instrument_model": "AB 5500 Genetic Analyzer", + "instrument_platform": "ABI_SOLID", + "base_count": "153", + "read_count": "1", + "tax_id": "394693", + "scientific_name": "Sebastes macdonaldi", + "sample_title": "Sebastes_macdonaldi-1", + "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", + "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", + "sample_description": "Sebastes_macdonaldi-1", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": true + }, + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" + ], + [ + { + "id": "SRX10940790_SRR14593545", + "run_accession": "SRR14593545", + "experiment_accession": "SRX10940790", + "sample_accession": "SAMN19097423", + "secondary_sample_accession": "SRS9020442", + "study_accession": "PRJNA728650", + "secondary_study_accession": "SRP319413", + "submission_accession": "SRA1234280", + "run_alias": "577-6_530058_19-037147 Goat_F.ab1", + "experiment_alias": "PRNP_2765", + "sample_alias": "prp_2765", + "study_alias": "PRJNA728650", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "PRNP_2765", + "instrument_model": "AB 3500xL Genetic Analyzer", + "instrument_platform": "CAPILLARY", + "base_count": "828", + "read_count": "1", + "tax_id": "9925", + "scientific_name": "Capra hircus", + "sample_title": "MIGS Eukaryotic sample from Capra hircus", + "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", + "study_title": "Capra hircus Raw sequence reads", + "sample_description": "Keywords: GSC:MIxS MIGS:5.0", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, [ - { - "id": "SRX17709227_SRR21711856", - "run_accession": "SRR21711856", - "experiment_accession": "SRX17709227", - "sample_accession": "SAMN31021823", - "secondary_sample_accession": "SRS15239723", - "study_accession": "PRJNA884373", - "secondary_study_accession": "SRP399678", - "submission_accession": "SRA1507236", - "run_alias": "GSM6601460_r1", - "experiment_alias": "GSM6601460_r1", - "sample_alias": "GSM6601460", - "study_alias": "GSE214215", - "library_layout": "SINGLE", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "GSM6601460", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "base_count": "573417800", - "read_count": "11468356", - "tax_id": "6239", - "scientific_name": "Caenorhabditis elegans", - "sample_title": "sham-treated worms in day 5", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "sample_description": "sham-treated worms in day 5", - "fastq_md5": "7cd1402155befc87be338132d1f31f64", - "fastq_bytes": "447377777", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_2": "", - "md5_1": "7cd1402155befc87be338132d1f31f64", - "md5_2": "", - "single_end": true - }, - "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" - ], + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" + ] + ], + [ + { + "id": "SRX9315476_SRR12848126", + "run_accession": "SRR12848126", + "experiment_accession": "SRX9315476", + "sample_accession": "SAMN16455283", + "secondary_sample_accession": "SRS7540262", + "study_accession": "PRJNA670070", + "secondary_study_accession": "SRP287769", + "submission_accession": "SRA1145417", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "experiment_alias": "F11-N1-05", + "sample_alias": "F11-N1-05", + "study_alias": "PRJNA670070", + "library_layout": "PAIRED", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "library_name": "F11-N1-05", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "base_count": "431758", + "read_count": "2954", + "tax_id": "10092", + "scientific_name": "Mus musculus domesticus", + "sample_title": "Longshanks_F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "sample_description": "F11-N1-05", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, [ - { - "id": "SRX17709228_SRR21711855", - "run_accession": "SRR21711855", - "experiment_accession": "SRX17709228", - "sample_accession": "SAMN31021822", - "secondary_sample_accession": "SRS15239724", - "study_accession": "PRJNA884373", - "secondary_study_accession": "SRP399678", - "submission_accession": "SRA1507236", - "run_alias": "GSM6601461_r1", - "experiment_alias": "GSM6601461_r1", - "sample_alias": "GSM6601461", - "study_alias": "GSE214215", - "library_layout": "SINGLE", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "GSM6601461", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "base_count": "677912850", - "read_count": "13558257", - "tax_id": "6239", - "scientific_name": "Caenorhabditis elegans", - "sample_title": "PM2.5-treated worms in day 5", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "sample_description": "PM2.5-treated worms in day 5", - "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", - "fastq_bytes": "529798447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_2": "", - "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", - "md5_2": "", - "single_end": true - }, - "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" ] ], - "1": [ - "samplesheet.csv:md5,dbd0e9c1683c603c681184a13f5b7341" + [ + { + "id": "SRX17709227_SRR21711856", + "run_accession": "SRR21711856", + "experiment_accession": "SRX17709227", + "sample_accession": "SAMN31021823", + "secondary_sample_accession": "SRS15239723", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601460_r1", + "experiment_alias": "GSM6601460_r1", + "sample_alias": "GSM6601460", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601460", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "573417800", + "read_count": "11468356", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "sham-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "sham-treated worms in day 5", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_2": "", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "single_end": true + }, + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" ], - "2": [ - "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + [ + { + "id": "SRX17709228_SRR21711855", + "run_accession": "SRR21711855", + "experiment_accession": "SRX17709228", + "sample_accession": "SAMN31021822", + "secondary_sample_accession": "SRS15239724", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601461_r1", + "experiment_alias": "GSM6601461_r1", + "sample_alias": "GSM6601461", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601461", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "677912850", + "read_count": "13558257", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "PM2.5-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "PM2.5-treated worms in day 5", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_2": "", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "single_end": true + }, + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" + ] + ], + "1": [ + "samplesheet.csv:md5,dbd0e9c1683c603c681184a13f5b7341" + ], + "2": [ + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + ], + "3": [ + "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + ], + "fastq": [ + [ + { + "id": "DRX024467_DRR026872", + "run_accession": "DRR026872", + "experiment_accession": "DRX024467", + "sample_accession": "SAMD00023098", + "secondary_sample_accession": "DRS033740", + "study_accession": "PRJDB4356", + "secondary_study_accession": "DRP003256", + "submission_accession": "DRA002758", + "run_alias": "DRR026872", + "experiment_alias": "DRX024467", + "sample_alias": "SAMD00023098", + "study_alias": "DRP003256", + "library_layout": "SINGLE", + "library_selection": "Restriction Digest", + "library_source": "GENOMIC", + "library_strategy": "OTHER", + "library_name": "IpeRAD1_3", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "62550", + "read_count": "417", + "tax_id": "35883", + "scientific_name": "Ipomoea nil", + "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", + "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", + "study_title": "The Japanese morning glory genome sequence", + "sample_description": "Keywords: GSC:MIxS MIGS:6.0", + "fastq_md5": "515e5448c55e054113c4a22df5f62791", + "fastq_bytes": "38447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_2": "", + "md5_1": "515e5448c55e054113c4a22df5f62791", + "md5_2": "", + "single_end": true + }, + "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" ], - "3": [ - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", - "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", - "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", - "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + [ + { + "id": "ERX1234253_ERR1160846", + "run_accession": "ERR1160846", + "experiment_accession": "ERX1234253", + "sample_accession": "SAMEA3687214", + "secondary_sample_accession": "ERS994363", + "study_accession": "PRJEB11419", + "secondary_study_accession": "ERP012803", + "submission_accession": "ERA541392", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "study_alias": "qiita_sid_10317", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "10317.BLANK.93.3E.r22", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "35658", + "read_count": "283", + "tax_id": "256318", + "scientific_name": "metagenome", + "sample_title": "10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "study_title": "American Gut Project", + "sample_description": "American Gut control", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_2": "", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "single_end": true + }, + "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" ], - "fastq": [ - [ - { - "id": "ERX1188904_ERR1109373", - "run_accession": "ERR1109373", - "experiment_accession": "ERX1188904", - "sample_accession": "SAMEA3643867", - "secondary_sample_accession": "ERS951016", - "study_accession": "PRJEB11633", - "secondary_study_accession": "ERP013030", - "submission_accession": "ERA528939", - "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", - "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", - "sample_alias": "sample_56", - "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", - "library_layout": "PAIRED", - "library_selection": "RT-PCR", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "unspecified", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "29700", - "read_count": "169", - "tax_id": "63433", - "scientific_name": "Leptopilina boulardi", - "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing", - "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", - "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", - "fastq_bytes": "3221;8151;8118", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "md5_1": "9fd57225d6c07a31843276d6df9b15c0", - "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", - "single_end": false - }, - [ - "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" - ] - ], - [ - { - "id": "SRX9504942_SRR13055517", - "run_accession": "SRR13055517", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r1", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2246028", - "read_count": "29553", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", - "fastq_bytes": "721167;723753", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", - "md5_2": "18dbe96e7f58b63406d9058938df1962", - "single_end": false - }, - [ - "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", - "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" - ] - ], - [ - { - "id": "SRX9504942_SRR13055518", - "run_accession": "SRR13055518", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r2", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2235236", - "read_count": "29411", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", - "fastq_bytes": "717693;723429", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "md5_1": "5ec894d863fcefe394470a0925aefde4", - "md5_2": "aead170df9851773d5202b5760c76d76", - "single_end": false - }, - [ - "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", - "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" - ] - ], - [ - { - "id": "SRX9504942_SRR13055519", - "run_accession": "SRR13055519", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r3", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2232728", - "read_count": "29378", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", - "fastq_bytes": "714907;721705", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", - "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", - "single_end": false - }, - [ - "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", - "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" - ] - ], - [ - { - "id": "DRX024467_DRR026872", - "run_accession": "DRR026872", - "experiment_accession": "DRX024467", - "sample_accession": "SAMD00023098", - "secondary_sample_accession": "DRS033740", - "study_accession": "PRJDB4356", - "secondary_study_accession": "DRP003256", - "submission_accession": "DRA002758", - "run_alias": "DRR026872", - "experiment_alias": "DRX024467", - "sample_alias": "SAMD00023098", - "study_alias": "DRP003256", - "library_layout": "SINGLE", - "library_selection": "Restriction Digest", - "library_source": "GENOMIC", - "library_strategy": "OTHER", - "library_name": "IpeRAD1_3", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "62550", - "read_count": "417", - "tax_id": "35883", - "scientific_name": "Ipomoea nil", - "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", - "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", - "study_title": "The Japanese morning glory genome sequence", - "sample_description": "Keywords: GSC:MIxS MIGS:6.0", - "fastq_md5": "515e5448c55e054113c4a22df5f62791", - "fastq_bytes": "38447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_2": "", - "md5_1": "515e5448c55e054113c4a22df5f62791", - "md5_2": "", - "single_end": true - }, - "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" - ], - [ - { - "id": "SRX6725035_SRR9984183", - "run_accession": "SRR9984183", - "experiment_accession": "SRX6725035", - "sample_accession": "SAMN12581720", - "secondary_sample_accession": "SRS5277011", - "study_accession": "PRJNA560329", - "secondary_study_accession": "SRP218535", - "submission_accession": "SRA942061", - "run_alias": "Emb289P1_bin131.fastq", - "experiment_alias": "Emb289P1_bin131", - "sample_alias": "Emb289P1_bin131", - "study_alias": "PRJNA560329", - "library_layout": "SINGLE", - "library_selection": "RANDOM", - "library_source": "METAGENOMIC", - "library_strategy": "WGS", - "library_name": "Emb289P1_bin131", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "1996273", - "read_count": "58", - "tax_id": "2660712", - "scientific_name": "Defluviitaleaceae bacterium", - "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", - "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", - "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", - "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", - "fastq_md5": "0b512d2dc31685983456bd56fd836544", - "fastq_bytes": "605358", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_2": "", - "md5_1": "0b512d2dc31685983456bd56fd836544", - "md5_2": "", - "single_end": true - }, - "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" - ], + [ + { + "id": "DRX026011_DRR028935", + "run_accession": "DRR028935", + "experiment_accession": "DRX026011", + "sample_accession": "SAMD00024405", + "secondary_sample_accession": "DRS019431", + "study_accession": "PRJDB3420", + "secondary_study_accession": "DRP002616", + "submission_accession": "DRA002949", + "run_alias": "DRR028935", + "experiment_alias": "DRX026011", + "sample_alias": "SAMD00024405", + "study_alias": "DRP002616", + "library_layout": "PAIRED", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "day0_BbSQE-I", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "194930", + "read_count": "965", + "tax_id": "1202541", + "scientific_name": "Botryococcus braunii Showa", + "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", + "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", + "sample_description": "Liquid culture", + "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", + "fastq_bytes": "60275;61610", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "md5_1": "cc01df82a9354bb6b3be93483b20c35a", + "md5_2": "941c9998d746416dad53c94c480ddf30", + "single_end": false + }, [ - { - "id": "SRX9504942_SRR13055520", - "run_accession": "SRR13055520", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r4", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2214488", - "read_count": "29138", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", - "fastq_bytes": "709867;716862", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "md5_1": "795d460abff6009c7f5ff7c14b773fbe", - "md5_2": "c3f34379356b28d6dac7212abc1a0a04", - "single_end": false - }, - [ - "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", - "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" - ] - ], - [ - { - "id": "SRX9626017_SRR13191702", - "run_accession": "SRR13191702", - "experiment_accession": "SRX9626017", - "sample_accession": "SAMN16980141", - "secondary_sample_accession": "SRS7827211", - "study_accession": "PRJNA682076", - "secondary_study_accession": "SRP295653", - "submission_accession": "SRA1166126", - "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", - "experiment_alias": "S.170804.00784", - "sample_alias": "S.170804.00784_662", - "study_alias": "PRJNA682076", - "library_layout": "PAIRED", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "library_name": "S.170804.00784", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "45682", - "read_count": "91", - "tax_id": "408170", - "scientific_name": "human gut metagenome", - "sample_title": "Metagenome or environmental sample from human gut metagenome", - "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "sample_description": "Metagenome or environmental sample from human gut metagenome", - "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", - "fastq_bytes": "15420;16324", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "md5_1": "89c5be920021a035084d8aeb74f32df7", - "md5_2": "56271be38a80db78ef3bdfc5d9909b98", - "single_end": false - }, - [ - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" - ] - ], + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" + ] + ], + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "sample_accession": "SAMEA3643867", + "secondary_sample_accession": "ERS951016", + "study_accession": "PRJEB11633", + "secondary_study_accession": "ERP013030", + "submission_accession": "ERA528939", + "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", + "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", + "sample_alias": "sample_56", + "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", + "library_layout": "PAIRED", + "library_selection": "RT-PCR", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "unspecified", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "29700", + "read_count": "169", + "tax_id": "63433", + "scientific_name": "Leptopilina boulardi", + "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing", + "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", + "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_bytes": "3221;8151;8118", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, [ - { - "id": "ERX1234253_ERR1160846", - "run_accession": "ERR1160846", - "experiment_accession": "ERX1234253", - "sample_accession": "SAMEA3687214", - "secondary_sample_accession": "ERS994363", - "study_accession": "PRJEB11419", - "secondary_study_accession": "ERP012803", - "submission_accession": "ERA541392", - "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", - "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", - "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", - "study_alias": "qiita_sid_10317", - "library_layout": "SINGLE", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "library_name": "10317.BLANK.93.3E.r22", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "35658", - "read_count": "283", - "tax_id": "256318", - "scientific_name": "metagenome", - "sample_title": "10317.BLANK.93.3E.r22", - "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", - "study_title": "American Gut Project", - "sample_description": "American Gut control", - "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", - "fastq_bytes": "18077", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_2": "", - "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", - "md5_2": "", - "single_end": true - }, - "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" - ], + "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" + ] + ], + [ + { + "id": "SRX9504942_SRR13055519", + "run_accession": "SRR13055519", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r3", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2232728", + "read_count": "29378", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", + "fastq_bytes": "714907;721705", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", + "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", + "single_end": false + }, [ - { - "id": "SRX11047067_SRR14709033", - "run_accession": "SRR14709033", - "experiment_accession": "SRX11047067", - "sample_accession": "SAMN19373034", - "secondary_sample_accession": "SRS9115923", - "study_accession": "PRJNA733285", - "secondary_study_accession": "SRP322267", - "submission_accession": "SRA1239521", - "run_alias": "Sebastes_levis-2.fastq", - "experiment_alias": "Sebastes_macdonaldi-1", - "sample_alias": "S._macdonaldi-1", - "study_alias": "PRJNA733285", - "library_layout": "SINGLE", - "library_selection": "PCR", - "library_source": "GENOMIC", - "library_strategy": "AMPLICON", - "library_name": "Sebastes_macdonaldi-1", - "instrument_model": "AB 5500 Genetic Analyzer", - "instrument_platform": "ABI_SOLID", - "base_count": "153", - "read_count": "1", - "tax_id": "394693", - "scientific_name": "Sebastes macdonaldi", - "sample_title": "Sebastes_macdonaldi-1", - "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", - "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", - "sample_description": "Sebastes_macdonaldi-1", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": true - }, - "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" - ], + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" + ] + ], + [ + { + "id": "SRX9504942_SRR13055517", + "run_accession": "SRR13055517", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r1", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2246028", + "read_count": "29553", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", + "fastq_bytes": "721167;723753", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", + "md5_2": "18dbe96e7f58b63406d9058938df1962", + "single_end": false + }, [ - { - "id": "SRX10940790_SRR14593545", - "run_accession": "SRR14593545", - "experiment_accession": "SRX10940790", - "sample_accession": "SAMN19097423", - "secondary_sample_accession": "SRS9020442", - "study_accession": "PRJNA728650", - "secondary_study_accession": "SRP319413", - "submission_accession": "SRA1234280", - "run_alias": "577-6_530058_19-037147 Goat_F.ab1", - "experiment_alias": "PRNP_2765", - "sample_alias": "prp_2765", - "study_alias": "PRJNA728650", - "library_layout": "PAIRED", - "library_selection": "PCR", - "library_source": "GENOMIC", - "library_strategy": "AMPLICON", - "library_name": "PRNP_2765", - "instrument_model": "AB 3500xL Genetic Analyzer", - "instrument_platform": "CAPILLARY", - "base_count": "828", - "read_count": "1", - "tax_id": "9925", - "scientific_name": "Capra hircus", - "sample_title": "MIGS Eukaryotic sample from Capra hircus", - "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", - "study_title": "Capra hircus Raw sequence reads", - "sample_description": "Keywords: GSC:MIxS MIGS:5.0", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": false - }, - [ - "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", - "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" - ] - ], + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" + ] + ], + [ + { + "id": "SRX9504942_SRR13055518", + "run_accession": "SRR13055518", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r2", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2235236", + "read_count": "29411", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", + "fastq_bytes": "717693;723429", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "md5_1": "5ec894d863fcefe394470a0925aefde4", + "md5_2": "aead170df9851773d5202b5760c76d76", + "single_end": false + }, [ - { - "id": "DRX026011_DRR028935", - "run_accession": "DRR028935", - "experiment_accession": "DRX026011", - "sample_accession": "SAMD00024405", - "secondary_sample_accession": "DRS019431", - "study_accession": "PRJDB3420", - "secondary_study_accession": "DRP002616", - "submission_accession": "DRA002949", - "run_alias": "DRR028935", - "experiment_alias": "DRX026011", - "sample_alias": "SAMD00024405", - "study_alias": "DRP002616", - "library_layout": "PAIRED", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "day0_BbSQE-I", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "194930", - "read_count": "965", - "tax_id": "1202541", - "scientific_name": "Botryococcus braunii Showa", - "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", - "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", - "sample_description": "Liquid culture", - "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", - "fastq_bytes": "60275;61610", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "md5_1": "cc01df82a9354bb6b3be93483b20c35a", - "md5_2": "941c9998d746416dad53c94c480ddf30", - "single_end": false - }, - [ - "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", - "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" - ] - ], + "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" + ] + ], + [ + { + "id": "SRX9504942_SRR13055520", + "run_accession": "SRR13055520", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r4", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2214488", + "read_count": "29138", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", + "fastq_bytes": "709867;716862", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "md5_1": "795d460abff6009c7f5ff7c14b773fbe", + "md5_2": "c3f34379356b28d6dac7212abc1a0a04", + "single_end": false + }, [ - { - "id": "SRX9315476_SRR12848126", - "run_accession": "SRR12848126", - "experiment_accession": "SRX9315476", - "sample_accession": "SAMN16455283", - "secondary_sample_accession": "SRS7540262", - "study_accession": "PRJNA670070", - "secondary_study_accession": "SRP287769", - "submission_accession": "SRA1145417", - "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", - "experiment_alias": "F11-N1-05", - "sample_alias": "F11-N1-05", - "study_alias": "PRJNA670070", - "library_layout": "PAIRED", - "library_selection": "RANDOM PCR", - "library_source": "GENOMIC", - "library_strategy": "Synthetic-Long-Read", - "library_name": "F11-N1-05", - "instrument_model": "Illumina HiSeq 3000", - "instrument_platform": "ILLUMINA", - "base_count": "431758", - "read_count": "2954", - "tax_id": "10092", - "scientific_name": "Mus musculus domesticus", - "sample_title": "Longshanks_F11-N1-05", - "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "sample_description": "F11-N1-05", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": false - }, - [ - "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", - "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" - ] - ], + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" + ] + ], + [ + { + "id": "SRX9626017_SRR13191702", + "run_accession": "SRR13191702", + "experiment_accession": "SRX9626017", + "sample_accession": "SAMN16980141", + "secondary_sample_accession": "SRS7827211", + "study_accession": "PRJNA682076", + "secondary_study_accession": "SRP295653", + "submission_accession": "SRA1166126", + "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", + "experiment_alias": "S.170804.00784", + "sample_alias": "S.170804.00784_662", + "study_alias": "PRJNA682076", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "S.170804.00784", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "45682", + "read_count": "91", + "tax_id": "408170", + "scientific_name": "human gut metagenome", + "sample_title": "Metagenome or environmental sample from human gut metagenome", + "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "sample_description": "Metagenome or environmental sample from human gut metagenome", + "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", + "fastq_bytes": "15420;16324", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98", + "single_end": false + }, [ - { - "id": "SRX17709227_SRR21711856", - "run_accession": "SRR21711856", - "experiment_accession": "SRX17709227", - "sample_accession": "SAMN31021823", - "secondary_sample_accession": "SRS15239723", - "study_accession": "PRJNA884373", - "secondary_study_accession": "SRP399678", - "submission_accession": "SRA1507236", - "run_alias": "GSM6601460_r1", - "experiment_alias": "GSM6601460_r1", - "sample_alias": "GSM6601460", - "study_alias": "GSE214215", - "library_layout": "SINGLE", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "GSM6601460", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "base_count": "573417800", - "read_count": "11468356", - "tax_id": "6239", - "scientific_name": "Caenorhabditis elegans", - "sample_title": "sham-treated worms in day 5", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "sample_description": "sham-treated worms in day 5", - "fastq_md5": "7cd1402155befc87be338132d1f31f64", - "fastq_bytes": "447377777", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_2": "", - "md5_1": "7cd1402155befc87be338132d1f31f64", - "md5_2": "", - "single_end": true - }, - "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" - ], + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + ] + ], + [ + { + "id": "SRX6725035_SRR9984183", + "run_accession": "SRR9984183", + "experiment_accession": "SRX6725035", + "sample_accession": "SAMN12581720", + "secondary_sample_accession": "SRS5277011", + "study_accession": "PRJNA560329", + "secondary_study_accession": "SRP218535", + "submission_accession": "SRA942061", + "run_alias": "Emb289P1_bin131.fastq", + "experiment_alias": "Emb289P1_bin131", + "sample_alias": "Emb289P1_bin131", + "study_alias": "PRJNA560329", + "library_layout": "SINGLE", + "library_selection": "RANDOM", + "library_source": "METAGENOMIC", + "library_strategy": "WGS", + "library_name": "Emb289P1_bin131", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "1996273", + "read_count": "58", + "tax_id": "2660712", + "scientific_name": "Defluviitaleaceae bacterium", + "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", + "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", + "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", + "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", + "fastq_md5": "0b512d2dc31685983456bd56fd836544", + "fastq_bytes": "605358", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_2": "", + "md5_1": "0b512d2dc31685983456bd56fd836544", + "md5_2": "", + "single_end": true + }, + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" + ], + [ + { + "id": "SRX11047067_SRR14709033", + "run_accession": "SRR14709033", + "experiment_accession": "SRX11047067", + "sample_accession": "SAMN19373034", + "secondary_sample_accession": "SRS9115923", + "study_accession": "PRJNA733285", + "secondary_study_accession": "SRP322267", + "submission_accession": "SRA1239521", + "run_alias": "Sebastes_levis-2.fastq", + "experiment_alias": "Sebastes_macdonaldi-1", + "sample_alias": "S._macdonaldi-1", + "study_alias": "PRJNA733285", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "Sebastes_macdonaldi-1", + "instrument_model": "AB 5500 Genetic Analyzer", + "instrument_platform": "ABI_SOLID", + "base_count": "153", + "read_count": "1", + "tax_id": "394693", + "scientific_name": "Sebastes macdonaldi", + "sample_title": "Sebastes_macdonaldi-1", + "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", + "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", + "sample_description": "Sebastes_macdonaldi-1", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": true + }, + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" + ], + [ + { + "id": "SRX10940790_SRR14593545", + "run_accession": "SRR14593545", + "experiment_accession": "SRX10940790", + "sample_accession": "SAMN19097423", + "secondary_sample_accession": "SRS9020442", + "study_accession": "PRJNA728650", + "secondary_study_accession": "SRP319413", + "submission_accession": "SRA1234280", + "run_alias": "577-6_530058_19-037147 Goat_F.ab1", + "experiment_alias": "PRNP_2765", + "sample_alias": "prp_2765", + "study_alias": "PRJNA728650", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "PRNP_2765", + "instrument_model": "AB 3500xL Genetic Analyzer", + "instrument_platform": "CAPILLARY", + "base_count": "828", + "read_count": "1", + "tax_id": "9925", + "scientific_name": "Capra hircus", + "sample_title": "MIGS Eukaryotic sample from Capra hircus", + "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", + "study_title": "Capra hircus Raw sequence reads", + "sample_description": "Keywords: GSC:MIxS MIGS:5.0", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, [ - { - "id": "SRX17709228_SRR21711855", - "run_accession": "SRR21711855", - "experiment_accession": "SRX17709228", - "sample_accession": "SAMN31021822", - "secondary_sample_accession": "SRS15239724", - "study_accession": "PRJNA884373", - "secondary_study_accession": "SRP399678", - "submission_accession": "SRA1507236", - "run_alias": "GSM6601461_r1", - "experiment_alias": "GSM6601461_r1", - "sample_alias": "GSM6601461", - "study_alias": "GSE214215", - "library_layout": "SINGLE", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "GSM6601461", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "base_count": "677912850", - "read_count": "13558257", - "tax_id": "6239", - "scientific_name": "Caenorhabditis elegans", - "sample_title": "PM2.5-treated worms in day 5", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "sample_description": "PM2.5-treated worms in day 5", - "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", - "fastq_bytes": "529798447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_2": "", - "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", - "md5_2": "", - "single_end": true - }, - "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" ] ], - "mappings": [ - "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + [ + { + "id": "SRX9315476_SRR12848126", + "run_accession": "SRR12848126", + "experiment_accession": "SRX9315476", + "sample_accession": "SAMN16455283", + "secondary_sample_accession": "SRS7540262", + "study_accession": "PRJNA670070", + "secondary_study_accession": "SRP287769", + "submission_accession": "SRA1145417", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "experiment_alias": "F11-N1-05", + "sample_alias": "F11-N1-05", + "study_alias": "PRJNA670070", + "library_layout": "PAIRED", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "library_name": "F11-N1-05", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "base_count": "431758", + "read_count": "2954", + "tax_id": "10092", + "scientific_name": "Mus musculus domesticus", + "sample_title": "Longshanks_F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "sample_description": "F11-N1-05", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" + ] ], - "samplesheet": [ - "samplesheet.csv:md5,dbd0e9c1683c603c681184a13f5b7341" + [ + { + "id": "SRX17709227_SRR21711856", + "run_accession": "SRR21711856", + "experiment_accession": "SRX17709227", + "sample_accession": "SAMN31021823", + "secondary_sample_accession": "SRS15239723", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601460_r1", + "experiment_alias": "GSM6601460_r1", + "sample_alias": "GSM6601460", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601460", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "573417800", + "read_count": "11468356", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "sham-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "sham-treated worms in day 5", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_2": "", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "single_end": true + }, + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" ], - "versions": [ - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", - "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", - "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", - "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + [ + { + "id": "SRX17709228_SRR21711855", + "run_accession": "SRR21711855", + "experiment_accession": "SRX17709228", + "sample_accession": "SAMN31021822", + "secondary_sample_accession": "SRS15239724", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601461_r1", + "experiment_alias": "GSM6601461_r1", + "sample_alias": "GSM6601461", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601461", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "677912850", + "read_count": "13558257", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "PM2.5-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "PM2.5-treated worms in day 5", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_2": "", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "single_end": true + }, + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" ] - }, - "failed": false, - "stdout": [ - "WARN: There's no process matching config selector: CUSTOM_DUMPSOFTWAREVERSIONS", - "WARN: There's no process matching config selector: MULTIQC_MAPPINGS_CONFIG" ], - "errorMessage": null, - "trace": { - "tasksFailed": 0, - "tasksCount": 57, - "tasksSucceeded": 57 - }, - "name": "workflow", - "success": true + "mappings": [ + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + ], + "samplesheet": [ + "samplesheet.csv:md5,dbd0e9c1683c603c681184a13f5b7341" + ], + "versions": [ + "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + ] } ], - "timestamp": "2023-08-25T15:06:56+0000" + "timestamp": "2023-08-25T15:13:41+0000" } } \ No newline at end of file From e8258ba4d77dae0e963c63558099c781f36c2435 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 28 Aug 2023 11:17:16 +0200 Subject: [PATCH 410/852] order --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index ad72ea4a..0535bb57 100644 --- a/main.nf +++ b/main.nf @@ -72,8 +72,8 @@ if (params.input_type == 'synapse') { ======================================================================================== */ -include { CUSTOM_DUMPSOFTWAREVERSIONS } from './modules/nf-core/custom/dumpsoftwareversions' include { MULTIQC_MAPPINGS_CONFIG } from './modules/local/multiqc_mappings_config' +include { CUSTOM_DUMPSOFTWAREVERSIONS } from './modules/nf-core/custom/dumpsoftwareversions' /* ======================================================================================== From f8322343c09fd45f30c503002d6542f1459f5d67 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 28 Aug 2023 11:17:32 +0200 Subject: [PATCH 411/852] update test and snapshots --- workflows/sra/tests/main.nf.test | 7 +- workflows/sra/tests/main.nf.test.snap | 1043 ++++++++++++++----------- 2 files changed, 571 insertions(+), 479 deletions(-) diff --git a/workflows/sra/tests/main.nf.test b/workflows/sra/tests/main.nf.test index 2652eb80..4822da3d 100644 --- a/workflows/sra/tests/main.nf.test +++ b/workflows/sra/tests/main.nf.test @@ -23,7 +23,12 @@ nextflow_workflow { then { assertAll( { assert workflow.success }, - { assert snapshot(workflow.out).match() } +// { assert snapshot(workflow.out).match() } + { assert new File("$outputDir/custom").exists() }, + { assert new File("$outputDir/metadata").exists() }, + { assert new File("$outputDir/pipeline_info").exists() }, + { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, + { assert snapshot(path("$outputDir/samplesheet/").list()).match("samplesheet") } ) } } diff --git a/workflows/sra/tests/main.nf.test.snap b/workflows/sra/tests/main.nf.test.snap index 3eab5807..62d0d976 100644 --- a/workflows/sra/tests/main.nf.test.snap +++ b/workflows/sra/tests/main.nf.test.snap @@ -45,6 +45,48 @@ }, "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" ], + [ + { + "id": "SRX6725035_SRR9984183", + "run_accession": "SRR9984183", + "experiment_accession": "SRX6725035", + "sample_accession": "SAMN12581720", + "secondary_sample_accession": "SRS5277011", + "study_accession": "PRJNA560329", + "secondary_study_accession": "SRP218535", + "submission_accession": "SRA942061", + "run_alias": "Emb289P1_bin131.fastq", + "experiment_alias": "Emb289P1_bin131", + "sample_alias": "Emb289P1_bin131", + "study_alias": "PRJNA560329", + "library_layout": "SINGLE", + "library_selection": "RANDOM", + "library_source": "METAGENOMIC", + "library_strategy": "WGS", + "library_name": "Emb289P1_bin131", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "1996273", + "read_count": "58", + "tax_id": "2660712", + "scientific_name": "Defluviitaleaceae bacterium", + "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", + "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", + "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", + "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", + "fastq_md5": "0b512d2dc31685983456bd56fd836544", + "fastq_bytes": "605358", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_2": "", + "md5_1": "0b512d2dc31685983456bd56fd836544", + "md5_2": "", + "single_end": true + }, + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" + ], [ { "id": "ERX1234253_ERR1160846", @@ -89,47 +131,47 @@ ], [ { - "id": "DRX026011_DRR028935", - "run_accession": "DRR028935", - "experiment_accession": "DRX026011", - "sample_accession": "SAMD00024405", - "secondary_sample_accession": "DRS019431", - "study_accession": "PRJDB3420", - "secondary_study_accession": "DRP002616", - "submission_accession": "DRA002949", - "run_alias": "DRR028935", - "experiment_alias": "DRX026011", - "sample_alias": "SAMD00024405", - "study_alias": "DRP002616", + "id": "SRX9626017_SRR13191702", + "run_accession": "SRR13191702", + "experiment_accession": "SRX9626017", + "sample_accession": "SAMN16980141", + "secondary_sample_accession": "SRS7827211", + "study_accession": "PRJNA682076", + "secondary_study_accession": "SRP295653", + "submission_accession": "SRA1166126", + "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", + "experiment_alias": "S.170804.00784", + "sample_alias": "S.170804.00784_662", + "study_alias": "PRJNA682076", "library_layout": "PAIRED", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "day0_BbSQE-I", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "S.170804.00784", "instrument_model": "Illumina HiSeq 2500", "instrument_platform": "ILLUMINA", - "base_count": "194930", - "read_count": "965", - "tax_id": "1202541", - "scientific_name": "Botryococcus braunii Showa", - "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", - "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", - "sample_description": "Liquid culture", - "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", - "fastq_bytes": "60275;61610", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "md5_1": "cc01df82a9354bb6b3be93483b20c35a", - "md5_2": "941c9998d746416dad53c94c480ddf30", + "base_count": "45682", + "read_count": "91", + "tax_id": "408170", + "scientific_name": "human gut metagenome", + "sample_title": "Metagenome or environmental sample from human gut metagenome", + "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "sample_description": "Metagenome or environmental sample from human gut metagenome", + "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", + "fastq_bytes": "15420;16324", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98", "single_end": false }, [ - "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", - "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" ] ], [ @@ -179,105 +221,60 @@ ], [ { - "id": "SRX9504942_SRR13055519", - "run_accession": "SRR13055519", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r3", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2232728", - "read_count": "29378", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", - "fastq_bytes": "714907;721705", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", - "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", - "single_end": false - }, - [ - "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", - "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" - ] - ], - [ - { - "id": "SRX9504942_SRR13055517", - "run_accession": "SRR13055517", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r1", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", + "id": "DRX026011_DRR028935", + "run_accession": "DRR028935", + "experiment_accession": "DRX026011", + "sample_accession": "SAMD00024405", + "secondary_sample_accession": "DRS019431", + "study_accession": "PRJDB3420", + "secondary_study_accession": "DRP002616", + "submission_accession": "DRA002949", + "run_alias": "DRR028935", + "experiment_alias": "DRX026011", + "sample_alias": "SAMD00024405", + "study_alias": "DRP002616", "library_layout": "PAIRED", - "library_selection": "other", + "library_selection": "cDNA", "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", + "library_strategy": "RNA-Seq", + "library_name": "day0_BbSQE-I", + "instrument_model": "Illumina HiSeq 2500", "instrument_platform": "ILLUMINA", - "base_count": "2246028", - "read_count": "29553", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", - "fastq_bytes": "721167;723753", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", - "md5_2": "18dbe96e7f58b63406d9058938df1962", + "base_count": "194930", + "read_count": "965", + "tax_id": "1202541", + "scientific_name": "Botryococcus braunii Showa", + "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", + "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", + "sample_description": "Liquid culture", + "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", + "fastq_bytes": "60275;61610", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "md5_1": "cc01df82a9354bb6b3be93483b20c35a", + "md5_2": "941c9998d746416dad53c94c480ddf30", "single_end": false }, [ - "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", - "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" ] ], [ { - "id": "SRX9504942_SRR13055518", - "run_accession": "SRR13055518", + "id": "SRX9504942_SRR13055520", + "run_accession": "SRR13055520", "experiment_accession": "SRX9504942", "sample_accession": "SAMN16793052", "secondary_sample_accession": "SRS7713669", "study_accession": "PRJNA678298", "secondary_study_accession": "SRP292504", "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r2", + "run_alias": "GSM4907283_r4", "experiment_alias": "GSM4907283", "sample_alias": "GSM4907283", "study_alias": "GSE159787", @@ -288,41 +285,41 @@ "library_name": "", "instrument_model": "NextSeq 550", "instrument_platform": "ILLUMINA", - "base_count": "2235236", - "read_count": "29411", + "base_count": "2214488", + "read_count": "29138", "tax_id": "9606", "scientific_name": "Homo sapiens", "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", - "fastq_bytes": "717693;723429", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "md5_1": "5ec894d863fcefe394470a0925aefde4", - "md5_2": "aead170df9851773d5202b5760c76d76", + "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", + "fastq_bytes": "709867;716862", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "md5_1": "795d460abff6009c7f5ff7c14b773fbe", + "md5_2": "c3f34379356b28d6dac7212abc1a0a04", "single_end": false }, [ - "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", - "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" ] ], [ { - "id": "SRX9504942_SRR13055520", - "run_accession": "SRR13055520", + "id": "SRX9504942_SRR13055519", + "run_accession": "SRR13055519", "experiment_accession": "SRX9504942", "sample_accession": "SAMN16793052", "secondary_sample_accession": "SRS7713669", "study_accession": "PRJNA678298", "secondary_study_accession": "SRP292504", "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r4", + "run_alias": "GSM4907283_r3", "experiment_alias": "GSM4907283", "sample_alias": "GSM4907283", "study_alias": "GSE159787", @@ -333,117 +330,30 @@ "library_name": "", "instrument_model": "NextSeq 550", "instrument_platform": "ILLUMINA", - "base_count": "2214488", - "read_count": "29138", + "base_count": "2232728", + "read_count": "29378", "tax_id": "9606", "scientific_name": "Homo sapiens", "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", - "fastq_bytes": "709867;716862", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "md5_1": "795d460abff6009c7f5ff7c14b773fbe", - "md5_2": "c3f34379356b28d6dac7212abc1a0a04", - "single_end": false - }, - [ - "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", - "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" - ] - ], - [ - { - "id": "SRX9626017_SRR13191702", - "run_accession": "SRR13191702", - "experiment_accession": "SRX9626017", - "sample_accession": "SAMN16980141", - "secondary_sample_accession": "SRS7827211", - "study_accession": "PRJNA682076", - "secondary_study_accession": "SRP295653", - "submission_accession": "SRA1166126", - "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", - "experiment_alias": "S.170804.00784", - "sample_alias": "S.170804.00784_662", - "study_alias": "PRJNA682076", - "library_layout": "PAIRED", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "library_name": "S.170804.00784", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "45682", - "read_count": "91", - "tax_id": "408170", - "scientific_name": "human gut metagenome", - "sample_title": "Metagenome or environmental sample from human gut metagenome", - "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "sample_description": "Metagenome or environmental sample from human gut metagenome", - "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", - "fastq_bytes": "15420;16324", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "md5_1": "89c5be920021a035084d8aeb74f32df7", - "md5_2": "56271be38a80db78ef3bdfc5d9909b98", + "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", + "fastq_bytes": "714907;721705", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", + "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", "single_end": false }, [ - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" ] ], - [ - { - "id": "SRX6725035_SRR9984183", - "run_accession": "SRR9984183", - "experiment_accession": "SRX6725035", - "sample_accession": "SAMN12581720", - "secondary_sample_accession": "SRS5277011", - "study_accession": "PRJNA560329", - "secondary_study_accession": "SRP218535", - "submission_accession": "SRA942061", - "run_alias": "Emb289P1_bin131.fastq", - "experiment_alias": "Emb289P1_bin131", - "sample_alias": "Emb289P1_bin131", - "study_alias": "PRJNA560329", - "library_layout": "SINGLE", - "library_selection": "RANDOM", - "library_source": "METAGENOMIC", - "library_strategy": "WGS", - "library_name": "Emb289P1_bin131", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "1996273", - "read_count": "58", - "tax_id": "2660712", - "scientific_name": "Defluviitaleaceae bacterium", - "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", - "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", - "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", - "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", - "fastq_md5": "0b512d2dc31685983456bd56fd836544", - "fastq_bytes": "605358", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_2": "", - "md5_1": "0b512d2dc31685983456bd56fd836544", - "md5_2": "", - "single_end": true - }, - "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" - ], [ { "id": "SRX11047067_SRR14709033", @@ -531,6 +441,51 @@ "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" ] ], + [ + { + "id": "SRX9504942_SRR13055517", + "run_accession": "SRR13055517", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r1", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2246028", + "read_count": "29553", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", + "fastq_bytes": "721167;723753", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", + "md5_2": "18dbe96e7f58b63406d9058938df1962", + "single_end": false + }, + [ + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" + ] + ], [ { "id": "SRX9315476_SRR12848126", @@ -572,8 +527,53 @@ "single_end": false }, [ - "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", - "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" + ] + ], + [ + { + "id": "SRX9504942_SRR13055518", + "run_accession": "SRR13055518", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r2", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2235236", + "read_count": "29411", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", + "fastq_bytes": "717693;723429", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "md5_1": "5ec894d863fcefe394470a0925aefde4", + "md5_2": "aead170df9851773d5202b5760c76d76", + "single_end": false + }, + [ + "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" ] ], [ @@ -668,8 +668,8 @@ "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" ], "3": [ - "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" @@ -717,6 +717,48 @@ }, "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" ], + [ + { + "id": "SRX6725035_SRR9984183", + "run_accession": "SRR9984183", + "experiment_accession": "SRX6725035", + "sample_accession": "SAMN12581720", + "secondary_sample_accession": "SRS5277011", + "study_accession": "PRJNA560329", + "secondary_study_accession": "SRP218535", + "submission_accession": "SRA942061", + "run_alias": "Emb289P1_bin131.fastq", + "experiment_alias": "Emb289P1_bin131", + "sample_alias": "Emb289P1_bin131", + "study_alias": "PRJNA560329", + "library_layout": "SINGLE", + "library_selection": "RANDOM", + "library_source": "METAGENOMIC", + "library_strategy": "WGS", + "library_name": "Emb289P1_bin131", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "1996273", + "read_count": "58", + "tax_id": "2660712", + "scientific_name": "Defluviitaleaceae bacterium", + "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", + "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", + "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", + "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", + "fastq_md5": "0b512d2dc31685983456bd56fd836544", + "fastq_bytes": "605358", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_2": "", + "md5_1": "0b512d2dc31685983456bd56fd836544", + "md5_2": "", + "single_end": true + }, + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" + ], [ { "id": "ERX1234253_ERR1160846", @@ -761,47 +803,47 @@ ], [ { - "id": "DRX026011_DRR028935", - "run_accession": "DRR028935", - "experiment_accession": "DRX026011", - "sample_accession": "SAMD00024405", - "secondary_sample_accession": "DRS019431", - "study_accession": "PRJDB3420", - "secondary_study_accession": "DRP002616", - "submission_accession": "DRA002949", - "run_alias": "DRR028935", - "experiment_alias": "DRX026011", - "sample_alias": "SAMD00024405", - "study_alias": "DRP002616", + "id": "SRX9626017_SRR13191702", + "run_accession": "SRR13191702", + "experiment_accession": "SRX9626017", + "sample_accession": "SAMN16980141", + "secondary_sample_accession": "SRS7827211", + "study_accession": "PRJNA682076", + "secondary_study_accession": "SRP295653", + "submission_accession": "SRA1166126", + "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", + "experiment_alias": "S.170804.00784", + "sample_alias": "S.170804.00784_662", + "study_alias": "PRJNA682076", "library_layout": "PAIRED", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "day0_BbSQE-I", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "S.170804.00784", "instrument_model": "Illumina HiSeq 2500", "instrument_platform": "ILLUMINA", - "base_count": "194930", - "read_count": "965", - "tax_id": "1202541", - "scientific_name": "Botryococcus braunii Showa", - "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", - "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", - "sample_description": "Liquid culture", - "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", - "fastq_bytes": "60275;61610", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "md5_1": "cc01df82a9354bb6b3be93483b20c35a", - "md5_2": "941c9998d746416dad53c94c480ddf30", + "base_count": "45682", + "read_count": "91", + "tax_id": "408170", + "scientific_name": "human gut metagenome", + "sample_title": "Metagenome or environmental sample from human gut metagenome", + "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "sample_description": "Metagenome or environmental sample from human gut metagenome", + "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", + "fastq_bytes": "15420;16324", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98", "single_end": false }, [ - "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", - "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" ] ], [ @@ -851,137 +893,47 @@ ], [ { - "id": "SRX9504942_SRR13055519", - "run_accession": "SRR13055519", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r3", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2232728", - "read_count": "29378", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", - "fastq_bytes": "714907;721705", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", - "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", - "single_end": false - }, - [ - "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", - "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" - ] - ], - [ - { - "id": "SRX9504942_SRR13055517", - "run_accession": "SRR13055517", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r1", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2246028", - "read_count": "29553", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", - "fastq_bytes": "721167;723753", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", - "md5_2": "18dbe96e7f58b63406d9058938df1962", - "single_end": false - }, - [ - "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", - "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" - ] - ], - [ - { - "id": "SRX9504942_SRR13055518", - "run_accession": "SRR13055518", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r2", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", + "id": "DRX026011_DRR028935", + "run_accession": "DRR028935", + "experiment_accession": "DRX026011", + "sample_accession": "SAMD00024405", + "secondary_sample_accession": "DRS019431", + "study_accession": "PRJDB3420", + "secondary_study_accession": "DRP002616", + "submission_accession": "DRA002949", + "run_alias": "DRR028935", + "experiment_alias": "DRX026011", + "sample_alias": "SAMD00024405", + "study_alias": "DRP002616", "library_layout": "PAIRED", - "library_selection": "other", + "library_selection": "cDNA", "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", + "library_strategy": "RNA-Seq", + "library_name": "day0_BbSQE-I", + "instrument_model": "Illumina HiSeq 2500", "instrument_platform": "ILLUMINA", - "base_count": "2235236", - "read_count": "29411", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", - "fastq_bytes": "717693;723429", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "md5_1": "5ec894d863fcefe394470a0925aefde4", - "md5_2": "aead170df9851773d5202b5760c76d76", + "base_count": "194930", + "read_count": "965", + "tax_id": "1202541", + "scientific_name": "Botryococcus braunii Showa", + "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", + "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", + "sample_description": "Liquid culture", + "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", + "fastq_bytes": "60275;61610", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "md5_1": "cc01df82a9354bb6b3be93483b20c35a", + "md5_2": "941c9998d746416dad53c94c480ddf30", "single_end": false }, [ - "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", - "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" ] ], [ @@ -1031,91 +983,49 @@ ], [ { - "id": "SRX9626017_SRR13191702", - "run_accession": "SRR13191702", - "experiment_accession": "SRX9626017", - "sample_accession": "SAMN16980141", - "secondary_sample_accession": "SRS7827211", - "study_accession": "PRJNA682076", - "secondary_study_accession": "SRP295653", - "submission_accession": "SRA1166126", - "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", - "experiment_alias": "S.170804.00784", - "sample_alias": "S.170804.00784_662", - "study_alias": "PRJNA682076", + "id": "SRX9504942_SRR13055519", + "run_accession": "SRR13055519", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r3", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", "library_layout": "PAIRED", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "library_name": "S.170804.00784", - "instrument_model": "Illumina HiSeq 2500", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", "instrument_platform": "ILLUMINA", - "base_count": "45682", - "read_count": "91", - "tax_id": "408170", - "scientific_name": "human gut metagenome", - "sample_title": "Metagenome or environmental sample from human gut metagenome", - "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "sample_description": "Metagenome or environmental sample from human gut metagenome", - "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", - "fastq_bytes": "15420;16324", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "md5_1": "89c5be920021a035084d8aeb74f32df7", - "md5_2": "56271be38a80db78ef3bdfc5d9909b98", + "base_count": "2232728", + "read_count": "29378", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", + "fastq_bytes": "714907;721705", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", + "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", "single_end": false }, [ - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" ] ], - [ - { - "id": "SRX6725035_SRR9984183", - "run_accession": "SRR9984183", - "experiment_accession": "SRX6725035", - "sample_accession": "SAMN12581720", - "secondary_sample_accession": "SRS5277011", - "study_accession": "PRJNA560329", - "secondary_study_accession": "SRP218535", - "submission_accession": "SRA942061", - "run_alias": "Emb289P1_bin131.fastq", - "experiment_alias": "Emb289P1_bin131", - "sample_alias": "Emb289P1_bin131", - "study_alias": "PRJNA560329", - "library_layout": "SINGLE", - "library_selection": "RANDOM", - "library_source": "METAGENOMIC", - "library_strategy": "WGS", - "library_name": "Emb289P1_bin131", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "1996273", - "read_count": "58", - "tax_id": "2660712", - "scientific_name": "Defluviitaleaceae bacterium", - "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", - "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", - "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", - "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", - "fastq_md5": "0b512d2dc31685983456bd56fd836544", - "fastq_bytes": "605358", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_2": "", - "md5_1": "0b512d2dc31685983456bd56fd836544", - "md5_2": "", - "single_end": true - }, - "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" - ], [ { "id": "SRX11047067_SRR14709033", @@ -1203,6 +1113,51 @@ "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" ] ], + [ + { + "id": "SRX9504942_SRR13055517", + "run_accession": "SRR13055517", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r1", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2246028", + "read_count": "29553", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", + "fastq_bytes": "721167;723753", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", + "md5_2": "18dbe96e7f58b63406d9058938df1962", + "single_end": false + }, + [ + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" + ] + ], [ { "id": "SRX9315476_SRR12848126", @@ -1248,6 +1203,51 @@ "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" ] ], + [ + { + "id": "SRX9504942_SRR13055518", + "run_accession": "SRR13055518", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r2", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2235236", + "read_count": "29411", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", + "fastq_bytes": "717693;723429", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "md5_1": "5ec894d863fcefe394470a0925aefde4", + "md5_2": "aead170df9851773d5202b5760c76d76", + "single_end": false + }, + [ + "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" + ] + ], [ { "id": "SRX17709227_SRR21711856", @@ -1340,14 +1340,101 @@ "samplesheet.csv:md5,dbd0e9c1683c603c681184a13f5b7341" ], "versions": [ - "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" ] } ], - "timestamp": "2023-08-25T15:13:41+0000" + "timestamp": "2023-08-28T08:57:15+0000" + }, + "metadata": { + "content": [ + "DRR026872.runinfo_ftp.tsv:md5,73606f6a05c45b077809da43ca638b5f", + "DRR028935.runinfo_ftp.tsv:md5,f79eefcea5db346f76f76f87df7f8dd2", + "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", + "ERR1160846.runinfo_ftp.tsv:md5,1b2dc1a64117de20b2164724836da345", + "GSE214215.runinfo_ftp.tsv:md5,23a580c89ee7bf681ca3ffa26aa1837f", + "GSM4907283.runinfo_ftp.tsv:md5,090f3594af6ef6f5af4d9e4aaf030d18", + "SRR12848126.runinfo_ftp.tsv:md5,5d1e6bfd3d4077d1e66378c58e44975d", + "SRR13191702.runinfo_ftp.tsv:md5,409e262bb41bb6103315126db4d0dd1d", + "SRR14593545.runinfo_ftp.tsv:md5,62015706ac156693ba3d86ed050cab54", + "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", + "SRR9984183.runinfo_ftp.tsv:md5,53ab34ff3612b0e2c7d60476822787be" + ], + "timestamp": "2023-08-28T08:57:15+0000" + }, + "samplesheet": { + "content": [ + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565", + "samplesheet.csv:md5,dbd0e9c1683c603c681184a13f5b7341" + ], + "timestamp": "2023-08-28T08:57:15+0000" + }, + "custom": { + "content": [ + "user-settings.mkfg:md5,a182ee157fbd89040a00b9658f53848d" + ], + "timestamp": "2023-08-28T08:57:15+0000" + }, + "fastq": { + "content": [ + "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791", + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30", + "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9", + "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6", + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2", + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda", + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64", + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83", + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544", + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79", + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962", + "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76", + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88", + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04", + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98", + [ + "DRX024467_DRR026872.fastq.gz.md5:md5,dacaeba3498fb8f405411a22cdb4b40d", + "DRX026011_DRR028935_1.fastq.gz.md5:md5,a47018c5972ba4c11539d0d6bc25eda9", + "DRX026011_DRR028935_2.fastq.gz.md5:md5,f477bbef548fbed665734ebf084eea2f", + "ERX1188904_ERR1109373_1.fastq.gz.md5:md5,50c1c3108631dc32a3151b67e0260d86", + "ERX1188904_ERR1109373_2.fastq.gz.md5:md5,1f22463d410e91a288c83d43654b2499", + "ERX1234253_ERR1160846.fastq.gz.md5:md5,513a8437ad331fc512b088b3750aa1ff", + "SRX17709227_SRR21711856.fastq.gz.md5:md5,13a38fbef27c3e15867d80887145ae75", + "SRX17709228_SRR21711855.fastq.gz.md5:md5,1e871ddd9e92e1866e0c64d36eb5ec85", + "SRX6725035_SRR9984183.fastq.gz.md5:md5,84f59dbb76c9b5eab7e14d90ced352c4", + "SRX9504942_SRR13055517_1.fastq.gz.md5:md5,a03f7f374dc401047b6f6ccaec3885cc", + "SRX9504942_SRR13055517_2.fastq.gz.md5:md5,facaf207753e977327e7b7df7bb8ace0", + "SRX9504942_SRR13055518_1.fastq.gz.md5:md5,5cf412cd62aadaa4838d9eabb5b44368", + "SRX9504942_SRR13055518_2.fastq.gz.md5:md5,93292b826afc72b23be93df26dd710c8", + "SRX9504942_SRR13055519_1.fastq.gz.md5:md5,f6ad6e2610397147a0a55c651de3992f", + "SRX9504942_SRR13055519_2.fastq.gz.md5:md5,2fe7dd4bcc1e7e61c6f54ef50cf961f3", + "SRX9504942_SRR13055520_1.fastq.gz.md5:md5,ab195b37746a3424a1099d9f8cc58de8", + "SRX9504942_SRR13055520_2.fastq.gz.md5:md5,10c448e23f1f7e7af61ec1204f8fc882", + "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", + "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" + ] + ], + "timestamp": "2023-08-28T08:57:15+0000" + }, + "pipeline_info": { + "content": [ + "execution_report_2023-08-28_10-54-32.html:md5,710a38308b41b4bd86b6d2d8fd4a72b7", + "execution_timeline_2023-08-28_10-54-32.html:md5,1583b3c97bc7c97a8550c3d0ce6302c8", + "pipeline_dag_2023-08-28_10-54-32.html:md5,63f58c7a48a1b71d3ee7809cb6a92740" + ], + "timestamp": "2023-08-28T08:57:15+0000" } -} \ No newline at end of file +} From 80892b7ca38100a00b31b5abb2c079694e2729a0 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 28 Aug 2023 13:06:34 +0200 Subject: [PATCH 412/852] update test --- workflows/sra/tests/main.nf.test | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workflows/sra/tests/main.nf.test b/workflows/sra/tests/main.nf.test index 4822da3d..2a1e82a1 100644 --- a/workflows/sra/tests/main.nf.test +++ b/workflows/sra/tests/main.nf.test @@ -27,8 +27,8 @@ nextflow_workflow { { assert new File("$outputDir/custom").exists() }, { assert new File("$outputDir/metadata").exists() }, { assert new File("$outputDir/pipeline_info").exists() }, - { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") }, - { assert snapshot(path("$outputDir/samplesheet/").list()).match("samplesheet") } + { assert new File("$outputDir/samplesheet").exists() }, + { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") } ) } } From 9a70ce9bca6179b6d43f9bb2bb6326de8aa48343 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 28 Aug 2023 14:27:56 +0200 Subject: [PATCH 413/852] update tests and snapshot --- .../sra_custom_ena_metadata_fields.nf.test | 19 +++++++++++++++---- ...ra_custom_ena_metadata_fields.nf.test.snap | 12 ++++++------ .../tests/sra_force_sratools_download.nf.test | 19 +++++++++++++++---- .../sra_nf_core_pipeline_atacseq.nf.test | 19 +++++++++++++++---- .../sra_nf_core_pipeline_atacseq.nf.test.snap | 12 ++++++------ .../tests/sra_nf_core_pipeline_rnaseq.nf.test | 19 +++++++++++++++---- .../sra_nf_core_pipeline_rnaseq.nf.test.snap | 12 ++++++------ .../sra_nf_core_pipeline_taxprofiler.nf.test | 19 +++++++++++++++---- ..._nf_core_pipeline_taxprofiler.nf.test.snap | 12 ++++++------ .../sra_nf_core_pipeline_viralrecon.nf.test | 19 +++++++++++++++---- ...a_nf_core_pipeline_viralrecon.nf.test.snap | 12 ++++++------ 11 files changed, 120 insertions(+), 54 deletions(-) diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test index 6e27c4a9..f1f55f02 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test @@ -1,7 +1,8 @@ -nextflow_pipeline { +nextflow_workflow { - name "Test workflow: sra.nf" - script "main.nf" + name "Test workflow: sra/main.nf" + script "workflows/sra/main.nf" + workflow "SRA" tag "workflows" tag "workflows_sra" tag "sra_custom_ena_metadata_fields" @@ -9,6 +10,11 @@ nextflow_pipeline { test("Parameters: --nf_core_pipeline rnaseq --ena_metadata_fields ... --sample_mapping_fields ...") { when { + workflow { + """ + input[0] = Channel.from('DRR026872','DRR028935','ERR1109373','ERR1160846','GSE214215','GSM4907283','SRR12848126','SRR13191702','SRR14593545','SRR14709033','SRR9984183') + """ + } params { outdir = "$outputDir" nf_core_pipeline = "rnaseq" @@ -20,7 +26,12 @@ nextflow_pipeline { then { assertAll( { assert workflow.success }, - { assert snapshot(process.out).match() } +// { assert snapshot(workflow.out).match() } + { assert new File("$outputDir/custom").exists() }, + { assert new File("$outputDir/metadata").exists() }, + { assert new File("$outputDir/pipeline_info").exists() }, + { assert new File("$outputDir/samplesheet").exists() }, + { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") } ) } } diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap index 55c39d4f..ddd8e845 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap @@ -12,20 +12,20 @@ "SRR14709033.runinfo_ftp.tsv:md5,2385a9cc5e320e78b02743c45d1338f1", "SRR9984183.runinfo_ftp.tsv:md5,f1ed9fc572d2e0d145be7f547f6d1236" ], - "timestamp": "2023-08-17T12:11:42+0000" + "timestamp": "2023-08-28T09:29:59+0000" }, "samplesheet": { "content": [ "id_mappings.csv:md5,8473773df806859c6af7acafcfe5aa6f", - "multiqc_config.yml:md5,6f6189ee58855de81eaf82ad86e21040" + "samplesheet.csv:md5,7bca96e409bd9eb6790e0d6737af686c" ], - "timestamp": "2023-08-17T12:11:42+0000" + "timestamp": "2023-08-28T09:29:59+0000" }, "software_versions": { "content": [ "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" ], - "timestamp": "2023-08-17T12:11:42+0000" + "timestamp": "2023-08-28T09:29:59+0000" }, "Parameters: '--nf_core_pipeline rnaseq --ena_metadata_fields ... --sample_mapping_fields ...'": { "content": [ @@ -33,7 +33,7 @@ } ], - "timestamp": "2023-08-17T12:11:42+0000" + "timestamp": "2023-08-28T09:29:59+0000" }, "fastq": { "content": [ @@ -83,6 +83,6 @@ "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" ] ], - "timestamp": "2023-08-17T12:11:42+0000" + "timestamp": "2023-08-28T09:29:59+0000" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test b/workflows/sra/tests/sra_force_sratools_download.nf.test index 1b501975..051e4aa5 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test @@ -1,7 +1,8 @@ -nextflow_pipeline { +nextflow_workflow { - name "Test workflow: sra.nf" - script "main.nf" + name "Test workflow: sra/main.nf" + script "workflows/sra/main.nf" + workflow "SRA" tag "workflows" tag "workflows_sra" tag "sra_force_sratools_download" @@ -9,6 +10,11 @@ nextflow_pipeline { test("Parameters: --force_sratools_download") { when { + workflow { + """ + input[0] = Channel.from('DRR026872','DRR028935','ERR1109373','ERR1160846','GSE214215','GSM4907283','SRR12848126','SRR13191702','SRR14593545','SRR14709033','SRR9984183') + """ + } params { outdir = "$outputDir" force_sratools_download = true @@ -18,7 +24,12 @@ nextflow_pipeline { then { assertAll( { assert workflow.success }, - { assert snapshot(process.out).match() } +// { assert snapshot(workflow.out).match() } + { assert new File("$outputDir/custom").exists() }, + { assert new File("$outputDir/metadata").exists() }, + { assert new File("$outputDir/pipeline_info").exists() }, + { assert new File("$outputDir/samplesheet").exists() }, + { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") } ) } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test index bda1d724..6925b971 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test @@ -1,7 +1,8 @@ -nextflow_pipeline { +nextflow_workflow { - name "Test workflow: sra.nf" - script "main.nf" + name "Test workflow: sra/main.nf" + script "workflows/sra/main.nf" + workflow "SRA" tag "workflows" tag "workflows_sra" tag "sra_nf_core_pipeline_atacseq" @@ -9,6 +10,11 @@ nextflow_pipeline { test("Parameters: --nf_core_pipeline atacseq") { when { + workflow { + """ + input[0] = Channel.from('DRR026872','DRR028935','ERR1109373','ERR1160846','GSE214215','GSM4907283','SRR12848126','SRR13191702','SRR14593545','SRR14709033','SRR9984183') + """ + } params { outdir = "$outputDir" nf_core_pipeline = "atacseq" @@ -18,7 +24,12 @@ nextflow_pipeline { then { assertAll( { assert workflow.success }, - { assert snapshot(process.out).match() } +// { assert snapshot(workflow.out).match() } + { assert new File("$outputDir/custom").exists() }, + { assert new File("$outputDir/metadata").exists() }, + { assert new File("$outputDir/pipeline_info").exists() }, + { assert new File("$outputDir/samplesheet").exists() }, + { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") } ) } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap index c99f258e..0ccec99b 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap @@ -12,20 +12,20 @@ "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", "SRR9984183.runinfo_ftp.tsv:md5,53ab34ff3612b0e2c7d60476822787be" ], - "timestamp": "2023-08-17T12:21:36+0000" + "timestamp": "2023-08-28T10:05:53+0000" }, "samplesheet": { "content": [ "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565", - "multiqc_config.yml:md5,a97047e12b0ea3f46d285629e4053548" + "samplesheet.csv:md5,252449b9f66687af076bb5a9dfea4551" ], - "timestamp": "2023-08-17T12:21:36+0000" + "timestamp": "2023-08-28T10:05:53+0000" }, "software_versions": { "content": [ "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" ], - "timestamp": "2023-08-17T12:21:36+0000" + "timestamp": "2023-08-28T10:05:53+0000" }, "Parameters: '--nf_core_pipeline atacseq'": { "content": [ @@ -33,7 +33,7 @@ } ], - "timestamp": "2023-08-17T12:21:36+0000" + "timestamp": "2023-08-28T10:05:53+0000" }, "fastq": { "content": [ @@ -83,6 +83,6 @@ "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" ] ], - "timestamp": "2023-08-17T12:21:36+0000" + "timestamp": "2023-08-28T10:05:57+0000" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test index 438b7f55..a84b7c41 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test @@ -1,7 +1,8 @@ -nextflow_pipeline { +nextflow_workflow { - name "Test workflow: sra.nf" - script "main.nf" + name "Test workflow: sra/main.nf" + script "workflows/sra/main.nf" + workflow "SRA" tag "workflows" tag "workflows_sra" tag "sra_nf_core_pipeline_rnaseq" @@ -9,6 +10,11 @@ nextflow_pipeline { test("Parameters: --nf_core_pipeline rnaseq") { when { + workflow { + """ + input[0] = Channel.from('DRR026872','DRR028935','ERR1109373','ERR1160846','GSE214215','GSM4907283','SRR12848126','SRR13191702','SRR14593545','SRR14709033','SRR9984183') + """ + } params { outdir = "$outputDir" nf_core_pipeline = "rnaseq" @@ -18,7 +24,12 @@ nextflow_pipeline { then { assertAll( { assert workflow.success }, - { assert snapshot(process.out).match() } +// { assert snapshot(workflow.out).match() } + { assert new File("$outputDir/custom").exists() }, + { assert new File("$outputDir/metadata").exists() }, + { assert new File("$outputDir/pipeline_info").exists() }, + { assert new File("$outputDir/samplesheet").exists() }, + { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") } ) } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap index 1da0381a..af68569e 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap @@ -12,20 +12,20 @@ "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", "SRR9984183.runinfo_ftp.tsv:md5,53ab34ff3612b0e2c7d60476822787be" ], - "timestamp": "2023-08-17T12:19:51+0000" + "timestamp": "2023-08-28T09:32:33+0000" }, "samplesheet": { "content": [ "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565", - "multiqc_config.yml:md5,a97047e12b0ea3f46d285629e4053548" + "samplesheet.csv:md5,f0b7e9436c6feb1a31c49c2c8ab761a2" ], - "timestamp": "2023-08-17T12:19:51+0000" + "timestamp": "2023-08-28T09:32:33+0000" }, "software_versions": { "content": [ "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" ], - "timestamp": "2023-08-17T12:19:51+0000" + "timestamp": "2023-08-28T09:32:33+0000" }, "Parameters: '--nf_core_pipeline rnaseq'": { "content": [ @@ -33,7 +33,7 @@ } ], - "timestamp": "2023-08-17T12:19:51+0000" + "timestamp": "2023-08-28T09:32:33+0000" }, "fastq": { "content": [ @@ -83,6 +83,6 @@ "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" ] ], - "timestamp": "2023-08-17T12:19:51+0000" + "timestamp": "2023-08-28T09:32:33+0000" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test index 301938c4..c2022ce2 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test @@ -1,7 +1,8 @@ -nextflow_pipeline { +nextflow_workflow { - name "Test workflow: sra.nf" - script "main.nf" + name "Test workflow: sra/main.nf" + script "workflows/sra/main.nf" + workflow "SRA" tag "workflows" tag "workflows_sra" tag "sra_nf_core_pipeline_taxprofiler" @@ -9,6 +10,11 @@ nextflow_pipeline { test("Parameters: --nf_core_pipeline taxprofiler") { when { + workflow { + """ + input[0] = Channel.from('DRR026872','DRR028935','ERR1109373','ERR1160846','GSE214215','GSM4907283','SRR12848126','SRR13191702','SRR14593545','SRR14709033','SRR9984183') + """ + } params { outdir = "$outputDir" nf_core_pipeline = "taxprofiler" @@ -18,7 +24,12 @@ nextflow_pipeline { then { assertAll( { assert workflow.success }, - { assert snapshot(process.out).match() } +// { assert snapshot(workflow.out).match() } + { assert new File("$outputDir/custom").exists() }, + { assert new File("$outputDir/metadata").exists() }, + { assert new File("$outputDir/pipeline_info").exists() }, + { assert new File("$outputDir/samplesheet").exists() }, + { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") } ) } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap index 85f3957b..da686d45 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap @@ -12,20 +12,20 @@ "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", "SRR9984183.runinfo_ftp.tsv:md5,53ab34ff3612b0e2c7d60476822787be" ], - "timestamp": "2023-08-17T12:24:34+0000" + "timestamp": "2023-08-28T09:27:41+0000" }, "samplesheet": { "content": [ "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565", - "multiqc_config.yml:md5,a97047e12b0ea3f46d285629e4053548" + "samplesheet.csv:md5,484efbb550b50f5ac63e4864282edea7" ], - "timestamp": "2023-08-17T12:24:34+0000" + "timestamp": "2023-08-28T09:27:41+0000" }, "software_versions": { "content": [ "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" ], - "timestamp": "2023-08-17T12:24:34+0000" + "timestamp": "2023-08-28T09:27:41+0000" }, "Parameters: --nf_core_pipeline taxprofiler": { "content": [ @@ -33,7 +33,7 @@ } ], - "timestamp": "2023-08-17T12:24:34+0000" + "timestamp": "2023-08-28T09:27:41+0000" }, "fastq": { "content": [ @@ -83,6 +83,6 @@ "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" ] ], - "timestamp": "2023-08-17T12:24:34+0000" + "timestamp": "2023-08-28T09:27:41+0000" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test index 892a7c3a..e664f0fd 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test @@ -1,7 +1,8 @@ -nextflow_pipeline { +nextflow_workflow { - name "Test workflow: sra.nf" - script "main.nf" + name "Test workflow: sra/main.nf" + script "workflows/sra/main.nf" + workflow "SRA" tag "workflows" tag "workflows_sra" tag "sra_nf_core_pipeline_viralrecon" @@ -9,6 +10,11 @@ nextflow_pipeline { test("Parameters: --nf_core_pipeline viralrecon") { when { + workflow { + """ + input[0] = Channel.from('DRR026872','DRR028935','ERR1109373','ERR1160846','GSE214215','GSM4907283','SRR12848126','SRR13191702','SRR14593545','SRR14709033','SRR9984183') + """ + } params { outdir = "$outputDir" nf_core_pipeline = "viralrecon" @@ -18,7 +24,12 @@ nextflow_pipeline { then { assertAll( { assert workflow.success }, - { assert snapshot(process.out).match() } +// { assert snapshot(workflow.out).match() } + { assert new File("$outputDir/custom").exists() }, + { assert new File("$outputDir/metadata").exists() }, + { assert new File("$outputDir/pipeline_info").exists() }, + { assert new File("$outputDir/samplesheet").exists() }, + { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") } ) } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap index 13c59b5d..a30d8377 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap @@ -12,14 +12,14 @@ "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", "SRR9984183.runinfo_ftp.tsv:md5,53ab34ff3612b0e2c7d60476822787be" ], - "timestamp": "2023-08-17T12:26:57+0000" + "timestamp": "2023-08-28T10:03:01+0000" }, "samplesheet": { "content": [ "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565", - "multiqc_config.yml:md5,a97047e12b0ea3f46d285629e4053548" + "samplesheet.csv:md5,3e32e2cfa3c8b23c9cd32d91b885c0de" ], - "timestamp": "2023-08-17T12:26:57+0000" + "timestamp": "2023-08-28T10:03:01+0000" }, "Parameters: --nf_core_pipeline viralrecon": { "content": [ @@ -27,13 +27,13 @@ } ], - "timestamp": "2023-08-17T12:26:57+0000" + "timestamp": "2023-08-28T10:03:01+0000" }, "software_versions": { "content": [ "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" ], - "timestamp": "2023-08-17T12:26:57+0000" + "timestamp": "2023-08-28T10:03:01+0000" }, "fastq": { "content": [ @@ -83,6 +83,6 @@ "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" ] ], - "timestamp": "2023-08-17T12:26:57+0000" + "timestamp": "2023-08-28T10:03:06+0000" } } \ No newline at end of file From f1c9f4792a212f5d323e4dfd2897ac14ef18da71 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 28 Aug 2023 14:36:24 +0200 Subject: [PATCH 414/852] update snapshot --- .../sra_force_sratools_download.nf.test.snap | 38 +------------------ 1 file changed, 1 insertion(+), 37 deletions(-) diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test.snap b/workflows/sra/tests/sra_force_sratools_download.nf.test.snap index d5d694da..331943c5 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test.snap +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test.snap @@ -1,40 +1,4 @@ { - "Parameters: '--force_sratools_download'": { - "content": [ - { - - } - ], - "timestamp": "2023-08-17T12:15:55+0000" - }, - "metadata": { - "content": [ - "DRR026872.runinfo_ftp.tsv:md5,73606f6a05c45b077809da43ca638b5f", - "DRR028935.runinfo_ftp.tsv:md5,f79eefcea5db346f76f76f87df7f8dd2", - "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", - "ERR1160846.runinfo_ftp.tsv:md5,1b2dc1a64117de20b2164724836da345", - "GSE214215.runinfo_ftp.tsv:md5,23a580c89ee7bf681ca3ffa26aa1837f", - "SRR12848126.runinfo_ftp.tsv:md5,5d1e6bfd3d4077d1e66378c58e44975d", - "SRR13191702.runinfo_ftp.tsv:md5,409e262bb41bb6103315126db4d0dd1d", - "SRR14593545.runinfo_ftp.tsv:md5,62015706ac156693ba3d86ed050cab54", - "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", - "SRR9984183.runinfo_ftp.tsv:md5,53ab34ff3612b0e2c7d60476822787be" - ], - "timestamp": "2023-08-17T12:15:55+0000" - }, - "samplesheet": { - "content": [ - "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565", - "multiqc_config.yml:md5,a97047e12b0ea3f46d285629e4053548" - ], - "timestamp": "2023-08-17T12:15:55+0000" - }, - "software_versions": { - "content": [ - "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" - ], - "timestamp": "2023-08-17T12:15:55+0000" - }, "fastq": { "content": [ "DRX024467_DRR026872.fastq.gz:md5,bd3f113c3b06cf4499fa0e00c634ec85", @@ -62,6 +26,6 @@ "SRX9626017_SRR13191702_1.fastq.gz:md5,627a90afcd9f3cfc7f5f91074f9a2df7", "SRX9626017_SRR13191702_2.fastq.gz:md5,3d9b2c68a8ad1547105b17de81b2d9af" ], - "timestamp": "2023-08-17T12:15:55+0000" + "timestamp": "2023-08-28T12:35:42+0000" } } \ No newline at end of file From eedee488a9dfaaa1fe43dd60f8647f2152c239ae Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 28 Aug 2023 14:48:35 +0200 Subject: [PATCH 415/852] update test --- .../sra/tests/sra_skip_fastq_download.nf.test | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test b/workflows/sra/tests/sra_skip_fastq_download.nf.test index 7d218cf7..7180fd6d 100644 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test @@ -1,7 +1,8 @@ -nextflow_pipeline { +nextflow_workflow { - name "Test workflow: sra.nf" - script "main.nf" + name "Test workflow: sra/main.nf" + script "workflows/sra/main.nf" + workflow "SRA" tag "workflows" tag "workflows_sra" tag "sra_skip_fastq_download" @@ -9,6 +10,11 @@ nextflow_pipeline { test("Parameters: --skip_fastq_download") { when { + workflow { + """ + input[0] = Channel.from('DRR026872','DRR028935','ERR1109373','ERR1160846','GSE214215','GSM4907283','SRR12848126','SRR13191702','SRR14593545','SRR14709033','SRR9984183') + """ + } params { outdir = "$outputDir" skip_fastq_download = true @@ -18,7 +24,10 @@ nextflow_pipeline { then { assertAll( { assert workflow.success }, - { assert snapshot(process.out).match() } +// { assert snapshot(workflow.out).match() } + { assert new File("$outputDir/metadata").exists() }, + { assert new File("$outputDir/pipeline_info").exists() }, + { assert new File("$outputDir/samplesheet").exists() } ) } } From db29566dfc71ff5b24d390bb54dfc1fbdce65baf Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 28 Aug 2023 14:51:45 +0200 Subject: [PATCH 416/852] need to update snapshot --- .../sra_skip_fastq_download.nf.test.snap | 46 ------------------- 1 file changed, 46 deletions(-) delete mode 100644 workflows/sra/tests/sra_skip_fastq_download.nf.test.snap diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap b/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap deleted file mode 100644 index d004d5d2..00000000 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap +++ /dev/null @@ -1,46 +0,0 @@ -{ - "Parameters: '--skip_fastq_download'": { - "content": [ - { - - } - ], - "timestamp": "2023-08-17T12:25:19+0000" - }, - "metadata": { - "content": [ - "DRR026872.runinfo_ftp.tsv:md5,73606f6a05c45b077809da43ca638b5f", - "DRR028935.runinfo_ftp.tsv:md5,f79eefcea5db346f76f76f87df7f8dd2", - "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", - "ERR1160846.runinfo_ftp.tsv:md5,1b2dc1a64117de20b2164724836da345", - "GSE214215.runinfo_ftp.tsv:md5,23a580c89ee7bf681ca3ffa26aa1837f", - "SRR12848126.runinfo_ftp.tsv:md5,5d1e6bfd3d4077d1e66378c58e44975d", - "SRR13191702.runinfo_ftp.tsv:md5,409e262bb41bb6103315126db4d0dd1d", - "SRR14593545.runinfo_ftp.tsv:md5,62015706ac156693ba3d86ed050cab54", - "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", - "SRR9984183.runinfo_ftp.tsv:md5,53ab34ff3612b0e2c7d60476822787be" - ], - "timestamp": "2023-08-17T12:25:19+0000" - }, - "samplesheet": { - "content": [ - "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565", - "multiqc_config.yml:md5,a97047e12b0ea3f46d285629e4053548" - ], - "timestamp": "2023-08-17T12:25:19+0000" - }, - "software_versions": { - "content": [ - "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" - ], - "timestamp": "2023-08-17T12:25:19+0000" - }, - "Parameters: --skip_fastq_download": { - "content": [ - { - - } - ], - "timestamp": "2023-08-17T12:25:19+0000" - } -} \ No newline at end of file From 57d7ba319a639bc33756df1ff2e8c229cf5b819a Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 28 Aug 2023 15:37:19 +0200 Subject: [PATCH 417/852] add nextflow.log to test output when failures --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2a30309b..d652f33e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -81,6 +81,7 @@ jobs: run: | sudo apt install bat > /dev/null batcat --decorations=always --color=always ${{ github.workspace }}/.nf-test/tests/*/output/pipeline_info/software_versions.yml + batcat --decorations=always --color=always ${{ github.workspace }}/.nf-test/tests/*/meta/nextflow.log - name: Publish Test Report uses: mikepenz/action-junit-report@v3 From 57bf16705bf23fe2c7695774e2376f2c709a4d35 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 28 Aug 2023 15:43:35 +0200 Subject: [PATCH 418/852] add nextflow.log to test output when failures --- .github/workflows/ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d652f33e..aa4b4cf9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -80,7 +80,6 @@ jobs: if: failure() run: | sudo apt install bat > /dev/null - batcat --decorations=always --color=always ${{ github.workspace }}/.nf-test/tests/*/output/pipeline_info/software_versions.yml batcat --decorations=always --color=always ${{ github.workspace }}/.nf-test/tests/*/meta/nextflow.log - name: Publish Test Report From 43223db40d2c1e26d14763bcd60ce5509adea749 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 11 Sep 2023 15:49:53 +0200 Subject: [PATCH 419/852] test rc --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index aa4b4cf9..5c5df959 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,7 +16,7 @@ on: env: NXF_ANSI_LOG: false - NFTEST_VER: "0.7.3" + NFTEST_VER: "0.8.0-rc1" concurrency: group: "${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}" From b40fe58f06b8f4909754eedddd5864bc614822b7 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 11 Sep 2023 15:50:42 +0200 Subject: [PATCH 420/852] re-able autoSort --- nf-test.config | 3 --- 1 file changed, 3 deletions(-) diff --git a/nf-test.config b/nf-test.config index 217a5138..0799cb40 100644 --- a/nf-test.config +++ b/nf-test.config @@ -13,7 +13,4 @@ config { // run all test with the defined docker profile from the main nextflow.config profile "" - - // Disable autosort Channels - autoSort false } From d9168a159281225cbb01336c355b0ede6a752486 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 11 Sep 2023 15:51:21 +0200 Subject: [PATCH 421/852] add .nf-test.log to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 935326a7..b1b5890a 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ testing* *.pyc .nf-test/ nf-test +.nf-test.log From 359462f90f28ea91885685774c9c9d3d0d2870f6 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 11 Sep 2023 16:49:57 +0200 Subject: [PATCH 422/852] simplify tests --- workflows/sra/tests/main.nf.test | 7 +------ workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test | 7 +------ workflows/sra/tests/sra_force_sratools_download.nf.test | 7 +------ workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test | 7 +------ workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test | 7 +------ .../sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test | 7 +------ .../sra/tests/sra_nf_core_pipeline_viralrecon.nf.test | 7 +------ workflows/sra/tests/sra_skip_fastq_download.nf.test | 5 +---- 8 files changed, 8 insertions(+), 46 deletions(-) diff --git a/workflows/sra/tests/main.nf.test b/workflows/sra/tests/main.nf.test index 2a1e82a1..2652eb80 100644 --- a/workflows/sra/tests/main.nf.test +++ b/workflows/sra/tests/main.nf.test @@ -23,12 +23,7 @@ nextflow_workflow { then { assertAll( { assert workflow.success }, -// { assert snapshot(workflow.out).match() } - { assert new File("$outputDir/custom").exists() }, - { assert new File("$outputDir/metadata").exists() }, - { assert new File("$outputDir/pipeline_info").exists() }, - { assert new File("$outputDir/samplesheet").exists() }, - { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") } + { assert snapshot(workflow.out).match() } ) } } diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test index f1f55f02..4dc9ba8b 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test @@ -26,12 +26,7 @@ nextflow_workflow { then { assertAll( { assert workflow.success }, -// { assert snapshot(workflow.out).match() } - { assert new File("$outputDir/custom").exists() }, - { assert new File("$outputDir/metadata").exists() }, - { assert new File("$outputDir/pipeline_info").exists() }, - { assert new File("$outputDir/samplesheet").exists() }, - { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") } + { assert snapshot(workflow.out).match() } ) } } diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test b/workflows/sra/tests/sra_force_sratools_download.nf.test index 051e4aa5..2b1b5953 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test @@ -24,12 +24,7 @@ nextflow_workflow { then { assertAll( { assert workflow.success }, -// { assert snapshot(workflow.out).match() } - { assert new File("$outputDir/custom").exists() }, - { assert new File("$outputDir/metadata").exists() }, - { assert new File("$outputDir/pipeline_info").exists() }, - { assert new File("$outputDir/samplesheet").exists() }, - { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") } + { assert snapshot(workflow.out).match() } ) } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test index 6925b971..3d946fea 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test @@ -24,12 +24,7 @@ nextflow_workflow { then { assertAll( { assert workflow.success }, -// { assert snapshot(workflow.out).match() } - { assert new File("$outputDir/custom").exists() }, - { assert new File("$outputDir/metadata").exists() }, - { assert new File("$outputDir/pipeline_info").exists() }, - { assert new File("$outputDir/samplesheet").exists() }, - { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") } + { assert snapshot(workflow.out).match() } ) } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test index a84b7c41..f51aa4ca 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test @@ -24,12 +24,7 @@ nextflow_workflow { then { assertAll( { assert workflow.success }, -// { assert snapshot(workflow.out).match() } - { assert new File("$outputDir/custom").exists() }, - { assert new File("$outputDir/metadata").exists() }, - { assert new File("$outputDir/pipeline_info").exists() }, - { assert new File("$outputDir/samplesheet").exists() }, - { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") } + { assert snapshot(workflow.out).match() } ) } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test index c2022ce2..97cd4a44 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test @@ -24,12 +24,7 @@ nextflow_workflow { then { assertAll( { assert workflow.success }, -// { assert snapshot(workflow.out).match() } - { assert new File("$outputDir/custom").exists() }, - { assert new File("$outputDir/metadata").exists() }, - { assert new File("$outputDir/pipeline_info").exists() }, - { assert new File("$outputDir/samplesheet").exists() }, - { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") } + { assert snapshot(workflow.out).match() } ) } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test index e664f0fd..434fac63 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test @@ -24,12 +24,7 @@ nextflow_workflow { then { assertAll( { assert workflow.success }, -// { assert snapshot(workflow.out).match() } - { assert new File("$outputDir/custom").exists() }, - { assert new File("$outputDir/metadata").exists() }, - { assert new File("$outputDir/pipeline_info").exists() }, - { assert new File("$outputDir/samplesheet").exists() }, - { assert snapshot(path("$outputDir/fastq/").list()).match("fastq") } + { assert snapshot(workflow.out).match() } ) } } diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test b/workflows/sra/tests/sra_skip_fastq_download.nf.test index 7180fd6d..dbe40144 100644 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test @@ -24,10 +24,7 @@ nextflow_workflow { then { assertAll( { assert workflow.success }, -// { assert snapshot(workflow.out).match() } - { assert new File("$outputDir/metadata").exists() }, - { assert new File("$outputDir/pipeline_info").exists() }, - { assert new File("$outputDir/samplesheet").exists() } + { assert snapshot(workflow.out).match() } ) } } From b180a636ff039c69cf3bd79060ba8a5a98692fad Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 11 Sep 2023 17:30:07 +0200 Subject: [PATCH 423/852] update snapshot --- workflows/sra/tests/main.nf.test.snap | 1707 ++++++++--------- ...ra_custom_ena_metadata_fields.nf.test.snap | 647 ++++++- .../sra_force_sratools_download.nf.test.snap | 1372 ++++++++++++- .../sra_nf_core_pipeline_atacseq.nf.test.snap | 1427 +++++++++++++- .../sra_nf_core_pipeline_rnaseq.nf.test.snap | 1427 +++++++++++++- ..._nf_core_pipeline_taxprofiler.nf.test.snap | 1425 +++++++++++++- ...a_nf_core_pipeline_viralrecon.nf.test.snap | 1425 +++++++++++++- .../sra_skip_fastq_download.nf.test.snap | 37 + 8 files changed, 8141 insertions(+), 1326 deletions(-) create mode 100644 workflows/sra/tests/sra_skip_fastq_download.nf.test.snap diff --git a/workflows/sra/tests/main.nf.test.snap b/workflows/sra/tests/main.nf.test.snap index 62d0d976..1c969bc2 100644 --- a/workflows/sra/tests/main.nf.test.snap +++ b/workflows/sra/tests/main.nf.test.snap @@ -47,131 +47,47 @@ ], [ { - "id": "SRX6725035_SRR9984183", - "run_accession": "SRR9984183", - "experiment_accession": "SRX6725035", - "sample_accession": "SAMN12581720", - "secondary_sample_accession": "SRS5277011", - "study_accession": "PRJNA560329", - "secondary_study_accession": "SRP218535", - "submission_accession": "SRA942061", - "run_alias": "Emb289P1_bin131.fastq", - "experiment_alias": "Emb289P1_bin131", - "sample_alias": "Emb289P1_bin131", - "study_alias": "PRJNA560329", - "library_layout": "SINGLE", - "library_selection": "RANDOM", - "library_source": "METAGENOMIC", - "library_strategy": "WGS", - "library_name": "Emb289P1_bin131", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "1996273", - "read_count": "58", - "tax_id": "2660712", - "scientific_name": "Defluviitaleaceae bacterium", - "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", - "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", - "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", - "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", - "fastq_md5": "0b512d2dc31685983456bd56fd836544", - "fastq_bytes": "605358", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_2": "", - "md5_1": "0b512d2dc31685983456bd56fd836544", - "md5_2": "", - "single_end": true - }, - "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" - ], - [ - { - "id": "ERX1234253_ERR1160846", - "run_accession": "ERR1160846", - "experiment_accession": "ERX1234253", - "sample_accession": "SAMEA3687214", - "secondary_sample_accession": "ERS994363", - "study_accession": "PRJEB11419", - "secondary_study_accession": "ERP012803", - "submission_accession": "ERA541392", - "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", - "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", - "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", - "study_alias": "qiita_sid_10317", - "library_layout": "SINGLE", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "library_name": "10317.BLANK.93.3E.r22", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "35658", - "read_count": "283", - "tax_id": "256318", - "scientific_name": "metagenome", - "sample_title": "10317.BLANK.93.3E.r22", - "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", - "study_title": "American Gut Project", - "sample_description": "American Gut control", - "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", - "fastq_bytes": "18077", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_2": "", - "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", - "md5_2": "", - "single_end": true - }, - "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" - ], - [ - { - "id": "SRX9626017_SRR13191702", - "run_accession": "SRR13191702", - "experiment_accession": "SRX9626017", - "sample_accession": "SAMN16980141", - "secondary_sample_accession": "SRS7827211", - "study_accession": "PRJNA682076", - "secondary_study_accession": "SRP295653", - "submission_accession": "SRA1166126", - "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", - "experiment_alias": "S.170804.00784", - "sample_alias": "S.170804.00784_662", - "study_alias": "PRJNA682076", + "id": "DRX026011_DRR028935", + "run_accession": "DRR028935", + "experiment_accession": "DRX026011", + "sample_accession": "SAMD00024405", + "secondary_sample_accession": "DRS019431", + "study_accession": "PRJDB3420", + "secondary_study_accession": "DRP002616", + "submission_accession": "DRA002949", + "run_alias": "DRR028935", + "experiment_alias": "DRX026011", + "sample_alias": "SAMD00024405", + "study_alias": "DRP002616", "library_layout": "PAIRED", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "library_name": "S.170804.00784", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "day0_BbSQE-I", "instrument_model": "Illumina HiSeq 2500", "instrument_platform": "ILLUMINA", - "base_count": "45682", - "read_count": "91", - "tax_id": "408170", - "scientific_name": "human gut metagenome", - "sample_title": "Metagenome or environmental sample from human gut metagenome", - "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "sample_description": "Metagenome or environmental sample from human gut metagenome", - "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", - "fastq_bytes": "15420;16324", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "md5_1": "89c5be920021a035084d8aeb74f32df7", - "md5_2": "56271be38a80db78ef3bdfc5d9909b98", + "base_count": "194930", + "read_count": "965", + "tax_id": "1202541", + "scientific_name": "Botryococcus braunii Showa", + "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", + "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", + "sample_description": "Liquid culture", + "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", + "fastq_bytes": "60275;61610", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "md5_1": "cc01df82a9354bb6b3be93483b20c35a", + "md5_2": "941c9998d746416dad53c94c480ddf30", "single_end": false }, [ - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" ] ], [ @@ -221,137 +137,89 @@ ], [ { - "id": "DRX026011_DRR028935", - "run_accession": "DRR028935", - "experiment_accession": "DRX026011", - "sample_accession": "SAMD00024405", - "secondary_sample_accession": "DRS019431", - "study_accession": "PRJDB3420", - "secondary_study_accession": "DRP002616", - "submission_accession": "DRA002949", - "run_alias": "DRR028935", - "experiment_alias": "DRX026011", - "sample_alias": "SAMD00024405", - "study_alias": "DRP002616", - "library_layout": "PAIRED", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "day0_BbSQE-I", + "id": "ERX1234253_ERR1160846", + "run_accession": "ERR1160846", + "experiment_accession": "ERX1234253", + "sample_accession": "SAMEA3687214", + "secondary_sample_accession": "ERS994363", + "study_accession": "PRJEB11419", + "secondary_study_accession": "ERP012803", + "submission_accession": "ERA541392", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "study_alias": "qiita_sid_10317", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "10317.BLANK.93.3E.r22", "instrument_model": "Illumina HiSeq 2500", "instrument_platform": "ILLUMINA", - "base_count": "194930", - "read_count": "965", - "tax_id": "1202541", - "scientific_name": "Botryococcus braunii Showa", - "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", - "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", - "sample_description": "Liquid culture", - "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", - "fastq_bytes": "60275;61610", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "md5_1": "cc01df82a9354bb6b3be93483b20c35a", - "md5_2": "941c9998d746416dad53c94c480ddf30", - "single_end": false + "base_count": "35658", + "read_count": "283", + "tax_id": "256318", + "scientific_name": "metagenome", + "sample_title": "10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "study_title": "American Gut Project", + "sample_description": "American Gut control", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_2": "", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "single_end": true }, - [ - "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", - "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" - ] + "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" ], [ { - "id": "SRX9504942_SRR13055520", - "run_accession": "SRR13055520", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r4", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", + "id": "SRX10940790_SRR14593545", + "run_accession": "SRR14593545", + "experiment_accession": "SRX10940790", + "sample_accession": "SAMN19097423", + "secondary_sample_accession": "SRS9020442", + "study_accession": "PRJNA728650", + "secondary_study_accession": "SRP319413", + "submission_accession": "SRA1234280", + "run_alias": "577-6_530058_19-037147 Goat_F.ab1", + "experiment_alias": "PRNP_2765", + "sample_alias": "prp_2765", + "study_alias": "PRJNA728650", "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2214488", - "read_count": "29138", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", - "fastq_bytes": "709867;716862", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "md5_1": "795d460abff6009c7f5ff7c14b773fbe", - "md5_2": "c3f34379356b28d6dac7212abc1a0a04", - "single_end": false - }, - [ - "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", - "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" - ] - ], - [ - { - "id": "SRX9504942_SRR13055519", - "run_accession": "SRR13055519", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r3", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2232728", - "read_count": "29378", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", - "fastq_bytes": "714907;721705", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", - "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "PRNP_2765", + "instrument_model": "AB 3500xL Genetic Analyzer", + "instrument_platform": "CAPILLARY", + "base_count": "828", + "read_count": "1", + "tax_id": "9925", + "scientific_name": "Capra hircus", + "sample_title": "MIGS Eukaryotic sample from Capra hircus", + "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", + "study_title": "Capra hircus Raw sequence reads", + "sample_description": "Keywords: GSC:MIxS MIGS:5.0", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", "single_end": false }, [ - "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", - "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" ] ], [ @@ -398,110 +266,146 @@ ], [ { - "id": "SRX10940790_SRR14593545", - "run_accession": "SRR14593545", - "experiment_accession": "SRX10940790", - "sample_accession": "SAMN19097423", - "secondary_sample_accession": "SRS9020442", - "study_accession": "PRJNA728650", - "secondary_study_accession": "SRP319413", - "submission_accession": "SRA1234280", - "run_alias": "577-6_530058_19-037147 Goat_F.ab1", - "experiment_alias": "PRNP_2765", - "sample_alias": "prp_2765", - "study_alias": "PRJNA728650", - "library_layout": "PAIRED", - "library_selection": "PCR", - "library_source": "GENOMIC", - "library_strategy": "AMPLICON", - "library_name": "PRNP_2765", - "instrument_model": "AB 3500xL Genetic Analyzer", - "instrument_platform": "CAPILLARY", - "base_count": "828", - "read_count": "1", - "tax_id": "9925", - "scientific_name": "Capra hircus", - "sample_title": "MIGS Eukaryotic sample from Capra hircus", - "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", - "study_title": "Capra hircus Raw sequence reads", - "sample_description": "Keywords: GSC:MIxS MIGS:5.0", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", + "id": "SRX17709227_SRR21711856", + "run_accession": "SRR21711856", + "experiment_accession": "SRX17709227", + "sample_accession": "SAMN31021823", + "secondary_sample_accession": "SRS15239723", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601460_r1", + "experiment_alias": "GSM6601460_r1", + "sample_alias": "GSM6601460", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601460", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "573417800", + "read_count": "11468356", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "sham-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "sham-treated worms in day 5", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", "fastq_2": "", - "md5_1": "", + "md5_1": "7cd1402155befc87be338132d1f31f64", "md5_2": "", - "single_end": false + "single_end": true }, - [ - "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", - "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" - ] + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" ], [ { - "id": "SRX9504942_SRR13055517", - "run_accession": "SRR13055517", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r1", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", + "id": "SRX17709228_SRR21711855", + "run_accession": "SRR21711855", + "experiment_accession": "SRX17709228", + "sample_accession": "SAMN31021822", + "secondary_sample_accession": "SRS15239724", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601461_r1", + "experiment_alias": "GSM6601461_r1", + "sample_alias": "GSM6601461", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601461", + "instrument_model": "Illumina HiSeq 4000", "instrument_platform": "ILLUMINA", - "base_count": "2246028", - "read_count": "29553", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", - "fastq_bytes": "721167;723753", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", - "md5_2": "18dbe96e7f58b63406d9058938df1962", - "single_end": false + "base_count": "677912850", + "read_count": "13558257", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "PM2.5-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "PM2.5-treated worms in day 5", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_2": "", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "single_end": true }, - [ - "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", - "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" - ] + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" ], [ { - "id": "SRX9315476_SRR12848126", - "run_accession": "SRR12848126", - "experiment_accession": "SRX9315476", - "sample_accession": "SAMN16455283", - "secondary_sample_accession": "SRS7540262", - "study_accession": "PRJNA670070", - "secondary_study_accession": "SRP287769", - "submission_accession": "SRA1145417", - "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", - "experiment_alias": "F11-N1-05", - "sample_alias": "F11-N1-05", - "study_alias": "PRJNA670070", - "library_layout": "PAIRED", - "library_selection": "RANDOM PCR", + "id": "SRX6725035_SRR9984183", + "run_accession": "SRR9984183", + "experiment_accession": "SRX6725035", + "sample_accession": "SAMN12581720", + "secondary_sample_accession": "SRS5277011", + "study_accession": "PRJNA560329", + "secondary_study_accession": "SRP218535", + "submission_accession": "SRA942061", + "run_alias": "Emb289P1_bin131.fastq", + "experiment_alias": "Emb289P1_bin131", + "sample_alias": "Emb289P1_bin131", + "study_alias": "PRJNA560329", + "library_layout": "SINGLE", + "library_selection": "RANDOM", + "library_source": "METAGENOMIC", + "library_strategy": "WGS", + "library_name": "Emb289P1_bin131", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "1996273", + "read_count": "58", + "tax_id": "2660712", + "scientific_name": "Defluviitaleaceae bacterium", + "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", + "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", + "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", + "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", + "fastq_md5": "0b512d2dc31685983456bd56fd836544", + "fastq_bytes": "605358", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_2": "", + "md5_1": "0b512d2dc31685983456bd56fd836544", + "md5_2": "", + "single_end": true + }, + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" + ], + [ + { + "id": "SRX9315476_SRR12848126", + "run_accession": "SRR12848126", + "experiment_accession": "SRX9315476", + "sample_accession": "SAMN16455283", + "secondary_sample_accession": "SRS7540262", + "study_accession": "PRJNA670070", + "secondary_study_accession": "SRP287769", + "submission_accession": "SRA1145417", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "experiment_alias": "F11-N1-05", + "sample_alias": "F11-N1-05", + "study_alias": "PRJNA670070", + "library_layout": "PAIRED", + "library_selection": "RANDOM PCR", "library_source": "GENOMIC", "library_strategy": "Synthetic-Long-Read", "library_name": "F11-N1-05", @@ -531,6 +435,51 @@ "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" ] ], + [ + { + "id": "SRX9504942_SRR13055517", + "run_accession": "SRR13055517", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r1", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2246028", + "read_count": "29553", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", + "fastq_bytes": "721167;723753", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", + "md5_2": "18dbe96e7f58b63406d9058938df1962", + "single_end": false + }, + [ + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" + ] + ], [ { "id": "SRX9504942_SRR13055518", @@ -578,96 +527,147 @@ ], [ { - "id": "SRX17709227_SRR21711856", - "run_accession": "SRR21711856", - "experiment_accession": "SRX17709227", - "sample_accession": "SAMN31021823", - "secondary_sample_accession": "SRS15239723", - "study_accession": "PRJNA884373", - "secondary_study_accession": "SRP399678", - "submission_accession": "SRA1507236", - "run_alias": "GSM6601460_r1", - "experiment_alias": "GSM6601460_r1", - "sample_alias": "GSM6601460", - "study_alias": "GSE214215", - "library_layout": "SINGLE", - "library_selection": "cDNA", + "id": "SRX9504942_SRR13055519", + "run_accession": "SRR13055519", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r3", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "GSM6601460", - "instrument_model": "Illumina HiSeq 4000", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", "instrument_platform": "ILLUMINA", - "base_count": "573417800", - "read_count": "11468356", - "tax_id": "6239", - "scientific_name": "Caenorhabditis elegans", - "sample_title": "sham-treated worms in day 5", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "sample_description": "sham-treated worms in day 5", - "fastq_md5": "7cd1402155befc87be338132d1f31f64", - "fastq_bytes": "447377777", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_2": "", - "md5_1": "7cd1402155befc87be338132d1f31f64", - "md5_2": "", - "single_end": true + "base_count": "2232728", + "read_count": "29378", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", + "fastq_bytes": "714907;721705", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", + "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", + "single_end": false }, - "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" + [ + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" + ] ], [ { - "id": "SRX17709228_SRR21711855", - "run_accession": "SRR21711855", - "experiment_accession": "SRX17709228", - "sample_accession": "SAMN31021822", - "secondary_sample_accession": "SRS15239724", - "study_accession": "PRJNA884373", - "secondary_study_accession": "SRP399678", - "submission_accession": "SRA1507236", - "run_alias": "GSM6601461_r1", - "experiment_alias": "GSM6601461_r1", - "sample_alias": "GSM6601461", - "study_alias": "GSE214215", - "library_layout": "SINGLE", - "library_selection": "cDNA", + "id": "SRX9504942_SRR13055520", + "run_accession": "SRR13055520", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r4", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "GSM6601461", - "instrument_model": "Illumina HiSeq 4000", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", "instrument_platform": "ILLUMINA", - "base_count": "677912850", - "read_count": "13558257", - "tax_id": "6239", - "scientific_name": "Caenorhabditis elegans", - "sample_title": "PM2.5-treated worms in day 5", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "sample_description": "PM2.5-treated worms in day 5", - "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", - "fastq_bytes": "529798447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_2": "", - "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", - "md5_2": "", - "single_end": true + "base_count": "2214488", + "read_count": "29138", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", + "fastq_bytes": "709867;716862", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "md5_1": "795d460abff6009c7f5ff7c14b773fbe", + "md5_2": "c3f34379356b28d6dac7212abc1a0a04", + "single_end": false }, - "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" - ] - ], - "1": [ - "samplesheet.csv:md5,dbd0e9c1683c603c681184a13f5b7341" - ], - "2": [ - "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" - ], - "3": [ + [ + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" + ] + ], + [ + { + "id": "SRX9626017_SRR13191702", + "run_accession": "SRR13191702", + "experiment_accession": "SRX9626017", + "sample_accession": "SAMN16980141", + "secondary_sample_accession": "SRS7827211", + "study_accession": "PRJNA682076", + "secondary_study_accession": "SRP295653", + "submission_accession": "SRA1166126", + "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", + "experiment_alias": "S.170804.00784", + "sample_alias": "S.170804.00784_662", + "study_alias": "PRJNA682076", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "S.170804.00784", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "45682", + "read_count": "91", + "tax_id": "408170", + "scientific_name": "human gut metagenome", + "sample_title": "Metagenome or environmental sample from human gut metagenome", + "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "sample_description": "Metagenome or environmental sample from human gut metagenome", + "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", + "fastq_bytes": "15420;16324", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98", + "single_end": false + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + ] + ] + ], + "1": [ + "samplesheet.csv:md5,dbd0e9c1683c603c681184a13f5b7341" + ], + "2": [ + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + ], + "3": [ "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", @@ -719,45 +719,93 @@ ], [ { - "id": "SRX6725035_SRR9984183", - "run_accession": "SRR9984183", - "experiment_accession": "SRX6725035", - "sample_accession": "SAMN12581720", - "secondary_sample_accession": "SRS5277011", - "study_accession": "PRJNA560329", - "secondary_study_accession": "SRP218535", - "submission_accession": "SRA942061", - "run_alias": "Emb289P1_bin131.fastq", - "experiment_alias": "Emb289P1_bin131", - "sample_alias": "Emb289P1_bin131", - "study_alias": "PRJNA560329", - "library_layout": "SINGLE", - "library_selection": "RANDOM", - "library_source": "METAGENOMIC", - "library_strategy": "WGS", - "library_name": "Emb289P1_bin131", + "id": "DRX026011_DRR028935", + "run_accession": "DRR028935", + "experiment_accession": "DRX026011", + "sample_accession": "SAMD00024405", + "secondary_sample_accession": "DRS019431", + "study_accession": "PRJDB3420", + "secondary_study_accession": "DRP002616", + "submission_accession": "DRA002949", + "run_alias": "DRR028935", + "experiment_alias": "DRX026011", + "sample_alias": "SAMD00024405", + "study_alias": "DRP002616", + "library_layout": "PAIRED", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "day0_BbSQE-I", "instrument_model": "Illumina HiSeq 2500", "instrument_platform": "ILLUMINA", - "base_count": "1996273", - "read_count": "58", - "tax_id": "2660712", - "scientific_name": "Defluviitaleaceae bacterium", - "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", - "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", - "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", - "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", - "fastq_md5": "0b512d2dc31685983456bd56fd836544", - "fastq_bytes": "605358", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_2": "", - "md5_1": "0b512d2dc31685983456bd56fd836544", - "md5_2": "", - "single_end": true + "base_count": "194930", + "read_count": "965", + "tax_id": "1202541", + "scientific_name": "Botryococcus braunii Showa", + "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", + "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", + "sample_description": "Liquid culture", + "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", + "fastq_bytes": "60275;61610", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "md5_1": "cc01df82a9354bb6b3be93483b20c35a", + "md5_2": "941c9998d746416dad53c94c480ddf30", + "single_end": false }, - "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" + [ + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" + ] + ], + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "sample_accession": "SAMEA3643867", + "secondary_sample_accession": "ERS951016", + "study_accession": "PRJEB11633", + "secondary_study_accession": "ERP013030", + "submission_accession": "ERA528939", + "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", + "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", + "sample_alias": "sample_56", + "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", + "library_layout": "PAIRED", + "library_selection": "RT-PCR", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "unspecified", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "29700", + "read_count": "169", + "tax_id": "63433", + "scientific_name": "Leptopilina boulardi", + "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing", + "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", + "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_bytes": "3221;8151;8118", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, + [ + "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" + ] ], [ { @@ -803,227 +851,47 @@ ], [ { - "id": "SRX9626017_SRR13191702", - "run_accession": "SRR13191702", - "experiment_accession": "SRX9626017", - "sample_accession": "SAMN16980141", - "secondary_sample_accession": "SRS7827211", - "study_accession": "PRJNA682076", - "secondary_study_accession": "SRP295653", - "submission_accession": "SRA1166126", - "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", - "experiment_alias": "S.170804.00784", - "sample_alias": "S.170804.00784_662", - "study_alias": "PRJNA682076", + "id": "SRX10940790_SRR14593545", + "run_accession": "SRR14593545", + "experiment_accession": "SRX10940790", + "sample_accession": "SAMN19097423", + "secondary_sample_accession": "SRS9020442", + "study_accession": "PRJNA728650", + "secondary_study_accession": "SRP319413", + "submission_accession": "SRA1234280", + "run_alias": "577-6_530058_19-037147 Goat_F.ab1", + "experiment_alias": "PRNP_2765", + "sample_alias": "prp_2765", + "study_alias": "PRJNA728650", "library_layout": "PAIRED", "library_selection": "PCR", - "library_source": "METAGENOMIC", + "library_source": "GENOMIC", "library_strategy": "AMPLICON", - "library_name": "S.170804.00784", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "45682", - "read_count": "91", - "tax_id": "408170", - "scientific_name": "human gut metagenome", - "sample_title": "Metagenome or environmental sample from human gut metagenome", - "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "sample_description": "Metagenome or environmental sample from human gut metagenome", - "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", - "fastq_bytes": "15420;16324", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "md5_1": "89c5be920021a035084d8aeb74f32df7", - "md5_2": "56271be38a80db78ef3bdfc5d9909b98", + "library_name": "PRNP_2765", + "instrument_model": "AB 3500xL Genetic Analyzer", + "instrument_platform": "CAPILLARY", + "base_count": "828", + "read_count": "1", + "tax_id": "9925", + "scientific_name": "Capra hircus", + "sample_title": "MIGS Eukaryotic sample from Capra hircus", + "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", + "study_title": "Capra hircus Raw sequence reads", + "sample_description": "Keywords: GSC:MIxS MIGS:5.0", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", "single_end": false }, [ - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" - ] - ], - [ - { - "id": "ERX1188904_ERR1109373", - "run_accession": "ERR1109373", - "experiment_accession": "ERX1188904", - "sample_accession": "SAMEA3643867", - "secondary_sample_accession": "ERS951016", - "study_accession": "PRJEB11633", - "secondary_study_accession": "ERP013030", - "submission_accession": "ERA528939", - "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", - "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", - "sample_alias": "sample_56", - "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", - "library_layout": "PAIRED", - "library_selection": "RT-PCR", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "unspecified", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "29700", - "read_count": "169", - "tax_id": "63433", - "scientific_name": "Leptopilina boulardi", - "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing", - "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", - "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", - "fastq_bytes": "3221;8151;8118", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "md5_1": "9fd57225d6c07a31843276d6df9b15c0", - "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", - "single_end": false - }, - [ - "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" - ] - ], - [ - { - "id": "DRX026011_DRR028935", - "run_accession": "DRR028935", - "experiment_accession": "DRX026011", - "sample_accession": "SAMD00024405", - "secondary_sample_accession": "DRS019431", - "study_accession": "PRJDB3420", - "secondary_study_accession": "DRP002616", - "submission_accession": "DRA002949", - "run_alias": "DRR028935", - "experiment_alias": "DRX026011", - "sample_alias": "SAMD00024405", - "study_alias": "DRP002616", - "library_layout": "PAIRED", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "day0_BbSQE-I", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "194930", - "read_count": "965", - "tax_id": "1202541", - "scientific_name": "Botryococcus braunii Showa", - "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", - "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", - "sample_description": "Liquid culture", - "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", - "fastq_bytes": "60275;61610", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "md5_1": "cc01df82a9354bb6b3be93483b20c35a", - "md5_2": "941c9998d746416dad53c94c480ddf30", - "single_end": false - }, - [ - "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", - "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" - ] - ], - [ - { - "id": "SRX9504942_SRR13055520", - "run_accession": "SRR13055520", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r4", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2214488", - "read_count": "29138", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", - "fastq_bytes": "709867;716862", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "md5_1": "795d460abff6009c7f5ff7c14b773fbe", - "md5_2": "c3f34379356b28d6dac7212abc1a0a04", - "single_end": false - }, - [ - "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", - "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" - ] - ], - [ - { - "id": "SRX9504942_SRR13055519", - "run_accession": "SRR13055519", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r3", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2232728", - "read_count": "29378", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", - "fastq_bytes": "714907;721705", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", - "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", - "single_end": false - }, - [ - "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", - "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" ] ], [ @@ -1070,33 +938,159 @@ ], [ { - "id": "SRX10940790_SRR14593545", - "run_accession": "SRR14593545", - "experiment_accession": "SRX10940790", - "sample_accession": "SAMN19097423", - "secondary_sample_accession": "SRS9020442", - "study_accession": "PRJNA728650", - "secondary_study_accession": "SRP319413", - "submission_accession": "SRA1234280", - "run_alias": "577-6_530058_19-037147 Goat_F.ab1", - "experiment_alias": "PRNP_2765", - "sample_alias": "prp_2765", - "study_alias": "PRJNA728650", + "id": "SRX17709227_SRR21711856", + "run_accession": "SRR21711856", + "experiment_accession": "SRX17709227", + "sample_accession": "SAMN31021823", + "secondary_sample_accession": "SRS15239723", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601460_r1", + "experiment_alias": "GSM6601460_r1", + "sample_alias": "GSM6601460", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601460", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "573417800", + "read_count": "11468356", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "sham-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "sham-treated worms in day 5", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_2": "", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "single_end": true + }, + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" + ], + [ + { + "id": "SRX17709228_SRR21711855", + "run_accession": "SRR21711855", + "experiment_accession": "SRX17709228", + "sample_accession": "SAMN31021822", + "secondary_sample_accession": "SRS15239724", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601461_r1", + "experiment_alias": "GSM6601461_r1", + "sample_alias": "GSM6601461", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601461", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "677912850", + "read_count": "13558257", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "PM2.5-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "PM2.5-treated worms in day 5", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_2": "", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "single_end": true + }, + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" + ], + [ + { + "id": "SRX6725035_SRR9984183", + "run_accession": "SRR9984183", + "experiment_accession": "SRX6725035", + "sample_accession": "SAMN12581720", + "secondary_sample_accession": "SRS5277011", + "study_accession": "PRJNA560329", + "secondary_study_accession": "SRP218535", + "submission_accession": "SRA942061", + "run_alias": "Emb289P1_bin131.fastq", + "experiment_alias": "Emb289P1_bin131", + "sample_alias": "Emb289P1_bin131", + "study_alias": "PRJNA560329", + "library_layout": "SINGLE", + "library_selection": "RANDOM", + "library_source": "METAGENOMIC", + "library_strategy": "WGS", + "library_name": "Emb289P1_bin131", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "1996273", + "read_count": "58", + "tax_id": "2660712", + "scientific_name": "Defluviitaleaceae bacterium", + "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", + "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", + "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", + "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", + "fastq_md5": "0b512d2dc31685983456bd56fd836544", + "fastq_bytes": "605358", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_2": "", + "md5_1": "0b512d2dc31685983456bd56fd836544", + "md5_2": "", + "single_end": true + }, + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" + ], + [ + { + "id": "SRX9315476_SRR12848126", + "run_accession": "SRR12848126", + "experiment_accession": "SRX9315476", + "sample_accession": "SAMN16455283", + "secondary_sample_accession": "SRS7540262", + "study_accession": "PRJNA670070", + "secondary_study_accession": "SRP287769", + "submission_accession": "SRA1145417", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "experiment_alias": "F11-N1-05", + "sample_alias": "F11-N1-05", + "study_alias": "PRJNA670070", "library_layout": "PAIRED", - "library_selection": "PCR", + "library_selection": "RANDOM PCR", "library_source": "GENOMIC", - "library_strategy": "AMPLICON", - "library_name": "PRNP_2765", - "instrument_model": "AB 3500xL Genetic Analyzer", - "instrument_platform": "CAPILLARY", - "base_count": "828", - "read_count": "1", - "tax_id": "9925", - "scientific_name": "Capra hircus", - "sample_title": "MIGS Eukaryotic sample from Capra hircus", - "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", - "study_title": "Capra hircus Raw sequence reads", - "sample_description": "Keywords: GSC:MIxS MIGS:5.0", + "library_strategy": "Synthetic-Long-Read", + "library_name": "F11-N1-05", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "base_count": "431758", + "read_count": "2954", + "tax_id": "10092", + "scientific_name": "Mus musculus domesticus", + "sample_title": "Longshanks_F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "sample_description": "F11-N1-05", "fastq_md5": "", "fastq_bytes": "", "fastq_ftp": "", @@ -1109,8 +1103,8 @@ "single_end": false }, [ - "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", - "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" ] ], [ @@ -1158,51 +1152,6 @@ "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" ] ], - [ - { - "id": "SRX9315476_SRR12848126", - "run_accession": "SRR12848126", - "experiment_accession": "SRX9315476", - "sample_accession": "SAMN16455283", - "secondary_sample_accession": "SRS7540262", - "study_accession": "PRJNA670070", - "secondary_study_accession": "SRP287769", - "submission_accession": "SRA1145417", - "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", - "experiment_alias": "F11-N1-05", - "sample_alias": "F11-N1-05", - "study_alias": "PRJNA670070", - "library_layout": "PAIRED", - "library_selection": "RANDOM PCR", - "library_source": "GENOMIC", - "library_strategy": "Synthetic-Long-Read", - "library_name": "F11-N1-05", - "instrument_model": "Illumina HiSeq 3000", - "instrument_platform": "ILLUMINA", - "base_count": "431758", - "read_count": "2954", - "tax_id": "10092", - "scientific_name": "Mus musculus domesticus", - "sample_title": "Longshanks_F11-N1-05", - "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "sample_description": "F11-N1-05", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": false - }, - [ - "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", - "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" - ] - ], [ { "id": "SRX9504942_SRR13055518", @@ -1250,87 +1199,138 @@ ], [ { - "id": "SRX17709227_SRR21711856", - "run_accession": "SRR21711856", - "experiment_accession": "SRX17709227", - "sample_accession": "SAMN31021823", - "secondary_sample_accession": "SRS15239723", - "study_accession": "PRJNA884373", - "secondary_study_accession": "SRP399678", - "submission_accession": "SRA1507236", - "run_alias": "GSM6601460_r1", - "experiment_alias": "GSM6601460_r1", - "sample_alias": "GSM6601460", - "study_alias": "GSE214215", - "library_layout": "SINGLE", - "library_selection": "cDNA", + "id": "SRX9504942_SRR13055519", + "run_accession": "SRR13055519", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r3", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "GSM6601460", - "instrument_model": "Illumina HiSeq 4000", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", "instrument_platform": "ILLUMINA", - "base_count": "573417800", - "read_count": "11468356", - "tax_id": "6239", - "scientific_name": "Caenorhabditis elegans", - "sample_title": "sham-treated worms in day 5", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "sample_description": "sham-treated worms in day 5", - "fastq_md5": "7cd1402155befc87be338132d1f31f64", - "fastq_bytes": "447377777", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_2": "", - "md5_1": "7cd1402155befc87be338132d1f31f64", - "md5_2": "", - "single_end": true + "base_count": "2232728", + "read_count": "29378", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", + "fastq_bytes": "714907;721705", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", + "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", + "single_end": false }, - "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" + [ + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" + ] ], [ { - "id": "SRX17709228_SRR21711855", - "run_accession": "SRR21711855", - "experiment_accession": "SRX17709228", - "sample_accession": "SAMN31021822", - "secondary_sample_accession": "SRS15239724", - "study_accession": "PRJNA884373", - "secondary_study_accession": "SRP399678", - "submission_accession": "SRA1507236", - "run_alias": "GSM6601461_r1", - "experiment_alias": "GSM6601461_r1", - "sample_alias": "GSM6601461", - "study_alias": "GSE214215", - "library_layout": "SINGLE", - "library_selection": "cDNA", + "id": "SRX9504942_SRR13055520", + "run_accession": "SRR13055520", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r4", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "GSM6601461", - "instrument_model": "Illumina HiSeq 4000", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", "instrument_platform": "ILLUMINA", - "base_count": "677912850", - "read_count": "13558257", - "tax_id": "6239", - "scientific_name": "Caenorhabditis elegans", - "sample_title": "PM2.5-treated worms in day 5", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "sample_description": "PM2.5-treated worms in day 5", - "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", - "fastq_bytes": "529798447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_2": "", - "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", - "md5_2": "", - "single_end": true + "base_count": "2214488", + "read_count": "29138", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", + "fastq_bytes": "709867;716862", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "md5_1": "795d460abff6009c7f5ff7c14b773fbe", + "md5_2": "c3f34379356b28d6dac7212abc1a0a04", + "single_end": false }, - "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" + [ + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" + ] + ], + [ + { + "id": "SRX9626017_SRR13191702", + "run_accession": "SRR13191702", + "experiment_accession": "SRX9626017", + "sample_accession": "SAMN16980141", + "secondary_sample_accession": "SRS7827211", + "study_accession": "PRJNA682076", + "secondary_study_accession": "SRP295653", + "submission_accession": "SRA1166126", + "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", + "experiment_alias": "S.170804.00784", + "sample_alias": "S.170804.00784_662", + "study_alias": "PRJNA682076", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "S.170804.00784", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "45682", + "read_count": "91", + "tax_id": "408170", + "scientific_name": "human gut metagenome", + "sample_title": "Metagenome or environmental sample from human gut metagenome", + "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "sample_description": "Metagenome or environmental sample from human gut metagenome", + "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", + "fastq_bytes": "15420;16324", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98", + "single_end": false + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + ] ] ], "mappings": [ @@ -1348,93 +1348,6 @@ ] } ], - "timestamp": "2023-08-28T08:57:15+0000" - }, - "metadata": { - "content": [ - "DRR026872.runinfo_ftp.tsv:md5,73606f6a05c45b077809da43ca638b5f", - "DRR028935.runinfo_ftp.tsv:md5,f79eefcea5db346f76f76f87df7f8dd2", - "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", - "ERR1160846.runinfo_ftp.tsv:md5,1b2dc1a64117de20b2164724836da345", - "GSE214215.runinfo_ftp.tsv:md5,23a580c89ee7bf681ca3ffa26aa1837f", - "GSM4907283.runinfo_ftp.tsv:md5,090f3594af6ef6f5af4d9e4aaf030d18", - "SRR12848126.runinfo_ftp.tsv:md5,5d1e6bfd3d4077d1e66378c58e44975d", - "SRR13191702.runinfo_ftp.tsv:md5,409e262bb41bb6103315126db4d0dd1d", - "SRR14593545.runinfo_ftp.tsv:md5,62015706ac156693ba3d86ed050cab54", - "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", - "SRR9984183.runinfo_ftp.tsv:md5,53ab34ff3612b0e2c7d60476822787be" - ], - "timestamp": "2023-08-28T08:57:15+0000" - }, - "samplesheet": { - "content": [ - "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565", - "samplesheet.csv:md5,dbd0e9c1683c603c681184a13f5b7341" - ], - "timestamp": "2023-08-28T08:57:15+0000" - }, - "custom": { - "content": [ - "user-settings.mkfg:md5,a182ee157fbd89040a00b9658f53848d" - ], - "timestamp": "2023-08-28T08:57:15+0000" - }, - "fastq": { - "content": [ - "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791", - "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", - "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30", - "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9", - "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6", - "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", - "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2", - "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda", - "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64", - "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83", - "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544", - "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", - "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79", - "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", - "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962", - "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", - "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76", - "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", - "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88", - "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", - "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04", - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98", - [ - "DRX024467_DRR026872.fastq.gz.md5:md5,dacaeba3498fb8f405411a22cdb4b40d", - "DRX026011_DRR028935_1.fastq.gz.md5:md5,a47018c5972ba4c11539d0d6bc25eda9", - "DRX026011_DRR028935_2.fastq.gz.md5:md5,f477bbef548fbed665734ebf084eea2f", - "ERX1188904_ERR1109373_1.fastq.gz.md5:md5,50c1c3108631dc32a3151b67e0260d86", - "ERX1188904_ERR1109373_2.fastq.gz.md5:md5,1f22463d410e91a288c83d43654b2499", - "ERX1234253_ERR1160846.fastq.gz.md5:md5,513a8437ad331fc512b088b3750aa1ff", - "SRX17709227_SRR21711856.fastq.gz.md5:md5,13a38fbef27c3e15867d80887145ae75", - "SRX17709228_SRR21711855.fastq.gz.md5:md5,1e871ddd9e92e1866e0c64d36eb5ec85", - "SRX6725035_SRR9984183.fastq.gz.md5:md5,84f59dbb76c9b5eab7e14d90ced352c4", - "SRX9504942_SRR13055517_1.fastq.gz.md5:md5,a03f7f374dc401047b6f6ccaec3885cc", - "SRX9504942_SRR13055517_2.fastq.gz.md5:md5,facaf207753e977327e7b7df7bb8ace0", - "SRX9504942_SRR13055518_1.fastq.gz.md5:md5,5cf412cd62aadaa4838d9eabb5b44368", - "SRX9504942_SRR13055518_2.fastq.gz.md5:md5,93292b826afc72b23be93df26dd710c8", - "SRX9504942_SRR13055519_1.fastq.gz.md5:md5,f6ad6e2610397147a0a55c651de3992f", - "SRX9504942_SRR13055519_2.fastq.gz.md5:md5,2fe7dd4bcc1e7e61c6f54ef50cf961f3", - "SRX9504942_SRR13055520_1.fastq.gz.md5:md5,ab195b37746a3424a1099d9f8cc58de8", - "SRX9504942_SRR13055520_2.fastq.gz.md5:md5,10c448e23f1f7e7af61ec1204f8fc882", - "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", - "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" - ] - ], - "timestamp": "2023-08-28T08:57:15+0000" - }, - "pipeline_info": { - "content": [ - "execution_report_2023-08-28_10-54-32.html:md5,710a38308b41b4bd86b6d2d8fd4a72b7", - "execution_timeline_2023-08-28_10-54-32.html:md5,1583b3c97bc7c97a8550c3d0ce6302c8", - "pipeline_dag_2023-08-28_10-54-32.html:md5,63f58c7a48a1b71d3ee7809cb6a92740" - ], - "timestamp": "2023-08-28T08:57:15+0000" + "timestamp": "2023-09-11T16:58:15.05829" } -} +} \ No newline at end of file diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap index ddd8e845..c2782552 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap @@ -1,88 +1,573 @@ { - "metadata": { - "content": [ - "DRR026872.runinfo_ftp.tsv:md5,74a5f7058f27a565ce59db481355ca54", - "DRR028935.runinfo_ftp.tsv:md5,07a98fdcec207686a4ea2c9a3997edf3", - "ERR1109373.runinfo_ftp.tsv:md5,868897310855c50b1d5fc77d1195a1f9", - "ERR1160846.runinfo_ftp.tsv:md5,146d7f2ec778b32b7da7ad040e554114", - "GSE214215.runinfo_ftp.tsv:md5,adf62affe371dc9bad8e271450bdc2fe", - "SRR12848126.runinfo_ftp.tsv:md5,cf8827612a76645824e83418d7d76cbf", - "SRR13191702.runinfo_ftp.tsv:md5,2031ca9b7ab736dbde37d05b10cdb0ad", - "SRR14593545.runinfo_ftp.tsv:md5,3a1ac14d71744224a61ab542f869e180", - "SRR14709033.runinfo_ftp.tsv:md5,2385a9cc5e320e78b02743c45d1338f1", - "SRR9984183.runinfo_ftp.tsv:md5,f1ed9fc572d2e0d145be7f547f6d1236" - ], - "timestamp": "2023-08-28T09:29:59+0000" - }, - "samplesheet": { - "content": [ - "id_mappings.csv:md5,8473773df806859c6af7acafcfe5aa6f", - "samplesheet.csv:md5,7bca96e409bd9eb6790e0d6737af686c" - ], - "timestamp": "2023-08-28T09:29:59+0000" - }, - "software_versions": { - "content": [ - "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" - ], - "timestamp": "2023-08-28T09:29:59+0000" - }, - "Parameters: '--nf_core_pipeline rnaseq --ena_metadata_fields ... --sample_mapping_fields ...'": { + "Parameters: --nf_core_pipeline rnaseq --ena_metadata_fields ... --sample_mapping_fields ...": { "content": [ { - + "0": [ + [ + { + "id": "DRX024467_DRR026872", + "run_accession": "DRR026872", + "experiment_accession": "DRX024467", + "library_layout": "SINGLE", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_md5": "515e5448c55e054113c4a22df5f62791", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_2": "", + "md5_1": "515e5448c55e054113c4a22df5f62791", + "md5_2": "", + "single_end": true + }, + "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" + ], + [ + { + "id": "DRX026011_DRR028935", + "run_accession": "DRR028935", + "experiment_accession": "DRX026011", + "library_layout": "PAIRED", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "md5_1": "cc01df82a9354bb6b3be93483b20c35a", + "md5_2": "941c9998d746416dad53c94c480ddf30", + "single_end": false + }, + [ + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" + ] + ], + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "library_layout": "PAIRED", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, + [ + "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" + ] + ], + [ + { + "id": "ERX1234253_ERR1160846", + "run_accession": "ERR1160846", + "experiment_accession": "ERX1234253", + "library_layout": "SINGLE", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_2": "", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "single_end": true + }, + "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" + ], + [ + { + "id": "SRX10940790_SRR14593545", + "run_accession": "SRR14593545", + "experiment_accession": "SRX10940790", + "library_layout": "PAIRED", + "fastq_ftp": "", + "fastq_md5": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" + ] + ], + [ + { + "id": "SRX11047067_SRR14709033", + "run_accession": "SRR14709033", + "experiment_accession": "SRX11047067", + "library_layout": "SINGLE", + "fastq_ftp": "", + "fastq_md5": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": true + }, + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" + ], + [ + { + "id": "SRX17709227_SRR21711856", + "run_accession": "SRR21711856", + "experiment_accession": "SRX17709227", + "library_layout": "SINGLE", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_2": "", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "single_end": true + }, + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" + ], + [ + { + "id": "SRX17709228_SRR21711855", + "run_accession": "SRR21711855", + "experiment_accession": "SRX17709228", + "library_layout": "SINGLE", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_2": "", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "single_end": true + }, + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" + ], + [ + { + "id": "SRX6725035_SRR9984183", + "run_accession": "SRR9984183", + "experiment_accession": "SRX6725035", + "library_layout": "SINGLE", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_md5": "0b512d2dc31685983456bd56fd836544", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_2": "", + "md5_1": "0b512d2dc31685983456bd56fd836544", + "md5_2": "", + "single_end": true + }, + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" + ], + [ + { + "id": "SRX9315476_SRR12848126", + "run_accession": "SRR12848126", + "experiment_accession": "SRX9315476", + "library_layout": "PAIRED", + "fastq_ftp": "", + "fastq_md5": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" + ] + ], + [ + { + "id": "SRX9504942_SRR13055517", + "run_accession": "SRR13055517", + "experiment_accession": "SRX9504942", + "library_layout": "PAIRED", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", + "md5_2": "18dbe96e7f58b63406d9058938df1962", + "single_end": false + }, + [ + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" + ] + ], + [ + { + "id": "SRX9504942_SRR13055518", + "run_accession": "SRR13055518", + "experiment_accession": "SRX9504942", + "library_layout": "PAIRED", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "md5_1": "5ec894d863fcefe394470a0925aefde4", + "md5_2": "aead170df9851773d5202b5760c76d76", + "single_end": false + }, + [ + "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" + ] + ], + [ + { + "id": "SRX9504942_SRR13055519", + "run_accession": "SRR13055519", + "experiment_accession": "SRX9504942", + "library_layout": "PAIRED", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", + "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", + "single_end": false + }, + [ + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" + ] + ], + [ + { + "id": "SRX9504942_SRR13055520", + "run_accession": "SRR13055520", + "experiment_accession": "SRX9504942", + "library_layout": "PAIRED", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "md5_1": "795d460abff6009c7f5ff7c14b773fbe", + "md5_2": "c3f34379356b28d6dac7212abc1a0a04", + "single_end": false + }, + [ + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" + ] + ], + [ + { + "id": "SRX9626017_SRR13191702", + "run_accession": "SRR13191702", + "experiment_accession": "SRX9626017", + "library_layout": "PAIRED", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98", + "single_end": false + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + ] + ] + ], + "1": [ + "samplesheet.csv:md5,7bca96e409bd9eb6790e0d6737af686c" + ], + "2": [ + "id_mappings.csv:md5,8473773df806859c6af7acafcfe5aa6f" + ], + "3": [ + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + ], + "fastq": [ + [ + { + "id": "DRX024467_DRR026872", + "run_accession": "DRR026872", + "experiment_accession": "DRX024467", + "library_layout": "SINGLE", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_md5": "515e5448c55e054113c4a22df5f62791", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_2": "", + "md5_1": "515e5448c55e054113c4a22df5f62791", + "md5_2": "", + "single_end": true + }, + "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" + ], + [ + { + "id": "DRX026011_DRR028935", + "run_accession": "DRR028935", + "experiment_accession": "DRX026011", + "library_layout": "PAIRED", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "md5_1": "cc01df82a9354bb6b3be93483b20c35a", + "md5_2": "941c9998d746416dad53c94c480ddf30", + "single_end": false + }, + [ + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" + ] + ], + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "library_layout": "PAIRED", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, + [ + "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" + ] + ], + [ + { + "id": "ERX1234253_ERR1160846", + "run_accession": "ERR1160846", + "experiment_accession": "ERX1234253", + "library_layout": "SINGLE", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_2": "", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "single_end": true + }, + "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" + ], + [ + { + "id": "SRX10940790_SRR14593545", + "run_accession": "SRR14593545", + "experiment_accession": "SRX10940790", + "library_layout": "PAIRED", + "fastq_ftp": "", + "fastq_md5": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" + ] + ], + [ + { + "id": "SRX11047067_SRR14709033", + "run_accession": "SRR14709033", + "experiment_accession": "SRX11047067", + "library_layout": "SINGLE", + "fastq_ftp": "", + "fastq_md5": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": true + }, + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" + ], + [ + { + "id": "SRX17709227_SRR21711856", + "run_accession": "SRR21711856", + "experiment_accession": "SRX17709227", + "library_layout": "SINGLE", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_2": "", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "single_end": true + }, + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" + ], + [ + { + "id": "SRX17709228_SRR21711855", + "run_accession": "SRR21711855", + "experiment_accession": "SRX17709228", + "library_layout": "SINGLE", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_2": "", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "single_end": true + }, + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" + ], + [ + { + "id": "SRX6725035_SRR9984183", + "run_accession": "SRR9984183", + "experiment_accession": "SRX6725035", + "library_layout": "SINGLE", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_md5": "0b512d2dc31685983456bd56fd836544", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_2": "", + "md5_1": "0b512d2dc31685983456bd56fd836544", + "md5_2": "", + "single_end": true + }, + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" + ], + [ + { + "id": "SRX9315476_SRR12848126", + "run_accession": "SRR12848126", + "experiment_accession": "SRX9315476", + "library_layout": "PAIRED", + "fastq_ftp": "", + "fastq_md5": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" + ] + ], + [ + { + "id": "SRX9504942_SRR13055517", + "run_accession": "SRR13055517", + "experiment_accession": "SRX9504942", + "library_layout": "PAIRED", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", + "md5_2": "18dbe96e7f58b63406d9058938df1962", + "single_end": false + }, + [ + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" + ] + ], + [ + { + "id": "SRX9504942_SRR13055518", + "run_accession": "SRR13055518", + "experiment_accession": "SRX9504942", + "library_layout": "PAIRED", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "md5_1": "5ec894d863fcefe394470a0925aefde4", + "md5_2": "aead170df9851773d5202b5760c76d76", + "single_end": false + }, + [ + "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" + ] + ], + [ + { + "id": "SRX9504942_SRR13055519", + "run_accession": "SRR13055519", + "experiment_accession": "SRX9504942", + "library_layout": "PAIRED", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", + "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", + "single_end": false + }, + [ + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" + ] + ], + [ + { + "id": "SRX9504942_SRR13055520", + "run_accession": "SRR13055520", + "experiment_accession": "SRX9504942", + "library_layout": "PAIRED", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "md5_1": "795d460abff6009c7f5ff7c14b773fbe", + "md5_2": "c3f34379356b28d6dac7212abc1a0a04", + "single_end": false + }, + [ + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" + ] + ], + [ + { + "id": "SRX9626017_SRR13191702", + "run_accession": "SRR13191702", + "experiment_accession": "SRX9626017", + "library_layout": "PAIRED", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98", + "single_end": false + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + ] + ] + ], + "mappings": [ + "id_mappings.csv:md5,8473773df806859c6af7acafcfe5aa6f" + ], + "samplesheet": [ + "samplesheet.csv:md5,7bca96e409bd9eb6790e0d6737af686c" + ], + "versions": [ + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + ] } ], - "timestamp": "2023-08-28T09:29:59+0000" - }, - "fastq": { - "content": [ - "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791", - "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", - "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30", - "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9", - "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6", - "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", - "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2", - "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda", - "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64", - "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83", - "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544", - "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", - "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79", - "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", - "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962", - "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", - "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76", - "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", - "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88", - "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", - "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04", - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98", - [ - "DRX024467_DRR026872.fastq.gz.md5:md5,dacaeba3498fb8f405411a22cdb4b40d", - "DRX026011_DRR028935_1.fastq.gz.md5:md5,a47018c5972ba4c11539d0d6bc25eda9", - "DRX026011_DRR028935_2.fastq.gz.md5:md5,f477bbef548fbed665734ebf084eea2f", - "ERX1188904_ERR1109373_1.fastq.gz.md5:md5,50c1c3108631dc32a3151b67e0260d86", - "ERX1188904_ERR1109373_2.fastq.gz.md5:md5,1f22463d410e91a288c83d43654b2499", - "ERX1234253_ERR1160846.fastq.gz.md5:md5,513a8437ad331fc512b088b3750aa1ff", - "SRX17709227_SRR21711856.fastq.gz.md5:md5,13a38fbef27c3e15867d80887145ae75", - "SRX17709228_SRR21711855.fastq.gz.md5:md5,1e871ddd9e92e1866e0c64d36eb5ec85", - "SRX6725035_SRR9984183.fastq.gz.md5:md5,84f59dbb76c9b5eab7e14d90ced352c4", - "SRX9504942_SRR13055517_1.fastq.gz.md5:md5,a03f7f374dc401047b6f6ccaec3885cc", - "SRX9504942_SRR13055517_2.fastq.gz.md5:md5,facaf207753e977327e7b7df7bb8ace0", - "SRX9504942_SRR13055518_1.fastq.gz.md5:md5,5cf412cd62aadaa4838d9eabb5b44368", - "SRX9504942_SRR13055518_2.fastq.gz.md5:md5,93292b826afc72b23be93df26dd710c8", - "SRX9504942_SRR13055519_1.fastq.gz.md5:md5,f6ad6e2610397147a0a55c651de3992f", - "SRX9504942_SRR13055519_2.fastq.gz.md5:md5,2fe7dd4bcc1e7e61c6f54ef50cf961f3", - "SRX9504942_SRR13055520_1.fastq.gz.md5:md5,ab195b37746a3424a1099d9f8cc58de8", - "SRX9504942_SRR13055520_2.fastq.gz.md5:md5,10c448e23f1f7e7af61ec1204f8fc882", - "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", - "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" - ] - ], - "timestamp": "2023-08-28T09:29:59+0000" + "timestamp": "2023-09-11T16:47:26.813819" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test.snap b/workflows/sra/tests/sra_force_sratools_download.nf.test.snap index 331943c5..2c779c84 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test.snap +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test.snap @@ -1,31 +1,1351 @@ { - "fastq": { + "Parameters: --force_sratools_download": { "content": [ - "DRX024467_DRR026872.fastq.gz:md5,bd3f113c3b06cf4499fa0e00c634ec85", - "DRX026011_DRR028935_1.fastq.gz:md5,0f96fb60e903c8cbd55a6977e66f7c93", - "DRX026011_DRR028935_2.fastq.gz:md5,b97b1e0e806bcae10a7443e2f22d6ca2", - "ERX1188904_ERR1109373_1.fastq.gz:md5,e7edae2715dfaf4c318d37959fd9ae22", - "ERX1188904_ERR1109373_2.fastq.gz:md5,34ab048c92201a5ec4ab36d8dc1c5732", - "ERX1234253_ERR1160846.fastq.gz:md5,22683b24b2467494e430643423f1e275", - "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", - "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2", - "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda", - "SRX17709227_SRR21711856.fastq.gz:md5,eae43f1368d4568f415581394dc9726e", - "SRX17709228_SRR21711855.fastq.gz:md5,5194f8009b74552595c4ec5b7605d231", - "SRX6725035_SRR9984183.fastq.gz:md5,7a70e678c400366869601c8be41fe74b", - "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", - "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79", - "SRX9504942_SRR13055517_1.fastq.gz:md5,b6d912a73466c8f27b1d8021f80ec2bb", - "SRX9504942_SRR13055517_2.fastq.gz:md5,7c6e220694fa5d6d9124c739aa70ea92", - "SRX9504942_SRR13055518_1.fastq.gz:md5,ed29278c21a1bb2d8907a74be0dd4bc4", - "SRX9504942_SRR13055518_2.fastq.gz:md5,83785b728312deb81483fc1fd5b14264", - "SRX9504942_SRR13055519_1.fastq.gz:md5,28babc59a625b5161d97392efd4d0018", - "SRX9504942_SRR13055519_2.fastq.gz:md5,cf1eb4c61ab3522f4d473c86b2f696e1", - "SRX9504942_SRR13055520_1.fastq.gz:md5,cc75af896ec8a7cececb37851b0c6fcd", - "SRX9504942_SRR13055520_2.fastq.gz:md5,fe3e2bf9f738e4959243fad59e879eae", - "SRX9626017_SRR13191702_1.fastq.gz:md5,627a90afcd9f3cfc7f5f91074f9a2df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,3d9b2c68a8ad1547105b17de81b2d9af" + { + "0": [ + [ + { + "id": "DRX024467_DRR026872", + "run_accession": "DRR026872", + "experiment_accession": "DRX024467", + "sample_accession": "SAMD00023098", + "secondary_sample_accession": "DRS033740", + "study_accession": "PRJDB4356", + "secondary_study_accession": "DRP003256", + "submission_accession": "DRA002758", + "run_alias": "DRR026872", + "experiment_alias": "DRX024467", + "sample_alias": "SAMD00023098", + "study_alias": "DRP003256", + "library_layout": "SINGLE", + "library_selection": "Restriction Digest", + "library_source": "GENOMIC", + "library_strategy": "OTHER", + "library_name": "IpeRAD1_3", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "62550", + "read_count": "417", + "tax_id": "35883", + "scientific_name": "Ipomoea nil", + "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", + "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", + "study_title": "The Japanese morning glory genome sequence", + "sample_description": "Keywords: GSC:MIxS MIGS:6.0", + "fastq_md5": "515e5448c55e054113c4a22df5f62791", + "fastq_bytes": "38447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_2": "", + "md5_1": "515e5448c55e054113c4a22df5f62791", + "md5_2": "", + "single_end": true + }, + "DRX024467_DRR026872.fastq.gz:md5,bd3f113c3b06cf4499fa0e00c634ec85" + ], + [ + { + "id": "DRX026011_DRR028935", + "run_accession": "DRR028935", + "experiment_accession": "DRX026011", + "sample_accession": "SAMD00024405", + "secondary_sample_accession": "DRS019431", + "study_accession": "PRJDB3420", + "secondary_study_accession": "DRP002616", + "submission_accession": "DRA002949", + "run_alias": "DRR028935", + "experiment_alias": "DRX026011", + "sample_alias": "SAMD00024405", + "study_alias": "DRP002616", + "library_layout": "PAIRED", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "day0_BbSQE-I", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "194930", + "read_count": "965", + "tax_id": "1202541", + "scientific_name": "Botryococcus braunii Showa", + "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", + "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", + "sample_description": "Liquid culture", + "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", + "fastq_bytes": "60275;61610", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "md5_1": "cc01df82a9354bb6b3be93483b20c35a", + "md5_2": "941c9998d746416dad53c94c480ddf30", + "single_end": false + }, + [ + "DRX026011_DRR028935_1.fastq.gz:md5,0f96fb60e903c8cbd55a6977e66f7c93", + "DRX026011_DRR028935_2.fastq.gz:md5,b97b1e0e806bcae10a7443e2f22d6ca2" + ] + ], + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "sample_accession": "SAMEA3643867", + "secondary_sample_accession": "ERS951016", + "study_accession": "PRJEB11633", + "secondary_study_accession": "ERP013030", + "submission_accession": "ERA528939", + "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", + "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", + "sample_alias": "sample_56", + "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", + "library_layout": "PAIRED", + "library_selection": "RT-PCR", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "unspecified", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "29700", + "read_count": "169", + "tax_id": "63433", + "scientific_name": "Leptopilina boulardi", + "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing", + "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", + "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_bytes": "3221;8151;8118", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, + [ + "ERX1188904_ERR1109373_1.fastq.gz:md5,e7edae2715dfaf4c318d37959fd9ae22", + "ERX1188904_ERR1109373_2.fastq.gz:md5,34ab048c92201a5ec4ab36d8dc1c5732" + ] + ], + [ + { + "id": "ERX1234253_ERR1160846", + "run_accession": "ERR1160846", + "experiment_accession": "ERX1234253", + "sample_accession": "SAMEA3687214", + "secondary_sample_accession": "ERS994363", + "study_accession": "PRJEB11419", + "secondary_study_accession": "ERP012803", + "submission_accession": "ERA541392", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "study_alias": "qiita_sid_10317", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "10317.BLANK.93.3E.r22", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "35658", + "read_count": "283", + "tax_id": "256318", + "scientific_name": "metagenome", + "sample_title": "10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "study_title": "American Gut Project", + "sample_description": "American Gut control", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_2": "", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "single_end": true + }, + "ERX1234253_ERR1160846.fastq.gz:md5,22683b24b2467494e430643423f1e275" + ], + [ + { + "id": "SRX10940790_SRR14593545", + "run_accession": "SRR14593545", + "experiment_accession": "SRX10940790", + "sample_accession": "SAMN19097423", + "secondary_sample_accession": "SRS9020442", + "study_accession": "PRJNA728650", + "secondary_study_accession": "SRP319413", + "submission_accession": "SRA1234280", + "run_alias": "577-6_530058_19-037147 Goat_F.ab1", + "experiment_alias": "PRNP_2765", + "sample_alias": "prp_2765", + "study_alias": "PRJNA728650", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "PRNP_2765", + "instrument_model": "AB 3500xL Genetic Analyzer", + "instrument_platform": "CAPILLARY", + "base_count": "828", + "read_count": "1", + "tax_id": "9925", + "scientific_name": "Capra hircus", + "sample_title": "MIGS Eukaryotic sample from Capra hircus", + "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", + "study_title": "Capra hircus Raw sequence reads", + "sample_description": "Keywords: GSC:MIxS MIGS:5.0", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" + ] + ], + [ + { + "id": "SRX11047067_SRR14709033", + "run_accession": "SRR14709033", + "experiment_accession": "SRX11047067", + "sample_accession": "SAMN19373034", + "secondary_sample_accession": "SRS9115923", + "study_accession": "PRJNA733285", + "secondary_study_accession": "SRP322267", + "submission_accession": "SRA1239521", + "run_alias": "Sebastes_levis-2.fastq", + "experiment_alias": "Sebastes_macdonaldi-1", + "sample_alias": "S._macdonaldi-1", + "study_alias": "PRJNA733285", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "Sebastes_macdonaldi-1", + "instrument_model": "AB 5500 Genetic Analyzer", + "instrument_platform": "ABI_SOLID", + "base_count": "153", + "read_count": "1", + "tax_id": "394693", + "scientific_name": "Sebastes macdonaldi", + "sample_title": "Sebastes_macdonaldi-1", + "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", + "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", + "sample_description": "Sebastes_macdonaldi-1", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": true + }, + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" + ], + [ + { + "id": "SRX17709227_SRR21711856", + "run_accession": "SRR21711856", + "experiment_accession": "SRX17709227", + "sample_accession": "SAMN31021823", + "secondary_sample_accession": "SRS15239723", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601460_r1", + "experiment_alias": "GSM6601460_r1", + "sample_alias": "GSM6601460", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601460", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "573417800", + "read_count": "11468356", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "sham-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "sham-treated worms in day 5", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_2": "", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "single_end": true + }, + "SRX17709227_SRR21711856.fastq.gz:md5,eae43f1368d4568f415581394dc9726e" + ], + [ + { + "id": "SRX17709228_SRR21711855", + "run_accession": "SRR21711855", + "experiment_accession": "SRX17709228", + "sample_accession": "SAMN31021822", + "secondary_sample_accession": "SRS15239724", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601461_r1", + "experiment_alias": "GSM6601461_r1", + "sample_alias": "GSM6601461", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601461", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "677912850", + "read_count": "13558257", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "PM2.5-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "PM2.5-treated worms in day 5", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_2": "", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "single_end": true + }, + "SRX17709228_SRR21711855.fastq.gz:md5,5194f8009b74552595c4ec5b7605d231" + ], + [ + { + "id": "SRX6725035_SRR9984183", + "run_accession": "SRR9984183", + "experiment_accession": "SRX6725035", + "sample_accession": "SAMN12581720", + "secondary_sample_accession": "SRS5277011", + "study_accession": "PRJNA560329", + "secondary_study_accession": "SRP218535", + "submission_accession": "SRA942061", + "run_alias": "Emb289P1_bin131.fastq", + "experiment_alias": "Emb289P1_bin131", + "sample_alias": "Emb289P1_bin131", + "study_alias": "PRJNA560329", + "library_layout": "SINGLE", + "library_selection": "RANDOM", + "library_source": "METAGENOMIC", + "library_strategy": "WGS", + "library_name": "Emb289P1_bin131", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "1996273", + "read_count": "58", + "tax_id": "2660712", + "scientific_name": "Defluviitaleaceae bacterium", + "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", + "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", + "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", + "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", + "fastq_md5": "0b512d2dc31685983456bd56fd836544", + "fastq_bytes": "605358", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_2": "", + "md5_1": "0b512d2dc31685983456bd56fd836544", + "md5_2": "", + "single_end": true + }, + "SRX6725035_SRR9984183.fastq.gz:md5,7a70e678c400366869601c8be41fe74b" + ], + [ + { + "id": "SRX9315476_SRR12848126", + "run_accession": "SRR12848126", + "experiment_accession": "SRX9315476", + "sample_accession": "SAMN16455283", + "secondary_sample_accession": "SRS7540262", + "study_accession": "PRJNA670070", + "secondary_study_accession": "SRP287769", + "submission_accession": "SRA1145417", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "experiment_alias": "F11-N1-05", + "sample_alias": "F11-N1-05", + "study_alias": "PRJNA670070", + "library_layout": "PAIRED", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "library_name": "F11-N1-05", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "base_count": "431758", + "read_count": "2954", + "tax_id": "10092", + "scientific_name": "Mus musculus domesticus", + "sample_title": "Longshanks_F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "sample_description": "F11-N1-05", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" + ] + ], + [ + { + "id": "SRX9504942_SRR13055517", + "run_accession": "SRR13055517", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r1", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2246028", + "read_count": "29553", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", + "fastq_bytes": "721167;723753", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", + "md5_2": "18dbe96e7f58b63406d9058938df1962", + "single_end": false + }, + [ + "SRX9504942_SRR13055517_1.fastq.gz:md5,b6d912a73466c8f27b1d8021f80ec2bb", + "SRX9504942_SRR13055517_2.fastq.gz:md5,7c6e220694fa5d6d9124c739aa70ea92" + ] + ], + [ + { + "id": "SRX9504942_SRR13055518", + "run_accession": "SRR13055518", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r2", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2235236", + "read_count": "29411", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", + "fastq_bytes": "717693;723429", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "md5_1": "5ec894d863fcefe394470a0925aefde4", + "md5_2": "aead170df9851773d5202b5760c76d76", + "single_end": false + }, + [ + "SRX9504942_SRR13055518_1.fastq.gz:md5,ed29278c21a1bb2d8907a74be0dd4bc4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,83785b728312deb81483fc1fd5b14264" + ] + ], + [ + { + "id": "SRX9504942_SRR13055519", + "run_accession": "SRR13055519", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r3", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2232728", + "read_count": "29378", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", + "fastq_bytes": "714907;721705", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", + "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", + "single_end": false + }, + [ + "SRX9504942_SRR13055519_1.fastq.gz:md5,28babc59a625b5161d97392efd4d0018", + "SRX9504942_SRR13055519_2.fastq.gz:md5,cf1eb4c61ab3522f4d473c86b2f696e1" + ] + ], + [ + { + "id": "SRX9504942_SRR13055520", + "run_accession": "SRR13055520", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r4", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2214488", + "read_count": "29138", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", + "fastq_bytes": "709867;716862", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "md5_1": "795d460abff6009c7f5ff7c14b773fbe", + "md5_2": "c3f34379356b28d6dac7212abc1a0a04", + "single_end": false + }, + [ + "SRX9504942_SRR13055520_1.fastq.gz:md5,cc75af896ec8a7cececb37851b0c6fcd", + "SRX9504942_SRR13055520_2.fastq.gz:md5,fe3e2bf9f738e4959243fad59e879eae" + ] + ], + [ + { + "id": "SRX9626017_SRR13191702", + "run_accession": "SRR13191702", + "experiment_accession": "SRX9626017", + "sample_accession": "SAMN16980141", + "secondary_sample_accession": "SRS7827211", + "study_accession": "PRJNA682076", + "secondary_study_accession": "SRP295653", + "submission_accession": "SRA1166126", + "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", + "experiment_alias": "S.170804.00784", + "sample_alias": "S.170804.00784_662", + "study_alias": "PRJNA682076", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "S.170804.00784", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "45682", + "read_count": "91", + "tax_id": "408170", + "scientific_name": "human gut metagenome", + "sample_title": "Metagenome or environmental sample from human gut metagenome", + "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "sample_description": "Metagenome or environmental sample from human gut metagenome", + "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", + "fastq_bytes": "15420;16324", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98", + "single_end": false + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,627a90afcd9f3cfc7f5f91074f9a2df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,3d9b2c68a8ad1547105b17de81b2d9af" + ] + ] + ], + "1": [ + "samplesheet.csv:md5,9d4b95a31702af34a6f57d963137340d" + ], + "2": [ + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + ], + "3": [ + "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + ], + "fastq": [ + [ + { + "id": "DRX024467_DRR026872", + "run_accession": "DRR026872", + "experiment_accession": "DRX024467", + "sample_accession": "SAMD00023098", + "secondary_sample_accession": "DRS033740", + "study_accession": "PRJDB4356", + "secondary_study_accession": "DRP003256", + "submission_accession": "DRA002758", + "run_alias": "DRR026872", + "experiment_alias": "DRX024467", + "sample_alias": "SAMD00023098", + "study_alias": "DRP003256", + "library_layout": "SINGLE", + "library_selection": "Restriction Digest", + "library_source": "GENOMIC", + "library_strategy": "OTHER", + "library_name": "IpeRAD1_3", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "62550", + "read_count": "417", + "tax_id": "35883", + "scientific_name": "Ipomoea nil", + "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", + "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", + "study_title": "The Japanese morning glory genome sequence", + "sample_description": "Keywords: GSC:MIxS MIGS:6.0", + "fastq_md5": "515e5448c55e054113c4a22df5f62791", + "fastq_bytes": "38447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_2": "", + "md5_1": "515e5448c55e054113c4a22df5f62791", + "md5_2": "", + "single_end": true + }, + "DRX024467_DRR026872.fastq.gz:md5,bd3f113c3b06cf4499fa0e00c634ec85" + ], + [ + { + "id": "DRX026011_DRR028935", + "run_accession": "DRR028935", + "experiment_accession": "DRX026011", + "sample_accession": "SAMD00024405", + "secondary_sample_accession": "DRS019431", + "study_accession": "PRJDB3420", + "secondary_study_accession": "DRP002616", + "submission_accession": "DRA002949", + "run_alias": "DRR028935", + "experiment_alias": "DRX026011", + "sample_alias": "SAMD00024405", + "study_alias": "DRP002616", + "library_layout": "PAIRED", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "day0_BbSQE-I", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "194930", + "read_count": "965", + "tax_id": "1202541", + "scientific_name": "Botryococcus braunii Showa", + "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", + "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", + "sample_description": "Liquid culture", + "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", + "fastq_bytes": "60275;61610", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "md5_1": "cc01df82a9354bb6b3be93483b20c35a", + "md5_2": "941c9998d746416dad53c94c480ddf30", + "single_end": false + }, + [ + "DRX026011_DRR028935_1.fastq.gz:md5,0f96fb60e903c8cbd55a6977e66f7c93", + "DRX026011_DRR028935_2.fastq.gz:md5,b97b1e0e806bcae10a7443e2f22d6ca2" + ] + ], + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "sample_accession": "SAMEA3643867", + "secondary_sample_accession": "ERS951016", + "study_accession": "PRJEB11633", + "secondary_study_accession": "ERP013030", + "submission_accession": "ERA528939", + "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", + "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", + "sample_alias": "sample_56", + "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", + "library_layout": "PAIRED", + "library_selection": "RT-PCR", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "unspecified", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "29700", + "read_count": "169", + "tax_id": "63433", + "scientific_name": "Leptopilina boulardi", + "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing", + "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", + "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_bytes": "3221;8151;8118", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, + [ + "ERX1188904_ERR1109373_1.fastq.gz:md5,e7edae2715dfaf4c318d37959fd9ae22", + "ERX1188904_ERR1109373_2.fastq.gz:md5,34ab048c92201a5ec4ab36d8dc1c5732" + ] + ], + [ + { + "id": "ERX1234253_ERR1160846", + "run_accession": "ERR1160846", + "experiment_accession": "ERX1234253", + "sample_accession": "SAMEA3687214", + "secondary_sample_accession": "ERS994363", + "study_accession": "PRJEB11419", + "secondary_study_accession": "ERP012803", + "submission_accession": "ERA541392", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "study_alias": "qiita_sid_10317", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "10317.BLANK.93.3E.r22", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "35658", + "read_count": "283", + "tax_id": "256318", + "scientific_name": "metagenome", + "sample_title": "10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "study_title": "American Gut Project", + "sample_description": "American Gut control", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_2": "", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "single_end": true + }, + "ERX1234253_ERR1160846.fastq.gz:md5,22683b24b2467494e430643423f1e275" + ], + [ + { + "id": "SRX10940790_SRR14593545", + "run_accession": "SRR14593545", + "experiment_accession": "SRX10940790", + "sample_accession": "SAMN19097423", + "secondary_sample_accession": "SRS9020442", + "study_accession": "PRJNA728650", + "secondary_study_accession": "SRP319413", + "submission_accession": "SRA1234280", + "run_alias": "577-6_530058_19-037147 Goat_F.ab1", + "experiment_alias": "PRNP_2765", + "sample_alias": "prp_2765", + "study_alias": "PRJNA728650", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "PRNP_2765", + "instrument_model": "AB 3500xL Genetic Analyzer", + "instrument_platform": "CAPILLARY", + "base_count": "828", + "read_count": "1", + "tax_id": "9925", + "scientific_name": "Capra hircus", + "sample_title": "MIGS Eukaryotic sample from Capra hircus", + "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", + "study_title": "Capra hircus Raw sequence reads", + "sample_description": "Keywords: GSC:MIxS MIGS:5.0", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" + ] + ], + [ + { + "id": "SRX11047067_SRR14709033", + "run_accession": "SRR14709033", + "experiment_accession": "SRX11047067", + "sample_accession": "SAMN19373034", + "secondary_sample_accession": "SRS9115923", + "study_accession": "PRJNA733285", + "secondary_study_accession": "SRP322267", + "submission_accession": "SRA1239521", + "run_alias": "Sebastes_levis-2.fastq", + "experiment_alias": "Sebastes_macdonaldi-1", + "sample_alias": "S._macdonaldi-1", + "study_alias": "PRJNA733285", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "Sebastes_macdonaldi-1", + "instrument_model": "AB 5500 Genetic Analyzer", + "instrument_platform": "ABI_SOLID", + "base_count": "153", + "read_count": "1", + "tax_id": "394693", + "scientific_name": "Sebastes macdonaldi", + "sample_title": "Sebastes_macdonaldi-1", + "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", + "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", + "sample_description": "Sebastes_macdonaldi-1", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": true + }, + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" + ], + [ + { + "id": "SRX17709227_SRR21711856", + "run_accession": "SRR21711856", + "experiment_accession": "SRX17709227", + "sample_accession": "SAMN31021823", + "secondary_sample_accession": "SRS15239723", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601460_r1", + "experiment_alias": "GSM6601460_r1", + "sample_alias": "GSM6601460", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601460", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "573417800", + "read_count": "11468356", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "sham-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "sham-treated worms in day 5", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_2": "", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "single_end": true + }, + "SRX17709227_SRR21711856.fastq.gz:md5,eae43f1368d4568f415581394dc9726e" + ], + [ + { + "id": "SRX17709228_SRR21711855", + "run_accession": "SRR21711855", + "experiment_accession": "SRX17709228", + "sample_accession": "SAMN31021822", + "secondary_sample_accession": "SRS15239724", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601461_r1", + "experiment_alias": "GSM6601461_r1", + "sample_alias": "GSM6601461", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601461", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "677912850", + "read_count": "13558257", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "PM2.5-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "PM2.5-treated worms in day 5", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_2": "", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "single_end": true + }, + "SRX17709228_SRR21711855.fastq.gz:md5,5194f8009b74552595c4ec5b7605d231" + ], + [ + { + "id": "SRX6725035_SRR9984183", + "run_accession": "SRR9984183", + "experiment_accession": "SRX6725035", + "sample_accession": "SAMN12581720", + "secondary_sample_accession": "SRS5277011", + "study_accession": "PRJNA560329", + "secondary_study_accession": "SRP218535", + "submission_accession": "SRA942061", + "run_alias": "Emb289P1_bin131.fastq", + "experiment_alias": "Emb289P1_bin131", + "sample_alias": "Emb289P1_bin131", + "study_alias": "PRJNA560329", + "library_layout": "SINGLE", + "library_selection": "RANDOM", + "library_source": "METAGENOMIC", + "library_strategy": "WGS", + "library_name": "Emb289P1_bin131", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "1996273", + "read_count": "58", + "tax_id": "2660712", + "scientific_name": "Defluviitaleaceae bacterium", + "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", + "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", + "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", + "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", + "fastq_md5": "0b512d2dc31685983456bd56fd836544", + "fastq_bytes": "605358", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_2": "", + "md5_1": "0b512d2dc31685983456bd56fd836544", + "md5_2": "", + "single_end": true + }, + "SRX6725035_SRR9984183.fastq.gz:md5,7a70e678c400366869601c8be41fe74b" + ], + [ + { + "id": "SRX9315476_SRR12848126", + "run_accession": "SRR12848126", + "experiment_accession": "SRX9315476", + "sample_accession": "SAMN16455283", + "secondary_sample_accession": "SRS7540262", + "study_accession": "PRJNA670070", + "secondary_study_accession": "SRP287769", + "submission_accession": "SRA1145417", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "experiment_alias": "F11-N1-05", + "sample_alias": "F11-N1-05", + "study_alias": "PRJNA670070", + "library_layout": "PAIRED", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "library_name": "F11-N1-05", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "base_count": "431758", + "read_count": "2954", + "tax_id": "10092", + "scientific_name": "Mus musculus domesticus", + "sample_title": "Longshanks_F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "sample_description": "F11-N1-05", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" + ] + ], + [ + { + "id": "SRX9504942_SRR13055517", + "run_accession": "SRR13055517", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r1", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2246028", + "read_count": "29553", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", + "fastq_bytes": "721167;723753", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", + "md5_2": "18dbe96e7f58b63406d9058938df1962", + "single_end": false + }, + [ + "SRX9504942_SRR13055517_1.fastq.gz:md5,b6d912a73466c8f27b1d8021f80ec2bb", + "SRX9504942_SRR13055517_2.fastq.gz:md5,7c6e220694fa5d6d9124c739aa70ea92" + ] + ], + [ + { + "id": "SRX9504942_SRR13055518", + "run_accession": "SRR13055518", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r2", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2235236", + "read_count": "29411", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", + "fastq_bytes": "717693;723429", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "md5_1": "5ec894d863fcefe394470a0925aefde4", + "md5_2": "aead170df9851773d5202b5760c76d76", + "single_end": false + }, + [ + "SRX9504942_SRR13055518_1.fastq.gz:md5,ed29278c21a1bb2d8907a74be0dd4bc4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,83785b728312deb81483fc1fd5b14264" + ] + ], + [ + { + "id": "SRX9504942_SRR13055519", + "run_accession": "SRR13055519", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r3", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2232728", + "read_count": "29378", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", + "fastq_bytes": "714907;721705", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", + "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", + "single_end": false + }, + [ + "SRX9504942_SRR13055519_1.fastq.gz:md5,28babc59a625b5161d97392efd4d0018", + "SRX9504942_SRR13055519_2.fastq.gz:md5,cf1eb4c61ab3522f4d473c86b2f696e1" + ] + ], + [ + { + "id": "SRX9504942_SRR13055520", + "run_accession": "SRR13055520", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r4", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2214488", + "read_count": "29138", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", + "fastq_bytes": "709867;716862", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "md5_1": "795d460abff6009c7f5ff7c14b773fbe", + "md5_2": "c3f34379356b28d6dac7212abc1a0a04", + "single_end": false + }, + [ + "SRX9504942_SRR13055520_1.fastq.gz:md5,cc75af896ec8a7cececb37851b0c6fcd", + "SRX9504942_SRR13055520_2.fastq.gz:md5,fe3e2bf9f738e4959243fad59e879eae" + ] + ], + [ + { + "id": "SRX9626017_SRR13191702", + "run_accession": "SRR13191702", + "experiment_accession": "SRX9626017", + "sample_accession": "SAMN16980141", + "secondary_sample_accession": "SRS7827211", + "study_accession": "PRJNA682076", + "secondary_study_accession": "SRP295653", + "submission_accession": "SRA1166126", + "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", + "experiment_alias": "S.170804.00784", + "sample_alias": "S.170804.00784_662", + "study_alias": "PRJNA682076", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "S.170804.00784", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "45682", + "read_count": "91", + "tax_id": "408170", + "scientific_name": "human gut metagenome", + "sample_title": "Metagenome or environmental sample from human gut metagenome", + "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "sample_description": "Metagenome or environmental sample from human gut metagenome", + "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", + "fastq_bytes": "15420;16324", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98", + "single_end": false + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,627a90afcd9f3cfc7f5f91074f9a2df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,3d9b2c68a8ad1547105b17de81b2d9af" + ] + ] + ], + "mappings": [ + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + ], + "samplesheet": [ + "samplesheet.csv:md5,9d4b95a31702af34a6f57d963137340d" + ], + "versions": [ + "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + ] + } ], - "timestamp": "2023-08-28T12:35:42+0000" + "timestamp": "2023-09-11T17:03:59.154427" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap index 0ccec99b..069e3390 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap @@ -1,88 +1,1353 @@ { - "metadata": { - "content": [ - "DRR026872.runinfo_ftp.tsv:md5,73606f6a05c45b077809da43ca638b5f", - "DRR028935.runinfo_ftp.tsv:md5,f79eefcea5db346f76f76f87df7f8dd2", - "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", - "ERR1160846.runinfo_ftp.tsv:md5,1b2dc1a64117de20b2164724836da345", - "GSE214215.runinfo_ftp.tsv:md5,23a580c89ee7bf681ca3ffa26aa1837f", - "SRR12848126.runinfo_ftp.tsv:md5,5d1e6bfd3d4077d1e66378c58e44975d", - "SRR13191702.runinfo_ftp.tsv:md5,409e262bb41bb6103315126db4d0dd1d", - "SRR14593545.runinfo_ftp.tsv:md5,62015706ac156693ba3d86ed050cab54", - "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", - "SRR9984183.runinfo_ftp.tsv:md5,53ab34ff3612b0e2c7d60476822787be" - ], - "timestamp": "2023-08-28T10:05:53+0000" - }, - "samplesheet": { - "content": [ - "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565", - "samplesheet.csv:md5,252449b9f66687af076bb5a9dfea4551" - ], - "timestamp": "2023-08-28T10:05:53+0000" - }, - "software_versions": { - "content": [ - "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" - ], - "timestamp": "2023-08-28T10:05:53+0000" - }, - "Parameters: '--nf_core_pipeline atacseq'": { + "Parameters: --nf_core_pipeline atacseq": { "content": [ { - + "0": [ + [ + { + "id": "DRX024467_DRR026872", + "run_accession": "DRR026872", + "experiment_accession": "DRX024467", + "sample_accession": "SAMD00023098", + "secondary_sample_accession": "DRS033740", + "study_accession": "PRJDB4356", + "secondary_study_accession": "DRP003256", + "submission_accession": "DRA002758", + "run_alias": "DRR026872", + "experiment_alias": "DRX024467", + "sample_alias": "SAMD00023098", + "study_alias": "DRP003256", + "library_layout": "SINGLE", + "library_selection": "Restriction Digest", + "library_source": "GENOMIC", + "library_strategy": "OTHER", + "library_name": "IpeRAD1_3", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "62550", + "read_count": "417", + "tax_id": "35883", + "scientific_name": "Ipomoea nil", + "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", + "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", + "study_title": "The Japanese morning glory genome sequence", + "sample_description": "Keywords: GSC:MIxS MIGS:6.0", + "fastq_md5": "515e5448c55e054113c4a22df5f62791", + "fastq_bytes": "38447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_2": "", + "md5_1": "515e5448c55e054113c4a22df5f62791", + "md5_2": "", + "single_end": true + }, + "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" + ], + [ + { + "id": "DRX026011_DRR028935", + "run_accession": "DRR028935", + "experiment_accession": "DRX026011", + "sample_accession": "SAMD00024405", + "secondary_sample_accession": "DRS019431", + "study_accession": "PRJDB3420", + "secondary_study_accession": "DRP002616", + "submission_accession": "DRA002949", + "run_alias": "DRR028935", + "experiment_alias": "DRX026011", + "sample_alias": "SAMD00024405", + "study_alias": "DRP002616", + "library_layout": "PAIRED", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "day0_BbSQE-I", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "194930", + "read_count": "965", + "tax_id": "1202541", + "scientific_name": "Botryococcus braunii Showa", + "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", + "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", + "sample_description": "Liquid culture", + "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", + "fastq_bytes": "60275;61610", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "md5_1": "cc01df82a9354bb6b3be93483b20c35a", + "md5_2": "941c9998d746416dad53c94c480ddf30", + "single_end": false + }, + [ + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" + ] + ], + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "sample_accession": "SAMEA3643867", + "secondary_sample_accession": "ERS951016", + "study_accession": "PRJEB11633", + "secondary_study_accession": "ERP013030", + "submission_accession": "ERA528939", + "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", + "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", + "sample_alias": "sample_56", + "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", + "library_layout": "PAIRED", + "library_selection": "RT-PCR", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "unspecified", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "29700", + "read_count": "169", + "tax_id": "63433", + "scientific_name": "Leptopilina boulardi", + "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing", + "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", + "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_bytes": "3221;8151;8118", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, + [ + "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" + ] + ], + [ + { + "id": "ERX1234253_ERR1160846", + "run_accession": "ERR1160846", + "experiment_accession": "ERX1234253", + "sample_accession": "SAMEA3687214", + "secondary_sample_accession": "ERS994363", + "study_accession": "PRJEB11419", + "secondary_study_accession": "ERP012803", + "submission_accession": "ERA541392", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "study_alias": "qiita_sid_10317", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "10317.BLANK.93.3E.r22", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "35658", + "read_count": "283", + "tax_id": "256318", + "scientific_name": "metagenome", + "sample_title": "10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "study_title": "American Gut Project", + "sample_description": "American Gut control", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_2": "", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "single_end": true + }, + "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" + ], + [ + { + "id": "SRX10940790_SRR14593545", + "run_accession": "SRR14593545", + "experiment_accession": "SRX10940790", + "sample_accession": "SAMN19097423", + "secondary_sample_accession": "SRS9020442", + "study_accession": "PRJNA728650", + "secondary_study_accession": "SRP319413", + "submission_accession": "SRA1234280", + "run_alias": "577-6_530058_19-037147 Goat_F.ab1", + "experiment_alias": "PRNP_2765", + "sample_alias": "prp_2765", + "study_alias": "PRJNA728650", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "PRNP_2765", + "instrument_model": "AB 3500xL Genetic Analyzer", + "instrument_platform": "CAPILLARY", + "base_count": "828", + "read_count": "1", + "tax_id": "9925", + "scientific_name": "Capra hircus", + "sample_title": "MIGS Eukaryotic sample from Capra hircus", + "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", + "study_title": "Capra hircus Raw sequence reads", + "sample_description": "Keywords: GSC:MIxS MIGS:5.0", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" + ] + ], + [ + { + "id": "SRX11047067_SRR14709033", + "run_accession": "SRR14709033", + "experiment_accession": "SRX11047067", + "sample_accession": "SAMN19373034", + "secondary_sample_accession": "SRS9115923", + "study_accession": "PRJNA733285", + "secondary_study_accession": "SRP322267", + "submission_accession": "SRA1239521", + "run_alias": "Sebastes_levis-2.fastq", + "experiment_alias": "Sebastes_macdonaldi-1", + "sample_alias": "S._macdonaldi-1", + "study_alias": "PRJNA733285", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "Sebastes_macdonaldi-1", + "instrument_model": "AB 5500 Genetic Analyzer", + "instrument_platform": "ABI_SOLID", + "base_count": "153", + "read_count": "1", + "tax_id": "394693", + "scientific_name": "Sebastes macdonaldi", + "sample_title": "Sebastes_macdonaldi-1", + "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", + "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", + "sample_description": "Sebastes_macdonaldi-1", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": true + }, + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" + ], + [ + { + "id": "SRX17709227_SRR21711856", + "run_accession": "SRR21711856", + "experiment_accession": "SRX17709227", + "sample_accession": "SAMN31021823", + "secondary_sample_accession": "SRS15239723", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601460_r1", + "experiment_alias": "GSM6601460_r1", + "sample_alias": "GSM6601460", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601460", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "573417800", + "read_count": "11468356", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "sham-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "sham-treated worms in day 5", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_2": "", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "single_end": true + }, + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" + ], + [ + { + "id": "SRX17709228_SRR21711855", + "run_accession": "SRR21711855", + "experiment_accession": "SRX17709228", + "sample_accession": "SAMN31021822", + "secondary_sample_accession": "SRS15239724", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601461_r1", + "experiment_alias": "GSM6601461_r1", + "sample_alias": "GSM6601461", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601461", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "677912850", + "read_count": "13558257", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "PM2.5-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "PM2.5-treated worms in day 5", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_2": "", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "single_end": true + }, + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" + ], + [ + { + "id": "SRX6725035_SRR9984183", + "run_accession": "SRR9984183", + "experiment_accession": "SRX6725035", + "sample_accession": "SAMN12581720", + "secondary_sample_accession": "SRS5277011", + "study_accession": "PRJNA560329", + "secondary_study_accession": "SRP218535", + "submission_accession": "SRA942061", + "run_alias": "Emb289P1_bin131.fastq", + "experiment_alias": "Emb289P1_bin131", + "sample_alias": "Emb289P1_bin131", + "study_alias": "PRJNA560329", + "library_layout": "SINGLE", + "library_selection": "RANDOM", + "library_source": "METAGENOMIC", + "library_strategy": "WGS", + "library_name": "Emb289P1_bin131", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "1996273", + "read_count": "58", + "tax_id": "2660712", + "scientific_name": "Defluviitaleaceae bacterium", + "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", + "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", + "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", + "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", + "fastq_md5": "0b512d2dc31685983456bd56fd836544", + "fastq_bytes": "605358", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_2": "", + "md5_1": "0b512d2dc31685983456bd56fd836544", + "md5_2": "", + "single_end": true + }, + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" + ], + [ + { + "id": "SRX9315476_SRR12848126", + "run_accession": "SRR12848126", + "experiment_accession": "SRX9315476", + "sample_accession": "SAMN16455283", + "secondary_sample_accession": "SRS7540262", + "study_accession": "PRJNA670070", + "secondary_study_accession": "SRP287769", + "submission_accession": "SRA1145417", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "experiment_alias": "F11-N1-05", + "sample_alias": "F11-N1-05", + "study_alias": "PRJNA670070", + "library_layout": "PAIRED", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "library_name": "F11-N1-05", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "base_count": "431758", + "read_count": "2954", + "tax_id": "10092", + "scientific_name": "Mus musculus domesticus", + "sample_title": "Longshanks_F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "sample_description": "F11-N1-05", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" + ] + ], + [ + { + "id": "SRX9504942_SRR13055517", + "run_accession": "SRR13055517", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r1", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2246028", + "read_count": "29553", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", + "fastq_bytes": "721167;723753", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", + "md5_2": "18dbe96e7f58b63406d9058938df1962", + "single_end": false + }, + [ + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" + ] + ], + [ + { + "id": "SRX9504942_SRR13055518", + "run_accession": "SRR13055518", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r2", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2235236", + "read_count": "29411", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", + "fastq_bytes": "717693;723429", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "md5_1": "5ec894d863fcefe394470a0925aefde4", + "md5_2": "aead170df9851773d5202b5760c76d76", + "single_end": false + }, + [ + "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" + ] + ], + [ + { + "id": "SRX9504942_SRR13055519", + "run_accession": "SRR13055519", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r3", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2232728", + "read_count": "29378", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", + "fastq_bytes": "714907;721705", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", + "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", + "single_end": false + }, + [ + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" + ] + ], + [ + { + "id": "SRX9504942_SRR13055520", + "run_accession": "SRR13055520", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r4", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2214488", + "read_count": "29138", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", + "fastq_bytes": "709867;716862", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "md5_1": "795d460abff6009c7f5ff7c14b773fbe", + "md5_2": "c3f34379356b28d6dac7212abc1a0a04", + "single_end": false + }, + [ + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" + ] + ], + [ + { + "id": "SRX9626017_SRR13191702", + "run_accession": "SRR13191702", + "experiment_accession": "SRX9626017", + "sample_accession": "SAMN16980141", + "secondary_sample_accession": "SRS7827211", + "study_accession": "PRJNA682076", + "secondary_study_accession": "SRP295653", + "submission_accession": "SRA1166126", + "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", + "experiment_alias": "S.170804.00784", + "sample_alias": "S.170804.00784_662", + "study_alias": "PRJNA682076", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "S.170804.00784", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "45682", + "read_count": "91", + "tax_id": "408170", + "scientific_name": "human gut metagenome", + "sample_title": "Metagenome or environmental sample from human gut metagenome", + "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "sample_description": "Metagenome or environmental sample from human gut metagenome", + "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", + "fastq_bytes": "15420;16324", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98", + "single_end": false + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + ] + ] + ], + "1": [ + "samplesheet.csv:md5,252449b9f66687af076bb5a9dfea4551" + ], + "2": [ + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + ], + "3": [ + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + ], + "fastq": [ + [ + { + "id": "DRX024467_DRR026872", + "run_accession": "DRR026872", + "experiment_accession": "DRX024467", + "sample_accession": "SAMD00023098", + "secondary_sample_accession": "DRS033740", + "study_accession": "PRJDB4356", + "secondary_study_accession": "DRP003256", + "submission_accession": "DRA002758", + "run_alias": "DRR026872", + "experiment_alias": "DRX024467", + "sample_alias": "SAMD00023098", + "study_alias": "DRP003256", + "library_layout": "SINGLE", + "library_selection": "Restriction Digest", + "library_source": "GENOMIC", + "library_strategy": "OTHER", + "library_name": "IpeRAD1_3", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "62550", + "read_count": "417", + "tax_id": "35883", + "scientific_name": "Ipomoea nil", + "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", + "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", + "study_title": "The Japanese morning glory genome sequence", + "sample_description": "Keywords: GSC:MIxS MIGS:6.0", + "fastq_md5": "515e5448c55e054113c4a22df5f62791", + "fastq_bytes": "38447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_2": "", + "md5_1": "515e5448c55e054113c4a22df5f62791", + "md5_2": "", + "single_end": true + }, + "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" + ], + [ + { + "id": "DRX026011_DRR028935", + "run_accession": "DRR028935", + "experiment_accession": "DRX026011", + "sample_accession": "SAMD00024405", + "secondary_sample_accession": "DRS019431", + "study_accession": "PRJDB3420", + "secondary_study_accession": "DRP002616", + "submission_accession": "DRA002949", + "run_alias": "DRR028935", + "experiment_alias": "DRX026011", + "sample_alias": "SAMD00024405", + "study_alias": "DRP002616", + "library_layout": "PAIRED", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "day0_BbSQE-I", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "194930", + "read_count": "965", + "tax_id": "1202541", + "scientific_name": "Botryococcus braunii Showa", + "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", + "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", + "sample_description": "Liquid culture", + "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", + "fastq_bytes": "60275;61610", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "md5_1": "cc01df82a9354bb6b3be93483b20c35a", + "md5_2": "941c9998d746416dad53c94c480ddf30", + "single_end": false + }, + [ + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" + ] + ], + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "sample_accession": "SAMEA3643867", + "secondary_sample_accession": "ERS951016", + "study_accession": "PRJEB11633", + "secondary_study_accession": "ERP013030", + "submission_accession": "ERA528939", + "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", + "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", + "sample_alias": "sample_56", + "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", + "library_layout": "PAIRED", + "library_selection": "RT-PCR", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "unspecified", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "29700", + "read_count": "169", + "tax_id": "63433", + "scientific_name": "Leptopilina boulardi", + "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing", + "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", + "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_bytes": "3221;8151;8118", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, + [ + "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" + ] + ], + [ + { + "id": "ERX1234253_ERR1160846", + "run_accession": "ERR1160846", + "experiment_accession": "ERX1234253", + "sample_accession": "SAMEA3687214", + "secondary_sample_accession": "ERS994363", + "study_accession": "PRJEB11419", + "secondary_study_accession": "ERP012803", + "submission_accession": "ERA541392", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "study_alias": "qiita_sid_10317", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "10317.BLANK.93.3E.r22", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "35658", + "read_count": "283", + "tax_id": "256318", + "scientific_name": "metagenome", + "sample_title": "10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "study_title": "American Gut Project", + "sample_description": "American Gut control", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_2": "", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "single_end": true + }, + "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" + ], + [ + { + "id": "SRX10940790_SRR14593545", + "run_accession": "SRR14593545", + "experiment_accession": "SRX10940790", + "sample_accession": "SAMN19097423", + "secondary_sample_accession": "SRS9020442", + "study_accession": "PRJNA728650", + "secondary_study_accession": "SRP319413", + "submission_accession": "SRA1234280", + "run_alias": "577-6_530058_19-037147 Goat_F.ab1", + "experiment_alias": "PRNP_2765", + "sample_alias": "prp_2765", + "study_alias": "PRJNA728650", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "PRNP_2765", + "instrument_model": "AB 3500xL Genetic Analyzer", + "instrument_platform": "CAPILLARY", + "base_count": "828", + "read_count": "1", + "tax_id": "9925", + "scientific_name": "Capra hircus", + "sample_title": "MIGS Eukaryotic sample from Capra hircus", + "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", + "study_title": "Capra hircus Raw sequence reads", + "sample_description": "Keywords: GSC:MIxS MIGS:5.0", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" + ] + ], + [ + { + "id": "SRX11047067_SRR14709033", + "run_accession": "SRR14709033", + "experiment_accession": "SRX11047067", + "sample_accession": "SAMN19373034", + "secondary_sample_accession": "SRS9115923", + "study_accession": "PRJNA733285", + "secondary_study_accession": "SRP322267", + "submission_accession": "SRA1239521", + "run_alias": "Sebastes_levis-2.fastq", + "experiment_alias": "Sebastes_macdonaldi-1", + "sample_alias": "S._macdonaldi-1", + "study_alias": "PRJNA733285", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "Sebastes_macdonaldi-1", + "instrument_model": "AB 5500 Genetic Analyzer", + "instrument_platform": "ABI_SOLID", + "base_count": "153", + "read_count": "1", + "tax_id": "394693", + "scientific_name": "Sebastes macdonaldi", + "sample_title": "Sebastes_macdonaldi-1", + "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", + "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", + "sample_description": "Sebastes_macdonaldi-1", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": true + }, + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" + ], + [ + { + "id": "SRX17709227_SRR21711856", + "run_accession": "SRR21711856", + "experiment_accession": "SRX17709227", + "sample_accession": "SAMN31021823", + "secondary_sample_accession": "SRS15239723", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601460_r1", + "experiment_alias": "GSM6601460_r1", + "sample_alias": "GSM6601460", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601460", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "573417800", + "read_count": "11468356", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "sham-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "sham-treated worms in day 5", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_2": "", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "single_end": true + }, + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" + ], + [ + { + "id": "SRX17709228_SRR21711855", + "run_accession": "SRR21711855", + "experiment_accession": "SRX17709228", + "sample_accession": "SAMN31021822", + "secondary_sample_accession": "SRS15239724", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601461_r1", + "experiment_alias": "GSM6601461_r1", + "sample_alias": "GSM6601461", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601461", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "677912850", + "read_count": "13558257", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "PM2.5-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "PM2.5-treated worms in day 5", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_2": "", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "single_end": true + }, + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" + ], + [ + { + "id": "SRX6725035_SRR9984183", + "run_accession": "SRR9984183", + "experiment_accession": "SRX6725035", + "sample_accession": "SAMN12581720", + "secondary_sample_accession": "SRS5277011", + "study_accession": "PRJNA560329", + "secondary_study_accession": "SRP218535", + "submission_accession": "SRA942061", + "run_alias": "Emb289P1_bin131.fastq", + "experiment_alias": "Emb289P1_bin131", + "sample_alias": "Emb289P1_bin131", + "study_alias": "PRJNA560329", + "library_layout": "SINGLE", + "library_selection": "RANDOM", + "library_source": "METAGENOMIC", + "library_strategy": "WGS", + "library_name": "Emb289P1_bin131", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "1996273", + "read_count": "58", + "tax_id": "2660712", + "scientific_name": "Defluviitaleaceae bacterium", + "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", + "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", + "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", + "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", + "fastq_md5": "0b512d2dc31685983456bd56fd836544", + "fastq_bytes": "605358", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_2": "", + "md5_1": "0b512d2dc31685983456bd56fd836544", + "md5_2": "", + "single_end": true + }, + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" + ], + [ + { + "id": "SRX9315476_SRR12848126", + "run_accession": "SRR12848126", + "experiment_accession": "SRX9315476", + "sample_accession": "SAMN16455283", + "secondary_sample_accession": "SRS7540262", + "study_accession": "PRJNA670070", + "secondary_study_accession": "SRP287769", + "submission_accession": "SRA1145417", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "experiment_alias": "F11-N1-05", + "sample_alias": "F11-N1-05", + "study_alias": "PRJNA670070", + "library_layout": "PAIRED", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "library_name": "F11-N1-05", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "base_count": "431758", + "read_count": "2954", + "tax_id": "10092", + "scientific_name": "Mus musculus domesticus", + "sample_title": "Longshanks_F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "sample_description": "F11-N1-05", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" + ] + ], + [ + { + "id": "SRX9504942_SRR13055517", + "run_accession": "SRR13055517", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r1", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2246028", + "read_count": "29553", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", + "fastq_bytes": "721167;723753", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", + "md5_2": "18dbe96e7f58b63406d9058938df1962", + "single_end": false + }, + [ + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" + ] + ], + [ + { + "id": "SRX9504942_SRR13055518", + "run_accession": "SRR13055518", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r2", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2235236", + "read_count": "29411", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", + "fastq_bytes": "717693;723429", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "md5_1": "5ec894d863fcefe394470a0925aefde4", + "md5_2": "aead170df9851773d5202b5760c76d76", + "single_end": false + }, + [ + "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" + ] + ], + [ + { + "id": "SRX9504942_SRR13055519", + "run_accession": "SRR13055519", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r3", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2232728", + "read_count": "29378", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", + "fastq_bytes": "714907;721705", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", + "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", + "single_end": false + }, + [ + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" + ] + ], + [ + { + "id": "SRX9504942_SRR13055520", + "run_accession": "SRR13055520", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r4", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2214488", + "read_count": "29138", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", + "fastq_bytes": "709867;716862", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "md5_1": "795d460abff6009c7f5ff7c14b773fbe", + "md5_2": "c3f34379356b28d6dac7212abc1a0a04", + "single_end": false + }, + [ + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" + ] + ], + [ + { + "id": "SRX9626017_SRR13191702", + "run_accession": "SRR13191702", + "experiment_accession": "SRX9626017", + "sample_accession": "SAMN16980141", + "secondary_sample_accession": "SRS7827211", + "study_accession": "PRJNA682076", + "secondary_study_accession": "SRP295653", + "submission_accession": "SRA1166126", + "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", + "experiment_alias": "S.170804.00784", + "sample_alias": "S.170804.00784_662", + "study_alias": "PRJNA682076", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "S.170804.00784", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "45682", + "read_count": "91", + "tax_id": "408170", + "scientific_name": "human gut metagenome", + "sample_title": "Metagenome or environmental sample from human gut metagenome", + "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "sample_description": "Metagenome or environmental sample from human gut metagenome", + "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", + "fastq_bytes": "15420;16324", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98", + "single_end": false + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + ] + ] + ], + "mappings": [ + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + ], + "samplesheet": [ + "samplesheet.csv:md5,252449b9f66687af076bb5a9dfea4551" + ], + "versions": [ + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + ] } ], - "timestamp": "2023-08-28T10:05:53+0000" - }, - "fastq": { - "content": [ - "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791", - "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", - "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30", - "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9", - "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6", - "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", - "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2", - "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda", - "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64", - "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83", - "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544", - "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", - "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79", - "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", - "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962", - "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", - "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76", - "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", - "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88", - "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", - "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04", - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98", - [ - "DRX024467_DRR026872.fastq.gz.md5:md5,dacaeba3498fb8f405411a22cdb4b40d", - "DRX026011_DRR028935_1.fastq.gz.md5:md5,a47018c5972ba4c11539d0d6bc25eda9", - "DRX026011_DRR028935_2.fastq.gz.md5:md5,f477bbef548fbed665734ebf084eea2f", - "ERX1188904_ERR1109373_1.fastq.gz.md5:md5,50c1c3108631dc32a3151b67e0260d86", - "ERX1188904_ERR1109373_2.fastq.gz.md5:md5,1f22463d410e91a288c83d43654b2499", - "ERX1234253_ERR1160846.fastq.gz.md5:md5,513a8437ad331fc512b088b3750aa1ff", - "SRX17709227_SRR21711856.fastq.gz.md5:md5,13a38fbef27c3e15867d80887145ae75", - "SRX17709228_SRR21711855.fastq.gz.md5:md5,1e871ddd9e92e1866e0c64d36eb5ec85", - "SRX6725035_SRR9984183.fastq.gz.md5:md5,84f59dbb76c9b5eab7e14d90ced352c4", - "SRX9504942_SRR13055517_1.fastq.gz.md5:md5,a03f7f374dc401047b6f6ccaec3885cc", - "SRX9504942_SRR13055517_2.fastq.gz.md5:md5,facaf207753e977327e7b7df7bb8ace0", - "SRX9504942_SRR13055518_1.fastq.gz.md5:md5,5cf412cd62aadaa4838d9eabb5b44368", - "SRX9504942_SRR13055518_2.fastq.gz.md5:md5,93292b826afc72b23be93df26dd710c8", - "SRX9504942_SRR13055519_1.fastq.gz.md5:md5,f6ad6e2610397147a0a55c651de3992f", - "SRX9504942_SRR13055519_2.fastq.gz.md5:md5,2fe7dd4bcc1e7e61c6f54ef50cf961f3", - "SRX9504942_SRR13055520_1.fastq.gz.md5:md5,ab195b37746a3424a1099d9f8cc58de8", - "SRX9504942_SRR13055520_2.fastq.gz.md5:md5,10c448e23f1f7e7af61ec1204f8fc882", - "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", - "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" - ] - ], - "timestamp": "2023-08-28T10:05:57+0000" + "timestamp": "2023-09-11T16:36:17.537997" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap index af68569e..4c2abc45 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap @@ -1,88 +1,1353 @@ { - "metadata": { - "content": [ - "DRR026872.runinfo_ftp.tsv:md5,73606f6a05c45b077809da43ca638b5f", - "DRR028935.runinfo_ftp.tsv:md5,f79eefcea5db346f76f76f87df7f8dd2", - "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", - "ERR1160846.runinfo_ftp.tsv:md5,1b2dc1a64117de20b2164724836da345", - "GSE214215.runinfo_ftp.tsv:md5,23a580c89ee7bf681ca3ffa26aa1837f", - "SRR12848126.runinfo_ftp.tsv:md5,5d1e6bfd3d4077d1e66378c58e44975d", - "SRR13191702.runinfo_ftp.tsv:md5,409e262bb41bb6103315126db4d0dd1d", - "SRR14593545.runinfo_ftp.tsv:md5,62015706ac156693ba3d86ed050cab54", - "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", - "SRR9984183.runinfo_ftp.tsv:md5,53ab34ff3612b0e2c7d60476822787be" - ], - "timestamp": "2023-08-28T09:32:33+0000" - }, - "samplesheet": { - "content": [ - "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565", - "samplesheet.csv:md5,f0b7e9436c6feb1a31c49c2c8ab761a2" - ], - "timestamp": "2023-08-28T09:32:33+0000" - }, - "software_versions": { - "content": [ - "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" - ], - "timestamp": "2023-08-28T09:32:33+0000" - }, - "Parameters: '--nf_core_pipeline rnaseq'": { + "Parameters: --nf_core_pipeline rnaseq": { "content": [ { - + "0": [ + [ + { + "id": "DRX024467_DRR026872", + "run_accession": "DRR026872", + "experiment_accession": "DRX024467", + "sample_accession": "SAMD00023098", + "secondary_sample_accession": "DRS033740", + "study_accession": "PRJDB4356", + "secondary_study_accession": "DRP003256", + "submission_accession": "DRA002758", + "run_alias": "DRR026872", + "experiment_alias": "DRX024467", + "sample_alias": "SAMD00023098", + "study_alias": "DRP003256", + "library_layout": "SINGLE", + "library_selection": "Restriction Digest", + "library_source": "GENOMIC", + "library_strategy": "OTHER", + "library_name": "IpeRAD1_3", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "62550", + "read_count": "417", + "tax_id": "35883", + "scientific_name": "Ipomoea nil", + "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", + "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", + "study_title": "The Japanese morning glory genome sequence", + "sample_description": "Keywords: GSC:MIxS MIGS:6.0", + "fastq_md5": "515e5448c55e054113c4a22df5f62791", + "fastq_bytes": "38447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_2": "", + "md5_1": "515e5448c55e054113c4a22df5f62791", + "md5_2": "", + "single_end": true + }, + "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" + ], + [ + { + "id": "DRX026011_DRR028935", + "run_accession": "DRR028935", + "experiment_accession": "DRX026011", + "sample_accession": "SAMD00024405", + "secondary_sample_accession": "DRS019431", + "study_accession": "PRJDB3420", + "secondary_study_accession": "DRP002616", + "submission_accession": "DRA002949", + "run_alias": "DRR028935", + "experiment_alias": "DRX026011", + "sample_alias": "SAMD00024405", + "study_alias": "DRP002616", + "library_layout": "PAIRED", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "day0_BbSQE-I", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "194930", + "read_count": "965", + "tax_id": "1202541", + "scientific_name": "Botryococcus braunii Showa", + "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", + "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", + "sample_description": "Liquid culture", + "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", + "fastq_bytes": "60275;61610", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "md5_1": "cc01df82a9354bb6b3be93483b20c35a", + "md5_2": "941c9998d746416dad53c94c480ddf30", + "single_end": false + }, + [ + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" + ] + ], + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "sample_accession": "SAMEA3643867", + "secondary_sample_accession": "ERS951016", + "study_accession": "PRJEB11633", + "secondary_study_accession": "ERP013030", + "submission_accession": "ERA528939", + "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", + "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", + "sample_alias": "sample_56", + "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", + "library_layout": "PAIRED", + "library_selection": "RT-PCR", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "unspecified", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "29700", + "read_count": "169", + "tax_id": "63433", + "scientific_name": "Leptopilina boulardi", + "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing", + "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", + "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_bytes": "3221;8151;8118", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, + [ + "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" + ] + ], + [ + { + "id": "ERX1234253_ERR1160846", + "run_accession": "ERR1160846", + "experiment_accession": "ERX1234253", + "sample_accession": "SAMEA3687214", + "secondary_sample_accession": "ERS994363", + "study_accession": "PRJEB11419", + "secondary_study_accession": "ERP012803", + "submission_accession": "ERA541392", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "study_alias": "qiita_sid_10317", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "10317.BLANK.93.3E.r22", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "35658", + "read_count": "283", + "tax_id": "256318", + "scientific_name": "metagenome", + "sample_title": "10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "study_title": "American Gut Project", + "sample_description": "American Gut control", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_2": "", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "single_end": true + }, + "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" + ], + [ + { + "id": "SRX10940790_SRR14593545", + "run_accession": "SRR14593545", + "experiment_accession": "SRX10940790", + "sample_accession": "SAMN19097423", + "secondary_sample_accession": "SRS9020442", + "study_accession": "PRJNA728650", + "secondary_study_accession": "SRP319413", + "submission_accession": "SRA1234280", + "run_alias": "577-6_530058_19-037147 Goat_F.ab1", + "experiment_alias": "PRNP_2765", + "sample_alias": "prp_2765", + "study_alias": "PRJNA728650", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "PRNP_2765", + "instrument_model": "AB 3500xL Genetic Analyzer", + "instrument_platform": "CAPILLARY", + "base_count": "828", + "read_count": "1", + "tax_id": "9925", + "scientific_name": "Capra hircus", + "sample_title": "MIGS Eukaryotic sample from Capra hircus", + "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", + "study_title": "Capra hircus Raw sequence reads", + "sample_description": "Keywords: GSC:MIxS MIGS:5.0", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" + ] + ], + [ + { + "id": "SRX11047067_SRR14709033", + "run_accession": "SRR14709033", + "experiment_accession": "SRX11047067", + "sample_accession": "SAMN19373034", + "secondary_sample_accession": "SRS9115923", + "study_accession": "PRJNA733285", + "secondary_study_accession": "SRP322267", + "submission_accession": "SRA1239521", + "run_alias": "Sebastes_levis-2.fastq", + "experiment_alias": "Sebastes_macdonaldi-1", + "sample_alias": "S._macdonaldi-1", + "study_alias": "PRJNA733285", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "Sebastes_macdonaldi-1", + "instrument_model": "AB 5500 Genetic Analyzer", + "instrument_platform": "ABI_SOLID", + "base_count": "153", + "read_count": "1", + "tax_id": "394693", + "scientific_name": "Sebastes macdonaldi", + "sample_title": "Sebastes_macdonaldi-1", + "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", + "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", + "sample_description": "Sebastes_macdonaldi-1", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": true + }, + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" + ], + [ + { + "id": "SRX17709227_SRR21711856", + "run_accession": "SRR21711856", + "experiment_accession": "SRX17709227", + "sample_accession": "SAMN31021823", + "secondary_sample_accession": "SRS15239723", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601460_r1", + "experiment_alias": "GSM6601460_r1", + "sample_alias": "GSM6601460", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601460", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "573417800", + "read_count": "11468356", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "sham-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "sham-treated worms in day 5", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_2": "", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "single_end": true + }, + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" + ], + [ + { + "id": "SRX17709228_SRR21711855", + "run_accession": "SRR21711855", + "experiment_accession": "SRX17709228", + "sample_accession": "SAMN31021822", + "secondary_sample_accession": "SRS15239724", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601461_r1", + "experiment_alias": "GSM6601461_r1", + "sample_alias": "GSM6601461", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601461", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "677912850", + "read_count": "13558257", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "PM2.5-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "PM2.5-treated worms in day 5", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_2": "", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "single_end": true + }, + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" + ], + [ + { + "id": "SRX6725035_SRR9984183", + "run_accession": "SRR9984183", + "experiment_accession": "SRX6725035", + "sample_accession": "SAMN12581720", + "secondary_sample_accession": "SRS5277011", + "study_accession": "PRJNA560329", + "secondary_study_accession": "SRP218535", + "submission_accession": "SRA942061", + "run_alias": "Emb289P1_bin131.fastq", + "experiment_alias": "Emb289P1_bin131", + "sample_alias": "Emb289P1_bin131", + "study_alias": "PRJNA560329", + "library_layout": "SINGLE", + "library_selection": "RANDOM", + "library_source": "METAGENOMIC", + "library_strategy": "WGS", + "library_name": "Emb289P1_bin131", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "1996273", + "read_count": "58", + "tax_id": "2660712", + "scientific_name": "Defluviitaleaceae bacterium", + "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", + "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", + "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", + "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", + "fastq_md5": "0b512d2dc31685983456bd56fd836544", + "fastq_bytes": "605358", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_2": "", + "md5_1": "0b512d2dc31685983456bd56fd836544", + "md5_2": "", + "single_end": true + }, + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" + ], + [ + { + "id": "SRX9315476_SRR12848126", + "run_accession": "SRR12848126", + "experiment_accession": "SRX9315476", + "sample_accession": "SAMN16455283", + "secondary_sample_accession": "SRS7540262", + "study_accession": "PRJNA670070", + "secondary_study_accession": "SRP287769", + "submission_accession": "SRA1145417", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "experiment_alias": "F11-N1-05", + "sample_alias": "F11-N1-05", + "study_alias": "PRJNA670070", + "library_layout": "PAIRED", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "library_name": "F11-N1-05", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "base_count": "431758", + "read_count": "2954", + "tax_id": "10092", + "scientific_name": "Mus musculus domesticus", + "sample_title": "Longshanks_F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "sample_description": "F11-N1-05", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" + ] + ], + [ + { + "id": "SRX9504942_SRR13055517", + "run_accession": "SRR13055517", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r1", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2246028", + "read_count": "29553", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", + "fastq_bytes": "721167;723753", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", + "md5_2": "18dbe96e7f58b63406d9058938df1962", + "single_end": false + }, + [ + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" + ] + ], + [ + { + "id": "SRX9504942_SRR13055518", + "run_accession": "SRR13055518", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r2", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2235236", + "read_count": "29411", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", + "fastq_bytes": "717693;723429", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "md5_1": "5ec894d863fcefe394470a0925aefde4", + "md5_2": "aead170df9851773d5202b5760c76d76", + "single_end": false + }, + [ + "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" + ] + ], + [ + { + "id": "SRX9504942_SRR13055519", + "run_accession": "SRR13055519", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r3", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2232728", + "read_count": "29378", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", + "fastq_bytes": "714907;721705", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", + "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", + "single_end": false + }, + [ + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" + ] + ], + [ + { + "id": "SRX9504942_SRR13055520", + "run_accession": "SRR13055520", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r4", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2214488", + "read_count": "29138", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", + "fastq_bytes": "709867;716862", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "md5_1": "795d460abff6009c7f5ff7c14b773fbe", + "md5_2": "c3f34379356b28d6dac7212abc1a0a04", + "single_end": false + }, + [ + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" + ] + ], + [ + { + "id": "SRX9626017_SRR13191702", + "run_accession": "SRR13191702", + "experiment_accession": "SRX9626017", + "sample_accession": "SAMN16980141", + "secondary_sample_accession": "SRS7827211", + "study_accession": "PRJNA682076", + "secondary_study_accession": "SRP295653", + "submission_accession": "SRA1166126", + "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", + "experiment_alias": "S.170804.00784", + "sample_alias": "S.170804.00784_662", + "study_alias": "PRJNA682076", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "S.170804.00784", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "45682", + "read_count": "91", + "tax_id": "408170", + "scientific_name": "human gut metagenome", + "sample_title": "Metagenome or environmental sample from human gut metagenome", + "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "sample_description": "Metagenome or environmental sample from human gut metagenome", + "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", + "fastq_bytes": "15420;16324", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98", + "single_end": false + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + ] + ] + ], + "1": [ + "samplesheet.csv:md5,f0b7e9436c6feb1a31c49c2c8ab761a2" + ], + "2": [ + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + ], + "3": [ + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + ], + "fastq": [ + [ + { + "id": "DRX024467_DRR026872", + "run_accession": "DRR026872", + "experiment_accession": "DRX024467", + "sample_accession": "SAMD00023098", + "secondary_sample_accession": "DRS033740", + "study_accession": "PRJDB4356", + "secondary_study_accession": "DRP003256", + "submission_accession": "DRA002758", + "run_alias": "DRR026872", + "experiment_alias": "DRX024467", + "sample_alias": "SAMD00023098", + "study_alias": "DRP003256", + "library_layout": "SINGLE", + "library_selection": "Restriction Digest", + "library_source": "GENOMIC", + "library_strategy": "OTHER", + "library_name": "IpeRAD1_3", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "62550", + "read_count": "417", + "tax_id": "35883", + "scientific_name": "Ipomoea nil", + "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", + "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", + "study_title": "The Japanese morning glory genome sequence", + "sample_description": "Keywords: GSC:MIxS MIGS:6.0", + "fastq_md5": "515e5448c55e054113c4a22df5f62791", + "fastq_bytes": "38447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_2": "", + "md5_1": "515e5448c55e054113c4a22df5f62791", + "md5_2": "", + "single_end": true + }, + "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" + ], + [ + { + "id": "DRX026011_DRR028935", + "run_accession": "DRR028935", + "experiment_accession": "DRX026011", + "sample_accession": "SAMD00024405", + "secondary_sample_accession": "DRS019431", + "study_accession": "PRJDB3420", + "secondary_study_accession": "DRP002616", + "submission_accession": "DRA002949", + "run_alias": "DRR028935", + "experiment_alias": "DRX026011", + "sample_alias": "SAMD00024405", + "study_alias": "DRP002616", + "library_layout": "PAIRED", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "day0_BbSQE-I", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "194930", + "read_count": "965", + "tax_id": "1202541", + "scientific_name": "Botryococcus braunii Showa", + "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", + "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", + "sample_description": "Liquid culture", + "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", + "fastq_bytes": "60275;61610", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "md5_1": "cc01df82a9354bb6b3be93483b20c35a", + "md5_2": "941c9998d746416dad53c94c480ddf30", + "single_end": false + }, + [ + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" + ] + ], + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "sample_accession": "SAMEA3643867", + "secondary_sample_accession": "ERS951016", + "study_accession": "PRJEB11633", + "secondary_study_accession": "ERP013030", + "submission_accession": "ERA528939", + "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", + "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", + "sample_alias": "sample_56", + "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", + "library_layout": "PAIRED", + "library_selection": "RT-PCR", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "unspecified", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "29700", + "read_count": "169", + "tax_id": "63433", + "scientific_name": "Leptopilina boulardi", + "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing", + "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", + "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_bytes": "3221;8151;8118", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, + [ + "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" + ] + ], + [ + { + "id": "ERX1234253_ERR1160846", + "run_accession": "ERR1160846", + "experiment_accession": "ERX1234253", + "sample_accession": "SAMEA3687214", + "secondary_sample_accession": "ERS994363", + "study_accession": "PRJEB11419", + "secondary_study_accession": "ERP012803", + "submission_accession": "ERA541392", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "study_alias": "qiita_sid_10317", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "10317.BLANK.93.3E.r22", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "35658", + "read_count": "283", + "tax_id": "256318", + "scientific_name": "metagenome", + "sample_title": "10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "study_title": "American Gut Project", + "sample_description": "American Gut control", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_2": "", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "single_end": true + }, + "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" + ], + [ + { + "id": "SRX10940790_SRR14593545", + "run_accession": "SRR14593545", + "experiment_accession": "SRX10940790", + "sample_accession": "SAMN19097423", + "secondary_sample_accession": "SRS9020442", + "study_accession": "PRJNA728650", + "secondary_study_accession": "SRP319413", + "submission_accession": "SRA1234280", + "run_alias": "577-6_530058_19-037147 Goat_F.ab1", + "experiment_alias": "PRNP_2765", + "sample_alias": "prp_2765", + "study_alias": "PRJNA728650", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "PRNP_2765", + "instrument_model": "AB 3500xL Genetic Analyzer", + "instrument_platform": "CAPILLARY", + "base_count": "828", + "read_count": "1", + "tax_id": "9925", + "scientific_name": "Capra hircus", + "sample_title": "MIGS Eukaryotic sample from Capra hircus", + "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", + "study_title": "Capra hircus Raw sequence reads", + "sample_description": "Keywords: GSC:MIxS MIGS:5.0", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" + ] + ], + [ + { + "id": "SRX11047067_SRR14709033", + "run_accession": "SRR14709033", + "experiment_accession": "SRX11047067", + "sample_accession": "SAMN19373034", + "secondary_sample_accession": "SRS9115923", + "study_accession": "PRJNA733285", + "secondary_study_accession": "SRP322267", + "submission_accession": "SRA1239521", + "run_alias": "Sebastes_levis-2.fastq", + "experiment_alias": "Sebastes_macdonaldi-1", + "sample_alias": "S._macdonaldi-1", + "study_alias": "PRJNA733285", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "Sebastes_macdonaldi-1", + "instrument_model": "AB 5500 Genetic Analyzer", + "instrument_platform": "ABI_SOLID", + "base_count": "153", + "read_count": "1", + "tax_id": "394693", + "scientific_name": "Sebastes macdonaldi", + "sample_title": "Sebastes_macdonaldi-1", + "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", + "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", + "sample_description": "Sebastes_macdonaldi-1", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": true + }, + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" + ], + [ + { + "id": "SRX17709227_SRR21711856", + "run_accession": "SRR21711856", + "experiment_accession": "SRX17709227", + "sample_accession": "SAMN31021823", + "secondary_sample_accession": "SRS15239723", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601460_r1", + "experiment_alias": "GSM6601460_r1", + "sample_alias": "GSM6601460", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601460", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "573417800", + "read_count": "11468356", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "sham-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "sham-treated worms in day 5", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_2": "", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "single_end": true + }, + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" + ], + [ + { + "id": "SRX17709228_SRR21711855", + "run_accession": "SRR21711855", + "experiment_accession": "SRX17709228", + "sample_accession": "SAMN31021822", + "secondary_sample_accession": "SRS15239724", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601461_r1", + "experiment_alias": "GSM6601461_r1", + "sample_alias": "GSM6601461", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601461", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "677912850", + "read_count": "13558257", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "PM2.5-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "PM2.5-treated worms in day 5", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_2": "", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "single_end": true + }, + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" + ], + [ + { + "id": "SRX6725035_SRR9984183", + "run_accession": "SRR9984183", + "experiment_accession": "SRX6725035", + "sample_accession": "SAMN12581720", + "secondary_sample_accession": "SRS5277011", + "study_accession": "PRJNA560329", + "secondary_study_accession": "SRP218535", + "submission_accession": "SRA942061", + "run_alias": "Emb289P1_bin131.fastq", + "experiment_alias": "Emb289P1_bin131", + "sample_alias": "Emb289P1_bin131", + "study_alias": "PRJNA560329", + "library_layout": "SINGLE", + "library_selection": "RANDOM", + "library_source": "METAGENOMIC", + "library_strategy": "WGS", + "library_name": "Emb289P1_bin131", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "1996273", + "read_count": "58", + "tax_id": "2660712", + "scientific_name": "Defluviitaleaceae bacterium", + "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", + "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", + "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", + "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", + "fastq_md5": "0b512d2dc31685983456bd56fd836544", + "fastq_bytes": "605358", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_2": "", + "md5_1": "0b512d2dc31685983456bd56fd836544", + "md5_2": "", + "single_end": true + }, + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" + ], + [ + { + "id": "SRX9315476_SRR12848126", + "run_accession": "SRR12848126", + "experiment_accession": "SRX9315476", + "sample_accession": "SAMN16455283", + "secondary_sample_accession": "SRS7540262", + "study_accession": "PRJNA670070", + "secondary_study_accession": "SRP287769", + "submission_accession": "SRA1145417", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "experiment_alias": "F11-N1-05", + "sample_alias": "F11-N1-05", + "study_alias": "PRJNA670070", + "library_layout": "PAIRED", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "library_name": "F11-N1-05", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "base_count": "431758", + "read_count": "2954", + "tax_id": "10092", + "scientific_name": "Mus musculus domesticus", + "sample_title": "Longshanks_F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "sample_description": "F11-N1-05", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" + ] + ], + [ + { + "id": "SRX9504942_SRR13055517", + "run_accession": "SRR13055517", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r1", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2246028", + "read_count": "29553", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", + "fastq_bytes": "721167;723753", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", + "md5_2": "18dbe96e7f58b63406d9058938df1962", + "single_end": false + }, + [ + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" + ] + ], + [ + { + "id": "SRX9504942_SRR13055518", + "run_accession": "SRR13055518", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r2", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2235236", + "read_count": "29411", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", + "fastq_bytes": "717693;723429", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "md5_1": "5ec894d863fcefe394470a0925aefde4", + "md5_2": "aead170df9851773d5202b5760c76d76", + "single_end": false + }, + [ + "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" + ] + ], + [ + { + "id": "SRX9504942_SRR13055519", + "run_accession": "SRR13055519", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r3", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2232728", + "read_count": "29378", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", + "fastq_bytes": "714907;721705", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", + "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", + "single_end": false + }, + [ + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" + ] + ], + [ + { + "id": "SRX9504942_SRR13055520", + "run_accession": "SRR13055520", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r4", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2214488", + "read_count": "29138", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", + "fastq_bytes": "709867;716862", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "md5_1": "795d460abff6009c7f5ff7c14b773fbe", + "md5_2": "c3f34379356b28d6dac7212abc1a0a04", + "single_end": false + }, + [ + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" + ] + ], + [ + { + "id": "SRX9626017_SRR13191702", + "run_accession": "SRR13191702", + "experiment_accession": "SRX9626017", + "sample_accession": "SAMN16980141", + "secondary_sample_accession": "SRS7827211", + "study_accession": "PRJNA682076", + "secondary_study_accession": "SRP295653", + "submission_accession": "SRA1166126", + "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", + "experiment_alias": "S.170804.00784", + "sample_alias": "S.170804.00784_662", + "study_alias": "PRJNA682076", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "S.170804.00784", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "45682", + "read_count": "91", + "tax_id": "408170", + "scientific_name": "human gut metagenome", + "sample_title": "Metagenome or environmental sample from human gut metagenome", + "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "sample_description": "Metagenome or environmental sample from human gut metagenome", + "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", + "fastq_bytes": "15420;16324", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98", + "single_end": false + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + ] + ] + ], + "mappings": [ + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + ], + "samplesheet": [ + "samplesheet.csv:md5,f0b7e9436c6feb1a31c49c2c8ab761a2" + ], + "versions": [ + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + ] } ], - "timestamp": "2023-08-28T09:32:33+0000" - }, - "fastq": { - "content": [ - "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791", - "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", - "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30", - "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9", - "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6", - "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", - "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2", - "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda", - "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64", - "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83", - "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544", - "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", - "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79", - "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", - "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962", - "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", - "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76", - "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", - "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88", - "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", - "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04", - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98", - [ - "DRX024467_DRR026872.fastq.gz.md5:md5,dacaeba3498fb8f405411a22cdb4b40d", - "DRX026011_DRR028935_1.fastq.gz.md5:md5,a47018c5972ba4c11539d0d6bc25eda9", - "DRX026011_DRR028935_2.fastq.gz.md5:md5,f477bbef548fbed665734ebf084eea2f", - "ERX1188904_ERR1109373_1.fastq.gz.md5:md5,50c1c3108631dc32a3151b67e0260d86", - "ERX1188904_ERR1109373_2.fastq.gz.md5:md5,1f22463d410e91a288c83d43654b2499", - "ERX1234253_ERR1160846.fastq.gz.md5:md5,513a8437ad331fc512b088b3750aa1ff", - "SRX17709227_SRR21711856.fastq.gz.md5:md5,13a38fbef27c3e15867d80887145ae75", - "SRX17709228_SRR21711855.fastq.gz.md5:md5,1e871ddd9e92e1866e0c64d36eb5ec85", - "SRX6725035_SRR9984183.fastq.gz.md5:md5,84f59dbb76c9b5eab7e14d90ced352c4", - "SRX9504942_SRR13055517_1.fastq.gz.md5:md5,a03f7f374dc401047b6f6ccaec3885cc", - "SRX9504942_SRR13055517_2.fastq.gz.md5:md5,facaf207753e977327e7b7df7bb8ace0", - "SRX9504942_SRR13055518_1.fastq.gz.md5:md5,5cf412cd62aadaa4838d9eabb5b44368", - "SRX9504942_SRR13055518_2.fastq.gz.md5:md5,93292b826afc72b23be93df26dd710c8", - "SRX9504942_SRR13055519_1.fastq.gz.md5:md5,f6ad6e2610397147a0a55c651de3992f", - "SRX9504942_SRR13055519_2.fastq.gz.md5:md5,2fe7dd4bcc1e7e61c6f54ef50cf961f3", - "SRX9504942_SRR13055520_1.fastq.gz.md5:md5,ab195b37746a3424a1099d9f8cc58de8", - "SRX9504942_SRR13055520_2.fastq.gz.md5:md5,10c448e23f1f7e7af61ec1204f8fc882", - "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", - "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" - ] - ], - "timestamp": "2023-08-28T09:32:33+0000" + "timestamp": "2023-09-11T16:53:44.32524" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap index da686d45..a94fc295 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap @@ -1,88 +1,1353 @@ { - "metadata": { - "content": [ - "DRR026872.runinfo_ftp.tsv:md5,73606f6a05c45b077809da43ca638b5f", - "DRR028935.runinfo_ftp.tsv:md5,f79eefcea5db346f76f76f87df7f8dd2", - "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", - "ERR1160846.runinfo_ftp.tsv:md5,1b2dc1a64117de20b2164724836da345", - "GSE214215.runinfo_ftp.tsv:md5,23a580c89ee7bf681ca3ffa26aa1837f", - "SRR12848126.runinfo_ftp.tsv:md5,5d1e6bfd3d4077d1e66378c58e44975d", - "SRR13191702.runinfo_ftp.tsv:md5,409e262bb41bb6103315126db4d0dd1d", - "SRR14593545.runinfo_ftp.tsv:md5,62015706ac156693ba3d86ed050cab54", - "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", - "SRR9984183.runinfo_ftp.tsv:md5,53ab34ff3612b0e2c7d60476822787be" - ], - "timestamp": "2023-08-28T09:27:41+0000" - }, - "samplesheet": { - "content": [ - "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565", - "samplesheet.csv:md5,484efbb550b50f5ac63e4864282edea7" - ], - "timestamp": "2023-08-28T09:27:41+0000" - }, - "software_versions": { - "content": [ - "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" - ], - "timestamp": "2023-08-28T09:27:41+0000" - }, "Parameters: --nf_core_pipeline taxprofiler": { "content": [ { - + "0": [ + [ + { + "id": "DRX024467_DRR026872", + "run_accession": "DRR026872", + "experiment_accession": "DRX024467", + "sample_accession": "SAMD00023098", + "secondary_sample_accession": "DRS033740", + "study_accession": "PRJDB4356", + "secondary_study_accession": "DRP003256", + "submission_accession": "DRA002758", + "run_alias": "DRR026872", + "experiment_alias": "DRX024467", + "sample_alias": "SAMD00023098", + "study_alias": "DRP003256", + "library_layout": "SINGLE", + "library_selection": "Restriction Digest", + "library_source": "GENOMIC", + "library_strategy": "OTHER", + "library_name": "IpeRAD1_3", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "62550", + "read_count": "417", + "tax_id": "35883", + "scientific_name": "Ipomoea nil", + "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", + "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", + "study_title": "The Japanese morning glory genome sequence", + "sample_description": "Keywords: GSC:MIxS MIGS:6.0", + "fastq_md5": "515e5448c55e054113c4a22df5f62791", + "fastq_bytes": "38447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_2": "", + "md5_1": "515e5448c55e054113c4a22df5f62791", + "md5_2": "", + "single_end": true + }, + "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" + ], + [ + { + "id": "DRX026011_DRR028935", + "run_accession": "DRR028935", + "experiment_accession": "DRX026011", + "sample_accession": "SAMD00024405", + "secondary_sample_accession": "DRS019431", + "study_accession": "PRJDB3420", + "secondary_study_accession": "DRP002616", + "submission_accession": "DRA002949", + "run_alias": "DRR028935", + "experiment_alias": "DRX026011", + "sample_alias": "SAMD00024405", + "study_alias": "DRP002616", + "library_layout": "PAIRED", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "day0_BbSQE-I", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "194930", + "read_count": "965", + "tax_id": "1202541", + "scientific_name": "Botryococcus braunii Showa", + "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", + "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", + "sample_description": "Liquid culture", + "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", + "fastq_bytes": "60275;61610", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "md5_1": "cc01df82a9354bb6b3be93483b20c35a", + "md5_2": "941c9998d746416dad53c94c480ddf30", + "single_end": false + }, + [ + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" + ] + ], + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "sample_accession": "SAMEA3643867", + "secondary_sample_accession": "ERS951016", + "study_accession": "PRJEB11633", + "secondary_study_accession": "ERP013030", + "submission_accession": "ERA528939", + "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", + "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", + "sample_alias": "sample_56", + "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", + "library_layout": "PAIRED", + "library_selection": "RT-PCR", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "unspecified", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "29700", + "read_count": "169", + "tax_id": "63433", + "scientific_name": "Leptopilina boulardi", + "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing", + "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", + "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_bytes": "3221;8151;8118", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, + [ + "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" + ] + ], + [ + { + "id": "ERX1234253_ERR1160846", + "run_accession": "ERR1160846", + "experiment_accession": "ERX1234253", + "sample_accession": "SAMEA3687214", + "secondary_sample_accession": "ERS994363", + "study_accession": "PRJEB11419", + "secondary_study_accession": "ERP012803", + "submission_accession": "ERA541392", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "study_alias": "qiita_sid_10317", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "10317.BLANK.93.3E.r22", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "35658", + "read_count": "283", + "tax_id": "256318", + "scientific_name": "metagenome", + "sample_title": "10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "study_title": "American Gut Project", + "sample_description": "American Gut control", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_2": "", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "single_end": true + }, + "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" + ], + [ + { + "id": "SRX10940790_SRR14593545", + "run_accession": "SRR14593545", + "experiment_accession": "SRX10940790", + "sample_accession": "SAMN19097423", + "secondary_sample_accession": "SRS9020442", + "study_accession": "PRJNA728650", + "secondary_study_accession": "SRP319413", + "submission_accession": "SRA1234280", + "run_alias": "577-6_530058_19-037147 Goat_F.ab1", + "experiment_alias": "PRNP_2765", + "sample_alias": "prp_2765", + "study_alias": "PRJNA728650", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "PRNP_2765", + "instrument_model": "AB 3500xL Genetic Analyzer", + "instrument_platform": "CAPILLARY", + "base_count": "828", + "read_count": "1", + "tax_id": "9925", + "scientific_name": "Capra hircus", + "sample_title": "MIGS Eukaryotic sample from Capra hircus", + "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", + "study_title": "Capra hircus Raw sequence reads", + "sample_description": "Keywords: GSC:MIxS MIGS:5.0", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" + ] + ], + [ + { + "id": "SRX11047067_SRR14709033", + "run_accession": "SRR14709033", + "experiment_accession": "SRX11047067", + "sample_accession": "SAMN19373034", + "secondary_sample_accession": "SRS9115923", + "study_accession": "PRJNA733285", + "secondary_study_accession": "SRP322267", + "submission_accession": "SRA1239521", + "run_alias": "Sebastes_levis-2.fastq", + "experiment_alias": "Sebastes_macdonaldi-1", + "sample_alias": "S._macdonaldi-1", + "study_alias": "PRJNA733285", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "Sebastes_macdonaldi-1", + "instrument_model": "AB 5500 Genetic Analyzer", + "instrument_platform": "ABI_SOLID", + "base_count": "153", + "read_count": "1", + "tax_id": "394693", + "scientific_name": "Sebastes macdonaldi", + "sample_title": "Sebastes_macdonaldi-1", + "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", + "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", + "sample_description": "Sebastes_macdonaldi-1", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": true + }, + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" + ], + [ + { + "id": "SRX17709227_SRR21711856", + "run_accession": "SRR21711856", + "experiment_accession": "SRX17709227", + "sample_accession": "SAMN31021823", + "secondary_sample_accession": "SRS15239723", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601460_r1", + "experiment_alias": "GSM6601460_r1", + "sample_alias": "GSM6601460", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601460", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "573417800", + "read_count": "11468356", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "sham-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "sham-treated worms in day 5", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_2": "", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "single_end": true + }, + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" + ], + [ + { + "id": "SRX17709228_SRR21711855", + "run_accession": "SRR21711855", + "experiment_accession": "SRX17709228", + "sample_accession": "SAMN31021822", + "secondary_sample_accession": "SRS15239724", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601461_r1", + "experiment_alias": "GSM6601461_r1", + "sample_alias": "GSM6601461", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601461", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "677912850", + "read_count": "13558257", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "PM2.5-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "PM2.5-treated worms in day 5", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_2": "", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "single_end": true + }, + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" + ], + [ + { + "id": "SRX6725035_SRR9984183", + "run_accession": "SRR9984183", + "experiment_accession": "SRX6725035", + "sample_accession": "SAMN12581720", + "secondary_sample_accession": "SRS5277011", + "study_accession": "PRJNA560329", + "secondary_study_accession": "SRP218535", + "submission_accession": "SRA942061", + "run_alias": "Emb289P1_bin131.fastq", + "experiment_alias": "Emb289P1_bin131", + "sample_alias": "Emb289P1_bin131", + "study_alias": "PRJNA560329", + "library_layout": "SINGLE", + "library_selection": "RANDOM", + "library_source": "METAGENOMIC", + "library_strategy": "WGS", + "library_name": "Emb289P1_bin131", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "1996273", + "read_count": "58", + "tax_id": "2660712", + "scientific_name": "Defluviitaleaceae bacterium", + "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", + "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", + "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", + "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", + "fastq_md5": "0b512d2dc31685983456bd56fd836544", + "fastq_bytes": "605358", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_2": "", + "md5_1": "0b512d2dc31685983456bd56fd836544", + "md5_2": "", + "single_end": true + }, + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" + ], + [ + { + "id": "SRX9315476_SRR12848126", + "run_accession": "SRR12848126", + "experiment_accession": "SRX9315476", + "sample_accession": "SAMN16455283", + "secondary_sample_accession": "SRS7540262", + "study_accession": "PRJNA670070", + "secondary_study_accession": "SRP287769", + "submission_accession": "SRA1145417", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "experiment_alias": "F11-N1-05", + "sample_alias": "F11-N1-05", + "study_alias": "PRJNA670070", + "library_layout": "PAIRED", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "library_name": "F11-N1-05", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "base_count": "431758", + "read_count": "2954", + "tax_id": "10092", + "scientific_name": "Mus musculus domesticus", + "sample_title": "Longshanks_F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "sample_description": "F11-N1-05", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" + ] + ], + [ + { + "id": "SRX9504942_SRR13055517", + "run_accession": "SRR13055517", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r1", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2246028", + "read_count": "29553", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", + "fastq_bytes": "721167;723753", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", + "md5_2": "18dbe96e7f58b63406d9058938df1962", + "single_end": false + }, + [ + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" + ] + ], + [ + { + "id": "SRX9504942_SRR13055518", + "run_accession": "SRR13055518", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r2", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2235236", + "read_count": "29411", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", + "fastq_bytes": "717693;723429", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "md5_1": "5ec894d863fcefe394470a0925aefde4", + "md5_2": "aead170df9851773d5202b5760c76d76", + "single_end": false + }, + [ + "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" + ] + ], + [ + { + "id": "SRX9504942_SRR13055519", + "run_accession": "SRR13055519", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r3", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2232728", + "read_count": "29378", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", + "fastq_bytes": "714907;721705", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", + "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", + "single_end": false + }, + [ + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" + ] + ], + [ + { + "id": "SRX9504942_SRR13055520", + "run_accession": "SRR13055520", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r4", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2214488", + "read_count": "29138", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", + "fastq_bytes": "709867;716862", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "md5_1": "795d460abff6009c7f5ff7c14b773fbe", + "md5_2": "c3f34379356b28d6dac7212abc1a0a04", + "single_end": false + }, + [ + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" + ] + ], + [ + { + "id": "SRX9626017_SRR13191702", + "run_accession": "SRR13191702", + "experiment_accession": "SRX9626017", + "sample_accession": "SAMN16980141", + "secondary_sample_accession": "SRS7827211", + "study_accession": "PRJNA682076", + "secondary_study_accession": "SRP295653", + "submission_accession": "SRA1166126", + "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", + "experiment_alias": "S.170804.00784", + "sample_alias": "S.170804.00784_662", + "study_alias": "PRJNA682076", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "S.170804.00784", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "45682", + "read_count": "91", + "tax_id": "408170", + "scientific_name": "human gut metagenome", + "sample_title": "Metagenome or environmental sample from human gut metagenome", + "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "sample_description": "Metagenome or environmental sample from human gut metagenome", + "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", + "fastq_bytes": "15420;16324", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98", + "single_end": false + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + ] + ] + ], + "1": [ + "samplesheet.csv:md5,484efbb550b50f5ac63e4864282edea7" + ], + "2": [ + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + ], + "3": [ + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + ], + "fastq": [ + [ + { + "id": "DRX024467_DRR026872", + "run_accession": "DRR026872", + "experiment_accession": "DRX024467", + "sample_accession": "SAMD00023098", + "secondary_sample_accession": "DRS033740", + "study_accession": "PRJDB4356", + "secondary_study_accession": "DRP003256", + "submission_accession": "DRA002758", + "run_alias": "DRR026872", + "experiment_alias": "DRX024467", + "sample_alias": "SAMD00023098", + "study_alias": "DRP003256", + "library_layout": "SINGLE", + "library_selection": "Restriction Digest", + "library_source": "GENOMIC", + "library_strategy": "OTHER", + "library_name": "IpeRAD1_3", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "62550", + "read_count": "417", + "tax_id": "35883", + "scientific_name": "Ipomoea nil", + "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", + "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", + "study_title": "The Japanese morning glory genome sequence", + "sample_description": "Keywords: GSC:MIxS MIGS:6.0", + "fastq_md5": "515e5448c55e054113c4a22df5f62791", + "fastq_bytes": "38447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_2": "", + "md5_1": "515e5448c55e054113c4a22df5f62791", + "md5_2": "", + "single_end": true + }, + "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" + ], + [ + { + "id": "DRX026011_DRR028935", + "run_accession": "DRR028935", + "experiment_accession": "DRX026011", + "sample_accession": "SAMD00024405", + "secondary_sample_accession": "DRS019431", + "study_accession": "PRJDB3420", + "secondary_study_accession": "DRP002616", + "submission_accession": "DRA002949", + "run_alias": "DRR028935", + "experiment_alias": "DRX026011", + "sample_alias": "SAMD00024405", + "study_alias": "DRP002616", + "library_layout": "PAIRED", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "day0_BbSQE-I", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "194930", + "read_count": "965", + "tax_id": "1202541", + "scientific_name": "Botryococcus braunii Showa", + "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", + "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", + "sample_description": "Liquid culture", + "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", + "fastq_bytes": "60275;61610", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "md5_1": "cc01df82a9354bb6b3be93483b20c35a", + "md5_2": "941c9998d746416dad53c94c480ddf30", + "single_end": false + }, + [ + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" + ] + ], + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "sample_accession": "SAMEA3643867", + "secondary_sample_accession": "ERS951016", + "study_accession": "PRJEB11633", + "secondary_study_accession": "ERP013030", + "submission_accession": "ERA528939", + "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", + "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", + "sample_alias": "sample_56", + "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", + "library_layout": "PAIRED", + "library_selection": "RT-PCR", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "unspecified", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "29700", + "read_count": "169", + "tax_id": "63433", + "scientific_name": "Leptopilina boulardi", + "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing", + "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", + "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_bytes": "3221;8151;8118", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, + [ + "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" + ] + ], + [ + { + "id": "ERX1234253_ERR1160846", + "run_accession": "ERR1160846", + "experiment_accession": "ERX1234253", + "sample_accession": "SAMEA3687214", + "secondary_sample_accession": "ERS994363", + "study_accession": "PRJEB11419", + "secondary_study_accession": "ERP012803", + "submission_accession": "ERA541392", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "study_alias": "qiita_sid_10317", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "10317.BLANK.93.3E.r22", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "35658", + "read_count": "283", + "tax_id": "256318", + "scientific_name": "metagenome", + "sample_title": "10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "study_title": "American Gut Project", + "sample_description": "American Gut control", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_2": "", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "single_end": true + }, + "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" + ], + [ + { + "id": "SRX10940790_SRR14593545", + "run_accession": "SRR14593545", + "experiment_accession": "SRX10940790", + "sample_accession": "SAMN19097423", + "secondary_sample_accession": "SRS9020442", + "study_accession": "PRJNA728650", + "secondary_study_accession": "SRP319413", + "submission_accession": "SRA1234280", + "run_alias": "577-6_530058_19-037147 Goat_F.ab1", + "experiment_alias": "PRNP_2765", + "sample_alias": "prp_2765", + "study_alias": "PRJNA728650", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "PRNP_2765", + "instrument_model": "AB 3500xL Genetic Analyzer", + "instrument_platform": "CAPILLARY", + "base_count": "828", + "read_count": "1", + "tax_id": "9925", + "scientific_name": "Capra hircus", + "sample_title": "MIGS Eukaryotic sample from Capra hircus", + "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", + "study_title": "Capra hircus Raw sequence reads", + "sample_description": "Keywords: GSC:MIxS MIGS:5.0", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" + ] + ], + [ + { + "id": "SRX11047067_SRR14709033", + "run_accession": "SRR14709033", + "experiment_accession": "SRX11047067", + "sample_accession": "SAMN19373034", + "secondary_sample_accession": "SRS9115923", + "study_accession": "PRJNA733285", + "secondary_study_accession": "SRP322267", + "submission_accession": "SRA1239521", + "run_alias": "Sebastes_levis-2.fastq", + "experiment_alias": "Sebastes_macdonaldi-1", + "sample_alias": "S._macdonaldi-1", + "study_alias": "PRJNA733285", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "Sebastes_macdonaldi-1", + "instrument_model": "AB 5500 Genetic Analyzer", + "instrument_platform": "ABI_SOLID", + "base_count": "153", + "read_count": "1", + "tax_id": "394693", + "scientific_name": "Sebastes macdonaldi", + "sample_title": "Sebastes_macdonaldi-1", + "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", + "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", + "sample_description": "Sebastes_macdonaldi-1", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": true + }, + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" + ], + [ + { + "id": "SRX17709227_SRR21711856", + "run_accession": "SRR21711856", + "experiment_accession": "SRX17709227", + "sample_accession": "SAMN31021823", + "secondary_sample_accession": "SRS15239723", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601460_r1", + "experiment_alias": "GSM6601460_r1", + "sample_alias": "GSM6601460", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601460", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "573417800", + "read_count": "11468356", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "sham-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "sham-treated worms in day 5", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_2": "", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "single_end": true + }, + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" + ], + [ + { + "id": "SRX17709228_SRR21711855", + "run_accession": "SRR21711855", + "experiment_accession": "SRX17709228", + "sample_accession": "SAMN31021822", + "secondary_sample_accession": "SRS15239724", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601461_r1", + "experiment_alias": "GSM6601461_r1", + "sample_alias": "GSM6601461", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601461", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "677912850", + "read_count": "13558257", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "PM2.5-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "PM2.5-treated worms in day 5", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_2": "", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "single_end": true + }, + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" + ], + [ + { + "id": "SRX6725035_SRR9984183", + "run_accession": "SRR9984183", + "experiment_accession": "SRX6725035", + "sample_accession": "SAMN12581720", + "secondary_sample_accession": "SRS5277011", + "study_accession": "PRJNA560329", + "secondary_study_accession": "SRP218535", + "submission_accession": "SRA942061", + "run_alias": "Emb289P1_bin131.fastq", + "experiment_alias": "Emb289P1_bin131", + "sample_alias": "Emb289P1_bin131", + "study_alias": "PRJNA560329", + "library_layout": "SINGLE", + "library_selection": "RANDOM", + "library_source": "METAGENOMIC", + "library_strategy": "WGS", + "library_name": "Emb289P1_bin131", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "1996273", + "read_count": "58", + "tax_id": "2660712", + "scientific_name": "Defluviitaleaceae bacterium", + "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", + "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", + "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", + "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", + "fastq_md5": "0b512d2dc31685983456bd56fd836544", + "fastq_bytes": "605358", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_2": "", + "md5_1": "0b512d2dc31685983456bd56fd836544", + "md5_2": "", + "single_end": true + }, + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" + ], + [ + { + "id": "SRX9315476_SRR12848126", + "run_accession": "SRR12848126", + "experiment_accession": "SRX9315476", + "sample_accession": "SAMN16455283", + "secondary_sample_accession": "SRS7540262", + "study_accession": "PRJNA670070", + "secondary_study_accession": "SRP287769", + "submission_accession": "SRA1145417", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "experiment_alias": "F11-N1-05", + "sample_alias": "F11-N1-05", + "study_alias": "PRJNA670070", + "library_layout": "PAIRED", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "library_name": "F11-N1-05", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "base_count": "431758", + "read_count": "2954", + "tax_id": "10092", + "scientific_name": "Mus musculus domesticus", + "sample_title": "Longshanks_F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "sample_description": "F11-N1-05", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" + ] + ], + [ + { + "id": "SRX9504942_SRR13055517", + "run_accession": "SRR13055517", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r1", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2246028", + "read_count": "29553", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", + "fastq_bytes": "721167;723753", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", + "md5_2": "18dbe96e7f58b63406d9058938df1962", + "single_end": false + }, + [ + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" + ] + ], + [ + { + "id": "SRX9504942_SRR13055518", + "run_accession": "SRR13055518", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r2", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2235236", + "read_count": "29411", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", + "fastq_bytes": "717693;723429", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "md5_1": "5ec894d863fcefe394470a0925aefde4", + "md5_2": "aead170df9851773d5202b5760c76d76", + "single_end": false + }, + [ + "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" + ] + ], + [ + { + "id": "SRX9504942_SRR13055519", + "run_accession": "SRR13055519", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r3", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2232728", + "read_count": "29378", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", + "fastq_bytes": "714907;721705", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", + "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", + "single_end": false + }, + [ + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" + ] + ], + [ + { + "id": "SRX9504942_SRR13055520", + "run_accession": "SRR13055520", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r4", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2214488", + "read_count": "29138", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", + "fastq_bytes": "709867;716862", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "md5_1": "795d460abff6009c7f5ff7c14b773fbe", + "md5_2": "c3f34379356b28d6dac7212abc1a0a04", + "single_end": false + }, + [ + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" + ] + ], + [ + { + "id": "SRX9626017_SRR13191702", + "run_accession": "SRR13191702", + "experiment_accession": "SRX9626017", + "sample_accession": "SAMN16980141", + "secondary_sample_accession": "SRS7827211", + "study_accession": "PRJNA682076", + "secondary_study_accession": "SRP295653", + "submission_accession": "SRA1166126", + "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", + "experiment_alias": "S.170804.00784", + "sample_alias": "S.170804.00784_662", + "study_alias": "PRJNA682076", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "S.170804.00784", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "45682", + "read_count": "91", + "tax_id": "408170", + "scientific_name": "human gut metagenome", + "sample_title": "Metagenome or environmental sample from human gut metagenome", + "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "sample_description": "Metagenome or environmental sample from human gut metagenome", + "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", + "fastq_bytes": "15420;16324", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98", + "single_end": false + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + ] + ] + ], + "mappings": [ + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + ], + "samplesheet": [ + "samplesheet.csv:md5,484efbb550b50f5ac63e4864282edea7" + ], + "versions": [ + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + ] } ], - "timestamp": "2023-08-28T09:27:41+0000" - }, - "fastq": { - "content": [ - "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791", - "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", - "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30", - "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9", - "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6", - "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", - "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2", - "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda", - "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64", - "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83", - "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544", - "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", - "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79", - "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", - "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962", - "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", - "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76", - "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", - "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88", - "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", - "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04", - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98", - [ - "DRX024467_DRR026872.fastq.gz.md5:md5,dacaeba3498fb8f405411a22cdb4b40d", - "DRX026011_DRR028935_1.fastq.gz.md5:md5,a47018c5972ba4c11539d0d6bc25eda9", - "DRX026011_DRR028935_2.fastq.gz.md5:md5,f477bbef548fbed665734ebf084eea2f", - "ERX1188904_ERR1109373_1.fastq.gz.md5:md5,50c1c3108631dc32a3151b67e0260d86", - "ERX1188904_ERR1109373_2.fastq.gz.md5:md5,1f22463d410e91a288c83d43654b2499", - "ERX1234253_ERR1160846.fastq.gz.md5:md5,513a8437ad331fc512b088b3750aa1ff", - "SRX17709227_SRR21711856.fastq.gz.md5:md5,13a38fbef27c3e15867d80887145ae75", - "SRX17709228_SRR21711855.fastq.gz.md5:md5,1e871ddd9e92e1866e0c64d36eb5ec85", - "SRX6725035_SRR9984183.fastq.gz.md5:md5,84f59dbb76c9b5eab7e14d90ced352c4", - "SRX9504942_SRR13055517_1.fastq.gz.md5:md5,a03f7f374dc401047b6f6ccaec3885cc", - "SRX9504942_SRR13055517_2.fastq.gz.md5:md5,facaf207753e977327e7b7df7bb8ace0", - "SRX9504942_SRR13055518_1.fastq.gz.md5:md5,5cf412cd62aadaa4838d9eabb5b44368", - "SRX9504942_SRR13055518_2.fastq.gz.md5:md5,93292b826afc72b23be93df26dd710c8", - "SRX9504942_SRR13055519_1.fastq.gz.md5:md5,f6ad6e2610397147a0a55c651de3992f", - "SRX9504942_SRR13055519_2.fastq.gz.md5:md5,2fe7dd4bcc1e7e61c6f54ef50cf961f3", - "SRX9504942_SRR13055520_1.fastq.gz.md5:md5,ab195b37746a3424a1099d9f8cc58de8", - "SRX9504942_SRR13055520_2.fastq.gz.md5:md5,10c448e23f1f7e7af61ec1204f8fc882", - "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", - "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" - ] - ], - "timestamp": "2023-08-28T09:27:41+0000" + "timestamp": "2023-09-11T16:42:06.867767" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap index a30d8377..8b6be6a1 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap @@ -1,88 +1,1353 @@ { - "metadata": { - "content": [ - "DRR026872.runinfo_ftp.tsv:md5,73606f6a05c45b077809da43ca638b5f", - "DRR028935.runinfo_ftp.tsv:md5,f79eefcea5db346f76f76f87df7f8dd2", - "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", - "ERR1160846.runinfo_ftp.tsv:md5,1b2dc1a64117de20b2164724836da345", - "GSE214215.runinfo_ftp.tsv:md5,23a580c89ee7bf681ca3ffa26aa1837f", - "SRR12848126.runinfo_ftp.tsv:md5,5d1e6bfd3d4077d1e66378c58e44975d", - "SRR13191702.runinfo_ftp.tsv:md5,409e262bb41bb6103315126db4d0dd1d", - "SRR14593545.runinfo_ftp.tsv:md5,62015706ac156693ba3d86ed050cab54", - "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", - "SRR9984183.runinfo_ftp.tsv:md5,53ab34ff3612b0e2c7d60476822787be" - ], - "timestamp": "2023-08-28T10:03:01+0000" - }, - "samplesheet": { - "content": [ - "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565", - "samplesheet.csv:md5,3e32e2cfa3c8b23c9cd32d91b885c0de" - ], - "timestamp": "2023-08-28T10:03:01+0000" - }, "Parameters: --nf_core_pipeline viralrecon": { "content": [ { - + "0": [ + [ + { + "id": "DRX024467_DRR026872", + "run_accession": "DRR026872", + "experiment_accession": "DRX024467", + "sample_accession": "SAMD00023098", + "secondary_sample_accession": "DRS033740", + "study_accession": "PRJDB4356", + "secondary_study_accession": "DRP003256", + "submission_accession": "DRA002758", + "run_alias": "DRR026872", + "experiment_alias": "DRX024467", + "sample_alias": "SAMD00023098", + "study_alias": "DRP003256", + "library_layout": "SINGLE", + "library_selection": "Restriction Digest", + "library_source": "GENOMIC", + "library_strategy": "OTHER", + "library_name": "IpeRAD1_3", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "62550", + "read_count": "417", + "tax_id": "35883", + "scientific_name": "Ipomoea nil", + "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", + "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", + "study_title": "The Japanese morning glory genome sequence", + "sample_description": "Keywords: GSC:MIxS MIGS:6.0", + "fastq_md5": "515e5448c55e054113c4a22df5f62791", + "fastq_bytes": "38447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_2": "", + "md5_1": "515e5448c55e054113c4a22df5f62791", + "md5_2": "", + "single_end": true + }, + "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" + ], + [ + { + "id": "DRX026011_DRR028935", + "run_accession": "DRR028935", + "experiment_accession": "DRX026011", + "sample_accession": "SAMD00024405", + "secondary_sample_accession": "DRS019431", + "study_accession": "PRJDB3420", + "secondary_study_accession": "DRP002616", + "submission_accession": "DRA002949", + "run_alias": "DRR028935", + "experiment_alias": "DRX026011", + "sample_alias": "SAMD00024405", + "study_alias": "DRP002616", + "library_layout": "PAIRED", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "day0_BbSQE-I", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "194930", + "read_count": "965", + "tax_id": "1202541", + "scientific_name": "Botryococcus braunii Showa", + "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", + "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", + "sample_description": "Liquid culture", + "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", + "fastq_bytes": "60275;61610", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "md5_1": "cc01df82a9354bb6b3be93483b20c35a", + "md5_2": "941c9998d746416dad53c94c480ddf30", + "single_end": false + }, + [ + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" + ] + ], + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "sample_accession": "SAMEA3643867", + "secondary_sample_accession": "ERS951016", + "study_accession": "PRJEB11633", + "secondary_study_accession": "ERP013030", + "submission_accession": "ERA528939", + "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", + "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", + "sample_alias": "sample_56", + "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", + "library_layout": "PAIRED", + "library_selection": "RT-PCR", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "unspecified", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "29700", + "read_count": "169", + "tax_id": "63433", + "scientific_name": "Leptopilina boulardi", + "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing", + "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", + "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_bytes": "3221;8151;8118", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, + [ + "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" + ] + ], + [ + { + "id": "ERX1234253_ERR1160846", + "run_accession": "ERR1160846", + "experiment_accession": "ERX1234253", + "sample_accession": "SAMEA3687214", + "secondary_sample_accession": "ERS994363", + "study_accession": "PRJEB11419", + "secondary_study_accession": "ERP012803", + "submission_accession": "ERA541392", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "study_alias": "qiita_sid_10317", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "10317.BLANK.93.3E.r22", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "35658", + "read_count": "283", + "tax_id": "256318", + "scientific_name": "metagenome", + "sample_title": "10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "study_title": "American Gut Project", + "sample_description": "American Gut control", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_2": "", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "single_end": true + }, + "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" + ], + [ + { + "id": "SRX10940790_SRR14593545", + "run_accession": "SRR14593545", + "experiment_accession": "SRX10940790", + "sample_accession": "SAMN19097423", + "secondary_sample_accession": "SRS9020442", + "study_accession": "PRJNA728650", + "secondary_study_accession": "SRP319413", + "submission_accession": "SRA1234280", + "run_alias": "577-6_530058_19-037147 Goat_F.ab1", + "experiment_alias": "PRNP_2765", + "sample_alias": "prp_2765", + "study_alias": "PRJNA728650", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "PRNP_2765", + "instrument_model": "AB 3500xL Genetic Analyzer", + "instrument_platform": "CAPILLARY", + "base_count": "828", + "read_count": "1", + "tax_id": "9925", + "scientific_name": "Capra hircus", + "sample_title": "MIGS Eukaryotic sample from Capra hircus", + "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", + "study_title": "Capra hircus Raw sequence reads", + "sample_description": "Keywords: GSC:MIxS MIGS:5.0", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" + ] + ], + [ + { + "id": "SRX11047067_SRR14709033", + "run_accession": "SRR14709033", + "experiment_accession": "SRX11047067", + "sample_accession": "SAMN19373034", + "secondary_sample_accession": "SRS9115923", + "study_accession": "PRJNA733285", + "secondary_study_accession": "SRP322267", + "submission_accession": "SRA1239521", + "run_alias": "Sebastes_levis-2.fastq", + "experiment_alias": "Sebastes_macdonaldi-1", + "sample_alias": "S._macdonaldi-1", + "study_alias": "PRJNA733285", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "Sebastes_macdonaldi-1", + "instrument_model": "AB 5500 Genetic Analyzer", + "instrument_platform": "ABI_SOLID", + "base_count": "153", + "read_count": "1", + "tax_id": "394693", + "scientific_name": "Sebastes macdonaldi", + "sample_title": "Sebastes_macdonaldi-1", + "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", + "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", + "sample_description": "Sebastes_macdonaldi-1", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": true + }, + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" + ], + [ + { + "id": "SRX17709227_SRR21711856", + "run_accession": "SRR21711856", + "experiment_accession": "SRX17709227", + "sample_accession": "SAMN31021823", + "secondary_sample_accession": "SRS15239723", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601460_r1", + "experiment_alias": "GSM6601460_r1", + "sample_alias": "GSM6601460", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601460", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "573417800", + "read_count": "11468356", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "sham-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "sham-treated worms in day 5", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_2": "", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "single_end": true + }, + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" + ], + [ + { + "id": "SRX17709228_SRR21711855", + "run_accession": "SRR21711855", + "experiment_accession": "SRX17709228", + "sample_accession": "SAMN31021822", + "secondary_sample_accession": "SRS15239724", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601461_r1", + "experiment_alias": "GSM6601461_r1", + "sample_alias": "GSM6601461", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601461", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "677912850", + "read_count": "13558257", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "PM2.5-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "PM2.5-treated worms in day 5", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_2": "", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "single_end": true + }, + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" + ], + [ + { + "id": "SRX6725035_SRR9984183", + "run_accession": "SRR9984183", + "experiment_accession": "SRX6725035", + "sample_accession": "SAMN12581720", + "secondary_sample_accession": "SRS5277011", + "study_accession": "PRJNA560329", + "secondary_study_accession": "SRP218535", + "submission_accession": "SRA942061", + "run_alias": "Emb289P1_bin131.fastq", + "experiment_alias": "Emb289P1_bin131", + "sample_alias": "Emb289P1_bin131", + "study_alias": "PRJNA560329", + "library_layout": "SINGLE", + "library_selection": "RANDOM", + "library_source": "METAGENOMIC", + "library_strategy": "WGS", + "library_name": "Emb289P1_bin131", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "1996273", + "read_count": "58", + "tax_id": "2660712", + "scientific_name": "Defluviitaleaceae bacterium", + "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", + "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", + "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", + "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", + "fastq_md5": "0b512d2dc31685983456bd56fd836544", + "fastq_bytes": "605358", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_2": "", + "md5_1": "0b512d2dc31685983456bd56fd836544", + "md5_2": "", + "single_end": true + }, + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" + ], + [ + { + "id": "SRX9315476_SRR12848126", + "run_accession": "SRR12848126", + "experiment_accession": "SRX9315476", + "sample_accession": "SAMN16455283", + "secondary_sample_accession": "SRS7540262", + "study_accession": "PRJNA670070", + "secondary_study_accession": "SRP287769", + "submission_accession": "SRA1145417", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "experiment_alias": "F11-N1-05", + "sample_alias": "F11-N1-05", + "study_alias": "PRJNA670070", + "library_layout": "PAIRED", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "library_name": "F11-N1-05", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "base_count": "431758", + "read_count": "2954", + "tax_id": "10092", + "scientific_name": "Mus musculus domesticus", + "sample_title": "Longshanks_F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "sample_description": "F11-N1-05", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" + ] + ], + [ + { + "id": "SRX9504942_SRR13055517", + "run_accession": "SRR13055517", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r1", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2246028", + "read_count": "29553", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", + "fastq_bytes": "721167;723753", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", + "md5_2": "18dbe96e7f58b63406d9058938df1962", + "single_end": false + }, + [ + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" + ] + ], + [ + { + "id": "SRX9504942_SRR13055518", + "run_accession": "SRR13055518", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r2", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2235236", + "read_count": "29411", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", + "fastq_bytes": "717693;723429", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "md5_1": "5ec894d863fcefe394470a0925aefde4", + "md5_2": "aead170df9851773d5202b5760c76d76", + "single_end": false + }, + [ + "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" + ] + ], + [ + { + "id": "SRX9504942_SRR13055519", + "run_accession": "SRR13055519", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r3", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2232728", + "read_count": "29378", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", + "fastq_bytes": "714907;721705", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", + "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", + "single_end": false + }, + [ + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" + ] + ], + [ + { + "id": "SRX9504942_SRR13055520", + "run_accession": "SRR13055520", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r4", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2214488", + "read_count": "29138", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", + "fastq_bytes": "709867;716862", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "md5_1": "795d460abff6009c7f5ff7c14b773fbe", + "md5_2": "c3f34379356b28d6dac7212abc1a0a04", + "single_end": false + }, + [ + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" + ] + ], + [ + { + "id": "SRX9626017_SRR13191702", + "run_accession": "SRR13191702", + "experiment_accession": "SRX9626017", + "sample_accession": "SAMN16980141", + "secondary_sample_accession": "SRS7827211", + "study_accession": "PRJNA682076", + "secondary_study_accession": "SRP295653", + "submission_accession": "SRA1166126", + "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", + "experiment_alias": "S.170804.00784", + "sample_alias": "S.170804.00784_662", + "study_alias": "PRJNA682076", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "S.170804.00784", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "45682", + "read_count": "91", + "tax_id": "408170", + "scientific_name": "human gut metagenome", + "sample_title": "Metagenome or environmental sample from human gut metagenome", + "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "sample_description": "Metagenome or environmental sample from human gut metagenome", + "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", + "fastq_bytes": "15420;16324", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98", + "single_end": false + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + ] + ] + ], + "1": [ + "samplesheet.csv:md5,3e32e2cfa3c8b23c9cd32d91b885c0de" + ], + "2": [ + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + ], + "3": [ + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + ], + "fastq": [ + [ + { + "id": "DRX024467_DRR026872", + "run_accession": "DRR026872", + "experiment_accession": "DRX024467", + "sample_accession": "SAMD00023098", + "secondary_sample_accession": "DRS033740", + "study_accession": "PRJDB4356", + "secondary_study_accession": "DRP003256", + "submission_accession": "DRA002758", + "run_alias": "DRR026872", + "experiment_alias": "DRX024467", + "sample_alias": "SAMD00023098", + "study_alias": "DRP003256", + "library_layout": "SINGLE", + "library_selection": "Restriction Digest", + "library_source": "GENOMIC", + "library_strategy": "OTHER", + "library_name": "IpeRAD1_3", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "62550", + "read_count": "417", + "tax_id": "35883", + "scientific_name": "Ipomoea nil", + "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", + "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", + "study_title": "The Japanese morning glory genome sequence", + "sample_description": "Keywords: GSC:MIxS MIGS:6.0", + "fastq_md5": "515e5448c55e054113c4a22df5f62791", + "fastq_bytes": "38447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_2": "", + "md5_1": "515e5448c55e054113c4a22df5f62791", + "md5_2": "", + "single_end": true + }, + "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" + ], + [ + { + "id": "DRX026011_DRR028935", + "run_accession": "DRR028935", + "experiment_accession": "DRX026011", + "sample_accession": "SAMD00024405", + "secondary_sample_accession": "DRS019431", + "study_accession": "PRJDB3420", + "secondary_study_accession": "DRP002616", + "submission_accession": "DRA002949", + "run_alias": "DRR028935", + "experiment_alias": "DRX026011", + "sample_alias": "SAMD00024405", + "study_alias": "DRP002616", + "library_layout": "PAIRED", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "day0_BbSQE-I", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "194930", + "read_count": "965", + "tax_id": "1202541", + "scientific_name": "Botryococcus braunii Showa", + "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", + "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", + "sample_description": "Liquid culture", + "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", + "fastq_bytes": "60275;61610", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "md5_1": "cc01df82a9354bb6b3be93483b20c35a", + "md5_2": "941c9998d746416dad53c94c480ddf30", + "single_end": false + }, + [ + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" + ] + ], + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "sample_accession": "SAMEA3643867", + "secondary_sample_accession": "ERS951016", + "study_accession": "PRJEB11633", + "secondary_study_accession": "ERP013030", + "submission_accession": "ERA528939", + "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", + "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", + "sample_alias": "sample_56", + "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", + "library_layout": "PAIRED", + "library_selection": "RT-PCR", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "unspecified", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "29700", + "read_count": "169", + "tax_id": "63433", + "scientific_name": "Leptopilina boulardi", + "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing", + "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", + "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_bytes": "3221;8151;8118", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, + [ + "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" + ] + ], + [ + { + "id": "ERX1234253_ERR1160846", + "run_accession": "ERR1160846", + "experiment_accession": "ERX1234253", + "sample_accession": "SAMEA3687214", + "secondary_sample_accession": "ERS994363", + "study_accession": "PRJEB11419", + "secondary_study_accession": "ERP012803", + "submission_accession": "ERA541392", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "study_alias": "qiita_sid_10317", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "10317.BLANK.93.3E.r22", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "35658", + "read_count": "283", + "tax_id": "256318", + "scientific_name": "metagenome", + "sample_title": "10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "study_title": "American Gut Project", + "sample_description": "American Gut control", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_2": "", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "single_end": true + }, + "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" + ], + [ + { + "id": "SRX10940790_SRR14593545", + "run_accession": "SRR14593545", + "experiment_accession": "SRX10940790", + "sample_accession": "SAMN19097423", + "secondary_sample_accession": "SRS9020442", + "study_accession": "PRJNA728650", + "secondary_study_accession": "SRP319413", + "submission_accession": "SRA1234280", + "run_alias": "577-6_530058_19-037147 Goat_F.ab1", + "experiment_alias": "PRNP_2765", + "sample_alias": "prp_2765", + "study_alias": "PRJNA728650", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "PRNP_2765", + "instrument_model": "AB 3500xL Genetic Analyzer", + "instrument_platform": "CAPILLARY", + "base_count": "828", + "read_count": "1", + "tax_id": "9925", + "scientific_name": "Capra hircus", + "sample_title": "MIGS Eukaryotic sample from Capra hircus", + "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", + "study_title": "Capra hircus Raw sequence reads", + "sample_description": "Keywords: GSC:MIxS MIGS:5.0", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" + ] + ], + [ + { + "id": "SRX11047067_SRR14709033", + "run_accession": "SRR14709033", + "experiment_accession": "SRX11047067", + "sample_accession": "SAMN19373034", + "secondary_sample_accession": "SRS9115923", + "study_accession": "PRJNA733285", + "secondary_study_accession": "SRP322267", + "submission_accession": "SRA1239521", + "run_alias": "Sebastes_levis-2.fastq", + "experiment_alias": "Sebastes_macdonaldi-1", + "sample_alias": "S._macdonaldi-1", + "study_alias": "PRJNA733285", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "Sebastes_macdonaldi-1", + "instrument_model": "AB 5500 Genetic Analyzer", + "instrument_platform": "ABI_SOLID", + "base_count": "153", + "read_count": "1", + "tax_id": "394693", + "scientific_name": "Sebastes macdonaldi", + "sample_title": "Sebastes_macdonaldi-1", + "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", + "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", + "sample_description": "Sebastes_macdonaldi-1", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": true + }, + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" + ], + [ + { + "id": "SRX17709227_SRR21711856", + "run_accession": "SRR21711856", + "experiment_accession": "SRX17709227", + "sample_accession": "SAMN31021823", + "secondary_sample_accession": "SRS15239723", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601460_r1", + "experiment_alias": "GSM6601460_r1", + "sample_alias": "GSM6601460", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601460", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "573417800", + "read_count": "11468356", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "sham-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "sham-treated worms in day 5", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_2": "", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "single_end": true + }, + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" + ], + [ + { + "id": "SRX17709228_SRR21711855", + "run_accession": "SRR21711855", + "experiment_accession": "SRX17709228", + "sample_accession": "SAMN31021822", + "secondary_sample_accession": "SRS15239724", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601461_r1", + "experiment_alias": "GSM6601461_r1", + "sample_alias": "GSM6601461", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601461", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "677912850", + "read_count": "13558257", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "PM2.5-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "PM2.5-treated worms in day 5", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_2": "", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "single_end": true + }, + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" + ], + [ + { + "id": "SRX6725035_SRR9984183", + "run_accession": "SRR9984183", + "experiment_accession": "SRX6725035", + "sample_accession": "SAMN12581720", + "secondary_sample_accession": "SRS5277011", + "study_accession": "PRJNA560329", + "secondary_study_accession": "SRP218535", + "submission_accession": "SRA942061", + "run_alias": "Emb289P1_bin131.fastq", + "experiment_alias": "Emb289P1_bin131", + "sample_alias": "Emb289P1_bin131", + "study_alias": "PRJNA560329", + "library_layout": "SINGLE", + "library_selection": "RANDOM", + "library_source": "METAGENOMIC", + "library_strategy": "WGS", + "library_name": "Emb289P1_bin131", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "1996273", + "read_count": "58", + "tax_id": "2660712", + "scientific_name": "Defluviitaleaceae bacterium", + "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", + "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", + "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", + "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", + "fastq_md5": "0b512d2dc31685983456bd56fd836544", + "fastq_bytes": "605358", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_2": "", + "md5_1": "0b512d2dc31685983456bd56fd836544", + "md5_2": "", + "single_end": true + }, + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" + ], + [ + { + "id": "SRX9315476_SRR12848126", + "run_accession": "SRR12848126", + "experiment_accession": "SRX9315476", + "sample_accession": "SAMN16455283", + "secondary_sample_accession": "SRS7540262", + "study_accession": "PRJNA670070", + "secondary_study_accession": "SRP287769", + "submission_accession": "SRA1145417", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "experiment_alias": "F11-N1-05", + "sample_alias": "F11-N1-05", + "study_alias": "PRJNA670070", + "library_layout": "PAIRED", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "library_name": "F11-N1-05", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "base_count": "431758", + "read_count": "2954", + "tax_id": "10092", + "scientific_name": "Mus musculus domesticus", + "sample_title": "Longshanks_F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "sample_description": "F11-N1-05", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" + ] + ], + [ + { + "id": "SRX9504942_SRR13055517", + "run_accession": "SRR13055517", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r1", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2246028", + "read_count": "29553", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", + "fastq_bytes": "721167;723753", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", + "md5_2": "18dbe96e7f58b63406d9058938df1962", + "single_end": false + }, + [ + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" + ] + ], + [ + { + "id": "SRX9504942_SRR13055518", + "run_accession": "SRR13055518", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r2", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2235236", + "read_count": "29411", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", + "fastq_bytes": "717693;723429", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "md5_1": "5ec894d863fcefe394470a0925aefde4", + "md5_2": "aead170df9851773d5202b5760c76d76", + "single_end": false + }, + [ + "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" + ] + ], + [ + { + "id": "SRX9504942_SRR13055519", + "run_accession": "SRR13055519", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r3", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2232728", + "read_count": "29378", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", + "fastq_bytes": "714907;721705", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", + "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", + "single_end": false + }, + [ + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" + ] + ], + [ + { + "id": "SRX9504942_SRR13055520", + "run_accession": "SRR13055520", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r4", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2214488", + "read_count": "29138", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", + "fastq_bytes": "709867;716862", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "md5_1": "795d460abff6009c7f5ff7c14b773fbe", + "md5_2": "c3f34379356b28d6dac7212abc1a0a04", + "single_end": false + }, + [ + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" + ] + ], + [ + { + "id": "SRX9626017_SRR13191702", + "run_accession": "SRR13191702", + "experiment_accession": "SRX9626017", + "sample_accession": "SAMN16980141", + "secondary_sample_accession": "SRS7827211", + "study_accession": "PRJNA682076", + "secondary_study_accession": "SRP295653", + "submission_accession": "SRA1166126", + "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", + "experiment_alias": "S.170804.00784", + "sample_alias": "S.170804.00784_662", + "study_alias": "PRJNA682076", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "S.170804.00784", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "45682", + "read_count": "91", + "tax_id": "408170", + "scientific_name": "human gut metagenome", + "sample_title": "Metagenome or environmental sample from human gut metagenome", + "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "sample_description": "Metagenome or environmental sample from human gut metagenome", + "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", + "fastq_bytes": "15420;16324", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98", + "single_end": false + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + ] + ] + ], + "mappings": [ + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + ], + "samplesheet": [ + "samplesheet.csv:md5,3e32e2cfa3c8b23c9cd32d91b885c0de" + ], + "versions": [ + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + ] } ], - "timestamp": "2023-08-28T10:03:01+0000" - }, - "software_versions": { - "content": [ - "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" - ], - "timestamp": "2023-08-28T10:03:01+0000" - }, - "fastq": { - "content": [ - "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791", - "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", - "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30", - "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9", - "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6", - "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", - "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2", - "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda", - "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64", - "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83", - "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544", - "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", - "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79", - "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", - "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962", - "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", - "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76", - "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", - "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88", - "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", - "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04", - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98", - [ - "DRX024467_DRR026872.fastq.gz.md5:md5,dacaeba3498fb8f405411a22cdb4b40d", - "DRX026011_DRR028935_1.fastq.gz.md5:md5,a47018c5972ba4c11539d0d6bc25eda9", - "DRX026011_DRR028935_2.fastq.gz.md5:md5,f477bbef548fbed665734ebf084eea2f", - "ERX1188904_ERR1109373_1.fastq.gz.md5:md5,50c1c3108631dc32a3151b67e0260d86", - "ERX1188904_ERR1109373_2.fastq.gz.md5:md5,1f22463d410e91a288c83d43654b2499", - "ERX1234253_ERR1160846.fastq.gz.md5:md5,513a8437ad331fc512b088b3750aa1ff", - "SRX17709227_SRR21711856.fastq.gz.md5:md5,13a38fbef27c3e15867d80887145ae75", - "SRX17709228_SRR21711855.fastq.gz.md5:md5,1e871ddd9e92e1866e0c64d36eb5ec85", - "SRX6725035_SRR9984183.fastq.gz.md5:md5,84f59dbb76c9b5eab7e14d90ced352c4", - "SRX9504942_SRR13055517_1.fastq.gz.md5:md5,a03f7f374dc401047b6f6ccaec3885cc", - "SRX9504942_SRR13055517_2.fastq.gz.md5:md5,facaf207753e977327e7b7df7bb8ace0", - "SRX9504942_SRR13055518_1.fastq.gz.md5:md5,5cf412cd62aadaa4838d9eabb5b44368", - "SRX9504942_SRR13055518_2.fastq.gz.md5:md5,93292b826afc72b23be93df26dd710c8", - "SRX9504942_SRR13055519_1.fastq.gz.md5:md5,f6ad6e2610397147a0a55c651de3992f", - "SRX9504942_SRR13055519_2.fastq.gz.md5:md5,2fe7dd4bcc1e7e61c6f54ef50cf961f3", - "SRX9504942_SRR13055520_1.fastq.gz.md5:md5,ab195b37746a3424a1099d9f8cc58de8", - "SRX9504942_SRR13055520_2.fastq.gz.md5:md5,10c448e23f1f7e7af61ec1204f8fc882", - "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", - "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" - ] - ], - "timestamp": "2023-08-28T10:03:06+0000" + "timestamp": "2023-09-11T16:33:01.320808" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap b/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap new file mode 100644 index 00000000..921bed59 --- /dev/null +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap @@ -0,0 +1,37 @@ +{ + "Parameters: --skip_fastq_download": { + "content": [ + { + "0": [ + + ], + "1": [ + "samplesheet.csv:md5,7cf3503b651fe016bc1e5fb3c2e996d5" + ], + "2": [ + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + ], + "3": [ + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + ], + "fastq": [ + + ], + "mappings": [ + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + ], + "samplesheet": [ + "samplesheet.csv:md5,7cf3503b651fe016bc1e5fb3c2e996d5" + ], + "versions": [ + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + ] + } + ], + "timestamp": "2023-09-11T16:58:42.10055" + } +} \ No newline at end of file From 07be381748947cf5d6c8d1d85be47c61c6735f52 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 11 Sep 2023 17:30:23 +0200 Subject: [PATCH 424/852] update snapshot --- workflows/synapse/tests/main.nf.test.snap | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/workflows/synapse/tests/main.nf.test.snap b/workflows/synapse/tests/main.nf.test.snap index 8528f776..9b25ee0c 100644 --- a/workflows/synapse/tests/main.nf.test.snap +++ b/workflows/synapse/tests/main.nf.test.snap @@ -3,14 +3,14 @@ "content": [ "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565", "multiqc_config.yml:md5,a97047e12b0ea3f46d285629e4053548", - "samplesheet.csv:md5,9b3c35e8af74e9af194baa2498aaf4d4" + "samplesheet.csv:md5,296e139d533c7a67567dd073ec0f945a" ], - "timestamp": "2023-08-24T14:05:07+0000" + "timestamp": "2023-09-11T17:08:51.001588" }, "software_versions": { "content": [ - "software_versions.yml:md5,f37983a6b1ce2334fe62fa188b31ca51" + "software_versions.yml:md5,966251d4b7717464ccea77d6e8841e58" ], - "timestamp": "2023-08-24T14:05:07+0000" + "timestamp": "2023-09-11T17:08:50.994607" } } \ No newline at end of file From cedcf471f8c39d7f66c589fa36c1919ffe025ad1 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 11 Sep 2023 18:26:47 +0200 Subject: [PATCH 425/852] relative path --- workflows/sra/tests/main.nf.test | 2 +- workflows/sra/tests/main.nf.test.snap | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/workflows/sra/tests/main.nf.test b/workflows/sra/tests/main.nf.test index 2652eb80..ef35c80a 100644 --- a/workflows/sra/tests/main.nf.test +++ b/workflows/sra/tests/main.nf.test @@ -16,7 +16,7 @@ nextflow_workflow { """ } params { - outdir = "$outputDir" + outdir = "results" } } diff --git a/workflows/sra/tests/main.nf.test.snap b/workflows/sra/tests/main.nf.test.snap index 1c969bc2..1692d4cd 100644 --- a/workflows/sra/tests/main.nf.test.snap +++ b/workflows/sra/tests/main.nf.test.snap @@ -662,7 +662,7 @@ ] ], "1": [ - "samplesheet.csv:md5,dbd0e9c1683c603c681184a13f5b7341" + "samplesheet.csv:md5,4aec9029e063bae998b3fa3dc3481556" ], "2": [ "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" @@ -1337,7 +1337,7 @@ "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" ], "samplesheet": [ - "samplesheet.csv:md5,dbd0e9c1683c603c681184a13f5b7341" + "samplesheet.csv:md5,4aec9029e063bae998b3fa3dc3481556" ], "versions": [ "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", @@ -1348,6 +1348,6 @@ ] } ], - "timestamp": "2023-09-11T16:58:15.05829" + "timestamp": "2023-09-11T18:23:09.598326" } } \ No newline at end of file From b26115d7e453393355ca7d5638fcd0ed40f583eb Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 11 Sep 2023 19:35:04 +0200 Subject: [PATCH 426/852] update tests and snapshot --- workflows/sra/tests/main.nf.test.snap | 2 +- .../sra/tests/sra_custom_ena_metadata_fields.nf.test | 2 +- .../tests/sra_custom_ena_metadata_fields.nf.test.snap | 10 +++++----- .../sra/tests/sra_force_sratools_download.nf.test | 2 +- .../sra/tests/sra_force_sratools_download.nf.test.snap | 6 +++--- .../sra/tests/sra_nf_core_pipeline_atacseq.nf.test | 2 +- .../tests/sra_nf_core_pipeline_atacseq.nf.test.snap | 6 +++--- .../sra/tests/sra_nf_core_pipeline_rnaseq.nf.test | 2 +- .../sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap | 10 +++++----- .../sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test | 2 +- .../sra_nf_core_pipeline_taxprofiler.nf.test.snap | 10 +++++----- .../sra/tests/sra_nf_core_pipeline_viralrecon.nf.test | 2 +- .../tests/sra_nf_core_pipeline_viralrecon.nf.test.snap | 6 +++--- workflows/sra/tests/sra_skip_fastq_download.nf.test | 2 +- .../sra/tests/sra_skip_fastq_download.nf.test.snap | 2 +- 15 files changed, 33 insertions(+), 33 deletions(-) diff --git a/workflows/sra/tests/main.nf.test.snap b/workflows/sra/tests/main.nf.test.snap index 1692d4cd..b8dc88ca 100644 --- a/workflows/sra/tests/main.nf.test.snap +++ b/workflows/sra/tests/main.nf.test.snap @@ -1348,6 +1348,6 @@ ] } ], - "timestamp": "2023-09-11T18:23:09.598326" + "timestamp": "2023-09-11T18:56:05.693225" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test index 4dc9ba8b..45280ab0 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test @@ -16,7 +16,7 @@ nextflow_workflow { """ } params { - outdir = "$outputDir" + outdir = "results" nf_core_pipeline = "rnaseq" ena_metadata_fields = "run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5" sample_mapping_fields = "run_accession,library_layout" diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap index c2782552..a2537a95 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap @@ -272,14 +272,14 @@ ] ], "1": [ - "samplesheet.csv:md5,7bca96e409bd9eb6790e0d6737af686c" + "samplesheet.csv:md5,be5465f34924356e136c804d63e1b562" ], "2": [ "id_mappings.csv:md5,8473773df806859c6af7acafcfe5aa6f" ], "3": [ - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" @@ -557,17 +557,17 @@ "id_mappings.csv:md5,8473773df806859c6af7acafcfe5aa6f" ], "samplesheet": [ - "samplesheet.csv:md5,7bca96e409bd9eb6790e0d6737af686c" + "samplesheet.csv:md5,be5465f34924356e136c804d63e1b562" ], "versions": [ - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" ] } ], - "timestamp": "2023-09-11T16:47:26.813819" + "timestamp": "2023-09-11T18:48:18.757655" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test b/workflows/sra/tests/sra_force_sratools_download.nf.test index 2b1b5953..76ce7cd3 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test @@ -16,7 +16,7 @@ nextflow_workflow { """ } params { - outdir = "$outputDir" + outdir = "results" force_sratools_download = true } } diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test.snap b/workflows/sra/tests/sra_force_sratools_download.nf.test.snap index 2c779c84..4e1b8aaf 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test.snap +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test.snap @@ -662,7 +662,7 @@ ] ], "1": [ - "samplesheet.csv:md5,9d4b95a31702af34a6f57d963137340d" + "samplesheet.csv:md5,4aec9029e063bae998b3fa3dc3481556" ], "2": [ "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" @@ -1336,7 +1336,7 @@ "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" ], "samplesheet": [ - "samplesheet.csv:md5,9d4b95a31702af34a6f57d963137340d" + "samplesheet.csv:md5,4aec9029e063bae998b3fa3dc3481556" ], "versions": [ "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", @@ -1346,6 +1346,6 @@ ] } ], - "timestamp": "2023-09-11T17:03:59.154427" + "timestamp": "2023-09-11T19:02:05.556134" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test index 3d946fea..0ce0c230 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test @@ -16,7 +16,7 @@ nextflow_workflow { """ } params { - outdir = "$outputDir" + outdir = "results" nf_core_pipeline = "atacseq" } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap index 069e3390..f6528e52 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap @@ -662,7 +662,7 @@ ] ], "1": [ - "samplesheet.csv:md5,252449b9f66687af076bb5a9dfea4551" + "samplesheet.csv:md5,16e5161103702777b2d763c1ed660d3c" ], "2": [ "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" @@ -1337,7 +1337,7 @@ "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" ], "samplesheet": [ - "samplesheet.csv:md5,252449b9f66687af076bb5a9dfea4551" + "samplesheet.csv:md5,16e5161103702777b2d763c1ed660d3c" ], "versions": [ "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", @@ -1348,6 +1348,6 @@ ] } ], - "timestamp": "2023-09-11T16:36:17.537997" + "timestamp": "2023-09-11T18:37:54.607231" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test index f51aa4ca..67c0fbe4 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test @@ -16,7 +16,7 @@ nextflow_workflow { """ } params { - outdir = "$outputDir" + outdir = "results" nf_core_pipeline = "rnaseq" } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap index 4c2abc45..124877ae 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap @@ -662,14 +662,14 @@ ] ], "1": [ - "samplesheet.csv:md5,f0b7e9436c6feb1a31c49c2c8ab761a2" + "samplesheet.csv:md5,fcbb1fbe56dc14561ec83e5f6a70ee80" ], "2": [ "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" ], "3": [ - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" @@ -1337,17 +1337,17 @@ "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" ], "samplesheet": [ - "samplesheet.csv:md5,f0b7e9436c6feb1a31c49c2c8ab761a2" + "samplesheet.csv:md5,fcbb1fbe56dc14561ec83e5f6a70ee80" ], "versions": [ - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" ] } ], - "timestamp": "2023-09-11T16:53:44.32524" + "timestamp": "2023-09-11T18:51:38.198125" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test index 97cd4a44..e00793cd 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test @@ -16,7 +16,7 @@ nextflow_workflow { """ } params { - outdir = "$outputDir" + outdir = "results" nf_core_pipeline = "taxprofiler" } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap index a94fc295..b63ad4b7 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap @@ -662,14 +662,14 @@ ] ], "1": [ - "samplesheet.csv:md5,484efbb550b50f5ac63e4864282edea7" + "samplesheet.csv:md5,0df1f60a9b5bc94f8a85e96edcc90f5c" ], "2": [ "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" ], "3": [ - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" @@ -1337,17 +1337,17 @@ "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" ], "samplesheet": [ - "samplesheet.csv:md5,484efbb550b50f5ac63e4864282edea7" + "samplesheet.csv:md5,0df1f60a9b5bc94f8a85e96edcc90f5c" ], "versions": [ - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" ] } ], - "timestamp": "2023-09-11T16:42:06.867767" + "timestamp": "2023-09-11T18:44:02.293186" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test index 434fac63..045e0363 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test @@ -16,7 +16,7 @@ nextflow_workflow { """ } params { - outdir = "$outputDir" + outdir = "results" nf_core_pipeline = "viralrecon" } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap index 8b6be6a1..1387f422 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap @@ -662,7 +662,7 @@ ] ], "1": [ - "samplesheet.csv:md5,3e32e2cfa3c8b23c9cd32d91b885c0de" + "samplesheet.csv:md5,4aec9029e063bae998b3fa3dc3481556" ], "2": [ "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" @@ -1337,7 +1337,7 @@ "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" ], "samplesheet": [ - "samplesheet.csv:md5,3e32e2cfa3c8b23c9cd32d91b885c0de" + "samplesheet.csv:md5,4aec9029e063bae998b3fa3dc3481556" ], "versions": [ "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", @@ -1348,6 +1348,6 @@ ] } ], - "timestamp": "2023-09-11T16:33:01.320808" + "timestamp": "2023-09-11T18:34:25.049818" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test b/workflows/sra/tests/sra_skip_fastq_download.nf.test index dbe40144..67abee3b 100644 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test @@ -16,7 +16,7 @@ nextflow_workflow { """ } params { - outdir = "$outputDir" + outdir = "results" skip_fastq_download = true } } diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap b/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap index 921bed59..3b04b917 100644 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap @@ -32,6 +32,6 @@ ] } ], - "timestamp": "2023-09-11T16:58:42.10055" + "timestamp": "2023-09-11T18:56:34.175665" } } \ No newline at end of file From 410321c8f88e2d28abd328e5d098d4780b76276d Mon Sep 17 00:00:00 2001 From: maxulysse Date: Tue, 12 Sep 2023 12:51:28 +0200 Subject: [PATCH 427/852] implement changes in GHA CI --- .github/workflows/ci.yml | 46 ++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5c5df959..4fe23a91 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,18 +1,17 @@ # This workflow runs the pipeline with the minimal test dataset to check that it completes without any syntax errors name: nf-core CI +# This workflow runs the pipeline with the minimal test dataset to check that it completes without any syntax errors on: - push: - branches: - - dev - - refactor pull_request: + release: + types: [published] + merge_group: + types: + - checks_requested branches: - - dev - master + - dev - refactor - release: - types: - - "published" env: NXF_ANSI_LOG: false @@ -23,6 +22,19 @@ concurrency: cancel-in-progress: true jobs: + changes: + name: Check for changes + runs-on: ubuntu-latest + outputs: + # Expose matched filters as job 'tags' output variable + tags: ${{ steps.filter.outputs.changes }} + steps: + - uses: actions/checkout@v3 + - uses: dorny/paths-filter@v2 + id: filter + with: + filters: "tests/config/tags.yml" + define_nxf_versions: name: Choose nextflow versions to test against depending on target branch runs-on: ubuntu-latest @@ -38,23 +50,15 @@ jobs: fi test: - name: Run pipeline with test data - needs: define_nxf_versions + name: ${{ matrix.tags }} ${{ matrix.profile }} NF ${{ matrix.NXF_VER }} + needs: [changes, define_nxf_versions] + if: needs.changes.outputs.tags != '[]' runs-on: ubuntu-latest strategy: fail-fast: false matrix: NXF_VER: ${{ fromJson(needs.define_nxf_versions.outputs.matrix) }} - test_tags: - - "modules_local" - - "sra_default_parameters" - - "sra_custom_ena_metadata_fields" - - "sra_force_sratools_download" - - "sra_nf_core_pipeline_atacseq" - - "sra_nf_core_pipeline_rnaseq" - - "sra_nf_core_pipeline_taxprofiler" - - "sra_nf_core_pipeline_viralrecon" - - "sra_skip_fastq_download" + tags: ["${{ fromJson(needs.changes.outputs.tags) }}"] profile: - "docker" @@ -74,7 +78,7 @@ jobs: - name: Run nf-test run: | - nf-test test --tag ${{ matrix.test_tags }} --profile "test,${{ matrix.profile }}" --junitxml=test.xml + nf-test test --tag ${{ matrix.tags }} --profile "test,${{ matrix.profile }}" --junitxml=test.xml - name: Output log on failure if: failure() From 57d6921e74bbfca14d021964bcd03723e42ad33c Mon Sep 17 00:00:00 2001 From: maxulysse Date: Tue, 12 Sep 2023 14:45:11 +0200 Subject: [PATCH 428/852] add tags --- .github/tags.yml | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 .github/tags.yml diff --git a/.github/tags.yml b/.github/tags.yml new file mode 100644 index 00000000..8fe923f5 --- /dev/null +++ b/.github/tags.yml @@ -0,0 +1,40 @@ +# local modules + +multiqc_mappings_config: + - modules/local/multiqc_mappings_config/* +sra_fastq_ftp: + - modules/local/sra_fastq_ftp/* +sra_ids_to_runinfo: + - modules/local/sra_ids_to_runinfo/* +sra_merge_samplesheet: + - modules/local/sra_merge_samplesheet/* +sra_runinfo_to_ftp: + - modules/local/sra_runinfo_to_ftp/* +sra_to_samplesheet: + - modules/local/sra_to_samplesheet/* + +# workflow: sra +sra_custom_ena_metadata_fields: + - conf/modules/sra.config + - workflows/sra/main.nf +sra_default_parameters: + - conf/modules/sra.config + - workflows/sra/main.nf +sra_force_sratools_download: + - conf/modules/sra.config + - workflows/sra/main.nf +sra_nf_core_pipeline_atacseq: + - conf/modules/sra.config + - workflows/sra/main.nf +sra_nf_core_pipeline_rnaseq: + - conf/modules/sra.config + - workflows/sra/main.nf +sra_nf_core_pipeline_taxprofiler: + - conf/modules/sra.config + - workflows/sra/main.nf +sra_nf_core_pipeline_viralrecon: + - conf/modules/sra.config + - workflows/sra/main.nf +sra_skip_fastq_download: + - conf/modules/sra.config + - workflows/sra/main.nf From e9d38bb614c8d93d2a8c542ff3d1ec53e3aed38d Mon Sep 17 00:00:00 2001 From: maxulysse Date: Tue, 12 Sep 2023 14:45:19 +0200 Subject: [PATCH 429/852] fix path to tags --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4fe23a91..7b7070e7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -33,7 +33,7 @@ jobs: - uses: dorny/paths-filter@v2 id: filter with: - filters: "tests/config/tags.yml" + filters: ".github/tags.yml" define_nxf_versions: name: Choose nextflow versions to test against depending on target branch From 54f954ca4371ea42f3e5cc0610cd747eb111bf3b Mon Sep 17 00:00:00 2001 From: maxulysse Date: Tue, 12 Sep 2023 15:16:10 +0200 Subject: [PATCH 430/852] rename files --- .../sra/tests/{main.nf.test => sra_default_parameters.nf.test} | 0 .../{main.nf.test.snap => sra_default_parameters.nf.test.snap} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename workflows/sra/tests/{main.nf.test => sra_default_parameters.nf.test} (100%) rename workflows/sra/tests/{main.nf.test.snap => sra_default_parameters.nf.test.snap} (100%) diff --git a/workflows/sra/tests/main.nf.test b/workflows/sra/tests/sra_default_parameters.nf.test similarity index 100% rename from workflows/sra/tests/main.nf.test rename to workflows/sra/tests/sra_default_parameters.nf.test diff --git a/workflows/sra/tests/main.nf.test.snap b/workflows/sra/tests/sra_default_parameters.nf.test.snap similarity index 100% rename from workflows/sra/tests/main.nf.test.snap rename to workflows/sra/tests/sra_default_parameters.nf.test.snap From 82510e8b9297fb1106cf86c4e191cfedbd6c4101 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Tue, 12 Sep 2023 15:16:19 +0200 Subject: [PATCH 431/852] add tests to tags --- .github/tags.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/tags.yml b/.github/tags.yml index 8fe923f5..68607d79 100644 --- a/.github/tags.yml +++ b/.github/tags.yml @@ -1,5 +1,4 @@ # local modules - multiqc_mappings_config: - modules/local/multiqc_mappings_config/* sra_fastq_ftp: @@ -16,25 +15,33 @@ sra_to_samplesheet: # workflow: sra sra_custom_ena_metadata_fields: - conf/modules/sra.config + - workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test - workflows/sra/main.nf sra_default_parameters: - conf/modules/sra.config + - workflows/sra/tests/sra_default_parameters.nf.test - workflows/sra/main.nf sra_force_sratools_download: - conf/modules/sra.config + - workflows/sra/tests/sra_force_sratools_download.nf.test - workflows/sra/main.nf sra_nf_core_pipeline_atacseq: - conf/modules/sra.config + - workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test - workflows/sra/main.nf sra_nf_core_pipeline_rnaseq: - conf/modules/sra.config + - workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test - workflows/sra/main.nf sra_nf_core_pipeline_taxprofiler: - conf/modules/sra.config + - workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test - workflows/sra/main.nf sra_nf_core_pipeline_viralrecon: - conf/modules/sra.config + - workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test - workflows/sra/main.nf sra_skip_fastq_download: - conf/modules/sra.config + - workflows/sra/tests/sra_skip_fastq_download.nf.test - workflows/sra/main.nf From c707eef5871a8a82bdfc1b6f3f918ced7b0b252f Mon Sep 17 00:00:00 2001 From: maxulysse Date: Tue, 12 Sep 2023 15:24:45 +0200 Subject: [PATCH 432/852] alphabetical order --- .github/tags.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/tags.yml b/.github/tags.yml index 68607d79..aa7b69c9 100644 --- a/.github/tags.yml +++ b/.github/tags.yml @@ -15,33 +15,33 @@ sra_to_samplesheet: # workflow: sra sra_custom_ena_metadata_fields: - conf/modules/sra.config - - workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test - workflows/sra/main.nf + - workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test sra_default_parameters: - conf/modules/sra.config - - workflows/sra/tests/sra_default_parameters.nf.test - workflows/sra/main.nf + - workflows/sra/tests/sra_default_parameters.nf.test sra_force_sratools_download: - conf/modules/sra.config - - workflows/sra/tests/sra_force_sratools_download.nf.test - workflows/sra/main.nf + - workflows/sra/tests/sra_force_sratools_download.nf.test sra_nf_core_pipeline_atacseq: - conf/modules/sra.config - - workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test - workflows/sra/main.nf + - workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test sra_nf_core_pipeline_rnaseq: - conf/modules/sra.config - - workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test - workflows/sra/main.nf + - workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test sra_nf_core_pipeline_taxprofiler: - conf/modules/sra.config - - workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test - workflows/sra/main.nf + - workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test sra_nf_core_pipeline_viralrecon: - conf/modules/sra.config - - workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test - workflows/sra/main.nf + - workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test sra_skip_fastq_download: - conf/modules/sra.config - - workflows/sra/tests/sra_skip_fastq_download.nf.test - workflows/sra/main.nf + - workflows/sra/tests/sra_skip_fastq_download.nf.test From b5d80fb8ad782d6366fa77cc41bde11000f257c4 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Tue, 12 Sep 2023 15:33:28 +0200 Subject: [PATCH 433/852] add modules to changes --- .github/tags.yml | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/.github/tags.yml b/.github/tags.yml index aa7b69c9..ed5c9dcc 100644 --- a/.github/tags.yml +++ b/.github/tags.yml @@ -15,33 +15,73 @@ sra_to_samplesheet: # workflow: sra sra_custom_ena_metadata_fields: - conf/modules/sra.config + - modules/local/sra_ids_to_runinfo/main.nf + - modules/local/sra_runinfo_to_ftp/main.nf + - modules/local/sra_fastq_ftp/main.nf + - modules/local/sra_to_samplesheet/main.nf + - modules/local/sra_merge_samplesheet/main.nf - workflows/sra/main.nf - workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test sra_default_parameters: - conf/modules/sra.config + - modules/local/sra_ids_to_runinfo/main.nf + - modules/local/sra_runinfo_to_ftp/main.nf + - modules/local/sra_fastq_ftp/main.nf + - modules/local/sra_to_samplesheet/main.nf + - modules/local/sra_merge_samplesheet/main.nf - workflows/sra/main.nf - workflows/sra/tests/sra_default_parameters.nf.test sra_force_sratools_download: - conf/modules/sra.config + - modules/local/sra_ids_to_runinfo/main.nf + - modules/local/sra_runinfo_to_ftp/main.nf + - modules/local/sra_fastq_ftp/main.nf + - modules/local/sra_to_samplesheet/main.nf + - modules/local/sra_merge_samplesheet/main.nf - workflows/sra/main.nf - workflows/sra/tests/sra_force_sratools_download.nf.test sra_nf_core_pipeline_atacseq: - conf/modules/sra.config + - modules/local/sra_ids_to_runinfo/main.nf + - modules/local/sra_runinfo_to_ftp/main.nf + - modules/local/sra_fastq_ftp/main.nf + - modules/local/sra_to_samplesheet/main.nf + - modules/local/sra_merge_samplesheet/main.nf - workflows/sra/main.nf - workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test sra_nf_core_pipeline_rnaseq: - conf/modules/sra.config + - modules/local/sra_ids_to_runinfo/main.nf + - modules/local/sra_runinfo_to_ftp/main.nf + - modules/local/sra_fastq_ftp/main.nf + - modules/local/sra_to_samplesheet/main.nf + - modules/local/sra_merge_samplesheet/main.nf - workflows/sra/main.nf - workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test sra_nf_core_pipeline_taxprofiler: - conf/modules/sra.config + - modules/local/sra_ids_to_runinfo/main.nf + - modules/local/sra_runinfo_to_ftp/main.nf + - modules/local/sra_fastq_ftp/main.nf + - modules/local/sra_to_samplesheet/main.nf + - modules/local/sra_merge_samplesheet/main.nf - workflows/sra/main.nf - workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test sra_nf_core_pipeline_viralrecon: - conf/modules/sra.config + - modules/local/sra_ids_to_runinfo/main.nf + - modules/local/sra_runinfo_to_ftp/main.nf + - modules/local/sra_fastq_ftp/main.nf + - modules/local/sra_to_samplesheet/main.nf + - modules/local/sra_merge_samplesheet/main.nf - workflows/sra/main.nf - workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test sra_skip_fastq_download: - conf/modules/sra.config + - modules/local/sra_ids_to_runinfo/main.nf + - modules/local/sra_runinfo_to_ftp/main.nf + - modules/local/sra_fastq_ftp/main.nf + - modules/local/sra_to_samplesheet/main.nf + - modules/local/sra_merge_samplesheet/main.nf - workflows/sra/main.nf - workflows/sra/tests/sra_skip_fastq_download.nf.test From 9c6bf658cfeba3b1780615faa794f77d85c44000 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Mon, 18 Sep 2023 14:57:33 +0100 Subject: [PATCH 434/852] Remove public_aws_ecr profile --- .github/workflows/cloud_tests_full.yml | 2 +- .github/workflows/cloud_tests_small.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cloud_tests_full.yml b/.github/workflows/cloud_tests_full.yml index e25a97aa..d0ed0552 100644 --- a/.github/workflows/cloud_tests_full.yml +++ b/.github/workflows/cloud_tests_full.yml @@ -27,7 +27,7 @@ jobs: compute_env: ${{ secrets.TOWER_CE_AWS_CPU }} workdir: "${{ secrets.TOWER_BUCKET_AWS }}/work/fetchngs/work-${{ github.sha }}" run_name: "aws_fetchngs_full" - profiles: test_full,public_aws_ecr + profiles: test_full parameters: | { "hook_url": "${{ secrets.MEGATESTS_ALERTS_SLACK_HOOK_URL }}", diff --git a/.github/workflows/cloud_tests_small.yml b/.github/workflows/cloud_tests_small.yml index e7636fdc..12b8daab 100644 --- a/.github/workflows/cloud_tests_small.yml +++ b/.github/workflows/cloud_tests_small.yml @@ -25,7 +25,7 @@ jobs: compute_env: ${{ secrets.TOWER_CE_AWS_CPU }} workdir: "${{ secrets.TOWER_BUCKET_AWS }}/work/fetchngs/work-${{ github.sha }}" run_name: "aws_fetchngs_small" - profiles: test,public_aws_ecr + profiles: test parameters: | { "outdir": "${{ secrets.TOWER_BUCKET_AWS }}/fetchngs/results-test-${{ github.sha }}" From 2c7c13f08909ea069bb0dbb86ed78874f40f38a5 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Mon, 18 Sep 2023 15:02:36 +0100 Subject: [PATCH 435/852] Replace large config file with individual configs per module --- conf/modules/sra.config | 88 ------------------- .../multiqc_mappings_config/nextflow.config | 9 ++ modules/local/sra_fastq_ftp/nextflow.config | 17 ++++ .../local/sra_ids_to_runinfo/nextflow.config | 8 ++ .../sra_merge_samplesheet/nextflow.config | 9 ++ .../local/sra_runinfo_to_ftp/nextflow.config | 9 ++ .../local/sra_to_samplesheet/nextflow.config | 8 ++ .../sratools/fasterqdump/nextflow.config | 10 +++ .../nf-core/sratools/prefetch/nextflow.config | 8 ++ nextflow.config | 2 +- workflows/sra/nextflow.config | 7 ++ workflows/synapse/nextflow.config | 0 12 files changed, 86 insertions(+), 89 deletions(-) delete mode 100644 conf/modules/sra.config create mode 100644 modules/local/multiqc_mappings_config/nextflow.config create mode 100644 modules/local/sra_fastq_ftp/nextflow.config create mode 100644 modules/local/sra_ids_to_runinfo/nextflow.config create mode 100644 modules/local/sra_merge_samplesheet/nextflow.config create mode 100644 modules/local/sra_runinfo_to_ftp/nextflow.config create mode 100644 modules/local/sra_to_samplesheet/nextflow.config create mode 100644 modules/nf-core/sratools/fasterqdump/nextflow.config create mode 100644 modules/nf-core/sratools/prefetch/nextflow.config create mode 100644 workflows/sra/nextflow.config create mode 100644 workflows/synapse/nextflow.config diff --git a/conf/modules/sra.config b/conf/modules/sra.config deleted file mode 100644 index 15802b41..00000000 --- a/conf/modules/sra.config +++ /dev/null @@ -1,88 +0,0 @@ -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Config file for defining DSL2 per module options and publishing paths -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Available keys to override module options: - ext.args = Additional arguments appended to command in module. - ext.args2 = Second set of arguments appended to command in module (multi-tool modules). - ext.args3 = Third set of arguments appended to command in module (multi-tool modules). - ext.prefix = File name prefix for output files. ----------------------------------------------------------------------------------------- -*/ - -// -// Process options for the SRA workflow -// -process { - - withName: SRA_IDS_TO_RUNINFO { - publishDir = [ - path: { "${params.outdir}/metadata" }, - enabled: false - ] - } - - withName: SRA_RUNINFO_TO_FTP { - publishDir = [ - path: { "${params.outdir}/metadata" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: SRA_FASTQ_FTP { - ext.args = '--retry 5 --continue-at - --max-time 1200' - publishDir = [ - [ - path: { "${params.outdir}/fastq" }, - mode: params.publish_dir_mode, - pattern: "*.fastq.gz" - ], - [ - path: { "${params.outdir}/fastq/md5" }, - mode: params.publish_dir_mode, - pattern: "*.md5" - ] - ] - } - - withName: SRATOOLS_PREFETCH { - publishDir = [ - path: { "${params.outdir}/sra" }, - enabled: false - ] - } - - withName: SRATOOLS_FASTERQDUMP { - ext.args = '--split-files --include-technical' - publishDir = [ - path: { "${params.outdir}/fastq" }, - mode: params.publish_dir_mode, - pattern: "*.fastq.gz" - ] - } - - withName: SRA_TO_SAMPLESHEET { - publishDir = [ - path: { "${params.outdir}/samplesheet" }, - enabled: false - ] - } - - withName: SRA_MERGE_SAMPLESHEET { - publishDir = [ - path: { "${params.outdir}/samplesheet" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: MULTIQC_MAPPINGS_CONFIG { - publishDir = [ - path: { "${params.outdir}/samplesheet" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - -} diff --git a/modules/local/multiqc_mappings_config/nextflow.config b/modules/local/multiqc_mappings_config/nextflow.config new file mode 100644 index 00000000..e2382930 --- /dev/null +++ b/modules/local/multiqc_mappings_config/nextflow.config @@ -0,0 +1,9 @@ +process { + withName: 'MULTIQC_MAPPINGS_CONFIG' { + publishDir = [ + path: { "${params.outdir}/samplesheet" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } +} \ No newline at end of file diff --git a/modules/local/sra_fastq_ftp/nextflow.config b/modules/local/sra_fastq_ftp/nextflow.config new file mode 100644 index 00000000..7b5ebf70 --- /dev/null +++ b/modules/local/sra_fastq_ftp/nextflow.config @@ -0,0 +1,17 @@ +process { + withName: 'SRA_FASTQ_FTP' { + ext.args = '--retry 5 --continue-at - --max-time 1200' + publishDir = [ + [ + path: { "${params.outdir}/fastq" }, + mode: params.publish_dir_mode, + pattern: "*.fastq.gz" + ], + [ + path: { "${params.outdir}/fastq/md5" }, + mode: params.publish_dir_mode, + pattern: "*.md5" + ] + ] + } +} diff --git a/modules/local/sra_ids_to_runinfo/nextflow.config b/modules/local/sra_ids_to_runinfo/nextflow.config new file mode 100644 index 00000000..73da969a --- /dev/null +++ b/modules/local/sra_ids_to_runinfo/nextflow.config @@ -0,0 +1,8 @@ +process { + withName: 'SRA_IDS_TO_RUNINFO' { + publishDir = [ + path: { "${params.outdir}/metadata" }, + enabled: false + ] + } +} \ No newline at end of file diff --git a/modules/local/sra_merge_samplesheet/nextflow.config b/modules/local/sra_merge_samplesheet/nextflow.config new file mode 100644 index 00000000..f2926529 --- /dev/null +++ b/modules/local/sra_merge_samplesheet/nextflow.config @@ -0,0 +1,9 @@ +process { + withName: 'SRA_MERGE_SAMPLESHEET' { + publishDir = [ + path: { "${params.outdir}/samplesheet" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } +} \ No newline at end of file diff --git a/modules/local/sra_runinfo_to_ftp/nextflow.config b/modules/local/sra_runinfo_to_ftp/nextflow.config new file mode 100644 index 00000000..aee1848c --- /dev/null +++ b/modules/local/sra_runinfo_to_ftp/nextflow.config @@ -0,0 +1,9 @@ +process { + withName: 'SRA_RUNINFO_TO_FTP' { + publishDir = [ + path: { "${params.outdir}/metadata" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } +} \ No newline at end of file diff --git a/modules/local/sra_to_samplesheet/nextflow.config b/modules/local/sra_to_samplesheet/nextflow.config new file mode 100644 index 00000000..da241c1a --- /dev/null +++ b/modules/local/sra_to_samplesheet/nextflow.config @@ -0,0 +1,8 @@ +process { + withName: SRA_TO_SAMPLESHEET { + publishDir = [ + path: { "${params.outdir}/samplesheet" }, + enabled: false + ] + } +} diff --git a/modules/nf-core/sratools/fasterqdump/nextflow.config b/modules/nf-core/sratools/fasterqdump/nextflow.config new file mode 100644 index 00000000..f98b140d --- /dev/null +++ b/modules/nf-core/sratools/fasterqdump/nextflow.config @@ -0,0 +1,10 @@ +process { + withName: SRATOOLS_FASTERQDUMP { + ext.args = '--split-files --include-technical' + publishDir = [ + path: { "${params.outdir}/fastq" }, + mode: params.publish_dir_mode, + pattern: "*.fastq.gz" + ] + } +} \ No newline at end of file diff --git a/modules/nf-core/sratools/prefetch/nextflow.config b/modules/nf-core/sratools/prefetch/nextflow.config new file mode 100644 index 00000000..a2ca8848 --- /dev/null +++ b/modules/nf-core/sratools/prefetch/nextflow.config @@ -0,0 +1,8 @@ +process { + withName: SRATOOLS_PREFETCH { + publishDir = [ + path: { "${params.outdir}/sra" }, + enabled: false + ] + } +} \ No newline at end of file diff --git a/nextflow.config b/nextflow.config index e2584ce6..40149dba 100644 --- a/nextflow.config +++ b/nextflow.config @@ -219,7 +219,7 @@ manifest { // Load modules.config for DSL2 module specific options includeConfig 'conf/modules/base.config' if ( params.input_type == 'sra' ) { - includeConfig 'conf/modules/sra.config' + includeConfig 'workflows/sra/nextflow.config' } if ( params.input_type == 'synapse' ) { includeConfig 'conf/modules/synapse.config' diff --git a/workflows/sra/nextflow.config b/workflows/sra/nextflow.config new file mode 100644 index 00000000..d4dd6f30 --- /dev/null +++ b/workflows/sra/nextflow.config @@ -0,0 +1,7 @@ +includeConfig "../../modules/local/multiqc_mappings_config/nextflow.config" +includeConfig "../../modules/local/sra_fastq_ftp/nextflow.config" +includeConfig "../../modules/local/sra_ids_to_runinfo/nextflow.config" +includeConfig "../../modules/local/sra_merge_samplesheet/nextflow.config" +includeConfig "../../modules/local/sra_runinfo_to_ftp/nextflow.config" +includeConfig "../../modules/local/sra_to_samplesheet/nextflow.config" +includeConfig "../../modules/nf-core/sratools/prefetch/nextflow.config" diff --git a/workflows/synapse/nextflow.config b/workflows/synapse/nextflow.config new file mode 100644 index 00000000..e69de29b From 64aca64197641d7f36df4b3be2ce25c200a42293 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Mon, 18 Sep 2023 16:17:33 +0100 Subject: [PATCH 436/852] Inherit Synapse related configuration via separate files --- conf/modules/synapse.config | 66 ------------------- modules/local/synapse_get/nextflow.config | 16 +++++ modules/local/synapse_list/nextflow.config | 10 +++ .../synapse_merge_samplesheet/nextflow.config | 9 +++ modules/local/synapse_show/nextflow.config | 9 +++ .../synapse_to_samplesheet/nextflow.config | 8 +++ nextflow.config | 11 ++-- workflows/synapse/nextflow.config | 5 ++ 8 files changed, 63 insertions(+), 71 deletions(-) delete mode 100644 conf/modules/synapse.config create mode 100644 modules/local/synapse_get/nextflow.config create mode 100644 modules/local/synapse_list/nextflow.config create mode 100644 modules/local/synapse_merge_samplesheet/nextflow.config create mode 100644 modules/local/synapse_show/nextflow.config create mode 100644 modules/local/synapse_to_samplesheet/nextflow.config diff --git a/conf/modules/synapse.config b/conf/modules/synapse.config deleted file mode 100644 index 2f52aa6f..00000000 --- a/conf/modules/synapse.config +++ /dev/null @@ -1,66 +0,0 @@ -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Config file for defining DSL2 per module options and publishing paths -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Available keys to override module options: - ext.args = Additional arguments appended to command in module. - ext.args2 = Second set of arguments appended to command in module (multi-tool modules). - ext.args3 = Third set of arguments appended to command in module (multi-tool modules). - ext.prefix = File name prefix for output files. ----------------------------------------------------------------------------------------- -*/ - -// -// Process options for the Synapse workflow -// - -process { - - withName: SYNAPSE_LIST { - ext.args = '--long' - publishDir = [ - path: { "${params.outdir}/metadata" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: SYNAPSE_GET { - publishDir = [ - [ - path: { "${params.outdir}/fastq" }, - mode: params.publish_dir_mode, - pattern: "*.fastq.gz" - ], - [ - path: { "${params.outdir}/fastq/md5" }, - mode: params.publish_dir_mode, - pattern: "*.md5" - ] - ] - } - - withName: SYNAPSE_SHOW { - publishDir = [ - path: { "${params.outdir}/metadata" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: SYNAPSE_TO_SAMPLESHEET { - publishDir = [ - path: { "${params.outdir}/samplesheet" }, - enabled: false - ] - } - - withName: SYNAPSE_MERGE_SAMPLESHEET { - publishDir = [ - path: { "${params.outdir}/samplesheet" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - -} diff --git a/modules/local/synapse_get/nextflow.config b/modules/local/synapse_get/nextflow.config new file mode 100644 index 00000000..869f80aa --- /dev/null +++ b/modules/local/synapse_get/nextflow.config @@ -0,0 +1,16 @@ +process { + withName: 'SYNAPSE_GET' { + publishDir = [ + [ + path: { "${params.outdir}/fastq" }, + mode: params.publish_dir_mode, + pattern: "*.fastq.gz" + ], + [ + path: { "${params.outdir}/fastq/md5" }, + mode: params.publish_dir_mode, + pattern: "*.md5" + ] + ] + } +} \ No newline at end of file diff --git a/modules/local/synapse_list/nextflow.config b/modules/local/synapse_list/nextflow.config new file mode 100644 index 00000000..15124234 --- /dev/null +++ b/modules/local/synapse_list/nextflow.config @@ -0,0 +1,10 @@ +process { + withName: SYNAPSE_LIST { + ext.args = '--long' + publishDir = [ + path: { "${params.outdir}/metadata" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } +} diff --git a/modules/local/synapse_merge_samplesheet/nextflow.config b/modules/local/synapse_merge_samplesheet/nextflow.config new file mode 100644 index 00000000..9befef9c --- /dev/null +++ b/modules/local/synapse_merge_samplesheet/nextflow.config @@ -0,0 +1,9 @@ +process { + withName: SYNAPSE_MERGE_SAMPLESHEET { + publishDir = [ + path: { "${params.outdir}/samplesheet" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } +} \ No newline at end of file diff --git a/modules/local/synapse_show/nextflow.config b/modules/local/synapse_show/nextflow.config new file mode 100644 index 00000000..a1864dfe --- /dev/null +++ b/modules/local/synapse_show/nextflow.config @@ -0,0 +1,9 @@ +process { + withName: 'SYNAPSE_SHOW' { + publishDir = [ + path: { "${params.outdir}/metadata" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } +} \ No newline at end of file diff --git a/modules/local/synapse_to_samplesheet/nextflow.config b/modules/local/synapse_to_samplesheet/nextflow.config new file mode 100644 index 00000000..b286c12c --- /dev/null +++ b/modules/local/synapse_to_samplesheet/nextflow.config @@ -0,0 +1,8 @@ +process { + withName: SYNAPSE_TO_SAMPLESHEET { + publishDir = [ + path: { "${params.outdir}/samplesheet" }, + enabled: false + ] + } +} \ No newline at end of file diff --git a/nextflow.config b/nextflow.config index 40149dba..4ee1bb88 100644 --- a/nextflow.config +++ b/nextflow.config @@ -218,11 +218,12 @@ manifest { // Load modules.config for DSL2 module specific options includeConfig 'conf/modules/base.config' -if ( params.input_type == 'sra' ) { - includeConfig 'workflows/sra/nextflow.config' -} -if ( params.input_type == 'synapse' ) { - includeConfig 'conf/modules/synapse.config' + +switch ( params.input_type ) { + case "sra": + includeConfig './workflows/sra/nextflow.config' + case "synapse": + includeConfig './workflows/synapse/nextflow.config' } // Function to ensure that resource requirements don't go beyond diff --git a/workflows/synapse/nextflow.config b/workflows/synapse/nextflow.config index e69de29b..01b71558 100644 --- a/workflows/synapse/nextflow.config +++ b/workflows/synapse/nextflow.config @@ -0,0 +1,5 @@ +includeConfig "../../modules/local/synapse_get/nextflow.config" +includeConfig "../../modules/local/synapse_to_samplesheet/nextflow.config" +includeConfig "../../modules/local/synapse_list/nextflow.config" +includeConfig "../../modules/local/synapse_merge_samplesheet/nextflow.config" +includeConfig "../../modules/local/synapse_show/nextflow.config" \ No newline at end of file From 63caf19616aacac49992ac058bff13b9fa60bb3e Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Mon, 18 Sep 2023 16:23:54 +0100 Subject: [PATCH 437/852] Revert switch for inheritance of correct config --- nextflow.config | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/nextflow.config b/nextflow.config index 4ee1bb88..84d8b42e 100644 --- a/nextflow.config +++ b/nextflow.config @@ -219,11 +219,10 @@ manifest { // Load modules.config for DSL2 module specific options includeConfig 'conf/modules/base.config' -switch ( params.input_type ) { - case "sra": - includeConfig './workflows/sra/nextflow.config' - case "synapse": - includeConfig './workflows/synapse/nextflow.config' +if ( params.input_type == "sra" ) { + includeConfig './workflows/sra/nextflow.config' +} else if ( params.input_type == "synapse" ) { + includeConfig './workflows/synapse/nextflow.config' } // Function to ensure that resource requirements don't go beyond From 1dba48c4a0d95bac089557a552ac5d17fcb08393 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Mon, 18 Sep 2023 16:36:14 +0100 Subject: [PATCH 438/852] Handle custom/dumpsoftwareversions via config --- conf/base.config | 9 ++++++--- conf/modules/base.config | 1 + modules/nf-core/custom/nextflow.config | 10 ++++++++++ nextflow.config | 4 ++-- workflows/nextflow.config | 15 +++++++++++++++ 5 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 modules/nf-core/custom/nextflow.config create mode 100644 workflows/nextflow.config diff --git a/conf/base.config b/conf/base.config index 4767e522..6af79a7b 100644 --- a/conf/base.config +++ b/conf/base.config @@ -14,6 +14,12 @@ process { memory = { check_max( 6.GB * task.attempt, 'memory' ) } time = { check_max( 4.h * task.attempt, 'time' ) } + publishDir = [ + path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + errorStrategy = { task.exitStatus in ((130..145) + 104) ? 'retry' : 'finish' } maxRetries = 1 maxErrors = '-1' @@ -57,7 +63,4 @@ process { errorStrategy = 'retry' maxRetries = 2 } - withName:CUSTOM_DUMPSOFTWAREVERSIONS { - cache = false - } } diff --git a/conf/modules/base.config b/conf/modules/base.config index d7eb6c86..035487c5 100644 --- a/conf/modules/base.config +++ b/conf/modules/base.config @@ -22,6 +22,7 @@ process { ] withName: CUSTOM_DUMPSOFTWAREVERSIONS { + cache = false publishDir = [ path: { "${params.outdir}/pipeline_info" }, mode: params.publish_dir_mode, diff --git a/modules/nf-core/custom/nextflow.config b/modules/nf-core/custom/nextflow.config new file mode 100644 index 00000000..241654e7 --- /dev/null +++ b/modules/nf-core/custom/nextflow.config @@ -0,0 +1,10 @@ +process { + withName: CUSTOM_DUMPSOFTWAREVERSIONS { + cache = false + publishDir = [ + path: { "${params.outdir}/pipeline_info" }, + mode: params.publish_dir_mode, + pattern: '*_versions.yml' + ] + } +} \ No newline at end of file diff --git a/nextflow.config b/nextflow.config index 84d8b42e..a11a769d 100644 --- a/nextflow.config +++ b/nextflow.config @@ -216,8 +216,8 @@ manifest { doi = 'https://doi.org/10.5281/zenodo.5070524' } -// Load modules.config for DSL2 module specific options -includeConfig 'conf/modules/base.config' +// Module specific configs +includeConfig 'modules/nf-core/custom/nextflow.config' if ( params.input_type == "sra" ) { includeConfig './workflows/sra/nextflow.config' diff --git a/workflows/nextflow.config b/workflows/nextflow.config new file mode 100644 index 00000000..db80204c --- /dev/null +++ b/workflows/nextflow.config @@ -0,0 +1,15 @@ +process { + publishDir = [ + path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + + withName: CUSTOM_DUMPSOFTWAREVERSIONS { + publishDir = [ + path: { "${params.outdir}/pipeline_info" }, + mode: params.publish_dir_mode, + pattern: '*_versions.yml' + ] + } +} From f86a80ba422bf993783988ecf46c1485ea262e1f Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Mon, 18 Sep 2023 16:37:18 +0100 Subject: [PATCH 439/852] Update multiqc to v1.15 --- modules.json | 2 +- modules/nf-core/custom/dumpsoftwareversions/main.nf | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules.json b/modules.json index 3137b88b..ab610dfb 100644 --- a/modules.json +++ b/modules.json @@ -7,7 +7,7 @@ "nf-core": { "custom/dumpsoftwareversions": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "git_sha": "05c280924b6c768d484c7c443dad5e605c4ff4b4", "installed_by": ["modules"] }, "custom/sratoolsncbisettings": { diff --git a/modules/nf-core/custom/dumpsoftwareversions/main.nf b/modules/nf-core/custom/dumpsoftwareversions/main.nf index ebc87273..c9d014b1 100644 --- a/modules/nf-core/custom/dumpsoftwareversions/main.nf +++ b/modules/nf-core/custom/dumpsoftwareversions/main.nf @@ -2,10 +2,10 @@ process CUSTOM_DUMPSOFTWAREVERSIONS { label 'process_single' // Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container - conda "bioconda::multiqc=1.14" + conda "bioconda::multiqc=1.15" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.14--pyhdfd78af_0' : - 'biocontainers/multiqc:1.14--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.15--pyhdfd78af_0' : + 'biocontainers/multiqc:1.15--pyhdfd78af_0' }" input: path versions From 31e10bb27f66dd6fe6ec8bd8d92935b31434df3b Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Mon, 18 Sep 2023 16:39:20 +0100 Subject: [PATCH 440/852] Use switch statement to avoid nested if-else --- nextflow.config | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/nextflow.config b/nextflow.config index a11a769d..dc2a5d2b 100644 --- a/nextflow.config +++ b/nextflow.config @@ -219,11 +219,24 @@ manifest { // Module specific configs includeConfig 'modules/nf-core/custom/nextflow.config' +/* if ( params.input_type == "sra" ) { includeConfig './workflows/sra/nextflow.config' } else if ( params.input_type == "synapse" ) { includeConfig './workflows/synapse/nextflow.config' } +*/ + +switch ( params.input_type ) { + case "sra": + includeConfig './workflows/sra/nextflow.config' + break + case "synapse": + includeConfig './workflows/synapse/nextflow.config' + break + default: + break +} // Function to ensure that resource requirements don't go beyond // a maximum limit From 105a65f8597b18b4397e6e075153090f9244d604 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Mon, 18 Sep 2023 16:44:42 +0100 Subject: [PATCH 441/852] Moved workflows configuration to workflows/nextflow.config --- .../nextflow.config | 0 nextflow.config | 23 +++-------------- workflows/nextflow.config | 25 ++++++++----------- 3 files changed, 15 insertions(+), 33 deletions(-) rename modules/nf-core/custom/{ => dumpsoftwareversions}/nextflow.config (100%) diff --git a/modules/nf-core/custom/nextflow.config b/modules/nf-core/custom/dumpsoftwareversions/nextflow.config similarity index 100% rename from modules/nf-core/custom/nextflow.config rename to modules/nf-core/custom/dumpsoftwareversions/nextflow.config diff --git a/nextflow.config b/nextflow.config index dc2a5d2b..4fad92ca 100644 --- a/nextflow.config +++ b/nextflow.config @@ -217,26 +217,11 @@ manifest { } // Module specific configs -includeConfig 'modules/nf-core/custom/nextflow.config' +// Currently just dumpsoftwareversions +includeConfig 'modules/nf-core/custom/dumpsoftwareversions/nextflow.config' -/* -if ( params.input_type == "sra" ) { - includeConfig './workflows/sra/nextflow.config' -} else if ( params.input_type == "synapse" ) { - includeConfig './workflows/synapse/nextflow.config' -} -*/ - -switch ( params.input_type ) { - case "sra": - includeConfig './workflows/sra/nextflow.config' - break - case "synapse": - includeConfig './workflows/synapse/nextflow.config' - break - default: - break -} +// Workflow specific configs +includeConfig 'workflows/nextflow.config' // Function to ensure that resource requirements don't go beyond // a maximum limit diff --git a/workflows/nextflow.config b/workflows/nextflow.config index db80204c..d27deb3a 100644 --- a/workflows/nextflow.config +++ b/workflows/nextflow.config @@ -1,15 +1,12 @@ -process { - publishDir = [ - path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] +// Read in specific config relating to workflow. - withName: CUSTOM_DUMPSOFTWAREVERSIONS { - publishDir = [ - path: { "${params.outdir}/pipeline_info" }, - mode: params.publish_dir_mode, - pattern: '*_versions.yml' - ] - } -} +switch ( params.input_type ) { + case "sra": + includeConfig './sra/nextflow.config' + break + case "synapse": + includeConfig './synapse/nextflow.config' + break + default: + break +} \ No newline at end of file From 8b256afb6466d3834488adf9b8e58cf334bff6b7 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Mon, 18 Sep 2023 16:55:39 +0100 Subject: [PATCH 442/852] Addition of subworkflow specific configuration file --- .../nextflow.config | 2 ++ workflows/sra/nextflow.config | 1 + 2 files changed, 3 insertions(+) create mode 100644 subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/nextflow.config diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/nextflow.config b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/nextflow.config new file mode 100644 index 00000000..b11c499f --- /dev/null +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/nextflow.config @@ -0,0 +1,2 @@ +includeConfig '../../../modules/nf-core/sratools/prefetch/nextflow.config' +includeConfig '../../../modules/nf-core/sratools/fasterqdump/nextflow.config' \ No newline at end of file diff --git a/workflows/sra/nextflow.config b/workflows/sra/nextflow.config index d4dd6f30..6b66fcd5 100644 --- a/workflows/sra/nextflow.config +++ b/workflows/sra/nextflow.config @@ -5,3 +5,4 @@ includeConfig "../../modules/local/sra_merge_samplesheet/nextflow.config" includeConfig "../../modules/local/sra_runinfo_to_ftp/nextflow.config" includeConfig "../../modules/local/sra_to_samplesheet/nextflow.config" includeConfig "../../modules/nf-core/sratools/prefetch/nextflow.config" +includeConfig "../../subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/nextflow.config" From 57b46e4d93b7d463f1d6079c8d88f73611690314 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Mon, 18 Sep 2023 16:57:25 +0100 Subject: [PATCH 443/852] Add empty config for sratoolsncbisettings to make it consistent --- modules/nf-core/custom/sratoolsncbisettings/nextflow.config | 0 .../nextflow.config | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 modules/nf-core/custom/sratoolsncbisettings/nextflow.config diff --git a/modules/nf-core/custom/sratoolsncbisettings/nextflow.config b/modules/nf-core/custom/sratoolsncbisettings/nextflow.config new file mode 100644 index 00000000..e69de29b diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/nextflow.config b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/nextflow.config index b11c499f..996c1888 100644 --- a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/nextflow.config +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/nextflow.config @@ -1,2 +1,3 @@ includeConfig '../../../modules/nf-core/sratools/prefetch/nextflow.config' -includeConfig '../../../modules/nf-core/sratools/fasterqdump/nextflow.config' \ No newline at end of file +includeConfig '../../../modules/nf-core/sratools/fasterqdump/nextflow.config' +includeConfig '../../../modules/nf-core/custom/sratoolsncbisettings/nextflow.config' \ No newline at end of file From 32561205d47040660d539cdd9a37a1bc4d50a3b5 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Mon, 18 Sep 2023 17:07:55 +0100 Subject: [PATCH 444/852] CHANGELOG --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 20dd21f8..92e31da4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,7 +18,8 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements ### Enhancements & fixes - [#166](https://github.com/nf-core/fetchngs/issues/175) - Add NF-TEST pipeline end-to-end tests for existing CI tests -- [#184](https://github.com/nf-core/fetchngs/pull/184/files) Emits all files in workflow for testing and enabling workflow to be imported (not supported by Nextflow) +- [#184](https://github.com/nf-core/fetchngs/pull/184) Emits all files in workflow for testing and enabling workflow to be imported (not supported by Nextflow) +- [#195](https://github.com/nf-core/fetchngs/pull/195) Separate configuration files for all modules ## [[1.10.0](https://github.com/nf-core/fetchngs/releases/tag/1.10.0)] - 2023-05-16 From 8284cc4003a71307d7e5eacf4e028eb72c23da7b Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Mon, 18 Sep 2023 17:09:51 +0100 Subject: [PATCH 445/852] Update change tags --- .github/tags.yml | 104 ++++++++++++++++++++++------------------------- 1 file changed, 48 insertions(+), 56 deletions(-) diff --git a/.github/tags.yml b/.github/tags.yml index ed5c9dcc..9fc74a2c 100644 --- a/.github/tags.yml +++ b/.github/tags.yml @@ -14,74 +14,66 @@ sra_to_samplesheet: # workflow: sra sra_custom_ena_metadata_fields: - - conf/modules/sra.config - - modules/local/sra_ids_to_runinfo/main.nf - - modules/local/sra_runinfo_to_ftp/main.nf - - modules/local/sra_fastq_ftp/main.nf - - modules/local/sra_to_samplesheet/main.nf - - modules/local/sra_merge_samplesheet/main.nf - - workflows/sra/main.nf + - modules/local/sra_ids_to_runinfo/* + - modules/local/sra_runinfo_to_ftp/* + - modules/local/sra_fastq_ftp/* + - modules/local/sra_to_samplesheet/* + - modules/local/sra_merge_samplesheet/* + - workflows/sra/* - workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test sra_default_parameters: - - conf/modules/sra.config - - modules/local/sra_ids_to_runinfo/main.nf - - modules/local/sra_runinfo_to_ftp/main.nf - - modules/local/sra_fastq_ftp/main.nf - - modules/local/sra_to_samplesheet/main.nf - - modules/local/sra_merge_samplesheet/main.nf - - workflows/sra/main.nf + - modules/local/sra_ids_to_runinfo/* + - modules/local/sra_runinfo_to_ftp/* + - modules/local/sra_fastq_ftp/* + - modules/local/sra_to_samplesheet/* + - modules/local/sra_merge_samplesheet/* + - workflows/sra/* - workflows/sra/tests/sra_default_parameters.nf.test sra_force_sratools_download: - - conf/modules/sra.config - - modules/local/sra_ids_to_runinfo/main.nf - - modules/local/sra_runinfo_to_ftp/main.nf - - modules/local/sra_fastq_ftp/main.nf - - modules/local/sra_to_samplesheet/main.nf - - modules/local/sra_merge_samplesheet/main.nf - - workflows/sra/main.nf + - modules/local/sra_ids_to_runinfo/* + - modules/local/sra_runinfo_to_ftp/* + - modules/local/sra_fastq_ftp/* + - modules/local/sra_to_samplesheet/* + - modules/local/sra_merge_samplesheet/* + - workflows/sra/* - workflows/sra/tests/sra_force_sratools_download.nf.test sra_nf_core_pipeline_atacseq: - - conf/modules/sra.config - - modules/local/sra_ids_to_runinfo/main.nf - - modules/local/sra_runinfo_to_ftp/main.nf - - modules/local/sra_fastq_ftp/main.nf - - modules/local/sra_to_samplesheet/main.nf - - modules/local/sra_merge_samplesheet/main.nf - - workflows/sra/main.nf + - modules/local/sra_ids_to_runinfo/* + - modules/local/sra_runinfo_to_ftp/* + - modules/local/sra_fastq_ftp/* + - modules/local/sra_to_samplesheet/* + - modules/local/sra_merge_samplesheet/* + - workflows/sra/* - workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test sra_nf_core_pipeline_rnaseq: - - conf/modules/sra.config - - modules/local/sra_ids_to_runinfo/main.nf - - modules/local/sra_runinfo_to_ftp/main.nf - - modules/local/sra_fastq_ftp/main.nf - - modules/local/sra_to_samplesheet/main.nf - - modules/local/sra_merge_samplesheet/main.nf - - workflows/sra/main.nf + - modules/local/sra_ids_to_runinfo/* + - modules/local/sra_runinfo_to_ftp/* + - modules/local/sra_fastq_ftp/* + - modules/local/sra_to_samplesheet/* + - modules/local/sra_merge_samplesheet/* + - workflows/sra/* - workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test sra_nf_core_pipeline_taxprofiler: - - conf/modules/sra.config - - modules/local/sra_ids_to_runinfo/main.nf - - modules/local/sra_runinfo_to_ftp/main.nf - - modules/local/sra_fastq_ftp/main.nf - - modules/local/sra_to_samplesheet/main.nf - - modules/local/sra_merge_samplesheet/main.nf - - workflows/sra/main.nf + - modules/local/sra_ids_to_runinfo/* + - modules/local/sra_runinfo_to_ftp/* + - modules/local/sra_fastq_ftp/* + - modules/local/sra_to_samplesheet/* + - modules/local/sra_merge_samplesheet/* + - workflows/sra/* - workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test sra_nf_core_pipeline_viralrecon: - - conf/modules/sra.config - - modules/local/sra_ids_to_runinfo/main.nf - - modules/local/sra_runinfo_to_ftp/main.nf - - modules/local/sra_fastq_ftp/main.nf - - modules/local/sra_to_samplesheet/main.nf - - modules/local/sra_merge_samplesheet/main.nf - - workflows/sra/main.nf + - modules/local/sra_ids_to_runinfo/* + - modules/local/sra_runinfo_to_ftp/* + - modules/local/sra_fastq_ftp/* + - modules/local/sra_to_samplesheet/* + - modules/local/sra_merge_samplesheet/* + - workflows/sra/* - workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test sra_skip_fastq_download: - - conf/modules/sra.config - - modules/local/sra_ids_to_runinfo/main.nf - - modules/local/sra_runinfo_to_ftp/main.nf - - modules/local/sra_fastq_ftp/main.nf - - modules/local/sra_to_samplesheet/main.nf - - modules/local/sra_merge_samplesheet/main.nf - - workflows/sra/main.nf + - modules/local/sra_ids_to_runinfo/* + - modules/local/sra_runinfo_to_ftp/* + - modules/local/sra_fastq_ftp/* + - modules/local/sra_to_samplesheet/* + - modules/local/sra_merge_samplesheet/* + - workflows/sra/* - workflows/sra/tests/sra_skip_fastq_download.nf.test From 4bec2990de02ed84c3df5d37acea8a70e46a3934 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Thu, 21 Sep 2023 10:29:23 +0100 Subject: [PATCH 446/852] Revert dev to release 1.10 This reverts commit 624d420ecbb1f039695132fa02db78fcd65002f6, reversing changes made to 1b9d1876b3973e436618652ffa485395f8f57213. --- .gitattributes | 1 - .github/workflows/ci.yml | 82 ++++------ .gitignore | 2 - .nf-core.yml | 10 -- CHANGELOG.md | 16 -- bin/sra_runinfo_to_ftp.py | 3 +- conf/test.config | 3 - conf/test_data.config | 36 ----- docs/usage.md | 6 - lib/NftestUtils.groovy | 38 ----- modules.json | 3 +- .../main.nf => multiqc_mappings_config.nf} | 0 .../tests/main.nf.test | 31 ---- .../tests/main.nf.test.snap | 52 ------- .../main.nf => sra_fastq_ftp.nf} | 0 .../local/sra_fastq_ftp/tests/main.nf.test | 34 ----- .../sra_fastq_ftp/tests/main.nf.test.snap | 140 ------------------ .../main.nf => sra_ids_to_runinfo.nf} | 0 .../sra_ids_to_runinfo/tests/main.nf.test | 32 ---- .../tests/main.nf.test.snap | 21 --- .../main.nf => sra_merge_samplesheet.nf} | 0 .../sra_merge_samplesheet/tests/main.nf.test | 32 ---- .../tests/main.nf.test.snap | 27 ---- .../main.nf => sra_runinfo_to_ftp.nf} | 0 .../sra_runinfo_to_ftp/tests/main.nf.test | 31 ---- .../tests/main.nf.test.snap | 21 --- .../main.nf => sra_to_samplesheet.nf} | 0 .../sra_to_samplesheet/tests/main.nf.test | 34 ----- .../tests/main.nf.test.snap | 113 -------------- .../{synapse_get/main.nf => synapse_get.nf} | 0 .../{synapse_list/main.nf => synapse_list.nf} | 0 .../main.nf => synapse_merge_samplesheet.nf} | 0 .../{synapse_show/main.nf => synapse_show.nf} | 0 .../main.nf => synapse_to_samplesheet.nf} | 0 .../custom-dumpsoftwareversions.diff | 13 -- .../templates/dumpsoftwareversions.py | 1 + nextflow.config | 2 +- nf-test.config | 16 -- workflows/{sra/main.nf => sra.nf} | 16 +- workflows/sra/tests/main.nf.test | 24 --- workflows/sra/tests/main.nf.test.snap | 88 ----------- .../sra_custom_ena_metadata_fields.nf.test | 27 ---- ...ra_custom_ena_metadata_fields.nf.test.snap | 88 ----------- .../tests/sra_force_sratools_download.nf.test | 25 ---- .../sra_force_sratools_download.nf.test.snap | 67 --------- .../sra_nf_core_pipeline_atacseq.nf.test | 25 ---- .../sra_nf_core_pipeline_atacseq.nf.test.snap | 88 ----------- .../tests/sra_nf_core_pipeline_rnaseq.nf.test | 25 ---- .../sra_nf_core_pipeline_rnaseq.nf.test.snap | 88 ----------- .../sra_nf_core_pipeline_taxprofiler.nf.test | 25 ---- ..._nf_core_pipeline_taxprofiler.nf.test.snap | 88 ----------- .../sra_nf_core_pipeline_viralrecon.nf.test | 25 ---- ...a_nf_core_pipeline_viralrecon.nf.test.snap | 88 ----------- .../sra/tests/sra_skip_fastq_download.nf.test | 25 ---- .../sra_skip_fastq_download.nf.test.snap | 46 ------ workflows/{synapse/main.nf => synapse.nf} | 12 +- workflows/synapse/tests/main.nf.test | 28 ---- 57 files changed, 47 insertions(+), 1651 deletions(-) delete mode 100644 conf/test_data.config delete mode 100644 lib/NftestUtils.groovy rename modules/local/{multiqc_mappings_config/main.nf => multiqc_mappings_config.nf} (100%) delete mode 100644 modules/local/multiqc_mappings_config/tests/main.nf.test delete mode 100644 modules/local/multiqc_mappings_config/tests/main.nf.test.snap rename modules/local/{sra_fastq_ftp/main.nf => sra_fastq_ftp.nf} (100%) delete mode 100644 modules/local/sra_fastq_ftp/tests/main.nf.test delete mode 100644 modules/local/sra_fastq_ftp/tests/main.nf.test.snap rename modules/local/{sra_ids_to_runinfo/main.nf => sra_ids_to_runinfo.nf} (100%) delete mode 100644 modules/local/sra_ids_to_runinfo/tests/main.nf.test delete mode 100644 modules/local/sra_ids_to_runinfo/tests/main.nf.test.snap rename modules/local/{sra_merge_samplesheet/main.nf => sra_merge_samplesheet.nf} (100%) delete mode 100644 modules/local/sra_merge_samplesheet/tests/main.nf.test delete mode 100644 modules/local/sra_merge_samplesheet/tests/main.nf.test.snap rename modules/local/{sra_runinfo_to_ftp/main.nf => sra_runinfo_to_ftp.nf} (100%) delete mode 100644 modules/local/sra_runinfo_to_ftp/tests/main.nf.test delete mode 100644 modules/local/sra_runinfo_to_ftp/tests/main.nf.test.snap rename modules/local/{sra_to_samplesheet/main.nf => sra_to_samplesheet.nf} (100%) delete mode 100644 modules/local/sra_to_samplesheet/tests/main.nf.test delete mode 100644 modules/local/sra_to_samplesheet/tests/main.nf.test.snap rename modules/local/{synapse_get/main.nf => synapse_get.nf} (100%) rename modules/local/{synapse_list/main.nf => synapse_list.nf} (100%) rename modules/local/{synapse_merge_samplesheet/main.nf => synapse_merge_samplesheet.nf} (100%) rename modules/local/{synapse_show/main.nf => synapse_show.nf} (100%) rename modules/local/{synapse_to_samplesheet/main.nf => synapse_to_samplesheet.nf} (100%) delete mode 100644 modules/nf-core/custom/dumpsoftwareversions/custom-dumpsoftwareversions.diff delete mode 100644 nf-test.config rename workflows/{sra/main.nf => sra.nf} (89%) delete mode 100644 workflows/sra/tests/main.nf.test delete mode 100644 workflows/sra/tests/main.nf.test.snap delete mode 100644 workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test delete mode 100644 workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap delete mode 100644 workflows/sra/tests/sra_force_sratools_download.nf.test delete mode 100644 workflows/sra/tests/sra_force_sratools_download.nf.test.snap delete mode 100644 workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test delete mode 100644 workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap delete mode 100644 workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test delete mode 100644 workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap delete mode 100644 workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test delete mode 100644 workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap delete mode 100644 workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test delete mode 100644 workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap delete mode 100644 workflows/sra/tests/sra_skip_fastq_download.nf.test delete mode 100644 workflows/sra/tests/sra_skip_fastq_download.nf.test.snap rename workflows/{synapse/main.nf => synapse.nf} (89%) delete mode 100644 workflows/synapse/tests/main.nf.test diff --git a/.gitattributes b/.gitattributes index c1c17000..7a2dabc2 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,5 +1,4 @@ *.config linguist-language=nextflow *.nf.test linguist-language=nextflow -tests/**/*nf.test.snap linguist-generated modules/nf-core/** linguist-generated subworkflows/nf-core/** linguist-generated diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 451613fb..5bef3edd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,61 +1,31 @@ -# This workflow runs the pipeline with the minimal test dataset to check that it completes without any syntax errors name: nf-core CI +# This workflow runs the pipeline with the minimal test dataset to check that it completes without any syntax errors on: push: branches: - dev pull_request: - branches: - - dev - - master release: - types: - - "published" + types: [published] env: NXF_ANSI_LOG: false - NFTEST_VER: "0.7.3" concurrency: group: "${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}" cancel-in-progress: true jobs: - define_nxf_versions: - name: Choose nextflow versions to test against depending on target branch - runs-on: ubuntu-latest - outputs: - matrix: ${{ steps.nxf_versions.outputs.matrix }} - steps: - - id: nxf_versions - run: | - if [[ "${{ github.event_name }}" == "pull_request" && "${{ github.base_ref }}" == "dev" && "${{ matrix.NXF_VER }}" != "latest-everything" ]]; then - echo matrix='["latest-everything"]' | tee -a $GITHUB_OUTPUT - else - echo matrix='["latest-everything", "22.10.1"]' | tee -a $GITHUB_OUTPUT - fi - test: name: Run pipeline with test data - needs: define_nxf_versions + # Only run on push if this is the nf-core dev branch (merged PRs) + if: "${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/fetchngs') }}" runs-on: ubuntu-latest strategy: - fail-fast: false matrix: - NXF_VER: ${{ fromJson(needs.define_nxf_versions.outputs.matrix) }} - test_tags: - - "modules_local" - - "sra_default_parameters" - - "sra_custom_ena_metadata_fields" - - "sra_force_sratools_download" - - "sra_nf_core_pipeline_atacseq" - - "sra_nf_core_pipeline_rnaseq" - - "sra_nf_core_pipeline_taxprofiler" - - "sra_nf_core_pipeline_viralrecon" - - "sra_skip_fastq_download" - profile: - - "docker" - + NXF_VER: + - "22.10.1" + - "latest-everything" steps: - name: Check out pipeline code uses: actions/checkout@v3 @@ -65,23 +35,29 @@ jobs: with: version: "${{ matrix.NXF_VER }}" - - name: Install nf-test + - name: Run pipeline with test data run: | - wget -qO- https://code.askimed.com/install/nf-test | bash -s $NFTEST_VER - sudo mv nf-test /usr/local/bin/ + nextflow run ${GITHUB_WORKSPACE} -profile test,docker --outdir ./results - - name: Run nf-test - run: | - nf-test test --tag ${{ matrix.test_tags }} --profile "test,${{ matrix.profile }}" --junitxml=test.xml + parameters: + name: Test workflow parameters + if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/fetchngs') }} + runs-on: ubuntu-latest + strategy: + matrix: + parameters: + - "--nf_core_pipeline rnaseq" + - "--ena_metadata_fields run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5 --sample_mapping_fields run_accession,library_layout" + - "--skip_fastq_download" + - "--force_sratools_download" + steps: + - name: Check out pipeline code + uses: actions/checkout@v2 - - name: Output log on failure - if: failure() + - name: Install Nextflow run: | - sudo apt install bat > /dev/null - batcat --decorations=always --color=always ${{ github.workspace }}/.nf-test/tests/*/output/pipeline_info/software_versions.yml - - - name: Publish Test Report - uses: mikepenz/action-junit-report@v3 - if: always() # always run even if the previous step fails - with: - report_paths: test.xml + wget -qO- get.nextflow.io | bash + sudo mv nextflow /usr/local/bin/ + - name: Run pipeline with various parameters + run: | + nextflow run ${GITHUB_WORKSPACE} -profile test,docker --outdir ./results ${{ matrix.parameters }} diff --git a/.gitignore b/.gitignore index 935326a7..5124c9ac 100644 --- a/.gitignore +++ b/.gitignore @@ -6,5 +6,3 @@ results/ testing/ testing* *.pyc -.nf-test/ -nf-test diff --git a/.nf-core.yml b/.nf-core.yml index 253f86e2..cafd671c 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,15 +1,5 @@ repository_type: pipeline lint: files_unchanged: - - .github/CONTRIBUTING.md - - .github/ISSUE_TEMPLATE/bug_report.yml - - assets/nf-core-fetchngs_logo_light.png - assets/sendmail_template.txt - lib/NfcoreTemplate.groovy - - .gitattributes - actions_ci: false - multiqc_config: false - nextflow_config: - - "params.validationShowHiddenParams" - - "params.validationSchemaIgnoreParams" - schema_params: false diff --git a/CHANGELOG.md b/CHANGELOG.md index 146b93b6..12ef2d50 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,22 +3,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [[1.10.1](https://github.com/nf-core/fetchngs/releases/tag/1.10.1)] - 2023-06-29 - -### Credits - -Special thanks to the following for their contributions to the release: - -- [Sateesh Peri](https://github.com/sateeshperi) -- [Edmund Miller](https://github.com/Emiller88) -- [Maxime Garcia](https://github.com/maxulysse) - -Thank you to everyone else that has contributed by reporting bugs, enhancements or in any other way, shape or form. - -### Enhancements & fixes - -- [#166](https://github.com/nf-core/fetchngs/issues/175) - Add NF-TEST pipeline end-to-end tests for existing CI tests - ## [[1.10.0](https://github.com/nf-core/fetchngs/releases/tag/1.10.0)] - 2023-05-16 ### Credits diff --git a/bin/sra_runinfo_to_ftp.py b/bin/sra_runinfo_to_ftp.py index c220f74e..ef80ec80 100755 --- a/bin/sra_runinfo_to_ftp.py +++ b/bin/sra_runinfo_to_ftp.py @@ -61,8 +61,7 @@ def parse_sra_runinfo(file_in): with open(file_in, "r", newline="") as fin: reader = csv.DictReader(fin, delimiter="\t", skipinitialspace=True) header = list(reader.fieldnames) - missing = frozenset(columns).difference(frozenset(header)) - if missing: + if missing := frozenset(columns).difference(frozenset(header)): logger.critical(f"The following expected columns are missing from {file_in}: " f"{', '.join(missing)}.") sys.exit(1) for row in reader: diff --git a/conf/test.config b/conf/test.config index 0bc98595..3c58e9cf 100644 --- a/conf/test.config +++ b/conf/test.config @@ -22,6 +22,3 @@ params { // Input data input = 'https://raw.githubusercontent.com/nf-core/test-datasets/fetchngs/sra_ids_test.csv' } - -// Load test_data.config for nf-tests -includeConfig 'test_data.config' diff --git a/conf/test_data.config b/conf/test_data.config deleted file mode 100644 index 42d3d818..00000000 --- a/conf/test_data.config +++ /dev/null @@ -1,36 +0,0 @@ -params { - // Base directory for test data - test_data_base = "https://raw.githubusercontent.com/nf-core/test-datasets/fetchngs" - - merge_samplesheet_ids = [ "DRX024467_DRR026872", "SRX11047067_SRR14709033", "SRX9504942_SRR13055517", "DRX026011_DRR028935", "SRX17709227_SRR21711856", "SRX9504942_SRR13055518", "ERX1188904_ERR1109373", "SRX17709228_SRR21711855", "SRX9504942_SRR13055519", "ERX1234253_ERR1160846", "SRX6725035_SRR9984183", "SRX9504942_SRR13055520", "SRX10940790_SRR14593545", "SRX9315476_SRR12848126", "SRX9626017_SRR13191702" ] - - def merge_samplesheet_url = "${params.test_data_base}/modules/local/sra_merge_samplesheet/samplesheets/" - def merge_mappings_url = "${params.test_data_base}/modules/local/sra_merge_samplesheet/mappings/" - def merge_samplesheet_urls = [] - def merge_mappings_urls = [] - - merge_samplesheet_ids.each { id -> - merge_samplesheet_urls += "${merge_samplesheet_url}${id}.samplesheet.csv" - merge_mappings_urls += "${merge_mappings_url}/${id}.mappings.csv" - } - - fastq_ftp_ids = ["SRR13191702"] - def fastq_ftp_url = "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/" - def fastq_ftp_urls = [] - - fastq_ftp_ids.each { id -> - fastq_ftp_urls += "${fastq_ftp_url}${id}_1.fastq.gz" - fastq_ftp_urls += "${fastq_ftp_url}${id}_2.fastq.gz" - } - - test_data { - 'modules_local' { - multiqc_mappings_config = "${params.test_data_base}/modules/local/multiqc_mappings_config/SRX9626017_SRR13191702.mappings.csv" - sra_merge_samplesheet_samplesheets = merge_samplesheet_urls - sra_merge_samplesheet_mappings = merge_mappings_urls - sra_to_samplesheet = "${params.test_data_base}/modules/local/sra_to_samplesheet/SRX9626017_SRR13191702.mappings.csv" - sra_fastq_ftp = fastq_ftp_urls - sra_runinfo_to_ftp = "${params.test_data_base}/modules/local/sra_runinfo_to_ftp/SRR13191702.runinfo.tsv" - } - } -} diff --git a/docs/usage.md b/docs/usage.md index b2cd7b50..0720a680 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -70,12 +70,6 @@ From v1.9 of this pipeline the default `strandedness` in the output samplesheet If FTP connections are blocked on your network use the [`--force_sratools_download`](https://nf-co.re/fetchngs/parameters#force_sratools_download) parameter to force the pipeline to download data using sra-tools instead of the ENA FTP. -### Downloading 10X Genomics Data - -As of v1.10.0, this pipeline now supports downloading of 10X Genomics data. For 10X data sets, the output needs to be split into three fastq files, consisting of the feature barcode+UMI, cDNA sequence reads, and sample index. Adding the `--force_sratools_download` parameter will cause the pipeline to use the sra-tools fasterq-dump program with appropriate setting to ensure that all three files are generated. - -Please note that in our experience the downloaded R1, R2, and R3 fastq files do not always correspond to the same data types across different submissions. In many cases, R1 will be the cell barcode + UMI, R2 is the cDNA sequence, and R3 is the sample index. However, this is not alway the case. Users are strongly encouraged to verify their data before proceeding with downstream analysis. - ### Downloading dbGAP data with JWT As of v1.10.0, the SRA Toolkit used in this pipeline can be configured to access protected data from dbGAP using a [JWT cart file](https://www.ncbi.nlm.nih.gov/sra/docs/sra-dbGAP-cloud-download/) on a supported cloud computing environment (Amazon Web Services or Google Cloud Platform). The JWT cart file can be specified with `--dbgap_key /path/to/cart.jwt`. diff --git a/lib/NftestUtils.groovy b/lib/NftestUtils.groovy deleted file mode 100644 index ce6fc8b4..00000000 --- a/lib/NftestUtils.groovy +++ /dev/null @@ -1,38 +0,0 @@ -// Helper functions for pipeline tests - -class NftestUtils { - - // Function to remove Nextflow version from software_versions.yml - public static String removeNextflowVersion(outputDir) { - def softwareVersions = path("$outputDir/pipeline_info/software_versions.yml").yaml - if (softwareVersions.containsKey("Workflow")) { - softwareVersions.Workflow.remove("Nextflow") - } - return softwareVersions - } - - // Function to filter lines from a file and return a new file - public static File filterLines(String inFilePath, int linesToSkip) { - if (linesToSkip >= 0) { - File inputFile = new File(inFilePath) - File outputFile = new File(inFilePath + ".filtered") - def lineCount = 0 - inputFile.eachLine { line -> - lineCount++ - if (lineCount > linesToSkip) { - outputFile.append(line + '\n') - } - } - return outputFile - } else { - File inputFile = new File(inFilePath) - File outputFile = new File(inFilePath + ".filtered") - def lines = inputFile.readLines() - def totalLines = lines.size() - lines.take(totalLines + linesToSkip).each { line -> - outputFile.append(line + '\n') - } - return outputFile - } - } -} diff --git a/modules.json b/modules.json index 2244addd..3137b88b 100644 --- a/modules.json +++ b/modules.json @@ -8,8 +8,7 @@ "custom/dumpsoftwareversions": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"], - "patch": "modules/nf-core/custom/dumpsoftwareversions/custom-dumpsoftwareversions.diff" + "installed_by": ["modules"] }, "custom/sratoolsncbisettings": { "branch": "master", diff --git a/modules/local/multiqc_mappings_config/main.nf b/modules/local/multiqc_mappings_config.nf similarity index 100% rename from modules/local/multiqc_mappings_config/main.nf rename to modules/local/multiqc_mappings_config.nf diff --git a/modules/local/multiqc_mappings_config/tests/main.nf.test b/modules/local/multiqc_mappings_config/tests/main.nf.test deleted file mode 100644 index 3bf79537..00000000 --- a/modules/local/multiqc_mappings_config/tests/main.nf.test +++ /dev/null @@ -1,31 +0,0 @@ -nextflow_process { - - name "Test process: MULTIQC_MAPPINGS_CONFIG" - script "modules/local/multiqc_mappings_config/main.nf" - process "MULTIQC_MAPPINGS_CONFIG" - tag "modules" - tag "modules_local" - tag "multiqc_mappings_config" - - test("Should run without failures") { - - when { - params { - outdir = "$outputDir" - } - - process { - """ - input[0] = file(params.test_data['modules_local']['multiqc_mappings_config'], checkIfExists: true) - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } - ) - } - } -} diff --git a/modules/local/multiqc_mappings_config/tests/main.nf.test.snap b/modules/local/multiqc_mappings_config/tests/main.nf.test.snap deleted file mode 100644 index 9cf7fb38..00000000 --- a/modules/local/multiqc_mappings_config/tests/main.nf.test.snap +++ /dev/null @@ -1,52 +0,0 @@ -{ - "SRX9626017_SRR13191702": { - "content": [ - { - "0": [ - [ - "multiqc_config.yml:md5,7f3cb10fff83ba9eb3e8fa6862d1290a", - "versions.yml:md5,dd4c66f0551d15510b36bb2e2b2fdd73" - ] - ], - "1": [ - "versions.yml:md5,dd4c66f0551d15510b36bb2e2b2fdd73" - ], - "versions": [ - "versions.yml:md5,dd4c66f0551d15510b36bb2e2b2fdd73" - ], - "yml": [ - [ - "multiqc_config.yml:md5,7f3cb10fff83ba9eb3e8fa6862d1290a", - "versions.yml:md5,dd4c66f0551d15510b36bb2e2b2fdd73" - ] - ] - } - ], - "timestamp": "2023-08-17T12:02:35+0000" - }, - "Should run without failures": { - "content": [ - { - "0": [ - [ - "multiqc_config.yml:md5,7f3cb10fff83ba9eb3e8fa6862d1290a", - "versions.yml:md5,dd4c66f0551d15510b36bb2e2b2fdd73" - ] - ], - "1": [ - "versions.yml:md5,dd4c66f0551d15510b36bb2e2b2fdd73" - ], - "versions": [ - "versions.yml:md5,dd4c66f0551d15510b36bb2e2b2fdd73" - ], - "yml": [ - [ - "multiqc_config.yml:md5,7f3cb10fff83ba9eb3e8fa6862d1290a", - "versions.yml:md5,dd4c66f0551d15510b36bb2e2b2fdd73" - ] - ] - } - ], - "timestamp": "2023-08-17T12:02:35+0000" - } -} \ No newline at end of file diff --git a/modules/local/sra_fastq_ftp/main.nf b/modules/local/sra_fastq_ftp.nf similarity index 100% rename from modules/local/sra_fastq_ftp/main.nf rename to modules/local/sra_fastq_ftp.nf diff --git a/modules/local/sra_fastq_ftp/tests/main.nf.test b/modules/local/sra_fastq_ftp/tests/main.nf.test deleted file mode 100644 index 7892d156..00000000 --- a/modules/local/sra_fastq_ftp/tests/main.nf.test +++ /dev/null @@ -1,34 +0,0 @@ -nextflow_process { - - name "Test process: SRA_FASTQ_FTP" - script "modules/local/sra_fastq_ftp/main.nf" - process "SRA_FASTQ_FTP" - tag "modules" - tag "modules_local" - tag "sra_fastq_ftp" - - test("Should run without failures") { - - when { - params { - outdir = "$outputDir" - } - - process { - """ - input[0] = [ - [ id:'SRX9626017_SRR13191702', single_end:false, md5_1: '89c5be920021a035084d8aeb74f32df7', md5_2: '56271be38a80db78ef3bdfc5d9909b98' ], // meta map - params.test_data['modules_local']['sra_fastq_ftp'] - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } - ) - } - } -} diff --git a/modules/local/sra_fastq_ftp/tests/main.nf.test.snap b/modules/local/sra_fastq_ftp/tests/main.nf.test.snap deleted file mode 100644 index c0d5ffdc..00000000 --- a/modules/local/sra_fastq_ftp/tests/main.nf.test.snap +++ /dev/null @@ -1,140 +0,0 @@ -{ - "SRX9626017_SRR13191702": { - "content": [ - { - "0": [ - [ - { - "id": "SRX9626017_SRR13191702", - "single_end": false, - "md5_1": "89c5be920021a035084d8aeb74f32df7", - "md5_2": "56271be38a80db78ef3bdfc5d9909b98" - }, - [ - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" - ] - ] - ], - "1": [ - [ - { - "id": "SRX9626017_SRR13191702", - "single_end": false, - "md5_1": "89c5be920021a035084d8aeb74f32df7", - "md5_2": "56271be38a80db78ef3bdfc5d9909b98" - }, - [ - "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", - "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" - ] - ] - ], - "2": [ - "versions.yml:md5,6b9d69dea1c1305f74a65197ee871f1b" - ], - "fastq": [ - [ - { - "id": "SRX9626017_SRR13191702", - "single_end": false, - "md5_1": "89c5be920021a035084d8aeb74f32df7", - "md5_2": "56271be38a80db78ef3bdfc5d9909b98" - }, - [ - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" - ] - ] - ], - "md5": [ - [ - { - "id": "SRX9626017_SRR13191702", - "single_end": false, - "md5_1": "89c5be920021a035084d8aeb74f32df7", - "md5_2": "56271be38a80db78ef3bdfc5d9909b98" - }, - [ - "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", - "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" - ] - ] - ], - "versions": [ - "versions.yml:md5,6b9d69dea1c1305f74a65197ee871f1b" - ] - } - ], - "timestamp": "2023-08-06T23:31:57+0000" - }, - "Should run without failures": { - "content": [ - { - "0": [ - [ - { - "id": "SRX9626017_SRR13191702", - "single_end": false, - "md5_1": "89c5be920021a035084d8aeb74f32df7", - "md5_2": "56271be38a80db78ef3bdfc5d9909b98" - }, - [ - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" - ] - ] - ], - "1": [ - [ - { - "id": "SRX9626017_SRR13191702", - "single_end": false, - "md5_1": "89c5be920021a035084d8aeb74f32df7", - "md5_2": "56271be38a80db78ef3bdfc5d9909b98" - }, - [ - "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", - "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" - ] - ] - ], - "2": [ - "versions.yml:md5,6b9d69dea1c1305f74a65197ee871f1b" - ], - "fastq": [ - [ - { - "id": "SRX9626017_SRR13191702", - "single_end": false, - "md5_1": "89c5be920021a035084d8aeb74f32df7", - "md5_2": "56271be38a80db78ef3bdfc5d9909b98" - }, - [ - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" - ] - ] - ], - "md5": [ - [ - { - "id": "SRX9626017_SRR13191702", - "single_end": false, - "md5_1": "89c5be920021a035084d8aeb74f32df7", - "md5_2": "56271be38a80db78ef3bdfc5d9909b98" - }, - [ - "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", - "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" - ] - ] - ], - "versions": [ - "versions.yml:md5,6b9d69dea1c1305f74a65197ee871f1b" - ] - } - ], - "timestamp": "2023-08-06T23:31:57+0000" - } -} \ No newline at end of file diff --git a/modules/local/sra_ids_to_runinfo/main.nf b/modules/local/sra_ids_to_runinfo.nf similarity index 100% rename from modules/local/sra_ids_to_runinfo/main.nf rename to modules/local/sra_ids_to_runinfo.nf diff --git a/modules/local/sra_ids_to_runinfo/tests/main.nf.test b/modules/local/sra_ids_to_runinfo/tests/main.nf.test deleted file mode 100644 index f8a44086..00000000 --- a/modules/local/sra_ids_to_runinfo/tests/main.nf.test +++ /dev/null @@ -1,32 +0,0 @@ -nextflow_process { - - name "Test process: SRA_IDS_TO_RUNINFO" - script "modules/local/sra_ids_to_runinfo/main.nf" - process "SRA_IDS_TO_RUNINFO" - tag "modules" - tag "modules_local" - tag "sra_ids_to_runinfo" - - test("Should run without failures") { - - when { - params { - outdir = "$outputDir" - } - - process { - """ - input[0] = 'SRR13191702' - input[1] = '' - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } - ) - } - } -} diff --git a/modules/local/sra_ids_to_runinfo/tests/main.nf.test.snap b/modules/local/sra_ids_to_runinfo/tests/main.nf.test.snap deleted file mode 100644 index dbca931f..00000000 --- a/modules/local/sra_ids_to_runinfo/tests/main.nf.test.snap +++ /dev/null @@ -1,21 +0,0 @@ -{ - "Should run without failures": { - "content": [ - { - "0": [ - "SRR13191702.runinfo.tsv:md5,3a1be35781ca6e8a28d8fd4d2f3bbe85" - ], - "1": [ - "versions.yml:md5,1c14442e9b494b586eafe41e77300fae" - ], - "tsv": [ - "SRR13191702.runinfo.tsv:md5,3a1be35781ca6e8a28d8fd4d2f3bbe85" - ], - "versions": [ - "versions.yml:md5,1c14442e9b494b586eafe41e77300fae" - ] - } - ], - "timestamp": "2023-08-06T23:30:51+0000" - } -} \ No newline at end of file diff --git a/modules/local/sra_merge_samplesheet/main.nf b/modules/local/sra_merge_samplesheet.nf similarity index 100% rename from modules/local/sra_merge_samplesheet/main.nf rename to modules/local/sra_merge_samplesheet.nf diff --git a/modules/local/sra_merge_samplesheet/tests/main.nf.test b/modules/local/sra_merge_samplesheet/tests/main.nf.test deleted file mode 100644 index e37039bd..00000000 --- a/modules/local/sra_merge_samplesheet/tests/main.nf.test +++ /dev/null @@ -1,32 +0,0 @@ -nextflow_process { - - name "Test process: SRA_MERGE_SAMPLESHEET" - script "modules/local/sra_merge_samplesheet/main.nf" - process "SRA_MERGE_SAMPLESHEET" - tag "modules" - tag "modules_local" - tag "sra_merge_samplesheet" - - test("Should run without failures") { - - when { - params { - outdir = "$outputDir" - } - - process { - """ - input[0] = params.test_data['modules_local']['sra_merge_samplesheet_samplesheets'].collect { file(it, checkIfExists: true) } - input[1] = params.test_data['modules_local']['sra_merge_samplesheet_mappings'].collect { file(it, checkIfExists: true) } - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } - ) - } - } -} diff --git a/modules/local/sra_merge_samplesheet/tests/main.nf.test.snap b/modules/local/sra_merge_samplesheet/tests/main.nf.test.snap deleted file mode 100644 index c5f06aac..00000000 --- a/modules/local/sra_merge_samplesheet/tests/main.nf.test.snap +++ /dev/null @@ -1,27 +0,0 @@ -{ - "Should run without failures": { - "content": [ - { - "0": [ - "samplesheet.csv:md5,ef756557b0735becd2574c2a3f5840b2" - ], - "1": [ - "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253" - ], - "2": [ - "versions.yml:md5,410006679d5e496d8c55e58e78ca6b34" - ], - "mappings": [ - "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253" - ], - "samplesheet": [ - "samplesheet.csv:md5,ef756557b0735becd2574c2a3f5840b2" - ], - "versions": [ - "versions.yml:md5,410006679d5e496d8c55e58e78ca6b34" - ] - } - ], - "timestamp": "2023-07-06T13:16:36+0000" - } -} \ No newline at end of file diff --git a/modules/local/sra_runinfo_to_ftp/main.nf b/modules/local/sra_runinfo_to_ftp.nf similarity index 100% rename from modules/local/sra_runinfo_to_ftp/main.nf rename to modules/local/sra_runinfo_to_ftp.nf diff --git a/modules/local/sra_runinfo_to_ftp/tests/main.nf.test b/modules/local/sra_runinfo_to_ftp/tests/main.nf.test deleted file mode 100644 index 1558ff39..00000000 --- a/modules/local/sra_runinfo_to_ftp/tests/main.nf.test +++ /dev/null @@ -1,31 +0,0 @@ -nextflow_process { - - name "Test process: SRA_RUNINFO_TO_FTP" - script "modules/local/sra_runinfo_to_ftp/main.nf" - process "SRA_RUNINFO_TO_FTP" - tag "modules" - tag "modules_local" - tag "sra_runinfo_to_ftp" - - test("Should run without failures") { - - when { - params { - outdir = "$outputDir" - } - - process { - """ - input[0] = file(params.test_data['modules_local']['sra_runinfo_to_ftp'], checkIfExists: true) - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } - ) - } - } -} diff --git a/modules/local/sra_runinfo_to_ftp/tests/main.nf.test.snap b/modules/local/sra_runinfo_to_ftp/tests/main.nf.test.snap deleted file mode 100644 index 71a25f99..00000000 --- a/modules/local/sra_runinfo_to_ftp/tests/main.nf.test.snap +++ /dev/null @@ -1,21 +0,0 @@ -{ - "Should run without failures": { - "content": [ - { - "0": [ - "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e" - ], - "1": [ - "versions.yml:md5,e95f8185f665127a73622a19d321bcca" - ], - "tsv": [ - "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e" - ], - "versions": [ - "versions.yml:md5,e95f8185f665127a73622a19d321bcca" - ] - } - ], - "timestamp": "2023-08-06T23:13:20+0000" - } -} \ No newline at end of file diff --git a/modules/local/sra_to_samplesheet/main.nf b/modules/local/sra_to_samplesheet.nf similarity index 100% rename from modules/local/sra_to_samplesheet/main.nf rename to modules/local/sra_to_samplesheet.nf diff --git a/modules/local/sra_to_samplesheet/tests/main.nf.test b/modules/local/sra_to_samplesheet/tests/main.nf.test deleted file mode 100644 index b2ec5b11..00000000 --- a/modules/local/sra_to_samplesheet/tests/main.nf.test +++ /dev/null @@ -1,34 +0,0 @@ -nextflow_process { - - name "Test process: SRA_TO_SAMPLESHEET" - script "modules/local/sra_to_samplesheet/main.nf" - process "SRA_TO_SAMPLESHEET" - tag "modules" - tag "modules_local" - tag "sra_to_samplesheet" - - test("Should run without failures") { - - when { - params { - outdir = "$outputDir" - } - - process { - """ - input[0] = [id:'ERX1188904_ERR1109373', run_accession:'ERR1109373', experiment_accession:'ERX1188904', sample_accession:'SAMEA3643867', experiment_alias:'ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7', run_alias:'ena-RUN-CAM-03-11-2015-17:01:52:847-7', sample_alias:'sample_56', study_alias:'ena-STUDY-CAM-02-11-2015-17:42:24:189-13', library_layout:'PAIRED', experiment_title:'Illumina HiSeq 2500 paired end sequencing', sample_title:'RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome', sample_description:'RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome', fastq_md5:'8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9', fastq_ftp:'ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz', fastq_1:'./results/fastq/ERX1188904_ERR1109373_1.fastq.gz', fastq_2:'./results/fastq/ERX1188904_ERR1109373_2.fastq.gz', md5_1:'9fd57225d6c07a31843276d6df9b15c0', md5_2:'5a62e8f785687dce890cfb4fe3e607f9', single_end:false] - input[1] = 'rnaseq' - input[2] = 'auto' - input[3] = 'experiment_accession,run_accession,sample_accession,experiment_alias,run_alias,sample_alias,experiment_title,sample_title,sample_description' - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } - ) - } - } -} diff --git a/modules/local/sra_to_samplesheet/tests/main.nf.test.snap b/modules/local/sra_to_samplesheet/tests/main.nf.test.snap deleted file mode 100644 index 8b5f4947..00000000 --- a/modules/local/sra_to_samplesheet/tests/main.nf.test.snap +++ /dev/null @@ -1,113 +0,0 @@ -{ - "Should run without failures": { - "content": [ - { - "0": [ - [ - { - "id": "ERX1188904_ERR1109373", - "run_accession": "ERR1109373", - "experiment_accession": "ERX1188904", - "sample_accession": "SAMEA3643867", - "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", - "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", - "sample_alias": "sample_56", - "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", - "library_layout": "PAIRED", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing", - "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_1": "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "fastq_2": "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9", - "md5_1": "9fd57225d6c07a31843276d6df9b15c0", - "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", - "single_end": false - }, - "ERX1188904_ERR1109373.samplesheet.csv:md5,e7898191d57258e049ee7129d36f5c08" - ] - ], - "1": [ - [ - { - "id": "ERX1188904_ERR1109373", - "run_accession": "ERR1109373", - "experiment_accession": "ERX1188904", - "sample_accession": "SAMEA3643867", - "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", - "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", - "sample_alias": "sample_56", - "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", - "library_layout": "PAIRED", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing", - "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_1": "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "fastq_2": "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9", - "md5_1": "9fd57225d6c07a31843276d6df9b15c0", - "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", - "single_end": false - }, - "ERX1188904_ERR1109373.mappings.csv:md5,d09ddb4f0709675e5dfe1eadf12c608f" - ] - ], - "mappings": [ - [ - { - "id": "ERX1188904_ERR1109373", - "run_accession": "ERR1109373", - "experiment_accession": "ERX1188904", - "sample_accession": "SAMEA3643867", - "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", - "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", - "sample_alias": "sample_56", - "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", - "library_layout": "PAIRED", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing", - "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_1": "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "fastq_2": "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9", - "md5_1": "9fd57225d6c07a31843276d6df9b15c0", - "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", - "single_end": false - }, - "ERX1188904_ERR1109373.mappings.csv:md5,d09ddb4f0709675e5dfe1eadf12c608f" - ] - ], - "samplesheet": [ - [ - { - "id": "ERX1188904_ERR1109373", - "run_accession": "ERR1109373", - "experiment_accession": "ERX1188904", - "sample_accession": "SAMEA3643867", - "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", - "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", - "sample_alias": "sample_56", - "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", - "library_layout": "PAIRED", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing", - "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_1": "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "fastq_2": "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9", - "md5_1": "9fd57225d6c07a31843276d6df9b15c0", - "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", - "single_end": false - }, - "ERX1188904_ERR1109373.samplesheet.csv:md5,e7898191d57258e049ee7129d36f5c08" - ] - ] - } - ], - "timestamp": "2023-08-17T10:55:52+0000" - } -} \ No newline at end of file diff --git a/modules/local/synapse_get/main.nf b/modules/local/synapse_get.nf similarity index 100% rename from modules/local/synapse_get/main.nf rename to modules/local/synapse_get.nf diff --git a/modules/local/synapse_list/main.nf b/modules/local/synapse_list.nf similarity index 100% rename from modules/local/synapse_list/main.nf rename to modules/local/synapse_list.nf diff --git a/modules/local/synapse_merge_samplesheet/main.nf b/modules/local/synapse_merge_samplesheet.nf similarity index 100% rename from modules/local/synapse_merge_samplesheet/main.nf rename to modules/local/synapse_merge_samplesheet.nf diff --git a/modules/local/synapse_show/main.nf b/modules/local/synapse_show.nf similarity index 100% rename from modules/local/synapse_show/main.nf rename to modules/local/synapse_show.nf diff --git a/modules/local/synapse_to_samplesheet/main.nf b/modules/local/synapse_to_samplesheet.nf similarity index 100% rename from modules/local/synapse_to_samplesheet/main.nf rename to modules/local/synapse_to_samplesheet.nf diff --git a/modules/nf-core/custom/dumpsoftwareversions/custom-dumpsoftwareversions.diff b/modules/nf-core/custom/dumpsoftwareversions/custom-dumpsoftwareversions.diff deleted file mode 100644 index a7893b24..00000000 --- a/modules/nf-core/custom/dumpsoftwareversions/custom-dumpsoftwareversions.diff +++ /dev/null @@ -1,13 +0,0 @@ -Changes in module 'nf-core/custom/dumpsoftwareversions' ---- modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py -+++ modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py -@@ -75,7 +75,6 @@ - versions_by_module[module] = process_versions - - versions_by_module["Workflow"] = { -- "Nextflow": "$workflow.nextflow.version", - "$workflow.manifest.name": "$workflow.manifest.version", - } - - -************************************************************ diff --git a/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py index 33d127f8..da033408 100755 --- a/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py +++ b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py @@ -75,6 +75,7 @@ def main(): versions_by_module[module] = process_versions versions_by_module["Workflow"] = { + "Nextflow": "$workflow.nextflow.version", "$workflow.manifest.name": "$workflow.manifest.version", } diff --git a/nextflow.config b/nextflow.config index 6eb5c18d..1e9aaed0 100644 --- a/nextflow.config +++ b/nextflow.config @@ -212,7 +212,7 @@ manifest { description = """Pipeline to fetch metadata and raw FastQ files from public databases""" mainScript = 'main.nf' nextflowVersion = '!>=22.10.1' - version = '1.10.1' + version = '1.10.0' doi = 'https://doi.org/10.5281/zenodo.5070524' } diff --git a/nf-test.config b/nf-test.config deleted file mode 100644 index 0799cb40..00000000 --- a/nf-test.config +++ /dev/null @@ -1,16 +0,0 @@ -config { - // location for all nf-tests - testsDir "." - - // nf-test directory including temporary files for each test - workDir ".nf-test" - - // location of library folder that is added automatically to the classpath - libDir "lib/" - - // location of an optional nextflow.config file specific for executing tests - configFile "nextflow.config" - - // run all test with the defined docker profile from the main nextflow.config - profile "" -} diff --git a/workflows/sra/main.nf b/workflows/sra.nf similarity index 89% rename from workflows/sra/main.nf rename to workflows/sra.nf index 512a73d4..44ff8346 100644 --- a/workflows/sra/main.nf +++ b/workflows/sra.nf @@ -19,12 +19,12 @@ WorkflowSra.initialise(params, valid_params) ======================================================================================== */ -include { SRA_IDS_TO_RUNINFO } from '../../modules/local/sra_ids_to_runinfo' -include { SRA_RUNINFO_TO_FTP } from '../../modules/local/sra_runinfo_to_ftp' -include { SRA_FASTQ_FTP } from '../../modules/local/sra_fastq_ftp' -include { SRA_TO_SAMPLESHEET } from '../../modules/local/sra_to_samplesheet' -include { SRA_MERGE_SAMPLESHEET } from '../../modules/local/sra_merge_samplesheet' -include { MULTIQC_MAPPINGS_CONFIG } from '../../modules/local/multiqc_mappings_config' +include { SRA_IDS_TO_RUNINFO } from '../modules/local/sra_ids_to_runinfo' +include { SRA_RUNINFO_TO_FTP } from '../modules/local/sra_runinfo_to_ftp' +include { SRA_FASTQ_FTP } from '../modules/local/sra_fastq_ftp' +include { SRA_TO_SAMPLESHEET } from '../modules/local/sra_to_samplesheet' +include { SRA_MERGE_SAMPLESHEET } from '../modules/local/sra_merge_samplesheet' +include { MULTIQC_MAPPINGS_CONFIG } from '../modules/local/multiqc_mappings_config' /* ======================================================================================== @@ -32,9 +32,9 @@ include { MULTIQC_MAPPINGS_CONFIG } from '../../modules/local/multiqc_mappings_c ======================================================================================== */ -include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../../modules/nf-core/custom/dumpsoftwareversions' +include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/custom/dumpsoftwareversions/main' -include { FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS } from '../../subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools' +include { FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS } from '../subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/main' /* ======================================================================================== diff --git a/workflows/sra/tests/main.nf.test b/workflows/sra/tests/main.nf.test deleted file mode 100644 index 39a5cc3f..00000000 --- a/workflows/sra/tests/main.nf.test +++ /dev/null @@ -1,24 +0,0 @@ -nextflow_pipeline { - - name "Test workflow: sra.nf" - script "main.nf" - tag "workflows" - tag "workflows_sra" - tag "sra_default_parameters" - - test("Parameters: default") { - - when { - params { - outdir = "$outputDir" - } - } - - then { - assertAll( - { assert workflow.success }, - { assert snapshot(process.out).match() } - ) - } - } -} diff --git a/workflows/sra/tests/main.nf.test.snap b/workflows/sra/tests/main.nf.test.snap deleted file mode 100644 index 88ea9654..00000000 --- a/workflows/sra/tests/main.nf.test.snap +++ /dev/null @@ -1,88 +0,0 @@ -{ - "Parameters: default": { - "content": [ - { - - } - ], - "timestamp": "2023-08-17T12:09:45+0000" - }, - "metadata": { - "content": [ - "DRR026872.runinfo_ftp.tsv:md5,73606f6a05c45b077809da43ca638b5f", - "DRR028935.runinfo_ftp.tsv:md5,f79eefcea5db346f76f76f87df7f8dd2", - "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", - "ERR1160846.runinfo_ftp.tsv:md5,1b2dc1a64117de20b2164724836da345", - "GSE214215.runinfo_ftp.tsv:md5,23a580c89ee7bf681ca3ffa26aa1837f", - "SRR12848126.runinfo_ftp.tsv:md5,5d1e6bfd3d4077d1e66378c58e44975d", - "SRR13191702.runinfo_ftp.tsv:md5,409e262bb41bb6103315126db4d0dd1d", - "SRR14593545.runinfo_ftp.tsv:md5,62015706ac156693ba3d86ed050cab54", - "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", - "SRR9984183.runinfo_ftp.tsv:md5,53ab34ff3612b0e2c7d60476822787be" - ], - "timestamp": "2023-08-17T12:09:45+0000" - }, - "samplesheet": { - "content": [ - "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565", - "multiqc_config.yml:md5,a97047e12b0ea3f46d285629e4053548" - ], - "timestamp": "2023-08-17T12:09:45+0000" - }, - "software_versions": { - "content": [ - "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" - ], - "timestamp": "2023-08-17T12:09:45+0000" - }, - "fastq": { - "content": [ - "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791", - "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", - "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30", - "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9", - "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6", - "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", - "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2", - "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda", - "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64", - "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83", - "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544", - "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", - "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79", - "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", - "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962", - "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", - "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76", - "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", - "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88", - "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", - "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04", - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98", - [ - "DRX024467_DRR026872.fastq.gz.md5:md5,dacaeba3498fb8f405411a22cdb4b40d", - "DRX026011_DRR028935_1.fastq.gz.md5:md5,a47018c5972ba4c11539d0d6bc25eda9", - "DRX026011_DRR028935_2.fastq.gz.md5:md5,f477bbef548fbed665734ebf084eea2f", - "ERX1188904_ERR1109373_1.fastq.gz.md5:md5,50c1c3108631dc32a3151b67e0260d86", - "ERX1188904_ERR1109373_2.fastq.gz.md5:md5,1f22463d410e91a288c83d43654b2499", - "ERX1234253_ERR1160846.fastq.gz.md5:md5,513a8437ad331fc512b088b3750aa1ff", - "SRX17709227_SRR21711856.fastq.gz.md5:md5,13a38fbef27c3e15867d80887145ae75", - "SRX17709228_SRR21711855.fastq.gz.md5:md5,1e871ddd9e92e1866e0c64d36eb5ec85", - "SRX6725035_SRR9984183.fastq.gz.md5:md5,84f59dbb76c9b5eab7e14d90ced352c4", - "SRX9504942_SRR13055517_1.fastq.gz.md5:md5,a03f7f374dc401047b6f6ccaec3885cc", - "SRX9504942_SRR13055517_2.fastq.gz.md5:md5,facaf207753e977327e7b7df7bb8ace0", - "SRX9504942_SRR13055518_1.fastq.gz.md5:md5,5cf412cd62aadaa4838d9eabb5b44368", - "SRX9504942_SRR13055518_2.fastq.gz.md5:md5,93292b826afc72b23be93df26dd710c8", - "SRX9504942_SRR13055519_1.fastq.gz.md5:md5,f6ad6e2610397147a0a55c651de3992f", - "SRX9504942_SRR13055519_2.fastq.gz.md5:md5,2fe7dd4bcc1e7e61c6f54ef50cf961f3", - "SRX9504942_SRR13055520_1.fastq.gz.md5:md5,ab195b37746a3424a1099d9f8cc58de8", - "SRX9504942_SRR13055520_2.fastq.gz.md5:md5,10c448e23f1f7e7af61ec1204f8fc882", - "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", - "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" - ] - ], - "timestamp": "2023-08-17T12:09:45+0000" - } -} \ No newline at end of file diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test deleted file mode 100644 index 6e27c4a9..00000000 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test +++ /dev/null @@ -1,27 +0,0 @@ -nextflow_pipeline { - - name "Test workflow: sra.nf" - script "main.nf" - tag "workflows" - tag "workflows_sra" - tag "sra_custom_ena_metadata_fields" - - test("Parameters: --nf_core_pipeline rnaseq --ena_metadata_fields ... --sample_mapping_fields ...") { - - when { - params { - outdir = "$outputDir" - nf_core_pipeline = "rnaseq" - ena_metadata_fields = "run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5" - sample_mapping_fields = "run_accession,library_layout" - } - } - - then { - assertAll( - { assert workflow.success }, - { assert snapshot(process.out).match() } - ) - } - } -} diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap deleted file mode 100644 index 55c39d4f..00000000 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap +++ /dev/null @@ -1,88 +0,0 @@ -{ - "metadata": { - "content": [ - "DRR026872.runinfo_ftp.tsv:md5,74a5f7058f27a565ce59db481355ca54", - "DRR028935.runinfo_ftp.tsv:md5,07a98fdcec207686a4ea2c9a3997edf3", - "ERR1109373.runinfo_ftp.tsv:md5,868897310855c50b1d5fc77d1195a1f9", - "ERR1160846.runinfo_ftp.tsv:md5,146d7f2ec778b32b7da7ad040e554114", - "GSE214215.runinfo_ftp.tsv:md5,adf62affe371dc9bad8e271450bdc2fe", - "SRR12848126.runinfo_ftp.tsv:md5,cf8827612a76645824e83418d7d76cbf", - "SRR13191702.runinfo_ftp.tsv:md5,2031ca9b7ab736dbde37d05b10cdb0ad", - "SRR14593545.runinfo_ftp.tsv:md5,3a1ac14d71744224a61ab542f869e180", - "SRR14709033.runinfo_ftp.tsv:md5,2385a9cc5e320e78b02743c45d1338f1", - "SRR9984183.runinfo_ftp.tsv:md5,f1ed9fc572d2e0d145be7f547f6d1236" - ], - "timestamp": "2023-08-17T12:11:42+0000" - }, - "samplesheet": { - "content": [ - "id_mappings.csv:md5,8473773df806859c6af7acafcfe5aa6f", - "multiqc_config.yml:md5,6f6189ee58855de81eaf82ad86e21040" - ], - "timestamp": "2023-08-17T12:11:42+0000" - }, - "software_versions": { - "content": [ - "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" - ], - "timestamp": "2023-08-17T12:11:42+0000" - }, - "Parameters: '--nf_core_pipeline rnaseq --ena_metadata_fields ... --sample_mapping_fields ...'": { - "content": [ - { - - } - ], - "timestamp": "2023-08-17T12:11:42+0000" - }, - "fastq": { - "content": [ - "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791", - "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", - "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30", - "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9", - "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6", - "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", - "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2", - "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda", - "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64", - "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83", - "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544", - "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", - "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79", - "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", - "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962", - "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", - "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76", - "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", - "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88", - "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", - "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04", - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98", - [ - "DRX024467_DRR026872.fastq.gz.md5:md5,dacaeba3498fb8f405411a22cdb4b40d", - "DRX026011_DRR028935_1.fastq.gz.md5:md5,a47018c5972ba4c11539d0d6bc25eda9", - "DRX026011_DRR028935_2.fastq.gz.md5:md5,f477bbef548fbed665734ebf084eea2f", - "ERX1188904_ERR1109373_1.fastq.gz.md5:md5,50c1c3108631dc32a3151b67e0260d86", - "ERX1188904_ERR1109373_2.fastq.gz.md5:md5,1f22463d410e91a288c83d43654b2499", - "ERX1234253_ERR1160846.fastq.gz.md5:md5,513a8437ad331fc512b088b3750aa1ff", - "SRX17709227_SRR21711856.fastq.gz.md5:md5,13a38fbef27c3e15867d80887145ae75", - "SRX17709228_SRR21711855.fastq.gz.md5:md5,1e871ddd9e92e1866e0c64d36eb5ec85", - "SRX6725035_SRR9984183.fastq.gz.md5:md5,84f59dbb76c9b5eab7e14d90ced352c4", - "SRX9504942_SRR13055517_1.fastq.gz.md5:md5,a03f7f374dc401047b6f6ccaec3885cc", - "SRX9504942_SRR13055517_2.fastq.gz.md5:md5,facaf207753e977327e7b7df7bb8ace0", - "SRX9504942_SRR13055518_1.fastq.gz.md5:md5,5cf412cd62aadaa4838d9eabb5b44368", - "SRX9504942_SRR13055518_2.fastq.gz.md5:md5,93292b826afc72b23be93df26dd710c8", - "SRX9504942_SRR13055519_1.fastq.gz.md5:md5,f6ad6e2610397147a0a55c651de3992f", - "SRX9504942_SRR13055519_2.fastq.gz.md5:md5,2fe7dd4bcc1e7e61c6f54ef50cf961f3", - "SRX9504942_SRR13055520_1.fastq.gz.md5:md5,ab195b37746a3424a1099d9f8cc58de8", - "SRX9504942_SRR13055520_2.fastq.gz.md5:md5,10c448e23f1f7e7af61ec1204f8fc882", - "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", - "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" - ] - ], - "timestamp": "2023-08-17T12:11:42+0000" - } -} \ No newline at end of file diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test b/workflows/sra/tests/sra_force_sratools_download.nf.test deleted file mode 100644 index 1b501975..00000000 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test +++ /dev/null @@ -1,25 +0,0 @@ -nextflow_pipeline { - - name "Test workflow: sra.nf" - script "main.nf" - tag "workflows" - tag "workflows_sra" - tag "sra_force_sratools_download" - - test("Parameters: --force_sratools_download") { - - when { - params { - outdir = "$outputDir" - force_sratools_download = true - } - } - - then { - assertAll( - { assert workflow.success }, - { assert snapshot(process.out).match() } - ) - } - } -} diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test.snap b/workflows/sra/tests/sra_force_sratools_download.nf.test.snap deleted file mode 100644 index d5d694da..00000000 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test.snap +++ /dev/null @@ -1,67 +0,0 @@ -{ - "Parameters: '--force_sratools_download'": { - "content": [ - { - - } - ], - "timestamp": "2023-08-17T12:15:55+0000" - }, - "metadata": { - "content": [ - "DRR026872.runinfo_ftp.tsv:md5,73606f6a05c45b077809da43ca638b5f", - "DRR028935.runinfo_ftp.tsv:md5,f79eefcea5db346f76f76f87df7f8dd2", - "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", - "ERR1160846.runinfo_ftp.tsv:md5,1b2dc1a64117de20b2164724836da345", - "GSE214215.runinfo_ftp.tsv:md5,23a580c89ee7bf681ca3ffa26aa1837f", - "SRR12848126.runinfo_ftp.tsv:md5,5d1e6bfd3d4077d1e66378c58e44975d", - "SRR13191702.runinfo_ftp.tsv:md5,409e262bb41bb6103315126db4d0dd1d", - "SRR14593545.runinfo_ftp.tsv:md5,62015706ac156693ba3d86ed050cab54", - "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", - "SRR9984183.runinfo_ftp.tsv:md5,53ab34ff3612b0e2c7d60476822787be" - ], - "timestamp": "2023-08-17T12:15:55+0000" - }, - "samplesheet": { - "content": [ - "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565", - "multiqc_config.yml:md5,a97047e12b0ea3f46d285629e4053548" - ], - "timestamp": "2023-08-17T12:15:55+0000" - }, - "software_versions": { - "content": [ - "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" - ], - "timestamp": "2023-08-17T12:15:55+0000" - }, - "fastq": { - "content": [ - "DRX024467_DRR026872.fastq.gz:md5,bd3f113c3b06cf4499fa0e00c634ec85", - "DRX026011_DRR028935_1.fastq.gz:md5,0f96fb60e903c8cbd55a6977e66f7c93", - "DRX026011_DRR028935_2.fastq.gz:md5,b97b1e0e806bcae10a7443e2f22d6ca2", - "ERX1188904_ERR1109373_1.fastq.gz:md5,e7edae2715dfaf4c318d37959fd9ae22", - "ERX1188904_ERR1109373_2.fastq.gz:md5,34ab048c92201a5ec4ab36d8dc1c5732", - "ERX1234253_ERR1160846.fastq.gz:md5,22683b24b2467494e430643423f1e275", - "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", - "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2", - "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda", - "SRX17709227_SRR21711856.fastq.gz:md5,eae43f1368d4568f415581394dc9726e", - "SRX17709228_SRR21711855.fastq.gz:md5,5194f8009b74552595c4ec5b7605d231", - "SRX6725035_SRR9984183.fastq.gz:md5,7a70e678c400366869601c8be41fe74b", - "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", - "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79", - "SRX9504942_SRR13055517_1.fastq.gz:md5,b6d912a73466c8f27b1d8021f80ec2bb", - "SRX9504942_SRR13055517_2.fastq.gz:md5,7c6e220694fa5d6d9124c739aa70ea92", - "SRX9504942_SRR13055518_1.fastq.gz:md5,ed29278c21a1bb2d8907a74be0dd4bc4", - "SRX9504942_SRR13055518_2.fastq.gz:md5,83785b728312deb81483fc1fd5b14264", - "SRX9504942_SRR13055519_1.fastq.gz:md5,28babc59a625b5161d97392efd4d0018", - "SRX9504942_SRR13055519_2.fastq.gz:md5,cf1eb4c61ab3522f4d473c86b2f696e1", - "SRX9504942_SRR13055520_1.fastq.gz:md5,cc75af896ec8a7cececb37851b0c6fcd", - "SRX9504942_SRR13055520_2.fastq.gz:md5,fe3e2bf9f738e4959243fad59e879eae", - "SRX9626017_SRR13191702_1.fastq.gz:md5,627a90afcd9f3cfc7f5f91074f9a2df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,3d9b2c68a8ad1547105b17de81b2d9af" - ], - "timestamp": "2023-08-17T12:15:55+0000" - } -} \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test deleted file mode 100644 index bda1d724..00000000 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test +++ /dev/null @@ -1,25 +0,0 @@ -nextflow_pipeline { - - name "Test workflow: sra.nf" - script "main.nf" - tag "workflows" - tag "workflows_sra" - tag "sra_nf_core_pipeline_atacseq" - - test("Parameters: --nf_core_pipeline atacseq") { - - when { - params { - outdir = "$outputDir" - nf_core_pipeline = "atacseq" - } - } - - then { - assertAll( - { assert workflow.success }, - { assert snapshot(process.out).match() } - ) - } - } -} diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap deleted file mode 100644 index c99f258e..00000000 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap +++ /dev/null @@ -1,88 +0,0 @@ -{ - "metadata": { - "content": [ - "DRR026872.runinfo_ftp.tsv:md5,73606f6a05c45b077809da43ca638b5f", - "DRR028935.runinfo_ftp.tsv:md5,f79eefcea5db346f76f76f87df7f8dd2", - "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", - "ERR1160846.runinfo_ftp.tsv:md5,1b2dc1a64117de20b2164724836da345", - "GSE214215.runinfo_ftp.tsv:md5,23a580c89ee7bf681ca3ffa26aa1837f", - "SRR12848126.runinfo_ftp.tsv:md5,5d1e6bfd3d4077d1e66378c58e44975d", - "SRR13191702.runinfo_ftp.tsv:md5,409e262bb41bb6103315126db4d0dd1d", - "SRR14593545.runinfo_ftp.tsv:md5,62015706ac156693ba3d86ed050cab54", - "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", - "SRR9984183.runinfo_ftp.tsv:md5,53ab34ff3612b0e2c7d60476822787be" - ], - "timestamp": "2023-08-17T12:21:36+0000" - }, - "samplesheet": { - "content": [ - "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565", - "multiqc_config.yml:md5,a97047e12b0ea3f46d285629e4053548" - ], - "timestamp": "2023-08-17T12:21:36+0000" - }, - "software_versions": { - "content": [ - "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" - ], - "timestamp": "2023-08-17T12:21:36+0000" - }, - "Parameters: '--nf_core_pipeline atacseq'": { - "content": [ - { - - } - ], - "timestamp": "2023-08-17T12:21:36+0000" - }, - "fastq": { - "content": [ - "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791", - "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", - "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30", - "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9", - "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6", - "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", - "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2", - "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda", - "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64", - "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83", - "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544", - "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", - "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79", - "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", - "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962", - "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", - "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76", - "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", - "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88", - "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", - "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04", - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98", - [ - "DRX024467_DRR026872.fastq.gz.md5:md5,dacaeba3498fb8f405411a22cdb4b40d", - "DRX026011_DRR028935_1.fastq.gz.md5:md5,a47018c5972ba4c11539d0d6bc25eda9", - "DRX026011_DRR028935_2.fastq.gz.md5:md5,f477bbef548fbed665734ebf084eea2f", - "ERX1188904_ERR1109373_1.fastq.gz.md5:md5,50c1c3108631dc32a3151b67e0260d86", - "ERX1188904_ERR1109373_2.fastq.gz.md5:md5,1f22463d410e91a288c83d43654b2499", - "ERX1234253_ERR1160846.fastq.gz.md5:md5,513a8437ad331fc512b088b3750aa1ff", - "SRX17709227_SRR21711856.fastq.gz.md5:md5,13a38fbef27c3e15867d80887145ae75", - "SRX17709228_SRR21711855.fastq.gz.md5:md5,1e871ddd9e92e1866e0c64d36eb5ec85", - "SRX6725035_SRR9984183.fastq.gz.md5:md5,84f59dbb76c9b5eab7e14d90ced352c4", - "SRX9504942_SRR13055517_1.fastq.gz.md5:md5,a03f7f374dc401047b6f6ccaec3885cc", - "SRX9504942_SRR13055517_2.fastq.gz.md5:md5,facaf207753e977327e7b7df7bb8ace0", - "SRX9504942_SRR13055518_1.fastq.gz.md5:md5,5cf412cd62aadaa4838d9eabb5b44368", - "SRX9504942_SRR13055518_2.fastq.gz.md5:md5,93292b826afc72b23be93df26dd710c8", - "SRX9504942_SRR13055519_1.fastq.gz.md5:md5,f6ad6e2610397147a0a55c651de3992f", - "SRX9504942_SRR13055519_2.fastq.gz.md5:md5,2fe7dd4bcc1e7e61c6f54ef50cf961f3", - "SRX9504942_SRR13055520_1.fastq.gz.md5:md5,ab195b37746a3424a1099d9f8cc58de8", - "SRX9504942_SRR13055520_2.fastq.gz.md5:md5,10c448e23f1f7e7af61ec1204f8fc882", - "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", - "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" - ] - ], - "timestamp": "2023-08-17T12:21:36+0000" - } -} \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test deleted file mode 100644 index 438b7f55..00000000 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test +++ /dev/null @@ -1,25 +0,0 @@ -nextflow_pipeline { - - name "Test workflow: sra.nf" - script "main.nf" - tag "workflows" - tag "workflows_sra" - tag "sra_nf_core_pipeline_rnaseq" - - test("Parameters: --nf_core_pipeline rnaseq") { - - when { - params { - outdir = "$outputDir" - nf_core_pipeline = "rnaseq" - } - } - - then { - assertAll( - { assert workflow.success }, - { assert snapshot(process.out).match() } - ) - } - } -} diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap deleted file mode 100644 index 1da0381a..00000000 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap +++ /dev/null @@ -1,88 +0,0 @@ -{ - "metadata": { - "content": [ - "DRR026872.runinfo_ftp.tsv:md5,73606f6a05c45b077809da43ca638b5f", - "DRR028935.runinfo_ftp.tsv:md5,f79eefcea5db346f76f76f87df7f8dd2", - "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", - "ERR1160846.runinfo_ftp.tsv:md5,1b2dc1a64117de20b2164724836da345", - "GSE214215.runinfo_ftp.tsv:md5,23a580c89ee7bf681ca3ffa26aa1837f", - "SRR12848126.runinfo_ftp.tsv:md5,5d1e6bfd3d4077d1e66378c58e44975d", - "SRR13191702.runinfo_ftp.tsv:md5,409e262bb41bb6103315126db4d0dd1d", - "SRR14593545.runinfo_ftp.tsv:md5,62015706ac156693ba3d86ed050cab54", - "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", - "SRR9984183.runinfo_ftp.tsv:md5,53ab34ff3612b0e2c7d60476822787be" - ], - "timestamp": "2023-08-17T12:19:51+0000" - }, - "samplesheet": { - "content": [ - "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565", - "multiqc_config.yml:md5,a97047e12b0ea3f46d285629e4053548" - ], - "timestamp": "2023-08-17T12:19:51+0000" - }, - "software_versions": { - "content": [ - "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" - ], - "timestamp": "2023-08-17T12:19:51+0000" - }, - "Parameters: '--nf_core_pipeline rnaseq'": { - "content": [ - { - - } - ], - "timestamp": "2023-08-17T12:19:51+0000" - }, - "fastq": { - "content": [ - "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791", - "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", - "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30", - "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9", - "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6", - "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", - "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2", - "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda", - "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64", - "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83", - "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544", - "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", - "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79", - "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", - "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962", - "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", - "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76", - "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", - "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88", - "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", - "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04", - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98", - [ - "DRX024467_DRR026872.fastq.gz.md5:md5,dacaeba3498fb8f405411a22cdb4b40d", - "DRX026011_DRR028935_1.fastq.gz.md5:md5,a47018c5972ba4c11539d0d6bc25eda9", - "DRX026011_DRR028935_2.fastq.gz.md5:md5,f477bbef548fbed665734ebf084eea2f", - "ERX1188904_ERR1109373_1.fastq.gz.md5:md5,50c1c3108631dc32a3151b67e0260d86", - "ERX1188904_ERR1109373_2.fastq.gz.md5:md5,1f22463d410e91a288c83d43654b2499", - "ERX1234253_ERR1160846.fastq.gz.md5:md5,513a8437ad331fc512b088b3750aa1ff", - "SRX17709227_SRR21711856.fastq.gz.md5:md5,13a38fbef27c3e15867d80887145ae75", - "SRX17709228_SRR21711855.fastq.gz.md5:md5,1e871ddd9e92e1866e0c64d36eb5ec85", - "SRX6725035_SRR9984183.fastq.gz.md5:md5,84f59dbb76c9b5eab7e14d90ced352c4", - "SRX9504942_SRR13055517_1.fastq.gz.md5:md5,a03f7f374dc401047b6f6ccaec3885cc", - "SRX9504942_SRR13055517_2.fastq.gz.md5:md5,facaf207753e977327e7b7df7bb8ace0", - "SRX9504942_SRR13055518_1.fastq.gz.md5:md5,5cf412cd62aadaa4838d9eabb5b44368", - "SRX9504942_SRR13055518_2.fastq.gz.md5:md5,93292b826afc72b23be93df26dd710c8", - "SRX9504942_SRR13055519_1.fastq.gz.md5:md5,f6ad6e2610397147a0a55c651de3992f", - "SRX9504942_SRR13055519_2.fastq.gz.md5:md5,2fe7dd4bcc1e7e61c6f54ef50cf961f3", - "SRX9504942_SRR13055520_1.fastq.gz.md5:md5,ab195b37746a3424a1099d9f8cc58de8", - "SRX9504942_SRR13055520_2.fastq.gz.md5:md5,10c448e23f1f7e7af61ec1204f8fc882", - "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", - "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" - ] - ], - "timestamp": "2023-08-17T12:19:51+0000" - } -} \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test deleted file mode 100644 index 301938c4..00000000 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test +++ /dev/null @@ -1,25 +0,0 @@ -nextflow_pipeline { - - name "Test workflow: sra.nf" - script "main.nf" - tag "workflows" - tag "workflows_sra" - tag "sra_nf_core_pipeline_taxprofiler" - - test("Parameters: --nf_core_pipeline taxprofiler") { - - when { - params { - outdir = "$outputDir" - nf_core_pipeline = "taxprofiler" - } - } - - then { - assertAll( - { assert workflow.success }, - { assert snapshot(process.out).match() } - ) - } - } -} diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap deleted file mode 100644 index 85f3957b..00000000 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap +++ /dev/null @@ -1,88 +0,0 @@ -{ - "metadata": { - "content": [ - "DRR026872.runinfo_ftp.tsv:md5,73606f6a05c45b077809da43ca638b5f", - "DRR028935.runinfo_ftp.tsv:md5,f79eefcea5db346f76f76f87df7f8dd2", - "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", - "ERR1160846.runinfo_ftp.tsv:md5,1b2dc1a64117de20b2164724836da345", - "GSE214215.runinfo_ftp.tsv:md5,23a580c89ee7bf681ca3ffa26aa1837f", - "SRR12848126.runinfo_ftp.tsv:md5,5d1e6bfd3d4077d1e66378c58e44975d", - "SRR13191702.runinfo_ftp.tsv:md5,409e262bb41bb6103315126db4d0dd1d", - "SRR14593545.runinfo_ftp.tsv:md5,62015706ac156693ba3d86ed050cab54", - "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", - "SRR9984183.runinfo_ftp.tsv:md5,53ab34ff3612b0e2c7d60476822787be" - ], - "timestamp": "2023-08-17T12:24:34+0000" - }, - "samplesheet": { - "content": [ - "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565", - "multiqc_config.yml:md5,a97047e12b0ea3f46d285629e4053548" - ], - "timestamp": "2023-08-17T12:24:34+0000" - }, - "software_versions": { - "content": [ - "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" - ], - "timestamp": "2023-08-17T12:24:34+0000" - }, - "Parameters: --nf_core_pipeline taxprofiler": { - "content": [ - { - - } - ], - "timestamp": "2023-08-17T12:24:34+0000" - }, - "fastq": { - "content": [ - "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791", - "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", - "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30", - "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9", - "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6", - "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", - "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2", - "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda", - "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64", - "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83", - "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544", - "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", - "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79", - "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", - "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962", - "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", - "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76", - "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", - "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88", - "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", - "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04", - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98", - [ - "DRX024467_DRR026872.fastq.gz.md5:md5,dacaeba3498fb8f405411a22cdb4b40d", - "DRX026011_DRR028935_1.fastq.gz.md5:md5,a47018c5972ba4c11539d0d6bc25eda9", - "DRX026011_DRR028935_2.fastq.gz.md5:md5,f477bbef548fbed665734ebf084eea2f", - "ERX1188904_ERR1109373_1.fastq.gz.md5:md5,50c1c3108631dc32a3151b67e0260d86", - "ERX1188904_ERR1109373_2.fastq.gz.md5:md5,1f22463d410e91a288c83d43654b2499", - "ERX1234253_ERR1160846.fastq.gz.md5:md5,513a8437ad331fc512b088b3750aa1ff", - "SRX17709227_SRR21711856.fastq.gz.md5:md5,13a38fbef27c3e15867d80887145ae75", - "SRX17709228_SRR21711855.fastq.gz.md5:md5,1e871ddd9e92e1866e0c64d36eb5ec85", - "SRX6725035_SRR9984183.fastq.gz.md5:md5,84f59dbb76c9b5eab7e14d90ced352c4", - "SRX9504942_SRR13055517_1.fastq.gz.md5:md5,a03f7f374dc401047b6f6ccaec3885cc", - "SRX9504942_SRR13055517_2.fastq.gz.md5:md5,facaf207753e977327e7b7df7bb8ace0", - "SRX9504942_SRR13055518_1.fastq.gz.md5:md5,5cf412cd62aadaa4838d9eabb5b44368", - "SRX9504942_SRR13055518_2.fastq.gz.md5:md5,93292b826afc72b23be93df26dd710c8", - "SRX9504942_SRR13055519_1.fastq.gz.md5:md5,f6ad6e2610397147a0a55c651de3992f", - "SRX9504942_SRR13055519_2.fastq.gz.md5:md5,2fe7dd4bcc1e7e61c6f54ef50cf961f3", - "SRX9504942_SRR13055520_1.fastq.gz.md5:md5,ab195b37746a3424a1099d9f8cc58de8", - "SRX9504942_SRR13055520_2.fastq.gz.md5:md5,10c448e23f1f7e7af61ec1204f8fc882", - "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", - "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" - ] - ], - "timestamp": "2023-08-17T12:24:34+0000" - } -} \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test deleted file mode 100644 index 892a7c3a..00000000 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test +++ /dev/null @@ -1,25 +0,0 @@ -nextflow_pipeline { - - name "Test workflow: sra.nf" - script "main.nf" - tag "workflows" - tag "workflows_sra" - tag "sra_nf_core_pipeline_viralrecon" - - test("Parameters: --nf_core_pipeline viralrecon") { - - when { - params { - outdir = "$outputDir" - nf_core_pipeline = "viralrecon" - } - } - - then { - assertAll( - { assert workflow.success }, - { assert snapshot(process.out).match() } - ) - } - } -} diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap deleted file mode 100644 index 13c59b5d..00000000 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap +++ /dev/null @@ -1,88 +0,0 @@ -{ - "metadata": { - "content": [ - "DRR026872.runinfo_ftp.tsv:md5,73606f6a05c45b077809da43ca638b5f", - "DRR028935.runinfo_ftp.tsv:md5,f79eefcea5db346f76f76f87df7f8dd2", - "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", - "ERR1160846.runinfo_ftp.tsv:md5,1b2dc1a64117de20b2164724836da345", - "GSE214215.runinfo_ftp.tsv:md5,23a580c89ee7bf681ca3ffa26aa1837f", - "SRR12848126.runinfo_ftp.tsv:md5,5d1e6bfd3d4077d1e66378c58e44975d", - "SRR13191702.runinfo_ftp.tsv:md5,409e262bb41bb6103315126db4d0dd1d", - "SRR14593545.runinfo_ftp.tsv:md5,62015706ac156693ba3d86ed050cab54", - "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", - "SRR9984183.runinfo_ftp.tsv:md5,53ab34ff3612b0e2c7d60476822787be" - ], - "timestamp": "2023-08-17T12:26:57+0000" - }, - "samplesheet": { - "content": [ - "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565", - "multiqc_config.yml:md5,a97047e12b0ea3f46d285629e4053548" - ], - "timestamp": "2023-08-17T12:26:57+0000" - }, - "Parameters: --nf_core_pipeline viralrecon": { - "content": [ - { - - } - ], - "timestamp": "2023-08-17T12:26:57+0000" - }, - "software_versions": { - "content": [ - "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, CUSTOM_SRATOOLSNCBISETTINGS={sratools=2.11.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_FASTQ_FTP={curl=7.81.0}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" - ], - "timestamp": "2023-08-17T12:26:57+0000" - }, - "fastq": { - "content": [ - "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791", - "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", - "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30", - "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9", - "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6", - "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", - "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2", - "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda", - "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64", - "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83", - "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544", - "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", - "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79", - "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", - "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962", - "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", - "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76", - "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", - "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88", - "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", - "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04", - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98", - [ - "DRX024467_DRR026872.fastq.gz.md5:md5,dacaeba3498fb8f405411a22cdb4b40d", - "DRX026011_DRR028935_1.fastq.gz.md5:md5,a47018c5972ba4c11539d0d6bc25eda9", - "DRX026011_DRR028935_2.fastq.gz.md5:md5,f477bbef548fbed665734ebf084eea2f", - "ERX1188904_ERR1109373_1.fastq.gz.md5:md5,50c1c3108631dc32a3151b67e0260d86", - "ERX1188904_ERR1109373_2.fastq.gz.md5:md5,1f22463d410e91a288c83d43654b2499", - "ERX1234253_ERR1160846.fastq.gz.md5:md5,513a8437ad331fc512b088b3750aa1ff", - "SRX17709227_SRR21711856.fastq.gz.md5:md5,13a38fbef27c3e15867d80887145ae75", - "SRX17709228_SRR21711855.fastq.gz.md5:md5,1e871ddd9e92e1866e0c64d36eb5ec85", - "SRX6725035_SRR9984183.fastq.gz.md5:md5,84f59dbb76c9b5eab7e14d90ced352c4", - "SRX9504942_SRR13055517_1.fastq.gz.md5:md5,a03f7f374dc401047b6f6ccaec3885cc", - "SRX9504942_SRR13055517_2.fastq.gz.md5:md5,facaf207753e977327e7b7df7bb8ace0", - "SRX9504942_SRR13055518_1.fastq.gz.md5:md5,5cf412cd62aadaa4838d9eabb5b44368", - "SRX9504942_SRR13055518_2.fastq.gz.md5:md5,93292b826afc72b23be93df26dd710c8", - "SRX9504942_SRR13055519_1.fastq.gz.md5:md5,f6ad6e2610397147a0a55c651de3992f", - "SRX9504942_SRR13055519_2.fastq.gz.md5:md5,2fe7dd4bcc1e7e61c6f54ef50cf961f3", - "SRX9504942_SRR13055520_1.fastq.gz.md5:md5,ab195b37746a3424a1099d9f8cc58de8", - "SRX9504942_SRR13055520_2.fastq.gz.md5:md5,10c448e23f1f7e7af61ec1204f8fc882", - "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", - "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" - ] - ], - "timestamp": "2023-08-17T12:26:57+0000" - } -} \ No newline at end of file diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test b/workflows/sra/tests/sra_skip_fastq_download.nf.test deleted file mode 100644 index 7d218cf7..00000000 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test +++ /dev/null @@ -1,25 +0,0 @@ -nextflow_pipeline { - - name "Test workflow: sra.nf" - script "main.nf" - tag "workflows" - tag "workflows_sra" - tag "sra_skip_fastq_download" - - test("Parameters: --skip_fastq_download") { - - when { - params { - outdir = "$outputDir" - skip_fastq_download = true - } - } - - then { - assertAll( - { assert workflow.success }, - { assert snapshot(process.out).match() } - ) - } - } -} diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap b/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap deleted file mode 100644 index d004d5d2..00000000 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap +++ /dev/null @@ -1,46 +0,0 @@ -{ - "Parameters: '--skip_fastq_download'": { - "content": [ - { - - } - ], - "timestamp": "2023-08-17T12:25:19+0000" - }, - "metadata": { - "content": [ - "DRR026872.runinfo_ftp.tsv:md5,73606f6a05c45b077809da43ca638b5f", - "DRR028935.runinfo_ftp.tsv:md5,f79eefcea5db346f76f76f87df7f8dd2", - "ERR1109373.runinfo_ftp.tsv:md5,d1717cb1638950b7af22ec1b976616a4", - "ERR1160846.runinfo_ftp.tsv:md5,1b2dc1a64117de20b2164724836da345", - "GSE214215.runinfo_ftp.tsv:md5,23a580c89ee7bf681ca3ffa26aa1837f", - "SRR12848126.runinfo_ftp.tsv:md5,5d1e6bfd3d4077d1e66378c58e44975d", - "SRR13191702.runinfo_ftp.tsv:md5,409e262bb41bb6103315126db4d0dd1d", - "SRR14593545.runinfo_ftp.tsv:md5,62015706ac156693ba3d86ed050cab54", - "SRR14709033.runinfo_ftp.tsv:md5,975dd9b32bdbd78b5da3cd88a5f705c1", - "SRR9984183.runinfo_ftp.tsv:md5,53ab34ff3612b0e2c7d60476822787be" - ], - "timestamp": "2023-08-17T12:25:19+0000" - }, - "samplesheet": { - "content": [ - "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565", - "multiqc_config.yml:md5,a97047e12b0ea3f46d285629e4053548" - ], - "timestamp": "2023-08-17T12:25:19+0000" - }, - "software_versions": { - "content": [ - "{CUSTOM_DUMPSOFTWAREVERSIONS={python=3.11.0, yaml=6.0}, MULTIQC_MAPPINGS_CONFIG={python=3.9.5}, SRA_IDS_TO_RUNINFO={python=3.9.5}, SRA_MERGE_SAMPLESHEET={sed=4.7}, SRA_RUNINFO_TO_FTP={python=3.9.5}, Workflow={nf-core/fetchngs=1.10.1}}" - ], - "timestamp": "2023-08-17T12:25:19+0000" - }, - "Parameters: --skip_fastq_download": { - "content": [ - { - - } - ], - "timestamp": "2023-08-17T12:25:19+0000" - } -} \ No newline at end of file diff --git a/workflows/synapse/main.nf b/workflows/synapse.nf similarity index 89% rename from workflows/synapse/main.nf rename to workflows/synapse.nf index f8cbeba1..f2138a60 100644 --- a/workflows/synapse/main.nf +++ b/workflows/synapse.nf @@ -19,11 +19,11 @@ if (params.synapse_config) { ======================================================================================== */ -include { SYNAPSE_LIST } from '../../modules/local/synapse_list' -include { SYNAPSE_SHOW } from '../../modules/local/synapse_show' -include { SYNAPSE_GET } from '../../modules/local/synapse_get' -include { SYNAPSE_TO_SAMPLESHEET } from '../../modules/local/synapse_to_samplesheet' -include { SYNAPSE_MERGE_SAMPLESHEET } from '../../modules/local/synapse_merge_samplesheet' +include { SYNAPSE_LIST } from '../modules/local/synapse_list' +include { SYNAPSE_SHOW } from '../modules/local/synapse_show' +include { SYNAPSE_GET } from '../modules/local/synapse_get' +include { SYNAPSE_TO_SAMPLESHEET } from '../modules/local/synapse_to_samplesheet' +include { SYNAPSE_MERGE_SAMPLESHEET } from '../modules/local/synapse_merge_samplesheet' /* ======================================================================================== @@ -31,7 +31,7 @@ include { SYNAPSE_MERGE_SAMPLESHEET } from '../../modules/local/synapse_merge_sa ======================================================================================== */ -include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../../modules/nf-core/custom/dumpsoftwareversions' +include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/custom/dumpsoftwareversions/main' /* ======================================================================================== diff --git a/workflows/synapse/tests/main.nf.test b/workflows/synapse/tests/main.nf.test deleted file mode 100644 index 7cbfed11..00000000 --- a/workflows/synapse/tests/main.nf.test +++ /dev/null @@ -1,28 +0,0 @@ -nextflow_pipeline { - - name "Test workflow: synapse.nf" - script "main.nf" - tag "workflows" - tag "synapse" - tag "synapse_default" - profile "test_synapse" - - test("Synapse Input Type") { - - when { - params { - outdir = "$outputDir" - } - } - - then { - assertAll( - { assert workflow.success }, - { assert snapshot(path("$outputDir/pipeline_info/software_versions.yml")).match("software_versions") }, - { assert snapshot(path("$outputDir/samplesheet/").list()).match("samplesheet") } - ) - } - - } - -} From e93c45a9f5fa1c16183e924e99ba4e41539bc328 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Thu, 21 Sep 2023 12:31:25 +0200 Subject: [PATCH 447/852] fix nf-core linting --- assets/multiqc_config.yml | 4 ++-- modules.json | 22 ++++++++++++++++------ nextflow.config | 7 ------- nextflow_schema.json | 18 ------------------ 4 files changed, 18 insertions(+), 33 deletions(-) diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index 70cc1fc7..5e3d9889 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -1,7 +1,7 @@ report_comment: > - This report has been generated by the nf-core/fetchngs + This report has been generated by the nf-core/fetchngs analysis pipeline. For information about how to interpret these results, please see the - documentation. + documentation. report_section_order: "nf-core-fetchngs-methods-description": order: -1000 diff --git a/modules.json b/modules.json index 3137b88b..2daacf3a 100644 --- a/modules.json +++ b/modules.json @@ -8,22 +8,30 @@ "custom/dumpsoftwareversions": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "custom/sratoolsncbisettings": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] + "installed_by": [ + "fastq_download_prefetch_fasterqdump_sratools" + ] }, "sratools/fasterqdump": { "branch": "master", "git_sha": "6712754854ae2832abfff3f0800cdb4a6a60bfca", - "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] + "installed_by": [ + "fastq_download_prefetch_fasterqdump_sratools" + ] }, "sratools/prefetch": { "branch": "master", "git_sha": "6712754854ae2832abfff3f0800cdb4a6a60bfca", - "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] + "installed_by": [ + "fastq_download_prefetch_fasterqdump_sratools" + ] } } }, @@ -32,10 +40,12 @@ "fastq_download_prefetch_fasterqdump_sratools": { "branch": "master", "git_sha": "6712754854ae2832abfff3f0800cdb4a6a60bfca", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] } } } } } -} +} \ No newline at end of file diff --git a/nextflow.config b/nextflow.config index 9caf9ff2..2a8e9bcc 100644 --- a/nextflow.config +++ b/nextflow.config @@ -21,13 +21,6 @@ params { skip_fastq_download = false dbgap_key = null - // MultiQC options - multiqc_config = null - multiqc_title = null - multiqc_logo = null - max_multiqc_email_size = '25.MB' - multiqc_methods_description = null - // Boilerplate options outdir = null publish_dir_mode = 'copy' diff --git a/nextflow_schema.json b/nextflow_schema.json index 3816846f..def56011 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -234,24 +234,6 @@ "help_text": "Incoming hook URL for messaging service. Currently, MS Teams and Slack are supported.", "hidden": true }, - "multiqc_config": { - "type": "string", - "format": "file-path", - "description": "Custom config file to supply to MultiQC.", - "fa_icon": "fas fa-cog", - "hidden": true - }, - "multiqc_logo": { - "type": "string", - "description": "Custom logo file to supply to MultiQC. File name must also be set in the MultiQC config file", - "fa_icon": "fas fa-image", - "hidden": true - }, - "multiqc_methods_description": { - "type": "string", - "description": "Custom MultiQC yaml file containing HTML including a methods description.", - "fa_icon": "fas fa-cog" - }, "validate_params": { "type": "boolean", "description": "Boolean whether to validate parameters against the schema at runtime", From 797a15bfc0afad3eb0a9a628b5fb8d588baa6873 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Thu, 21 Sep 2023 14:14:42 +0200 Subject: [PATCH 448/852] syntax fix --- lib/NfcoreTemplate.groovy | 3 +-- main.nf | 2 +- modules.json | 22 ++++++---------------- nextflow_schema.json | 3 ++- workflows/sra.nf | 20 ++++++++++---------- 5 files changed, 20 insertions(+), 30 deletions(-) diff --git a/lib/NfcoreTemplate.groovy b/lib/NfcoreTemplate.groovy index 9276512a..3d513a92 100755 --- a/lib/NfcoreTemplate.groovy +++ b/lib/NfcoreTemplate.groovy @@ -110,8 +110,7 @@ class NfcoreTemplate { def email_html = html_template.toString() // Render the sendmail template - def max_multiqc_email_size = (params.containsKey('max_multiqc_email_size') ? params.max_multiqc_email_size : 0) as nextflow.util.MemoryUnit - def smail_fields = [ email: email_address, subject: subject, email_txt: email_txt, email_html: email_html, projectDir: "$projectDir", mqcFile: mqc_report, mqcMaxSize: max_multiqc_email_size.toBytes() ] + def smail_fields = [ email: email_address, subject: subject, email_txt: email_txt, email_html: email_html, projectDir: "$projectDir" ] def sf = new File("$projectDir/assets/sendmail_template.txt") def sendmail_template = engine.createTemplate(sf).make(smail_fields) def sendmail_html = sendmail_template.toString() diff --git a/main.nf b/main.nf index 1d849bd3..b600e82f 100644 --- a/main.nf +++ b/main.nf @@ -23,7 +23,7 @@ include { validateParameters; paramsHelp } from 'plugin/nf-validation' if (params.help) { def logo = NfcoreTemplate.logo(workflow, params.monochrome_logs) def citation = '\n' + WorkflowMain.citation(workflow) + '\n' - def String command = "nextflow run ${workflow.manifest.name} --input samplesheet.csv --genome GRCh37 -profile docker" + def String command = "nextflow run ${workflow.manifest.name} --input id.csv -profile docker" log.info logo + paramsHelp(command) + citation + NfcoreTemplate.dashedLine(params.monochrome_logs) System.exit(0) } diff --git a/modules.json b/modules.json index 2daacf3a..3137b88b 100644 --- a/modules.json +++ b/modules.json @@ -8,30 +8,22 @@ "custom/dumpsoftwareversions": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "custom/sratoolsncbisettings": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "fastq_download_prefetch_fasterqdump_sratools" - ] + "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] }, "sratools/fasterqdump": { "branch": "master", "git_sha": "6712754854ae2832abfff3f0800cdb4a6a60bfca", - "installed_by": [ - "fastq_download_prefetch_fasterqdump_sratools" - ] + "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] }, "sratools/prefetch": { "branch": "master", "git_sha": "6712754854ae2832abfff3f0800cdb4a6a60bfca", - "installed_by": [ - "fastq_download_prefetch_fasterqdump_sratools" - ] + "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] } } }, @@ -40,12 +32,10 @@ "fastq_download_prefetch_fasterqdump_sratools": { "branch": "master", "git_sha": "6712754854ae2832abfff3f0800cdb4a6a60bfca", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] } } } } } -} \ No newline at end of file +} diff --git a/nextflow_schema.json b/nextflow_schema.json index def56011..cda974a5 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -69,7 +69,8 @@ "type": "string", "fa_icon": "fas fa-address-card", "help_text": "Path to a JWT cart file used to access protected dbGAP data on SRA using the sra-toolkit. Users with granted access to controlled data can download the JWT cart file for the study from the SRA Run Selector upon logging in. The JWT file can only be used on cloud platforms and is valid for 1 hour upon creation.", - "format": "file-path" + "format": "file-path", + "description": "dbGaP repository key." }, "outdir": { "type": "string", diff --git a/workflows/sra.nf b/workflows/sra.nf index 44ff8346..3a4809b6 100644 --- a/workflows/sra.nf +++ b/workflows/sra.nf @@ -4,14 +4,14 @@ ======================================================================================== */ -def valid_params = [ - ena_metadata_fields : ['run_accession', 'experiment_accession', 'library_layout', 'fastq_ftp', 'fastq_md5'] -] +include { paramsSummaryLog; paramsSummaryMap; fromSamplesheet } from 'plugin/nf-validation' -def summary_params = NfcoreSchema.paramsSummaryMap(workflow, params) +def logo = NfcoreTemplate.logo(workflow, params.monochrome_logs) +def citation = '\n' + WorkflowMain.citation(workflow) + '\n' +def summary_params = paramsSummaryMap(workflow) -// Validate input parameters -WorkflowSra.initialise(params, valid_params) +// Print parameter summary log to screen +log.info logo + paramsSummaryLog(workflow) + citation /* ======================================================================================== @@ -84,9 +84,9 @@ workflow SRA { if (!params.skip_fastq_download) { ch_sra_metadata - .map { - meta -> - [ meta, [ meta.fastq_1, meta.fastq_2 ] ] + .map { + meta -> + [ meta, [ meta.fastq_1, meta.fastq_2 ] ] } .branch { ftp: it[0].fastq_1 && !params.force_sratools_download @@ -115,7 +115,7 @@ workflow SRA { .out .fastq .mix(FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS.out.reads) - .map { + .map { meta, fastq -> def reads = fastq instanceof List ? fastq.flatten() : [ fastq ] def meta_clone = meta.clone() From 71f6c3ceddbe6f612d62ed01f9f90b53254103b2 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Thu, 21 Sep 2023 14:33:05 +0200 Subject: [PATCH 449/852] update module --- modules.json | 2 +- modules/nf-core/custom/dumpsoftwareversions/main.nf | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules.json b/modules.json index 3137b88b..ab610dfb 100644 --- a/modules.json +++ b/modules.json @@ -7,7 +7,7 @@ "nf-core": { "custom/dumpsoftwareversions": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "git_sha": "05c280924b6c768d484c7c443dad5e605c4ff4b4", "installed_by": ["modules"] }, "custom/sratoolsncbisettings": { diff --git a/modules/nf-core/custom/dumpsoftwareversions/main.nf b/modules/nf-core/custom/dumpsoftwareversions/main.nf index ebc87273..c9d014b1 100644 --- a/modules/nf-core/custom/dumpsoftwareversions/main.nf +++ b/modules/nf-core/custom/dumpsoftwareversions/main.nf @@ -2,10 +2,10 @@ process CUSTOM_DUMPSOFTWAREVERSIONS { label 'process_single' // Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container - conda "bioconda::multiqc=1.14" + conda "bioconda::multiqc=1.15" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.14--pyhdfd78af_0' : - 'biocontainers/multiqc:1.14--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.15--pyhdfd78af_0' : + 'biocontainers/multiqc:1.15--pyhdfd78af_0' }" input: path versions From 52517c6cfa8e4cca0d87650e7abeb6884438b43f Mon Sep 17 00:00:00 2001 From: maxulysse Date: Thu, 21 Sep 2023 14:33:24 +0200 Subject: [PATCH 450/852] fix issue --- nextflow_schema.json | 1 - workflows/sra.nf | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index cda974a5..345601b7 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -18,7 +18,6 @@ "exists": true, "mimetype": "text/csv", "pattern": "^\\S+\\.(csv|tsv|txt)$", - "schema": "assets/schema_input.json", "fa_icon": "fas fa-file-excel", "description": "File containing SRA/ENA/GEO/DDBJ identifiers one per line to download their associated metadata and FastQ files." }, diff --git a/workflows/sra.nf b/workflows/sra.nf index 3a4809b6..8d396ca1 100644 --- a/workflows/sra.nf +++ b/workflows/sra.nf @@ -4,7 +4,7 @@ ======================================================================================== */ -include { paramsSummaryLog; paramsSummaryMap; fromSamplesheet } from 'plugin/nf-validation' +include { paramsSummaryLog; paramsSummaryMap } from 'plugin/nf-validation' def logo = NfcoreTemplate.logo(workflow, params.monochrome_logs) def citation = '\n' + WorkflowMain.citation(workflow) + '\n' From f51446845daaee19d9489f8a6f24191fc6b3ce2d Mon Sep 17 00:00:00 2001 From: maxulysse Date: Thu, 21 Sep 2023 15:03:45 +0200 Subject: [PATCH 451/852] fix nf-validation issue --- assets/schema_input.json | 12 +++++++----- nextflow_schema.json | 1 + 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/assets/schema_input.json b/assets/schema_input.json index 9a800216..13044b1b 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -5,11 +5,13 @@ "description": "Schema for the file provided with params.input", "type": "array", "items": { - "type": "array", - "items": { - "type": "string", - "pattern": "^(((SR|ER|DR)[APRSX])|(SAM(N|EA|D))|(PRJ(NA|EB|DB))|(GS[EM])|(syn))(\\d+)$", - "errorMessage": "Please provide a valid SRA, ENA, DDBJ or GEO identifier" + "type": "object", + "properties": { + "": { + "type": "string", + "pattern": "^(((SR|ER|DR)[APRSX])|(SAM(N|EA|D))|(PRJ(NA|EB|DB))|(GS[EM])|(syn))(\\d+)$", + "errorMessage": "Please provide a valid SRA, ENA, DDBJ or GEO identifier" + } } } } diff --git a/nextflow_schema.json b/nextflow_schema.json index 345601b7..cda974a5 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -18,6 +18,7 @@ "exists": true, "mimetype": "text/csv", "pattern": "^\\S+\\.(csv|tsv|txt)$", + "schema": "assets/schema_input.json", "fa_icon": "fas fa-file-excel", "description": "File containing SRA/ENA/GEO/DDBJ identifiers one per line to download their associated metadata and FastQ files." }, From c3ed8e4439b8c65794aa397d820ce9becf507fd8 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Thu, 21 Sep 2023 15:08:34 +0200 Subject: [PATCH 452/852] it's actually an id --- assets/schema_input.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/schema_input.json b/assets/schema_input.json index 13044b1b..d451f9e9 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -7,7 +7,7 @@ "items": { "type": "object", "properties": { - "": { + "id": { "type": "string", "pattern": "^(((SR|ER|DR)[APRSX])|(SAM(N|EA|D))|(PRJ(NA|EB|DB))|(GS[EM])|(syn))(\\d+)$", "errorMessage": "Please provide a valid SRA, ENA, DDBJ or GEO identifier" From 131788e37a7519a7fc35efa9b6fbd9d1ff919def Mon Sep 17 00:00:00 2001 From: maxulysse Date: Thu, 21 Sep 2023 17:36:54 +0200 Subject: [PATCH 453/852] restore nf-test tests for sra workflow --- .../sra_custom_ena_metadata_fields.nf.test | 33 + ...ra_custom_ena_metadata_fields.nf.test.snap | 573 +++++++ .../sra/tests/sra_default_parameters.nf.test | 30 + .../tests/sra_default_parameters.nf.test.snap | 1353 +++++++++++++++++ .../tests/sra_force_sratools_download.nf.test | 31 + .../sra_force_sratools_download.nf.test.snap | 1351 ++++++++++++++++ .../sra_nf_core_pipeline_atacseq.nf.test | 31 + .../sra_nf_core_pipeline_atacseq.nf.test.snap | 1353 +++++++++++++++++ .../tests/sra_nf_core_pipeline_rnaseq.nf.test | 31 + .../sra_nf_core_pipeline_rnaseq.nf.test.snap | 1353 +++++++++++++++++ .../sra_nf_core_pipeline_taxprofiler.nf.test | 31 + ..._nf_core_pipeline_taxprofiler.nf.test.snap | 1353 +++++++++++++++++ .../sra_nf_core_pipeline_viralrecon.nf.test | 31 + ...a_nf_core_pipeline_viralrecon.nf.test.snap | 1353 +++++++++++++++++ .../sra/tests/sra_skip_fastq_download.nf.test | 31 + .../sra_skip_fastq_download.nf.test.snap | 37 + 16 files changed, 8975 insertions(+) create mode 100644 workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test create mode 100644 workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap create mode 100644 workflows/sra/tests/sra_default_parameters.nf.test create mode 100644 workflows/sra/tests/sra_default_parameters.nf.test.snap create mode 100644 workflows/sra/tests/sra_force_sratools_download.nf.test create mode 100644 workflows/sra/tests/sra_force_sratools_download.nf.test.snap create mode 100644 workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test create mode 100644 workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap create mode 100644 workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test create mode 100644 workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap create mode 100644 workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test create mode 100644 workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap create mode 100644 workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test create mode 100644 workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap create mode 100644 workflows/sra/tests/sra_skip_fastq_download.nf.test create mode 100644 workflows/sra/tests/sra_skip_fastq_download.nf.test.snap diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test new file mode 100644 index 00000000..45280ab0 --- /dev/null +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test @@ -0,0 +1,33 @@ +nextflow_workflow { + + name "Test workflow: sra/main.nf" + script "workflows/sra/main.nf" + workflow "SRA" + tag "workflows" + tag "workflows_sra" + tag "sra_custom_ena_metadata_fields" + + test("Parameters: --nf_core_pipeline rnaseq --ena_metadata_fields ... --sample_mapping_fields ...") { + + when { + workflow { + """ + input[0] = Channel.from('DRR026872','DRR028935','ERR1109373','ERR1160846','GSE214215','GSM4907283','SRR12848126','SRR13191702','SRR14593545','SRR14709033','SRR9984183') + """ + } + params { + outdir = "results" + nf_core_pipeline = "rnaseq" + ena_metadata_fields = "run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5" + sample_mapping_fields = "run_accession,library_layout" + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match() } + ) + } + } +} diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap new file mode 100644 index 00000000..a2537a95 --- /dev/null +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap @@ -0,0 +1,573 @@ +{ + "Parameters: --nf_core_pipeline rnaseq --ena_metadata_fields ... --sample_mapping_fields ...": { + "content": [ + { + "0": [ + [ + { + "id": "DRX024467_DRR026872", + "run_accession": "DRR026872", + "experiment_accession": "DRX024467", + "library_layout": "SINGLE", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_md5": "515e5448c55e054113c4a22df5f62791", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_2": "", + "md5_1": "515e5448c55e054113c4a22df5f62791", + "md5_2": "", + "single_end": true + }, + "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" + ], + [ + { + "id": "DRX026011_DRR028935", + "run_accession": "DRR028935", + "experiment_accession": "DRX026011", + "library_layout": "PAIRED", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "md5_1": "cc01df82a9354bb6b3be93483b20c35a", + "md5_2": "941c9998d746416dad53c94c480ddf30", + "single_end": false + }, + [ + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" + ] + ], + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "library_layout": "PAIRED", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, + [ + "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" + ] + ], + [ + { + "id": "ERX1234253_ERR1160846", + "run_accession": "ERR1160846", + "experiment_accession": "ERX1234253", + "library_layout": "SINGLE", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_2": "", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "single_end": true + }, + "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" + ], + [ + { + "id": "SRX10940790_SRR14593545", + "run_accession": "SRR14593545", + "experiment_accession": "SRX10940790", + "library_layout": "PAIRED", + "fastq_ftp": "", + "fastq_md5": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" + ] + ], + [ + { + "id": "SRX11047067_SRR14709033", + "run_accession": "SRR14709033", + "experiment_accession": "SRX11047067", + "library_layout": "SINGLE", + "fastq_ftp": "", + "fastq_md5": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": true + }, + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" + ], + [ + { + "id": "SRX17709227_SRR21711856", + "run_accession": "SRR21711856", + "experiment_accession": "SRX17709227", + "library_layout": "SINGLE", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_2": "", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "single_end": true + }, + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" + ], + [ + { + "id": "SRX17709228_SRR21711855", + "run_accession": "SRR21711855", + "experiment_accession": "SRX17709228", + "library_layout": "SINGLE", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_2": "", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "single_end": true + }, + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" + ], + [ + { + "id": "SRX6725035_SRR9984183", + "run_accession": "SRR9984183", + "experiment_accession": "SRX6725035", + "library_layout": "SINGLE", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_md5": "0b512d2dc31685983456bd56fd836544", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_2": "", + "md5_1": "0b512d2dc31685983456bd56fd836544", + "md5_2": "", + "single_end": true + }, + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" + ], + [ + { + "id": "SRX9315476_SRR12848126", + "run_accession": "SRR12848126", + "experiment_accession": "SRX9315476", + "library_layout": "PAIRED", + "fastq_ftp": "", + "fastq_md5": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" + ] + ], + [ + { + "id": "SRX9504942_SRR13055517", + "run_accession": "SRR13055517", + "experiment_accession": "SRX9504942", + "library_layout": "PAIRED", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", + "md5_2": "18dbe96e7f58b63406d9058938df1962", + "single_end": false + }, + [ + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" + ] + ], + [ + { + "id": "SRX9504942_SRR13055518", + "run_accession": "SRR13055518", + "experiment_accession": "SRX9504942", + "library_layout": "PAIRED", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "md5_1": "5ec894d863fcefe394470a0925aefde4", + "md5_2": "aead170df9851773d5202b5760c76d76", + "single_end": false + }, + [ + "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" + ] + ], + [ + { + "id": "SRX9504942_SRR13055519", + "run_accession": "SRR13055519", + "experiment_accession": "SRX9504942", + "library_layout": "PAIRED", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", + "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", + "single_end": false + }, + [ + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" + ] + ], + [ + { + "id": "SRX9504942_SRR13055520", + "run_accession": "SRR13055520", + "experiment_accession": "SRX9504942", + "library_layout": "PAIRED", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "md5_1": "795d460abff6009c7f5ff7c14b773fbe", + "md5_2": "c3f34379356b28d6dac7212abc1a0a04", + "single_end": false + }, + [ + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" + ] + ], + [ + { + "id": "SRX9626017_SRR13191702", + "run_accession": "SRR13191702", + "experiment_accession": "SRX9626017", + "library_layout": "PAIRED", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98", + "single_end": false + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + ] + ] + ], + "1": [ + "samplesheet.csv:md5,be5465f34924356e136c804d63e1b562" + ], + "2": [ + "id_mappings.csv:md5,8473773df806859c6af7acafcfe5aa6f" + ], + "3": [ + "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + ], + "fastq": [ + [ + { + "id": "DRX024467_DRR026872", + "run_accession": "DRR026872", + "experiment_accession": "DRX024467", + "library_layout": "SINGLE", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_md5": "515e5448c55e054113c4a22df5f62791", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_2": "", + "md5_1": "515e5448c55e054113c4a22df5f62791", + "md5_2": "", + "single_end": true + }, + "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" + ], + [ + { + "id": "DRX026011_DRR028935", + "run_accession": "DRR028935", + "experiment_accession": "DRX026011", + "library_layout": "PAIRED", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "md5_1": "cc01df82a9354bb6b3be93483b20c35a", + "md5_2": "941c9998d746416dad53c94c480ddf30", + "single_end": false + }, + [ + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" + ] + ], + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "library_layout": "PAIRED", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, + [ + "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" + ] + ], + [ + { + "id": "ERX1234253_ERR1160846", + "run_accession": "ERR1160846", + "experiment_accession": "ERX1234253", + "library_layout": "SINGLE", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_2": "", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "single_end": true + }, + "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" + ], + [ + { + "id": "SRX10940790_SRR14593545", + "run_accession": "SRR14593545", + "experiment_accession": "SRX10940790", + "library_layout": "PAIRED", + "fastq_ftp": "", + "fastq_md5": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" + ] + ], + [ + { + "id": "SRX11047067_SRR14709033", + "run_accession": "SRR14709033", + "experiment_accession": "SRX11047067", + "library_layout": "SINGLE", + "fastq_ftp": "", + "fastq_md5": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": true + }, + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" + ], + [ + { + "id": "SRX17709227_SRR21711856", + "run_accession": "SRR21711856", + "experiment_accession": "SRX17709227", + "library_layout": "SINGLE", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_2": "", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "single_end": true + }, + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" + ], + [ + { + "id": "SRX17709228_SRR21711855", + "run_accession": "SRR21711855", + "experiment_accession": "SRX17709228", + "library_layout": "SINGLE", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_2": "", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "single_end": true + }, + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" + ], + [ + { + "id": "SRX6725035_SRR9984183", + "run_accession": "SRR9984183", + "experiment_accession": "SRX6725035", + "library_layout": "SINGLE", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_md5": "0b512d2dc31685983456bd56fd836544", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_2": "", + "md5_1": "0b512d2dc31685983456bd56fd836544", + "md5_2": "", + "single_end": true + }, + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" + ], + [ + { + "id": "SRX9315476_SRR12848126", + "run_accession": "SRR12848126", + "experiment_accession": "SRX9315476", + "library_layout": "PAIRED", + "fastq_ftp": "", + "fastq_md5": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" + ] + ], + [ + { + "id": "SRX9504942_SRR13055517", + "run_accession": "SRR13055517", + "experiment_accession": "SRX9504942", + "library_layout": "PAIRED", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", + "md5_2": "18dbe96e7f58b63406d9058938df1962", + "single_end": false + }, + [ + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" + ] + ], + [ + { + "id": "SRX9504942_SRR13055518", + "run_accession": "SRR13055518", + "experiment_accession": "SRX9504942", + "library_layout": "PAIRED", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "md5_1": "5ec894d863fcefe394470a0925aefde4", + "md5_2": "aead170df9851773d5202b5760c76d76", + "single_end": false + }, + [ + "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" + ] + ], + [ + { + "id": "SRX9504942_SRR13055519", + "run_accession": "SRR13055519", + "experiment_accession": "SRX9504942", + "library_layout": "PAIRED", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", + "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", + "single_end": false + }, + [ + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" + ] + ], + [ + { + "id": "SRX9504942_SRR13055520", + "run_accession": "SRR13055520", + "experiment_accession": "SRX9504942", + "library_layout": "PAIRED", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "md5_1": "795d460abff6009c7f5ff7c14b773fbe", + "md5_2": "c3f34379356b28d6dac7212abc1a0a04", + "single_end": false + }, + [ + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" + ] + ], + [ + { + "id": "SRX9626017_SRR13191702", + "run_accession": "SRR13191702", + "experiment_accession": "SRX9626017", + "library_layout": "PAIRED", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98", + "single_end": false + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + ] + ] + ], + "mappings": [ + "id_mappings.csv:md5,8473773df806859c6af7acafcfe5aa6f" + ], + "samplesheet": [ + "samplesheet.csv:md5,be5465f34924356e136c804d63e1b562" + ], + "versions": [ + "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + ] + } + ], + "timestamp": "2023-09-11T18:48:18.757655" + } +} \ No newline at end of file diff --git a/workflows/sra/tests/sra_default_parameters.nf.test b/workflows/sra/tests/sra_default_parameters.nf.test new file mode 100644 index 00000000..ef35c80a --- /dev/null +++ b/workflows/sra/tests/sra_default_parameters.nf.test @@ -0,0 +1,30 @@ +nextflow_workflow { + + name "Test workflow: sra/main.nf" + script "workflows/sra/main.nf" + workflow "SRA" + tag "workflows" + tag "workflows_sra" + tag "sra_default_parameters" + + test("Parameters: default") { + + when { + workflow { + """ + input[0] = Channel.from('DRR026872','DRR028935','ERR1109373','ERR1160846','GSE214215','GSM4907283','SRR12848126','SRR13191702','SRR14593545','SRR14709033','SRR9984183') + """ + } + params { + outdir = "results" + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match() } + ) + } + } +} diff --git a/workflows/sra/tests/sra_default_parameters.nf.test.snap b/workflows/sra/tests/sra_default_parameters.nf.test.snap new file mode 100644 index 00000000..b8dc88ca --- /dev/null +++ b/workflows/sra/tests/sra_default_parameters.nf.test.snap @@ -0,0 +1,1353 @@ +{ + "Parameters: default": { + "content": [ + { + "0": [ + [ + { + "id": "DRX024467_DRR026872", + "run_accession": "DRR026872", + "experiment_accession": "DRX024467", + "sample_accession": "SAMD00023098", + "secondary_sample_accession": "DRS033740", + "study_accession": "PRJDB4356", + "secondary_study_accession": "DRP003256", + "submission_accession": "DRA002758", + "run_alias": "DRR026872", + "experiment_alias": "DRX024467", + "sample_alias": "SAMD00023098", + "study_alias": "DRP003256", + "library_layout": "SINGLE", + "library_selection": "Restriction Digest", + "library_source": "GENOMIC", + "library_strategy": "OTHER", + "library_name": "IpeRAD1_3", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "62550", + "read_count": "417", + "tax_id": "35883", + "scientific_name": "Ipomoea nil", + "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", + "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", + "study_title": "The Japanese morning glory genome sequence", + "sample_description": "Keywords: GSC:MIxS MIGS:6.0", + "fastq_md5": "515e5448c55e054113c4a22df5f62791", + "fastq_bytes": "38447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_2": "", + "md5_1": "515e5448c55e054113c4a22df5f62791", + "md5_2": "", + "single_end": true + }, + "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" + ], + [ + { + "id": "DRX026011_DRR028935", + "run_accession": "DRR028935", + "experiment_accession": "DRX026011", + "sample_accession": "SAMD00024405", + "secondary_sample_accession": "DRS019431", + "study_accession": "PRJDB3420", + "secondary_study_accession": "DRP002616", + "submission_accession": "DRA002949", + "run_alias": "DRR028935", + "experiment_alias": "DRX026011", + "sample_alias": "SAMD00024405", + "study_alias": "DRP002616", + "library_layout": "PAIRED", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "day0_BbSQE-I", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "194930", + "read_count": "965", + "tax_id": "1202541", + "scientific_name": "Botryococcus braunii Showa", + "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", + "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", + "sample_description": "Liquid culture", + "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", + "fastq_bytes": "60275;61610", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "md5_1": "cc01df82a9354bb6b3be93483b20c35a", + "md5_2": "941c9998d746416dad53c94c480ddf30", + "single_end": false + }, + [ + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" + ] + ], + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "sample_accession": "SAMEA3643867", + "secondary_sample_accession": "ERS951016", + "study_accession": "PRJEB11633", + "secondary_study_accession": "ERP013030", + "submission_accession": "ERA528939", + "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", + "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", + "sample_alias": "sample_56", + "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", + "library_layout": "PAIRED", + "library_selection": "RT-PCR", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "unspecified", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "29700", + "read_count": "169", + "tax_id": "63433", + "scientific_name": "Leptopilina boulardi", + "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing", + "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", + "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_bytes": "3221;8151;8118", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, + [ + "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" + ] + ], + [ + { + "id": "ERX1234253_ERR1160846", + "run_accession": "ERR1160846", + "experiment_accession": "ERX1234253", + "sample_accession": "SAMEA3687214", + "secondary_sample_accession": "ERS994363", + "study_accession": "PRJEB11419", + "secondary_study_accession": "ERP012803", + "submission_accession": "ERA541392", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "study_alias": "qiita_sid_10317", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "10317.BLANK.93.3E.r22", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "35658", + "read_count": "283", + "tax_id": "256318", + "scientific_name": "metagenome", + "sample_title": "10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "study_title": "American Gut Project", + "sample_description": "American Gut control", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_2": "", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "single_end": true + }, + "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" + ], + [ + { + "id": "SRX10940790_SRR14593545", + "run_accession": "SRR14593545", + "experiment_accession": "SRX10940790", + "sample_accession": "SAMN19097423", + "secondary_sample_accession": "SRS9020442", + "study_accession": "PRJNA728650", + "secondary_study_accession": "SRP319413", + "submission_accession": "SRA1234280", + "run_alias": "577-6_530058_19-037147 Goat_F.ab1", + "experiment_alias": "PRNP_2765", + "sample_alias": "prp_2765", + "study_alias": "PRJNA728650", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "PRNP_2765", + "instrument_model": "AB 3500xL Genetic Analyzer", + "instrument_platform": "CAPILLARY", + "base_count": "828", + "read_count": "1", + "tax_id": "9925", + "scientific_name": "Capra hircus", + "sample_title": "MIGS Eukaryotic sample from Capra hircus", + "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", + "study_title": "Capra hircus Raw sequence reads", + "sample_description": "Keywords: GSC:MIxS MIGS:5.0", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" + ] + ], + [ + { + "id": "SRX11047067_SRR14709033", + "run_accession": "SRR14709033", + "experiment_accession": "SRX11047067", + "sample_accession": "SAMN19373034", + "secondary_sample_accession": "SRS9115923", + "study_accession": "PRJNA733285", + "secondary_study_accession": "SRP322267", + "submission_accession": "SRA1239521", + "run_alias": "Sebastes_levis-2.fastq", + "experiment_alias": "Sebastes_macdonaldi-1", + "sample_alias": "S._macdonaldi-1", + "study_alias": "PRJNA733285", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "Sebastes_macdonaldi-1", + "instrument_model": "AB 5500 Genetic Analyzer", + "instrument_platform": "ABI_SOLID", + "base_count": "153", + "read_count": "1", + "tax_id": "394693", + "scientific_name": "Sebastes macdonaldi", + "sample_title": "Sebastes_macdonaldi-1", + "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", + "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", + "sample_description": "Sebastes_macdonaldi-1", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": true + }, + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" + ], + [ + { + "id": "SRX17709227_SRR21711856", + "run_accession": "SRR21711856", + "experiment_accession": "SRX17709227", + "sample_accession": "SAMN31021823", + "secondary_sample_accession": "SRS15239723", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601460_r1", + "experiment_alias": "GSM6601460_r1", + "sample_alias": "GSM6601460", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601460", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "573417800", + "read_count": "11468356", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "sham-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "sham-treated worms in day 5", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_2": "", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "single_end": true + }, + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" + ], + [ + { + "id": "SRX17709228_SRR21711855", + "run_accession": "SRR21711855", + "experiment_accession": "SRX17709228", + "sample_accession": "SAMN31021822", + "secondary_sample_accession": "SRS15239724", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601461_r1", + "experiment_alias": "GSM6601461_r1", + "sample_alias": "GSM6601461", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601461", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "677912850", + "read_count": "13558257", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "PM2.5-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "PM2.5-treated worms in day 5", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_2": "", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "single_end": true + }, + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" + ], + [ + { + "id": "SRX6725035_SRR9984183", + "run_accession": "SRR9984183", + "experiment_accession": "SRX6725035", + "sample_accession": "SAMN12581720", + "secondary_sample_accession": "SRS5277011", + "study_accession": "PRJNA560329", + "secondary_study_accession": "SRP218535", + "submission_accession": "SRA942061", + "run_alias": "Emb289P1_bin131.fastq", + "experiment_alias": "Emb289P1_bin131", + "sample_alias": "Emb289P1_bin131", + "study_alias": "PRJNA560329", + "library_layout": "SINGLE", + "library_selection": "RANDOM", + "library_source": "METAGENOMIC", + "library_strategy": "WGS", + "library_name": "Emb289P1_bin131", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "1996273", + "read_count": "58", + "tax_id": "2660712", + "scientific_name": "Defluviitaleaceae bacterium", + "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", + "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", + "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", + "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", + "fastq_md5": "0b512d2dc31685983456bd56fd836544", + "fastq_bytes": "605358", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_2": "", + "md5_1": "0b512d2dc31685983456bd56fd836544", + "md5_2": "", + "single_end": true + }, + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" + ], + [ + { + "id": "SRX9315476_SRR12848126", + "run_accession": "SRR12848126", + "experiment_accession": "SRX9315476", + "sample_accession": "SAMN16455283", + "secondary_sample_accession": "SRS7540262", + "study_accession": "PRJNA670070", + "secondary_study_accession": "SRP287769", + "submission_accession": "SRA1145417", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "experiment_alias": "F11-N1-05", + "sample_alias": "F11-N1-05", + "study_alias": "PRJNA670070", + "library_layout": "PAIRED", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "library_name": "F11-N1-05", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "base_count": "431758", + "read_count": "2954", + "tax_id": "10092", + "scientific_name": "Mus musculus domesticus", + "sample_title": "Longshanks_F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "sample_description": "F11-N1-05", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" + ] + ], + [ + { + "id": "SRX9504942_SRR13055517", + "run_accession": "SRR13055517", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r1", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2246028", + "read_count": "29553", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", + "fastq_bytes": "721167;723753", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", + "md5_2": "18dbe96e7f58b63406d9058938df1962", + "single_end": false + }, + [ + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" + ] + ], + [ + { + "id": "SRX9504942_SRR13055518", + "run_accession": "SRR13055518", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r2", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2235236", + "read_count": "29411", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", + "fastq_bytes": "717693;723429", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "md5_1": "5ec894d863fcefe394470a0925aefde4", + "md5_2": "aead170df9851773d5202b5760c76d76", + "single_end": false + }, + [ + "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" + ] + ], + [ + { + "id": "SRX9504942_SRR13055519", + "run_accession": "SRR13055519", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r3", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2232728", + "read_count": "29378", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", + "fastq_bytes": "714907;721705", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", + "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", + "single_end": false + }, + [ + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" + ] + ], + [ + { + "id": "SRX9504942_SRR13055520", + "run_accession": "SRR13055520", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r4", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2214488", + "read_count": "29138", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", + "fastq_bytes": "709867;716862", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "md5_1": "795d460abff6009c7f5ff7c14b773fbe", + "md5_2": "c3f34379356b28d6dac7212abc1a0a04", + "single_end": false + }, + [ + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" + ] + ], + [ + { + "id": "SRX9626017_SRR13191702", + "run_accession": "SRR13191702", + "experiment_accession": "SRX9626017", + "sample_accession": "SAMN16980141", + "secondary_sample_accession": "SRS7827211", + "study_accession": "PRJNA682076", + "secondary_study_accession": "SRP295653", + "submission_accession": "SRA1166126", + "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", + "experiment_alias": "S.170804.00784", + "sample_alias": "S.170804.00784_662", + "study_alias": "PRJNA682076", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "S.170804.00784", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "45682", + "read_count": "91", + "tax_id": "408170", + "scientific_name": "human gut metagenome", + "sample_title": "Metagenome or environmental sample from human gut metagenome", + "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "sample_description": "Metagenome or environmental sample from human gut metagenome", + "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", + "fastq_bytes": "15420;16324", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98", + "single_end": false + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + ] + ] + ], + "1": [ + "samplesheet.csv:md5,4aec9029e063bae998b3fa3dc3481556" + ], + "2": [ + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + ], + "3": [ + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + ], + "fastq": [ + [ + { + "id": "DRX024467_DRR026872", + "run_accession": "DRR026872", + "experiment_accession": "DRX024467", + "sample_accession": "SAMD00023098", + "secondary_sample_accession": "DRS033740", + "study_accession": "PRJDB4356", + "secondary_study_accession": "DRP003256", + "submission_accession": "DRA002758", + "run_alias": "DRR026872", + "experiment_alias": "DRX024467", + "sample_alias": "SAMD00023098", + "study_alias": "DRP003256", + "library_layout": "SINGLE", + "library_selection": "Restriction Digest", + "library_source": "GENOMIC", + "library_strategy": "OTHER", + "library_name": "IpeRAD1_3", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "62550", + "read_count": "417", + "tax_id": "35883", + "scientific_name": "Ipomoea nil", + "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", + "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", + "study_title": "The Japanese morning glory genome sequence", + "sample_description": "Keywords: GSC:MIxS MIGS:6.0", + "fastq_md5": "515e5448c55e054113c4a22df5f62791", + "fastq_bytes": "38447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_2": "", + "md5_1": "515e5448c55e054113c4a22df5f62791", + "md5_2": "", + "single_end": true + }, + "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" + ], + [ + { + "id": "DRX026011_DRR028935", + "run_accession": "DRR028935", + "experiment_accession": "DRX026011", + "sample_accession": "SAMD00024405", + "secondary_sample_accession": "DRS019431", + "study_accession": "PRJDB3420", + "secondary_study_accession": "DRP002616", + "submission_accession": "DRA002949", + "run_alias": "DRR028935", + "experiment_alias": "DRX026011", + "sample_alias": "SAMD00024405", + "study_alias": "DRP002616", + "library_layout": "PAIRED", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "day0_BbSQE-I", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "194930", + "read_count": "965", + "tax_id": "1202541", + "scientific_name": "Botryococcus braunii Showa", + "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", + "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", + "sample_description": "Liquid culture", + "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", + "fastq_bytes": "60275;61610", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "md5_1": "cc01df82a9354bb6b3be93483b20c35a", + "md5_2": "941c9998d746416dad53c94c480ddf30", + "single_end": false + }, + [ + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" + ] + ], + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "sample_accession": "SAMEA3643867", + "secondary_sample_accession": "ERS951016", + "study_accession": "PRJEB11633", + "secondary_study_accession": "ERP013030", + "submission_accession": "ERA528939", + "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", + "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", + "sample_alias": "sample_56", + "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", + "library_layout": "PAIRED", + "library_selection": "RT-PCR", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "unspecified", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "29700", + "read_count": "169", + "tax_id": "63433", + "scientific_name": "Leptopilina boulardi", + "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing", + "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", + "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_bytes": "3221;8151;8118", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, + [ + "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" + ] + ], + [ + { + "id": "ERX1234253_ERR1160846", + "run_accession": "ERR1160846", + "experiment_accession": "ERX1234253", + "sample_accession": "SAMEA3687214", + "secondary_sample_accession": "ERS994363", + "study_accession": "PRJEB11419", + "secondary_study_accession": "ERP012803", + "submission_accession": "ERA541392", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "study_alias": "qiita_sid_10317", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "10317.BLANK.93.3E.r22", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "35658", + "read_count": "283", + "tax_id": "256318", + "scientific_name": "metagenome", + "sample_title": "10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "study_title": "American Gut Project", + "sample_description": "American Gut control", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_2": "", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "single_end": true + }, + "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" + ], + [ + { + "id": "SRX10940790_SRR14593545", + "run_accession": "SRR14593545", + "experiment_accession": "SRX10940790", + "sample_accession": "SAMN19097423", + "secondary_sample_accession": "SRS9020442", + "study_accession": "PRJNA728650", + "secondary_study_accession": "SRP319413", + "submission_accession": "SRA1234280", + "run_alias": "577-6_530058_19-037147 Goat_F.ab1", + "experiment_alias": "PRNP_2765", + "sample_alias": "prp_2765", + "study_alias": "PRJNA728650", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "PRNP_2765", + "instrument_model": "AB 3500xL Genetic Analyzer", + "instrument_platform": "CAPILLARY", + "base_count": "828", + "read_count": "1", + "tax_id": "9925", + "scientific_name": "Capra hircus", + "sample_title": "MIGS Eukaryotic sample from Capra hircus", + "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", + "study_title": "Capra hircus Raw sequence reads", + "sample_description": "Keywords: GSC:MIxS MIGS:5.0", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" + ] + ], + [ + { + "id": "SRX11047067_SRR14709033", + "run_accession": "SRR14709033", + "experiment_accession": "SRX11047067", + "sample_accession": "SAMN19373034", + "secondary_sample_accession": "SRS9115923", + "study_accession": "PRJNA733285", + "secondary_study_accession": "SRP322267", + "submission_accession": "SRA1239521", + "run_alias": "Sebastes_levis-2.fastq", + "experiment_alias": "Sebastes_macdonaldi-1", + "sample_alias": "S._macdonaldi-1", + "study_alias": "PRJNA733285", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "Sebastes_macdonaldi-1", + "instrument_model": "AB 5500 Genetic Analyzer", + "instrument_platform": "ABI_SOLID", + "base_count": "153", + "read_count": "1", + "tax_id": "394693", + "scientific_name": "Sebastes macdonaldi", + "sample_title": "Sebastes_macdonaldi-1", + "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", + "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", + "sample_description": "Sebastes_macdonaldi-1", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": true + }, + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" + ], + [ + { + "id": "SRX17709227_SRR21711856", + "run_accession": "SRR21711856", + "experiment_accession": "SRX17709227", + "sample_accession": "SAMN31021823", + "secondary_sample_accession": "SRS15239723", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601460_r1", + "experiment_alias": "GSM6601460_r1", + "sample_alias": "GSM6601460", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601460", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "573417800", + "read_count": "11468356", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "sham-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "sham-treated worms in day 5", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_2": "", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "single_end": true + }, + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" + ], + [ + { + "id": "SRX17709228_SRR21711855", + "run_accession": "SRR21711855", + "experiment_accession": "SRX17709228", + "sample_accession": "SAMN31021822", + "secondary_sample_accession": "SRS15239724", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601461_r1", + "experiment_alias": "GSM6601461_r1", + "sample_alias": "GSM6601461", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601461", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "677912850", + "read_count": "13558257", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "PM2.5-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "PM2.5-treated worms in day 5", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_2": "", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "single_end": true + }, + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" + ], + [ + { + "id": "SRX6725035_SRR9984183", + "run_accession": "SRR9984183", + "experiment_accession": "SRX6725035", + "sample_accession": "SAMN12581720", + "secondary_sample_accession": "SRS5277011", + "study_accession": "PRJNA560329", + "secondary_study_accession": "SRP218535", + "submission_accession": "SRA942061", + "run_alias": "Emb289P1_bin131.fastq", + "experiment_alias": "Emb289P1_bin131", + "sample_alias": "Emb289P1_bin131", + "study_alias": "PRJNA560329", + "library_layout": "SINGLE", + "library_selection": "RANDOM", + "library_source": "METAGENOMIC", + "library_strategy": "WGS", + "library_name": "Emb289P1_bin131", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "1996273", + "read_count": "58", + "tax_id": "2660712", + "scientific_name": "Defluviitaleaceae bacterium", + "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", + "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", + "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", + "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", + "fastq_md5": "0b512d2dc31685983456bd56fd836544", + "fastq_bytes": "605358", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_2": "", + "md5_1": "0b512d2dc31685983456bd56fd836544", + "md5_2": "", + "single_end": true + }, + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" + ], + [ + { + "id": "SRX9315476_SRR12848126", + "run_accession": "SRR12848126", + "experiment_accession": "SRX9315476", + "sample_accession": "SAMN16455283", + "secondary_sample_accession": "SRS7540262", + "study_accession": "PRJNA670070", + "secondary_study_accession": "SRP287769", + "submission_accession": "SRA1145417", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "experiment_alias": "F11-N1-05", + "sample_alias": "F11-N1-05", + "study_alias": "PRJNA670070", + "library_layout": "PAIRED", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "library_name": "F11-N1-05", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "base_count": "431758", + "read_count": "2954", + "tax_id": "10092", + "scientific_name": "Mus musculus domesticus", + "sample_title": "Longshanks_F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "sample_description": "F11-N1-05", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" + ] + ], + [ + { + "id": "SRX9504942_SRR13055517", + "run_accession": "SRR13055517", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r1", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2246028", + "read_count": "29553", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", + "fastq_bytes": "721167;723753", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", + "md5_2": "18dbe96e7f58b63406d9058938df1962", + "single_end": false + }, + [ + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" + ] + ], + [ + { + "id": "SRX9504942_SRR13055518", + "run_accession": "SRR13055518", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r2", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2235236", + "read_count": "29411", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", + "fastq_bytes": "717693;723429", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "md5_1": "5ec894d863fcefe394470a0925aefde4", + "md5_2": "aead170df9851773d5202b5760c76d76", + "single_end": false + }, + [ + "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" + ] + ], + [ + { + "id": "SRX9504942_SRR13055519", + "run_accession": "SRR13055519", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r3", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2232728", + "read_count": "29378", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", + "fastq_bytes": "714907;721705", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", + "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", + "single_end": false + }, + [ + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" + ] + ], + [ + { + "id": "SRX9504942_SRR13055520", + "run_accession": "SRR13055520", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r4", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2214488", + "read_count": "29138", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", + "fastq_bytes": "709867;716862", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "md5_1": "795d460abff6009c7f5ff7c14b773fbe", + "md5_2": "c3f34379356b28d6dac7212abc1a0a04", + "single_end": false + }, + [ + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" + ] + ], + [ + { + "id": "SRX9626017_SRR13191702", + "run_accession": "SRR13191702", + "experiment_accession": "SRX9626017", + "sample_accession": "SAMN16980141", + "secondary_sample_accession": "SRS7827211", + "study_accession": "PRJNA682076", + "secondary_study_accession": "SRP295653", + "submission_accession": "SRA1166126", + "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", + "experiment_alias": "S.170804.00784", + "sample_alias": "S.170804.00784_662", + "study_alias": "PRJNA682076", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "S.170804.00784", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "45682", + "read_count": "91", + "tax_id": "408170", + "scientific_name": "human gut metagenome", + "sample_title": "Metagenome or environmental sample from human gut metagenome", + "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "sample_description": "Metagenome or environmental sample from human gut metagenome", + "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", + "fastq_bytes": "15420;16324", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98", + "single_end": false + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + ] + ] + ], + "mappings": [ + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + ], + "samplesheet": [ + "samplesheet.csv:md5,4aec9029e063bae998b3fa3dc3481556" + ], + "versions": [ + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + ] + } + ], + "timestamp": "2023-09-11T18:56:05.693225" + } +} \ No newline at end of file diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test b/workflows/sra/tests/sra_force_sratools_download.nf.test new file mode 100644 index 00000000..76ce7cd3 --- /dev/null +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test @@ -0,0 +1,31 @@ +nextflow_workflow { + + name "Test workflow: sra/main.nf" + script "workflows/sra/main.nf" + workflow "SRA" + tag "workflows" + tag "workflows_sra" + tag "sra_force_sratools_download" + + test("Parameters: --force_sratools_download") { + + when { + workflow { + """ + input[0] = Channel.from('DRR026872','DRR028935','ERR1109373','ERR1160846','GSE214215','GSM4907283','SRR12848126','SRR13191702','SRR14593545','SRR14709033','SRR9984183') + """ + } + params { + outdir = "results" + force_sratools_download = true + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match() } + ) + } + } +} diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test.snap b/workflows/sra/tests/sra_force_sratools_download.nf.test.snap new file mode 100644 index 00000000..4e1b8aaf --- /dev/null +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test.snap @@ -0,0 +1,1351 @@ +{ + "Parameters: --force_sratools_download": { + "content": [ + { + "0": [ + [ + { + "id": "DRX024467_DRR026872", + "run_accession": "DRR026872", + "experiment_accession": "DRX024467", + "sample_accession": "SAMD00023098", + "secondary_sample_accession": "DRS033740", + "study_accession": "PRJDB4356", + "secondary_study_accession": "DRP003256", + "submission_accession": "DRA002758", + "run_alias": "DRR026872", + "experiment_alias": "DRX024467", + "sample_alias": "SAMD00023098", + "study_alias": "DRP003256", + "library_layout": "SINGLE", + "library_selection": "Restriction Digest", + "library_source": "GENOMIC", + "library_strategy": "OTHER", + "library_name": "IpeRAD1_3", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "62550", + "read_count": "417", + "tax_id": "35883", + "scientific_name": "Ipomoea nil", + "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", + "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", + "study_title": "The Japanese morning glory genome sequence", + "sample_description": "Keywords: GSC:MIxS MIGS:6.0", + "fastq_md5": "515e5448c55e054113c4a22df5f62791", + "fastq_bytes": "38447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_2": "", + "md5_1": "515e5448c55e054113c4a22df5f62791", + "md5_2": "", + "single_end": true + }, + "DRX024467_DRR026872.fastq.gz:md5,bd3f113c3b06cf4499fa0e00c634ec85" + ], + [ + { + "id": "DRX026011_DRR028935", + "run_accession": "DRR028935", + "experiment_accession": "DRX026011", + "sample_accession": "SAMD00024405", + "secondary_sample_accession": "DRS019431", + "study_accession": "PRJDB3420", + "secondary_study_accession": "DRP002616", + "submission_accession": "DRA002949", + "run_alias": "DRR028935", + "experiment_alias": "DRX026011", + "sample_alias": "SAMD00024405", + "study_alias": "DRP002616", + "library_layout": "PAIRED", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "day0_BbSQE-I", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "194930", + "read_count": "965", + "tax_id": "1202541", + "scientific_name": "Botryococcus braunii Showa", + "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", + "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", + "sample_description": "Liquid culture", + "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", + "fastq_bytes": "60275;61610", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "md5_1": "cc01df82a9354bb6b3be93483b20c35a", + "md5_2": "941c9998d746416dad53c94c480ddf30", + "single_end": false + }, + [ + "DRX026011_DRR028935_1.fastq.gz:md5,0f96fb60e903c8cbd55a6977e66f7c93", + "DRX026011_DRR028935_2.fastq.gz:md5,b97b1e0e806bcae10a7443e2f22d6ca2" + ] + ], + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "sample_accession": "SAMEA3643867", + "secondary_sample_accession": "ERS951016", + "study_accession": "PRJEB11633", + "secondary_study_accession": "ERP013030", + "submission_accession": "ERA528939", + "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", + "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", + "sample_alias": "sample_56", + "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", + "library_layout": "PAIRED", + "library_selection": "RT-PCR", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "unspecified", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "29700", + "read_count": "169", + "tax_id": "63433", + "scientific_name": "Leptopilina boulardi", + "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing", + "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", + "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_bytes": "3221;8151;8118", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, + [ + "ERX1188904_ERR1109373_1.fastq.gz:md5,e7edae2715dfaf4c318d37959fd9ae22", + "ERX1188904_ERR1109373_2.fastq.gz:md5,34ab048c92201a5ec4ab36d8dc1c5732" + ] + ], + [ + { + "id": "ERX1234253_ERR1160846", + "run_accession": "ERR1160846", + "experiment_accession": "ERX1234253", + "sample_accession": "SAMEA3687214", + "secondary_sample_accession": "ERS994363", + "study_accession": "PRJEB11419", + "secondary_study_accession": "ERP012803", + "submission_accession": "ERA541392", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "study_alias": "qiita_sid_10317", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "10317.BLANK.93.3E.r22", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "35658", + "read_count": "283", + "tax_id": "256318", + "scientific_name": "metagenome", + "sample_title": "10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "study_title": "American Gut Project", + "sample_description": "American Gut control", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_2": "", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "single_end": true + }, + "ERX1234253_ERR1160846.fastq.gz:md5,22683b24b2467494e430643423f1e275" + ], + [ + { + "id": "SRX10940790_SRR14593545", + "run_accession": "SRR14593545", + "experiment_accession": "SRX10940790", + "sample_accession": "SAMN19097423", + "secondary_sample_accession": "SRS9020442", + "study_accession": "PRJNA728650", + "secondary_study_accession": "SRP319413", + "submission_accession": "SRA1234280", + "run_alias": "577-6_530058_19-037147 Goat_F.ab1", + "experiment_alias": "PRNP_2765", + "sample_alias": "prp_2765", + "study_alias": "PRJNA728650", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "PRNP_2765", + "instrument_model": "AB 3500xL Genetic Analyzer", + "instrument_platform": "CAPILLARY", + "base_count": "828", + "read_count": "1", + "tax_id": "9925", + "scientific_name": "Capra hircus", + "sample_title": "MIGS Eukaryotic sample from Capra hircus", + "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", + "study_title": "Capra hircus Raw sequence reads", + "sample_description": "Keywords: GSC:MIxS MIGS:5.0", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" + ] + ], + [ + { + "id": "SRX11047067_SRR14709033", + "run_accession": "SRR14709033", + "experiment_accession": "SRX11047067", + "sample_accession": "SAMN19373034", + "secondary_sample_accession": "SRS9115923", + "study_accession": "PRJNA733285", + "secondary_study_accession": "SRP322267", + "submission_accession": "SRA1239521", + "run_alias": "Sebastes_levis-2.fastq", + "experiment_alias": "Sebastes_macdonaldi-1", + "sample_alias": "S._macdonaldi-1", + "study_alias": "PRJNA733285", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "Sebastes_macdonaldi-1", + "instrument_model": "AB 5500 Genetic Analyzer", + "instrument_platform": "ABI_SOLID", + "base_count": "153", + "read_count": "1", + "tax_id": "394693", + "scientific_name": "Sebastes macdonaldi", + "sample_title": "Sebastes_macdonaldi-1", + "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", + "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", + "sample_description": "Sebastes_macdonaldi-1", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": true + }, + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" + ], + [ + { + "id": "SRX17709227_SRR21711856", + "run_accession": "SRR21711856", + "experiment_accession": "SRX17709227", + "sample_accession": "SAMN31021823", + "secondary_sample_accession": "SRS15239723", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601460_r1", + "experiment_alias": "GSM6601460_r1", + "sample_alias": "GSM6601460", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601460", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "573417800", + "read_count": "11468356", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "sham-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "sham-treated worms in day 5", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_2": "", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "single_end": true + }, + "SRX17709227_SRR21711856.fastq.gz:md5,eae43f1368d4568f415581394dc9726e" + ], + [ + { + "id": "SRX17709228_SRR21711855", + "run_accession": "SRR21711855", + "experiment_accession": "SRX17709228", + "sample_accession": "SAMN31021822", + "secondary_sample_accession": "SRS15239724", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601461_r1", + "experiment_alias": "GSM6601461_r1", + "sample_alias": "GSM6601461", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601461", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "677912850", + "read_count": "13558257", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "PM2.5-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "PM2.5-treated worms in day 5", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_2": "", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "single_end": true + }, + "SRX17709228_SRR21711855.fastq.gz:md5,5194f8009b74552595c4ec5b7605d231" + ], + [ + { + "id": "SRX6725035_SRR9984183", + "run_accession": "SRR9984183", + "experiment_accession": "SRX6725035", + "sample_accession": "SAMN12581720", + "secondary_sample_accession": "SRS5277011", + "study_accession": "PRJNA560329", + "secondary_study_accession": "SRP218535", + "submission_accession": "SRA942061", + "run_alias": "Emb289P1_bin131.fastq", + "experiment_alias": "Emb289P1_bin131", + "sample_alias": "Emb289P1_bin131", + "study_alias": "PRJNA560329", + "library_layout": "SINGLE", + "library_selection": "RANDOM", + "library_source": "METAGENOMIC", + "library_strategy": "WGS", + "library_name": "Emb289P1_bin131", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "1996273", + "read_count": "58", + "tax_id": "2660712", + "scientific_name": "Defluviitaleaceae bacterium", + "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", + "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", + "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", + "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", + "fastq_md5": "0b512d2dc31685983456bd56fd836544", + "fastq_bytes": "605358", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_2": "", + "md5_1": "0b512d2dc31685983456bd56fd836544", + "md5_2": "", + "single_end": true + }, + "SRX6725035_SRR9984183.fastq.gz:md5,7a70e678c400366869601c8be41fe74b" + ], + [ + { + "id": "SRX9315476_SRR12848126", + "run_accession": "SRR12848126", + "experiment_accession": "SRX9315476", + "sample_accession": "SAMN16455283", + "secondary_sample_accession": "SRS7540262", + "study_accession": "PRJNA670070", + "secondary_study_accession": "SRP287769", + "submission_accession": "SRA1145417", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "experiment_alias": "F11-N1-05", + "sample_alias": "F11-N1-05", + "study_alias": "PRJNA670070", + "library_layout": "PAIRED", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "library_name": "F11-N1-05", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "base_count": "431758", + "read_count": "2954", + "tax_id": "10092", + "scientific_name": "Mus musculus domesticus", + "sample_title": "Longshanks_F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "sample_description": "F11-N1-05", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" + ] + ], + [ + { + "id": "SRX9504942_SRR13055517", + "run_accession": "SRR13055517", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r1", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2246028", + "read_count": "29553", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", + "fastq_bytes": "721167;723753", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", + "md5_2": "18dbe96e7f58b63406d9058938df1962", + "single_end": false + }, + [ + "SRX9504942_SRR13055517_1.fastq.gz:md5,b6d912a73466c8f27b1d8021f80ec2bb", + "SRX9504942_SRR13055517_2.fastq.gz:md5,7c6e220694fa5d6d9124c739aa70ea92" + ] + ], + [ + { + "id": "SRX9504942_SRR13055518", + "run_accession": "SRR13055518", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r2", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2235236", + "read_count": "29411", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", + "fastq_bytes": "717693;723429", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "md5_1": "5ec894d863fcefe394470a0925aefde4", + "md5_2": "aead170df9851773d5202b5760c76d76", + "single_end": false + }, + [ + "SRX9504942_SRR13055518_1.fastq.gz:md5,ed29278c21a1bb2d8907a74be0dd4bc4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,83785b728312deb81483fc1fd5b14264" + ] + ], + [ + { + "id": "SRX9504942_SRR13055519", + "run_accession": "SRR13055519", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r3", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2232728", + "read_count": "29378", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", + "fastq_bytes": "714907;721705", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", + "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", + "single_end": false + }, + [ + "SRX9504942_SRR13055519_1.fastq.gz:md5,28babc59a625b5161d97392efd4d0018", + "SRX9504942_SRR13055519_2.fastq.gz:md5,cf1eb4c61ab3522f4d473c86b2f696e1" + ] + ], + [ + { + "id": "SRX9504942_SRR13055520", + "run_accession": "SRR13055520", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r4", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2214488", + "read_count": "29138", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", + "fastq_bytes": "709867;716862", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "md5_1": "795d460abff6009c7f5ff7c14b773fbe", + "md5_2": "c3f34379356b28d6dac7212abc1a0a04", + "single_end": false + }, + [ + "SRX9504942_SRR13055520_1.fastq.gz:md5,cc75af896ec8a7cececb37851b0c6fcd", + "SRX9504942_SRR13055520_2.fastq.gz:md5,fe3e2bf9f738e4959243fad59e879eae" + ] + ], + [ + { + "id": "SRX9626017_SRR13191702", + "run_accession": "SRR13191702", + "experiment_accession": "SRX9626017", + "sample_accession": "SAMN16980141", + "secondary_sample_accession": "SRS7827211", + "study_accession": "PRJNA682076", + "secondary_study_accession": "SRP295653", + "submission_accession": "SRA1166126", + "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", + "experiment_alias": "S.170804.00784", + "sample_alias": "S.170804.00784_662", + "study_alias": "PRJNA682076", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "S.170804.00784", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "45682", + "read_count": "91", + "tax_id": "408170", + "scientific_name": "human gut metagenome", + "sample_title": "Metagenome or environmental sample from human gut metagenome", + "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "sample_description": "Metagenome or environmental sample from human gut metagenome", + "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", + "fastq_bytes": "15420;16324", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98", + "single_end": false + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,627a90afcd9f3cfc7f5f91074f9a2df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,3d9b2c68a8ad1547105b17de81b2d9af" + ] + ] + ], + "1": [ + "samplesheet.csv:md5,4aec9029e063bae998b3fa3dc3481556" + ], + "2": [ + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + ], + "3": [ + "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + ], + "fastq": [ + [ + { + "id": "DRX024467_DRR026872", + "run_accession": "DRR026872", + "experiment_accession": "DRX024467", + "sample_accession": "SAMD00023098", + "secondary_sample_accession": "DRS033740", + "study_accession": "PRJDB4356", + "secondary_study_accession": "DRP003256", + "submission_accession": "DRA002758", + "run_alias": "DRR026872", + "experiment_alias": "DRX024467", + "sample_alias": "SAMD00023098", + "study_alias": "DRP003256", + "library_layout": "SINGLE", + "library_selection": "Restriction Digest", + "library_source": "GENOMIC", + "library_strategy": "OTHER", + "library_name": "IpeRAD1_3", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "62550", + "read_count": "417", + "tax_id": "35883", + "scientific_name": "Ipomoea nil", + "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", + "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", + "study_title": "The Japanese morning glory genome sequence", + "sample_description": "Keywords: GSC:MIxS MIGS:6.0", + "fastq_md5": "515e5448c55e054113c4a22df5f62791", + "fastq_bytes": "38447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_2": "", + "md5_1": "515e5448c55e054113c4a22df5f62791", + "md5_2": "", + "single_end": true + }, + "DRX024467_DRR026872.fastq.gz:md5,bd3f113c3b06cf4499fa0e00c634ec85" + ], + [ + { + "id": "DRX026011_DRR028935", + "run_accession": "DRR028935", + "experiment_accession": "DRX026011", + "sample_accession": "SAMD00024405", + "secondary_sample_accession": "DRS019431", + "study_accession": "PRJDB3420", + "secondary_study_accession": "DRP002616", + "submission_accession": "DRA002949", + "run_alias": "DRR028935", + "experiment_alias": "DRX026011", + "sample_alias": "SAMD00024405", + "study_alias": "DRP002616", + "library_layout": "PAIRED", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "day0_BbSQE-I", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "194930", + "read_count": "965", + "tax_id": "1202541", + "scientific_name": "Botryococcus braunii Showa", + "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", + "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", + "sample_description": "Liquid culture", + "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", + "fastq_bytes": "60275;61610", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "md5_1": "cc01df82a9354bb6b3be93483b20c35a", + "md5_2": "941c9998d746416dad53c94c480ddf30", + "single_end": false + }, + [ + "DRX026011_DRR028935_1.fastq.gz:md5,0f96fb60e903c8cbd55a6977e66f7c93", + "DRX026011_DRR028935_2.fastq.gz:md5,b97b1e0e806bcae10a7443e2f22d6ca2" + ] + ], + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "sample_accession": "SAMEA3643867", + "secondary_sample_accession": "ERS951016", + "study_accession": "PRJEB11633", + "secondary_study_accession": "ERP013030", + "submission_accession": "ERA528939", + "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", + "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", + "sample_alias": "sample_56", + "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", + "library_layout": "PAIRED", + "library_selection": "RT-PCR", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "unspecified", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "29700", + "read_count": "169", + "tax_id": "63433", + "scientific_name": "Leptopilina boulardi", + "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing", + "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", + "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_bytes": "3221;8151;8118", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, + [ + "ERX1188904_ERR1109373_1.fastq.gz:md5,e7edae2715dfaf4c318d37959fd9ae22", + "ERX1188904_ERR1109373_2.fastq.gz:md5,34ab048c92201a5ec4ab36d8dc1c5732" + ] + ], + [ + { + "id": "ERX1234253_ERR1160846", + "run_accession": "ERR1160846", + "experiment_accession": "ERX1234253", + "sample_accession": "SAMEA3687214", + "secondary_sample_accession": "ERS994363", + "study_accession": "PRJEB11419", + "secondary_study_accession": "ERP012803", + "submission_accession": "ERA541392", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "study_alias": "qiita_sid_10317", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "10317.BLANK.93.3E.r22", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "35658", + "read_count": "283", + "tax_id": "256318", + "scientific_name": "metagenome", + "sample_title": "10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "study_title": "American Gut Project", + "sample_description": "American Gut control", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_2": "", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "single_end": true + }, + "ERX1234253_ERR1160846.fastq.gz:md5,22683b24b2467494e430643423f1e275" + ], + [ + { + "id": "SRX10940790_SRR14593545", + "run_accession": "SRR14593545", + "experiment_accession": "SRX10940790", + "sample_accession": "SAMN19097423", + "secondary_sample_accession": "SRS9020442", + "study_accession": "PRJNA728650", + "secondary_study_accession": "SRP319413", + "submission_accession": "SRA1234280", + "run_alias": "577-6_530058_19-037147 Goat_F.ab1", + "experiment_alias": "PRNP_2765", + "sample_alias": "prp_2765", + "study_alias": "PRJNA728650", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "PRNP_2765", + "instrument_model": "AB 3500xL Genetic Analyzer", + "instrument_platform": "CAPILLARY", + "base_count": "828", + "read_count": "1", + "tax_id": "9925", + "scientific_name": "Capra hircus", + "sample_title": "MIGS Eukaryotic sample from Capra hircus", + "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", + "study_title": "Capra hircus Raw sequence reads", + "sample_description": "Keywords: GSC:MIxS MIGS:5.0", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" + ] + ], + [ + { + "id": "SRX11047067_SRR14709033", + "run_accession": "SRR14709033", + "experiment_accession": "SRX11047067", + "sample_accession": "SAMN19373034", + "secondary_sample_accession": "SRS9115923", + "study_accession": "PRJNA733285", + "secondary_study_accession": "SRP322267", + "submission_accession": "SRA1239521", + "run_alias": "Sebastes_levis-2.fastq", + "experiment_alias": "Sebastes_macdonaldi-1", + "sample_alias": "S._macdonaldi-1", + "study_alias": "PRJNA733285", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "Sebastes_macdonaldi-1", + "instrument_model": "AB 5500 Genetic Analyzer", + "instrument_platform": "ABI_SOLID", + "base_count": "153", + "read_count": "1", + "tax_id": "394693", + "scientific_name": "Sebastes macdonaldi", + "sample_title": "Sebastes_macdonaldi-1", + "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", + "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", + "sample_description": "Sebastes_macdonaldi-1", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": true + }, + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" + ], + [ + { + "id": "SRX17709227_SRR21711856", + "run_accession": "SRR21711856", + "experiment_accession": "SRX17709227", + "sample_accession": "SAMN31021823", + "secondary_sample_accession": "SRS15239723", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601460_r1", + "experiment_alias": "GSM6601460_r1", + "sample_alias": "GSM6601460", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601460", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "573417800", + "read_count": "11468356", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "sham-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "sham-treated worms in day 5", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_2": "", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "single_end": true + }, + "SRX17709227_SRR21711856.fastq.gz:md5,eae43f1368d4568f415581394dc9726e" + ], + [ + { + "id": "SRX17709228_SRR21711855", + "run_accession": "SRR21711855", + "experiment_accession": "SRX17709228", + "sample_accession": "SAMN31021822", + "secondary_sample_accession": "SRS15239724", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601461_r1", + "experiment_alias": "GSM6601461_r1", + "sample_alias": "GSM6601461", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601461", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "677912850", + "read_count": "13558257", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "PM2.5-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "PM2.5-treated worms in day 5", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_2": "", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "single_end": true + }, + "SRX17709228_SRR21711855.fastq.gz:md5,5194f8009b74552595c4ec5b7605d231" + ], + [ + { + "id": "SRX6725035_SRR9984183", + "run_accession": "SRR9984183", + "experiment_accession": "SRX6725035", + "sample_accession": "SAMN12581720", + "secondary_sample_accession": "SRS5277011", + "study_accession": "PRJNA560329", + "secondary_study_accession": "SRP218535", + "submission_accession": "SRA942061", + "run_alias": "Emb289P1_bin131.fastq", + "experiment_alias": "Emb289P1_bin131", + "sample_alias": "Emb289P1_bin131", + "study_alias": "PRJNA560329", + "library_layout": "SINGLE", + "library_selection": "RANDOM", + "library_source": "METAGENOMIC", + "library_strategy": "WGS", + "library_name": "Emb289P1_bin131", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "1996273", + "read_count": "58", + "tax_id": "2660712", + "scientific_name": "Defluviitaleaceae bacterium", + "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", + "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", + "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", + "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", + "fastq_md5": "0b512d2dc31685983456bd56fd836544", + "fastq_bytes": "605358", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_2": "", + "md5_1": "0b512d2dc31685983456bd56fd836544", + "md5_2": "", + "single_end": true + }, + "SRX6725035_SRR9984183.fastq.gz:md5,7a70e678c400366869601c8be41fe74b" + ], + [ + { + "id": "SRX9315476_SRR12848126", + "run_accession": "SRR12848126", + "experiment_accession": "SRX9315476", + "sample_accession": "SAMN16455283", + "secondary_sample_accession": "SRS7540262", + "study_accession": "PRJNA670070", + "secondary_study_accession": "SRP287769", + "submission_accession": "SRA1145417", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "experiment_alias": "F11-N1-05", + "sample_alias": "F11-N1-05", + "study_alias": "PRJNA670070", + "library_layout": "PAIRED", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "library_name": "F11-N1-05", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "base_count": "431758", + "read_count": "2954", + "tax_id": "10092", + "scientific_name": "Mus musculus domesticus", + "sample_title": "Longshanks_F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "sample_description": "F11-N1-05", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" + ] + ], + [ + { + "id": "SRX9504942_SRR13055517", + "run_accession": "SRR13055517", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r1", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2246028", + "read_count": "29553", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", + "fastq_bytes": "721167;723753", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", + "md5_2": "18dbe96e7f58b63406d9058938df1962", + "single_end": false + }, + [ + "SRX9504942_SRR13055517_1.fastq.gz:md5,b6d912a73466c8f27b1d8021f80ec2bb", + "SRX9504942_SRR13055517_2.fastq.gz:md5,7c6e220694fa5d6d9124c739aa70ea92" + ] + ], + [ + { + "id": "SRX9504942_SRR13055518", + "run_accession": "SRR13055518", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r2", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2235236", + "read_count": "29411", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", + "fastq_bytes": "717693;723429", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "md5_1": "5ec894d863fcefe394470a0925aefde4", + "md5_2": "aead170df9851773d5202b5760c76d76", + "single_end": false + }, + [ + "SRX9504942_SRR13055518_1.fastq.gz:md5,ed29278c21a1bb2d8907a74be0dd4bc4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,83785b728312deb81483fc1fd5b14264" + ] + ], + [ + { + "id": "SRX9504942_SRR13055519", + "run_accession": "SRR13055519", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r3", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2232728", + "read_count": "29378", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", + "fastq_bytes": "714907;721705", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", + "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", + "single_end": false + }, + [ + "SRX9504942_SRR13055519_1.fastq.gz:md5,28babc59a625b5161d97392efd4d0018", + "SRX9504942_SRR13055519_2.fastq.gz:md5,cf1eb4c61ab3522f4d473c86b2f696e1" + ] + ], + [ + { + "id": "SRX9504942_SRR13055520", + "run_accession": "SRR13055520", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r4", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2214488", + "read_count": "29138", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", + "fastq_bytes": "709867;716862", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "md5_1": "795d460abff6009c7f5ff7c14b773fbe", + "md5_2": "c3f34379356b28d6dac7212abc1a0a04", + "single_end": false + }, + [ + "SRX9504942_SRR13055520_1.fastq.gz:md5,cc75af896ec8a7cececb37851b0c6fcd", + "SRX9504942_SRR13055520_2.fastq.gz:md5,fe3e2bf9f738e4959243fad59e879eae" + ] + ], + [ + { + "id": "SRX9626017_SRR13191702", + "run_accession": "SRR13191702", + "experiment_accession": "SRX9626017", + "sample_accession": "SAMN16980141", + "secondary_sample_accession": "SRS7827211", + "study_accession": "PRJNA682076", + "secondary_study_accession": "SRP295653", + "submission_accession": "SRA1166126", + "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", + "experiment_alias": "S.170804.00784", + "sample_alias": "S.170804.00784_662", + "study_alias": "PRJNA682076", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "S.170804.00784", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "45682", + "read_count": "91", + "tax_id": "408170", + "scientific_name": "human gut metagenome", + "sample_title": "Metagenome or environmental sample from human gut metagenome", + "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "sample_description": "Metagenome or environmental sample from human gut metagenome", + "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", + "fastq_bytes": "15420;16324", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98", + "single_end": false + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,627a90afcd9f3cfc7f5f91074f9a2df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,3d9b2c68a8ad1547105b17de81b2d9af" + ] + ] + ], + "mappings": [ + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + ], + "samplesheet": [ + "samplesheet.csv:md5,4aec9029e063bae998b3fa3dc3481556" + ], + "versions": [ + "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + ] + } + ], + "timestamp": "2023-09-11T19:02:05.556134" + } +} \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test new file mode 100644 index 00000000..0ce0c230 --- /dev/null +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test @@ -0,0 +1,31 @@ +nextflow_workflow { + + name "Test workflow: sra/main.nf" + script "workflows/sra/main.nf" + workflow "SRA" + tag "workflows" + tag "workflows_sra" + tag "sra_nf_core_pipeline_atacseq" + + test("Parameters: --nf_core_pipeline atacseq") { + + when { + workflow { + """ + input[0] = Channel.from('DRR026872','DRR028935','ERR1109373','ERR1160846','GSE214215','GSM4907283','SRR12848126','SRR13191702','SRR14593545','SRR14709033','SRR9984183') + """ + } + params { + outdir = "results" + nf_core_pipeline = "atacseq" + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match() } + ) + } + } +} diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap new file mode 100644 index 00000000..f6528e52 --- /dev/null +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap @@ -0,0 +1,1353 @@ +{ + "Parameters: --nf_core_pipeline atacseq": { + "content": [ + { + "0": [ + [ + { + "id": "DRX024467_DRR026872", + "run_accession": "DRR026872", + "experiment_accession": "DRX024467", + "sample_accession": "SAMD00023098", + "secondary_sample_accession": "DRS033740", + "study_accession": "PRJDB4356", + "secondary_study_accession": "DRP003256", + "submission_accession": "DRA002758", + "run_alias": "DRR026872", + "experiment_alias": "DRX024467", + "sample_alias": "SAMD00023098", + "study_alias": "DRP003256", + "library_layout": "SINGLE", + "library_selection": "Restriction Digest", + "library_source": "GENOMIC", + "library_strategy": "OTHER", + "library_name": "IpeRAD1_3", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "62550", + "read_count": "417", + "tax_id": "35883", + "scientific_name": "Ipomoea nil", + "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", + "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", + "study_title": "The Japanese morning glory genome sequence", + "sample_description": "Keywords: GSC:MIxS MIGS:6.0", + "fastq_md5": "515e5448c55e054113c4a22df5f62791", + "fastq_bytes": "38447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_2": "", + "md5_1": "515e5448c55e054113c4a22df5f62791", + "md5_2": "", + "single_end": true + }, + "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" + ], + [ + { + "id": "DRX026011_DRR028935", + "run_accession": "DRR028935", + "experiment_accession": "DRX026011", + "sample_accession": "SAMD00024405", + "secondary_sample_accession": "DRS019431", + "study_accession": "PRJDB3420", + "secondary_study_accession": "DRP002616", + "submission_accession": "DRA002949", + "run_alias": "DRR028935", + "experiment_alias": "DRX026011", + "sample_alias": "SAMD00024405", + "study_alias": "DRP002616", + "library_layout": "PAIRED", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "day0_BbSQE-I", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "194930", + "read_count": "965", + "tax_id": "1202541", + "scientific_name": "Botryococcus braunii Showa", + "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", + "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", + "sample_description": "Liquid culture", + "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", + "fastq_bytes": "60275;61610", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "md5_1": "cc01df82a9354bb6b3be93483b20c35a", + "md5_2": "941c9998d746416dad53c94c480ddf30", + "single_end": false + }, + [ + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" + ] + ], + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "sample_accession": "SAMEA3643867", + "secondary_sample_accession": "ERS951016", + "study_accession": "PRJEB11633", + "secondary_study_accession": "ERP013030", + "submission_accession": "ERA528939", + "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", + "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", + "sample_alias": "sample_56", + "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", + "library_layout": "PAIRED", + "library_selection": "RT-PCR", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "unspecified", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "29700", + "read_count": "169", + "tax_id": "63433", + "scientific_name": "Leptopilina boulardi", + "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing", + "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", + "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_bytes": "3221;8151;8118", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, + [ + "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" + ] + ], + [ + { + "id": "ERX1234253_ERR1160846", + "run_accession": "ERR1160846", + "experiment_accession": "ERX1234253", + "sample_accession": "SAMEA3687214", + "secondary_sample_accession": "ERS994363", + "study_accession": "PRJEB11419", + "secondary_study_accession": "ERP012803", + "submission_accession": "ERA541392", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "study_alias": "qiita_sid_10317", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "10317.BLANK.93.3E.r22", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "35658", + "read_count": "283", + "tax_id": "256318", + "scientific_name": "metagenome", + "sample_title": "10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "study_title": "American Gut Project", + "sample_description": "American Gut control", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_2": "", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "single_end": true + }, + "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" + ], + [ + { + "id": "SRX10940790_SRR14593545", + "run_accession": "SRR14593545", + "experiment_accession": "SRX10940790", + "sample_accession": "SAMN19097423", + "secondary_sample_accession": "SRS9020442", + "study_accession": "PRJNA728650", + "secondary_study_accession": "SRP319413", + "submission_accession": "SRA1234280", + "run_alias": "577-6_530058_19-037147 Goat_F.ab1", + "experiment_alias": "PRNP_2765", + "sample_alias": "prp_2765", + "study_alias": "PRJNA728650", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "PRNP_2765", + "instrument_model": "AB 3500xL Genetic Analyzer", + "instrument_platform": "CAPILLARY", + "base_count": "828", + "read_count": "1", + "tax_id": "9925", + "scientific_name": "Capra hircus", + "sample_title": "MIGS Eukaryotic sample from Capra hircus", + "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", + "study_title": "Capra hircus Raw sequence reads", + "sample_description": "Keywords: GSC:MIxS MIGS:5.0", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" + ] + ], + [ + { + "id": "SRX11047067_SRR14709033", + "run_accession": "SRR14709033", + "experiment_accession": "SRX11047067", + "sample_accession": "SAMN19373034", + "secondary_sample_accession": "SRS9115923", + "study_accession": "PRJNA733285", + "secondary_study_accession": "SRP322267", + "submission_accession": "SRA1239521", + "run_alias": "Sebastes_levis-2.fastq", + "experiment_alias": "Sebastes_macdonaldi-1", + "sample_alias": "S._macdonaldi-1", + "study_alias": "PRJNA733285", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "Sebastes_macdonaldi-1", + "instrument_model": "AB 5500 Genetic Analyzer", + "instrument_platform": "ABI_SOLID", + "base_count": "153", + "read_count": "1", + "tax_id": "394693", + "scientific_name": "Sebastes macdonaldi", + "sample_title": "Sebastes_macdonaldi-1", + "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", + "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", + "sample_description": "Sebastes_macdonaldi-1", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": true + }, + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" + ], + [ + { + "id": "SRX17709227_SRR21711856", + "run_accession": "SRR21711856", + "experiment_accession": "SRX17709227", + "sample_accession": "SAMN31021823", + "secondary_sample_accession": "SRS15239723", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601460_r1", + "experiment_alias": "GSM6601460_r1", + "sample_alias": "GSM6601460", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601460", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "573417800", + "read_count": "11468356", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "sham-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "sham-treated worms in day 5", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_2": "", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "single_end": true + }, + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" + ], + [ + { + "id": "SRX17709228_SRR21711855", + "run_accession": "SRR21711855", + "experiment_accession": "SRX17709228", + "sample_accession": "SAMN31021822", + "secondary_sample_accession": "SRS15239724", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601461_r1", + "experiment_alias": "GSM6601461_r1", + "sample_alias": "GSM6601461", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601461", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "677912850", + "read_count": "13558257", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "PM2.5-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "PM2.5-treated worms in day 5", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_2": "", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "single_end": true + }, + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" + ], + [ + { + "id": "SRX6725035_SRR9984183", + "run_accession": "SRR9984183", + "experiment_accession": "SRX6725035", + "sample_accession": "SAMN12581720", + "secondary_sample_accession": "SRS5277011", + "study_accession": "PRJNA560329", + "secondary_study_accession": "SRP218535", + "submission_accession": "SRA942061", + "run_alias": "Emb289P1_bin131.fastq", + "experiment_alias": "Emb289P1_bin131", + "sample_alias": "Emb289P1_bin131", + "study_alias": "PRJNA560329", + "library_layout": "SINGLE", + "library_selection": "RANDOM", + "library_source": "METAGENOMIC", + "library_strategy": "WGS", + "library_name": "Emb289P1_bin131", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "1996273", + "read_count": "58", + "tax_id": "2660712", + "scientific_name": "Defluviitaleaceae bacterium", + "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", + "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", + "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", + "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", + "fastq_md5": "0b512d2dc31685983456bd56fd836544", + "fastq_bytes": "605358", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_2": "", + "md5_1": "0b512d2dc31685983456bd56fd836544", + "md5_2": "", + "single_end": true + }, + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" + ], + [ + { + "id": "SRX9315476_SRR12848126", + "run_accession": "SRR12848126", + "experiment_accession": "SRX9315476", + "sample_accession": "SAMN16455283", + "secondary_sample_accession": "SRS7540262", + "study_accession": "PRJNA670070", + "secondary_study_accession": "SRP287769", + "submission_accession": "SRA1145417", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "experiment_alias": "F11-N1-05", + "sample_alias": "F11-N1-05", + "study_alias": "PRJNA670070", + "library_layout": "PAIRED", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "library_name": "F11-N1-05", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "base_count": "431758", + "read_count": "2954", + "tax_id": "10092", + "scientific_name": "Mus musculus domesticus", + "sample_title": "Longshanks_F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "sample_description": "F11-N1-05", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" + ] + ], + [ + { + "id": "SRX9504942_SRR13055517", + "run_accession": "SRR13055517", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r1", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2246028", + "read_count": "29553", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", + "fastq_bytes": "721167;723753", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", + "md5_2": "18dbe96e7f58b63406d9058938df1962", + "single_end": false + }, + [ + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" + ] + ], + [ + { + "id": "SRX9504942_SRR13055518", + "run_accession": "SRR13055518", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r2", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2235236", + "read_count": "29411", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", + "fastq_bytes": "717693;723429", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "md5_1": "5ec894d863fcefe394470a0925aefde4", + "md5_2": "aead170df9851773d5202b5760c76d76", + "single_end": false + }, + [ + "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" + ] + ], + [ + { + "id": "SRX9504942_SRR13055519", + "run_accession": "SRR13055519", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r3", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2232728", + "read_count": "29378", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", + "fastq_bytes": "714907;721705", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", + "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", + "single_end": false + }, + [ + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" + ] + ], + [ + { + "id": "SRX9504942_SRR13055520", + "run_accession": "SRR13055520", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r4", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2214488", + "read_count": "29138", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", + "fastq_bytes": "709867;716862", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "md5_1": "795d460abff6009c7f5ff7c14b773fbe", + "md5_2": "c3f34379356b28d6dac7212abc1a0a04", + "single_end": false + }, + [ + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" + ] + ], + [ + { + "id": "SRX9626017_SRR13191702", + "run_accession": "SRR13191702", + "experiment_accession": "SRX9626017", + "sample_accession": "SAMN16980141", + "secondary_sample_accession": "SRS7827211", + "study_accession": "PRJNA682076", + "secondary_study_accession": "SRP295653", + "submission_accession": "SRA1166126", + "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", + "experiment_alias": "S.170804.00784", + "sample_alias": "S.170804.00784_662", + "study_alias": "PRJNA682076", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "S.170804.00784", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "45682", + "read_count": "91", + "tax_id": "408170", + "scientific_name": "human gut metagenome", + "sample_title": "Metagenome or environmental sample from human gut metagenome", + "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "sample_description": "Metagenome or environmental sample from human gut metagenome", + "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", + "fastq_bytes": "15420;16324", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98", + "single_end": false + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + ] + ] + ], + "1": [ + "samplesheet.csv:md5,16e5161103702777b2d763c1ed660d3c" + ], + "2": [ + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + ], + "3": [ + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + ], + "fastq": [ + [ + { + "id": "DRX024467_DRR026872", + "run_accession": "DRR026872", + "experiment_accession": "DRX024467", + "sample_accession": "SAMD00023098", + "secondary_sample_accession": "DRS033740", + "study_accession": "PRJDB4356", + "secondary_study_accession": "DRP003256", + "submission_accession": "DRA002758", + "run_alias": "DRR026872", + "experiment_alias": "DRX024467", + "sample_alias": "SAMD00023098", + "study_alias": "DRP003256", + "library_layout": "SINGLE", + "library_selection": "Restriction Digest", + "library_source": "GENOMIC", + "library_strategy": "OTHER", + "library_name": "IpeRAD1_3", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "62550", + "read_count": "417", + "tax_id": "35883", + "scientific_name": "Ipomoea nil", + "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", + "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", + "study_title": "The Japanese morning glory genome sequence", + "sample_description": "Keywords: GSC:MIxS MIGS:6.0", + "fastq_md5": "515e5448c55e054113c4a22df5f62791", + "fastq_bytes": "38447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_2": "", + "md5_1": "515e5448c55e054113c4a22df5f62791", + "md5_2": "", + "single_end": true + }, + "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" + ], + [ + { + "id": "DRX026011_DRR028935", + "run_accession": "DRR028935", + "experiment_accession": "DRX026011", + "sample_accession": "SAMD00024405", + "secondary_sample_accession": "DRS019431", + "study_accession": "PRJDB3420", + "secondary_study_accession": "DRP002616", + "submission_accession": "DRA002949", + "run_alias": "DRR028935", + "experiment_alias": "DRX026011", + "sample_alias": "SAMD00024405", + "study_alias": "DRP002616", + "library_layout": "PAIRED", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "day0_BbSQE-I", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "194930", + "read_count": "965", + "tax_id": "1202541", + "scientific_name": "Botryococcus braunii Showa", + "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", + "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", + "sample_description": "Liquid culture", + "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", + "fastq_bytes": "60275;61610", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "md5_1": "cc01df82a9354bb6b3be93483b20c35a", + "md5_2": "941c9998d746416dad53c94c480ddf30", + "single_end": false + }, + [ + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" + ] + ], + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "sample_accession": "SAMEA3643867", + "secondary_sample_accession": "ERS951016", + "study_accession": "PRJEB11633", + "secondary_study_accession": "ERP013030", + "submission_accession": "ERA528939", + "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", + "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", + "sample_alias": "sample_56", + "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", + "library_layout": "PAIRED", + "library_selection": "RT-PCR", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "unspecified", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "29700", + "read_count": "169", + "tax_id": "63433", + "scientific_name": "Leptopilina boulardi", + "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing", + "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", + "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_bytes": "3221;8151;8118", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, + [ + "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" + ] + ], + [ + { + "id": "ERX1234253_ERR1160846", + "run_accession": "ERR1160846", + "experiment_accession": "ERX1234253", + "sample_accession": "SAMEA3687214", + "secondary_sample_accession": "ERS994363", + "study_accession": "PRJEB11419", + "secondary_study_accession": "ERP012803", + "submission_accession": "ERA541392", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "study_alias": "qiita_sid_10317", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "10317.BLANK.93.3E.r22", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "35658", + "read_count": "283", + "tax_id": "256318", + "scientific_name": "metagenome", + "sample_title": "10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "study_title": "American Gut Project", + "sample_description": "American Gut control", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_2": "", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "single_end": true + }, + "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" + ], + [ + { + "id": "SRX10940790_SRR14593545", + "run_accession": "SRR14593545", + "experiment_accession": "SRX10940790", + "sample_accession": "SAMN19097423", + "secondary_sample_accession": "SRS9020442", + "study_accession": "PRJNA728650", + "secondary_study_accession": "SRP319413", + "submission_accession": "SRA1234280", + "run_alias": "577-6_530058_19-037147 Goat_F.ab1", + "experiment_alias": "PRNP_2765", + "sample_alias": "prp_2765", + "study_alias": "PRJNA728650", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "PRNP_2765", + "instrument_model": "AB 3500xL Genetic Analyzer", + "instrument_platform": "CAPILLARY", + "base_count": "828", + "read_count": "1", + "tax_id": "9925", + "scientific_name": "Capra hircus", + "sample_title": "MIGS Eukaryotic sample from Capra hircus", + "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", + "study_title": "Capra hircus Raw sequence reads", + "sample_description": "Keywords: GSC:MIxS MIGS:5.0", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" + ] + ], + [ + { + "id": "SRX11047067_SRR14709033", + "run_accession": "SRR14709033", + "experiment_accession": "SRX11047067", + "sample_accession": "SAMN19373034", + "secondary_sample_accession": "SRS9115923", + "study_accession": "PRJNA733285", + "secondary_study_accession": "SRP322267", + "submission_accession": "SRA1239521", + "run_alias": "Sebastes_levis-2.fastq", + "experiment_alias": "Sebastes_macdonaldi-1", + "sample_alias": "S._macdonaldi-1", + "study_alias": "PRJNA733285", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "Sebastes_macdonaldi-1", + "instrument_model": "AB 5500 Genetic Analyzer", + "instrument_platform": "ABI_SOLID", + "base_count": "153", + "read_count": "1", + "tax_id": "394693", + "scientific_name": "Sebastes macdonaldi", + "sample_title": "Sebastes_macdonaldi-1", + "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", + "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", + "sample_description": "Sebastes_macdonaldi-1", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": true + }, + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" + ], + [ + { + "id": "SRX17709227_SRR21711856", + "run_accession": "SRR21711856", + "experiment_accession": "SRX17709227", + "sample_accession": "SAMN31021823", + "secondary_sample_accession": "SRS15239723", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601460_r1", + "experiment_alias": "GSM6601460_r1", + "sample_alias": "GSM6601460", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601460", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "573417800", + "read_count": "11468356", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "sham-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "sham-treated worms in day 5", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_2": "", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "single_end": true + }, + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" + ], + [ + { + "id": "SRX17709228_SRR21711855", + "run_accession": "SRR21711855", + "experiment_accession": "SRX17709228", + "sample_accession": "SAMN31021822", + "secondary_sample_accession": "SRS15239724", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601461_r1", + "experiment_alias": "GSM6601461_r1", + "sample_alias": "GSM6601461", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601461", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "677912850", + "read_count": "13558257", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "PM2.5-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "PM2.5-treated worms in day 5", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_2": "", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "single_end": true + }, + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" + ], + [ + { + "id": "SRX6725035_SRR9984183", + "run_accession": "SRR9984183", + "experiment_accession": "SRX6725035", + "sample_accession": "SAMN12581720", + "secondary_sample_accession": "SRS5277011", + "study_accession": "PRJNA560329", + "secondary_study_accession": "SRP218535", + "submission_accession": "SRA942061", + "run_alias": "Emb289P1_bin131.fastq", + "experiment_alias": "Emb289P1_bin131", + "sample_alias": "Emb289P1_bin131", + "study_alias": "PRJNA560329", + "library_layout": "SINGLE", + "library_selection": "RANDOM", + "library_source": "METAGENOMIC", + "library_strategy": "WGS", + "library_name": "Emb289P1_bin131", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "1996273", + "read_count": "58", + "tax_id": "2660712", + "scientific_name": "Defluviitaleaceae bacterium", + "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", + "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", + "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", + "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", + "fastq_md5": "0b512d2dc31685983456bd56fd836544", + "fastq_bytes": "605358", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_2": "", + "md5_1": "0b512d2dc31685983456bd56fd836544", + "md5_2": "", + "single_end": true + }, + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" + ], + [ + { + "id": "SRX9315476_SRR12848126", + "run_accession": "SRR12848126", + "experiment_accession": "SRX9315476", + "sample_accession": "SAMN16455283", + "secondary_sample_accession": "SRS7540262", + "study_accession": "PRJNA670070", + "secondary_study_accession": "SRP287769", + "submission_accession": "SRA1145417", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "experiment_alias": "F11-N1-05", + "sample_alias": "F11-N1-05", + "study_alias": "PRJNA670070", + "library_layout": "PAIRED", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "library_name": "F11-N1-05", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "base_count": "431758", + "read_count": "2954", + "tax_id": "10092", + "scientific_name": "Mus musculus domesticus", + "sample_title": "Longshanks_F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "sample_description": "F11-N1-05", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" + ] + ], + [ + { + "id": "SRX9504942_SRR13055517", + "run_accession": "SRR13055517", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r1", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2246028", + "read_count": "29553", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", + "fastq_bytes": "721167;723753", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", + "md5_2": "18dbe96e7f58b63406d9058938df1962", + "single_end": false + }, + [ + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" + ] + ], + [ + { + "id": "SRX9504942_SRR13055518", + "run_accession": "SRR13055518", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r2", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2235236", + "read_count": "29411", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", + "fastq_bytes": "717693;723429", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "md5_1": "5ec894d863fcefe394470a0925aefde4", + "md5_2": "aead170df9851773d5202b5760c76d76", + "single_end": false + }, + [ + "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" + ] + ], + [ + { + "id": "SRX9504942_SRR13055519", + "run_accession": "SRR13055519", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r3", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2232728", + "read_count": "29378", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", + "fastq_bytes": "714907;721705", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", + "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", + "single_end": false + }, + [ + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" + ] + ], + [ + { + "id": "SRX9504942_SRR13055520", + "run_accession": "SRR13055520", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r4", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2214488", + "read_count": "29138", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", + "fastq_bytes": "709867;716862", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "md5_1": "795d460abff6009c7f5ff7c14b773fbe", + "md5_2": "c3f34379356b28d6dac7212abc1a0a04", + "single_end": false + }, + [ + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" + ] + ], + [ + { + "id": "SRX9626017_SRR13191702", + "run_accession": "SRR13191702", + "experiment_accession": "SRX9626017", + "sample_accession": "SAMN16980141", + "secondary_sample_accession": "SRS7827211", + "study_accession": "PRJNA682076", + "secondary_study_accession": "SRP295653", + "submission_accession": "SRA1166126", + "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", + "experiment_alias": "S.170804.00784", + "sample_alias": "S.170804.00784_662", + "study_alias": "PRJNA682076", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "S.170804.00784", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "45682", + "read_count": "91", + "tax_id": "408170", + "scientific_name": "human gut metagenome", + "sample_title": "Metagenome or environmental sample from human gut metagenome", + "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "sample_description": "Metagenome or environmental sample from human gut metagenome", + "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", + "fastq_bytes": "15420;16324", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98", + "single_end": false + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + ] + ] + ], + "mappings": [ + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + ], + "samplesheet": [ + "samplesheet.csv:md5,16e5161103702777b2d763c1ed660d3c" + ], + "versions": [ + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + ] + } + ], + "timestamp": "2023-09-11T18:37:54.607231" + } +} \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test new file mode 100644 index 00000000..67c0fbe4 --- /dev/null +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test @@ -0,0 +1,31 @@ +nextflow_workflow { + + name "Test workflow: sra/main.nf" + script "workflows/sra/main.nf" + workflow "SRA" + tag "workflows" + tag "workflows_sra" + tag "sra_nf_core_pipeline_rnaseq" + + test("Parameters: --nf_core_pipeline rnaseq") { + + when { + workflow { + """ + input[0] = Channel.from('DRR026872','DRR028935','ERR1109373','ERR1160846','GSE214215','GSM4907283','SRR12848126','SRR13191702','SRR14593545','SRR14709033','SRR9984183') + """ + } + params { + outdir = "results" + nf_core_pipeline = "rnaseq" + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match() } + ) + } + } +} diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap new file mode 100644 index 00000000..124877ae --- /dev/null +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap @@ -0,0 +1,1353 @@ +{ + "Parameters: --nf_core_pipeline rnaseq": { + "content": [ + { + "0": [ + [ + { + "id": "DRX024467_DRR026872", + "run_accession": "DRR026872", + "experiment_accession": "DRX024467", + "sample_accession": "SAMD00023098", + "secondary_sample_accession": "DRS033740", + "study_accession": "PRJDB4356", + "secondary_study_accession": "DRP003256", + "submission_accession": "DRA002758", + "run_alias": "DRR026872", + "experiment_alias": "DRX024467", + "sample_alias": "SAMD00023098", + "study_alias": "DRP003256", + "library_layout": "SINGLE", + "library_selection": "Restriction Digest", + "library_source": "GENOMIC", + "library_strategy": "OTHER", + "library_name": "IpeRAD1_3", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "62550", + "read_count": "417", + "tax_id": "35883", + "scientific_name": "Ipomoea nil", + "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", + "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", + "study_title": "The Japanese morning glory genome sequence", + "sample_description": "Keywords: GSC:MIxS MIGS:6.0", + "fastq_md5": "515e5448c55e054113c4a22df5f62791", + "fastq_bytes": "38447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_2": "", + "md5_1": "515e5448c55e054113c4a22df5f62791", + "md5_2": "", + "single_end": true + }, + "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" + ], + [ + { + "id": "DRX026011_DRR028935", + "run_accession": "DRR028935", + "experiment_accession": "DRX026011", + "sample_accession": "SAMD00024405", + "secondary_sample_accession": "DRS019431", + "study_accession": "PRJDB3420", + "secondary_study_accession": "DRP002616", + "submission_accession": "DRA002949", + "run_alias": "DRR028935", + "experiment_alias": "DRX026011", + "sample_alias": "SAMD00024405", + "study_alias": "DRP002616", + "library_layout": "PAIRED", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "day0_BbSQE-I", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "194930", + "read_count": "965", + "tax_id": "1202541", + "scientific_name": "Botryococcus braunii Showa", + "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", + "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", + "sample_description": "Liquid culture", + "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", + "fastq_bytes": "60275;61610", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "md5_1": "cc01df82a9354bb6b3be93483b20c35a", + "md5_2": "941c9998d746416dad53c94c480ddf30", + "single_end": false + }, + [ + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" + ] + ], + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "sample_accession": "SAMEA3643867", + "secondary_sample_accession": "ERS951016", + "study_accession": "PRJEB11633", + "secondary_study_accession": "ERP013030", + "submission_accession": "ERA528939", + "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", + "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", + "sample_alias": "sample_56", + "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", + "library_layout": "PAIRED", + "library_selection": "RT-PCR", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "unspecified", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "29700", + "read_count": "169", + "tax_id": "63433", + "scientific_name": "Leptopilina boulardi", + "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing", + "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", + "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_bytes": "3221;8151;8118", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, + [ + "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" + ] + ], + [ + { + "id": "ERX1234253_ERR1160846", + "run_accession": "ERR1160846", + "experiment_accession": "ERX1234253", + "sample_accession": "SAMEA3687214", + "secondary_sample_accession": "ERS994363", + "study_accession": "PRJEB11419", + "secondary_study_accession": "ERP012803", + "submission_accession": "ERA541392", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "study_alias": "qiita_sid_10317", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "10317.BLANK.93.3E.r22", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "35658", + "read_count": "283", + "tax_id": "256318", + "scientific_name": "metagenome", + "sample_title": "10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "study_title": "American Gut Project", + "sample_description": "American Gut control", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_2": "", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "single_end": true + }, + "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" + ], + [ + { + "id": "SRX10940790_SRR14593545", + "run_accession": "SRR14593545", + "experiment_accession": "SRX10940790", + "sample_accession": "SAMN19097423", + "secondary_sample_accession": "SRS9020442", + "study_accession": "PRJNA728650", + "secondary_study_accession": "SRP319413", + "submission_accession": "SRA1234280", + "run_alias": "577-6_530058_19-037147 Goat_F.ab1", + "experiment_alias": "PRNP_2765", + "sample_alias": "prp_2765", + "study_alias": "PRJNA728650", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "PRNP_2765", + "instrument_model": "AB 3500xL Genetic Analyzer", + "instrument_platform": "CAPILLARY", + "base_count": "828", + "read_count": "1", + "tax_id": "9925", + "scientific_name": "Capra hircus", + "sample_title": "MIGS Eukaryotic sample from Capra hircus", + "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", + "study_title": "Capra hircus Raw sequence reads", + "sample_description": "Keywords: GSC:MIxS MIGS:5.0", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" + ] + ], + [ + { + "id": "SRX11047067_SRR14709033", + "run_accession": "SRR14709033", + "experiment_accession": "SRX11047067", + "sample_accession": "SAMN19373034", + "secondary_sample_accession": "SRS9115923", + "study_accession": "PRJNA733285", + "secondary_study_accession": "SRP322267", + "submission_accession": "SRA1239521", + "run_alias": "Sebastes_levis-2.fastq", + "experiment_alias": "Sebastes_macdonaldi-1", + "sample_alias": "S._macdonaldi-1", + "study_alias": "PRJNA733285", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "Sebastes_macdonaldi-1", + "instrument_model": "AB 5500 Genetic Analyzer", + "instrument_platform": "ABI_SOLID", + "base_count": "153", + "read_count": "1", + "tax_id": "394693", + "scientific_name": "Sebastes macdonaldi", + "sample_title": "Sebastes_macdonaldi-1", + "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", + "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", + "sample_description": "Sebastes_macdonaldi-1", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": true + }, + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" + ], + [ + { + "id": "SRX17709227_SRR21711856", + "run_accession": "SRR21711856", + "experiment_accession": "SRX17709227", + "sample_accession": "SAMN31021823", + "secondary_sample_accession": "SRS15239723", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601460_r1", + "experiment_alias": "GSM6601460_r1", + "sample_alias": "GSM6601460", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601460", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "573417800", + "read_count": "11468356", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "sham-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "sham-treated worms in day 5", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_2": "", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "single_end": true + }, + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" + ], + [ + { + "id": "SRX17709228_SRR21711855", + "run_accession": "SRR21711855", + "experiment_accession": "SRX17709228", + "sample_accession": "SAMN31021822", + "secondary_sample_accession": "SRS15239724", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601461_r1", + "experiment_alias": "GSM6601461_r1", + "sample_alias": "GSM6601461", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601461", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "677912850", + "read_count": "13558257", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "PM2.5-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "PM2.5-treated worms in day 5", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_2": "", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "single_end": true + }, + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" + ], + [ + { + "id": "SRX6725035_SRR9984183", + "run_accession": "SRR9984183", + "experiment_accession": "SRX6725035", + "sample_accession": "SAMN12581720", + "secondary_sample_accession": "SRS5277011", + "study_accession": "PRJNA560329", + "secondary_study_accession": "SRP218535", + "submission_accession": "SRA942061", + "run_alias": "Emb289P1_bin131.fastq", + "experiment_alias": "Emb289P1_bin131", + "sample_alias": "Emb289P1_bin131", + "study_alias": "PRJNA560329", + "library_layout": "SINGLE", + "library_selection": "RANDOM", + "library_source": "METAGENOMIC", + "library_strategy": "WGS", + "library_name": "Emb289P1_bin131", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "1996273", + "read_count": "58", + "tax_id": "2660712", + "scientific_name": "Defluviitaleaceae bacterium", + "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", + "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", + "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", + "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", + "fastq_md5": "0b512d2dc31685983456bd56fd836544", + "fastq_bytes": "605358", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_2": "", + "md5_1": "0b512d2dc31685983456bd56fd836544", + "md5_2": "", + "single_end": true + }, + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" + ], + [ + { + "id": "SRX9315476_SRR12848126", + "run_accession": "SRR12848126", + "experiment_accession": "SRX9315476", + "sample_accession": "SAMN16455283", + "secondary_sample_accession": "SRS7540262", + "study_accession": "PRJNA670070", + "secondary_study_accession": "SRP287769", + "submission_accession": "SRA1145417", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "experiment_alias": "F11-N1-05", + "sample_alias": "F11-N1-05", + "study_alias": "PRJNA670070", + "library_layout": "PAIRED", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "library_name": "F11-N1-05", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "base_count": "431758", + "read_count": "2954", + "tax_id": "10092", + "scientific_name": "Mus musculus domesticus", + "sample_title": "Longshanks_F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "sample_description": "F11-N1-05", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" + ] + ], + [ + { + "id": "SRX9504942_SRR13055517", + "run_accession": "SRR13055517", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r1", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2246028", + "read_count": "29553", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", + "fastq_bytes": "721167;723753", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", + "md5_2": "18dbe96e7f58b63406d9058938df1962", + "single_end": false + }, + [ + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" + ] + ], + [ + { + "id": "SRX9504942_SRR13055518", + "run_accession": "SRR13055518", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r2", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2235236", + "read_count": "29411", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", + "fastq_bytes": "717693;723429", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "md5_1": "5ec894d863fcefe394470a0925aefde4", + "md5_2": "aead170df9851773d5202b5760c76d76", + "single_end": false + }, + [ + "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" + ] + ], + [ + { + "id": "SRX9504942_SRR13055519", + "run_accession": "SRR13055519", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r3", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2232728", + "read_count": "29378", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", + "fastq_bytes": "714907;721705", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", + "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", + "single_end": false + }, + [ + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" + ] + ], + [ + { + "id": "SRX9504942_SRR13055520", + "run_accession": "SRR13055520", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r4", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2214488", + "read_count": "29138", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", + "fastq_bytes": "709867;716862", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "md5_1": "795d460abff6009c7f5ff7c14b773fbe", + "md5_2": "c3f34379356b28d6dac7212abc1a0a04", + "single_end": false + }, + [ + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" + ] + ], + [ + { + "id": "SRX9626017_SRR13191702", + "run_accession": "SRR13191702", + "experiment_accession": "SRX9626017", + "sample_accession": "SAMN16980141", + "secondary_sample_accession": "SRS7827211", + "study_accession": "PRJNA682076", + "secondary_study_accession": "SRP295653", + "submission_accession": "SRA1166126", + "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", + "experiment_alias": "S.170804.00784", + "sample_alias": "S.170804.00784_662", + "study_alias": "PRJNA682076", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "S.170804.00784", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "45682", + "read_count": "91", + "tax_id": "408170", + "scientific_name": "human gut metagenome", + "sample_title": "Metagenome or environmental sample from human gut metagenome", + "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "sample_description": "Metagenome or environmental sample from human gut metagenome", + "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", + "fastq_bytes": "15420;16324", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98", + "single_end": false + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + ] + ] + ], + "1": [ + "samplesheet.csv:md5,fcbb1fbe56dc14561ec83e5f6a70ee80" + ], + "2": [ + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + ], + "3": [ + "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + ], + "fastq": [ + [ + { + "id": "DRX024467_DRR026872", + "run_accession": "DRR026872", + "experiment_accession": "DRX024467", + "sample_accession": "SAMD00023098", + "secondary_sample_accession": "DRS033740", + "study_accession": "PRJDB4356", + "secondary_study_accession": "DRP003256", + "submission_accession": "DRA002758", + "run_alias": "DRR026872", + "experiment_alias": "DRX024467", + "sample_alias": "SAMD00023098", + "study_alias": "DRP003256", + "library_layout": "SINGLE", + "library_selection": "Restriction Digest", + "library_source": "GENOMIC", + "library_strategy": "OTHER", + "library_name": "IpeRAD1_3", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "62550", + "read_count": "417", + "tax_id": "35883", + "scientific_name": "Ipomoea nil", + "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", + "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", + "study_title": "The Japanese morning glory genome sequence", + "sample_description": "Keywords: GSC:MIxS MIGS:6.0", + "fastq_md5": "515e5448c55e054113c4a22df5f62791", + "fastq_bytes": "38447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_2": "", + "md5_1": "515e5448c55e054113c4a22df5f62791", + "md5_2": "", + "single_end": true + }, + "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" + ], + [ + { + "id": "DRX026011_DRR028935", + "run_accession": "DRR028935", + "experiment_accession": "DRX026011", + "sample_accession": "SAMD00024405", + "secondary_sample_accession": "DRS019431", + "study_accession": "PRJDB3420", + "secondary_study_accession": "DRP002616", + "submission_accession": "DRA002949", + "run_alias": "DRR028935", + "experiment_alias": "DRX026011", + "sample_alias": "SAMD00024405", + "study_alias": "DRP002616", + "library_layout": "PAIRED", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "day0_BbSQE-I", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "194930", + "read_count": "965", + "tax_id": "1202541", + "scientific_name": "Botryococcus braunii Showa", + "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", + "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", + "sample_description": "Liquid culture", + "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", + "fastq_bytes": "60275;61610", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "md5_1": "cc01df82a9354bb6b3be93483b20c35a", + "md5_2": "941c9998d746416dad53c94c480ddf30", + "single_end": false + }, + [ + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" + ] + ], + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "sample_accession": "SAMEA3643867", + "secondary_sample_accession": "ERS951016", + "study_accession": "PRJEB11633", + "secondary_study_accession": "ERP013030", + "submission_accession": "ERA528939", + "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", + "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", + "sample_alias": "sample_56", + "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", + "library_layout": "PAIRED", + "library_selection": "RT-PCR", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "unspecified", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "29700", + "read_count": "169", + "tax_id": "63433", + "scientific_name": "Leptopilina boulardi", + "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing", + "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", + "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_bytes": "3221;8151;8118", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, + [ + "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" + ] + ], + [ + { + "id": "ERX1234253_ERR1160846", + "run_accession": "ERR1160846", + "experiment_accession": "ERX1234253", + "sample_accession": "SAMEA3687214", + "secondary_sample_accession": "ERS994363", + "study_accession": "PRJEB11419", + "secondary_study_accession": "ERP012803", + "submission_accession": "ERA541392", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "study_alias": "qiita_sid_10317", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "10317.BLANK.93.3E.r22", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "35658", + "read_count": "283", + "tax_id": "256318", + "scientific_name": "metagenome", + "sample_title": "10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "study_title": "American Gut Project", + "sample_description": "American Gut control", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_2": "", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "single_end": true + }, + "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" + ], + [ + { + "id": "SRX10940790_SRR14593545", + "run_accession": "SRR14593545", + "experiment_accession": "SRX10940790", + "sample_accession": "SAMN19097423", + "secondary_sample_accession": "SRS9020442", + "study_accession": "PRJNA728650", + "secondary_study_accession": "SRP319413", + "submission_accession": "SRA1234280", + "run_alias": "577-6_530058_19-037147 Goat_F.ab1", + "experiment_alias": "PRNP_2765", + "sample_alias": "prp_2765", + "study_alias": "PRJNA728650", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "PRNP_2765", + "instrument_model": "AB 3500xL Genetic Analyzer", + "instrument_platform": "CAPILLARY", + "base_count": "828", + "read_count": "1", + "tax_id": "9925", + "scientific_name": "Capra hircus", + "sample_title": "MIGS Eukaryotic sample from Capra hircus", + "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", + "study_title": "Capra hircus Raw sequence reads", + "sample_description": "Keywords: GSC:MIxS MIGS:5.0", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" + ] + ], + [ + { + "id": "SRX11047067_SRR14709033", + "run_accession": "SRR14709033", + "experiment_accession": "SRX11047067", + "sample_accession": "SAMN19373034", + "secondary_sample_accession": "SRS9115923", + "study_accession": "PRJNA733285", + "secondary_study_accession": "SRP322267", + "submission_accession": "SRA1239521", + "run_alias": "Sebastes_levis-2.fastq", + "experiment_alias": "Sebastes_macdonaldi-1", + "sample_alias": "S._macdonaldi-1", + "study_alias": "PRJNA733285", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "Sebastes_macdonaldi-1", + "instrument_model": "AB 5500 Genetic Analyzer", + "instrument_platform": "ABI_SOLID", + "base_count": "153", + "read_count": "1", + "tax_id": "394693", + "scientific_name": "Sebastes macdonaldi", + "sample_title": "Sebastes_macdonaldi-1", + "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", + "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", + "sample_description": "Sebastes_macdonaldi-1", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": true + }, + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" + ], + [ + { + "id": "SRX17709227_SRR21711856", + "run_accession": "SRR21711856", + "experiment_accession": "SRX17709227", + "sample_accession": "SAMN31021823", + "secondary_sample_accession": "SRS15239723", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601460_r1", + "experiment_alias": "GSM6601460_r1", + "sample_alias": "GSM6601460", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601460", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "573417800", + "read_count": "11468356", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "sham-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "sham-treated worms in day 5", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_2": "", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "single_end": true + }, + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" + ], + [ + { + "id": "SRX17709228_SRR21711855", + "run_accession": "SRR21711855", + "experiment_accession": "SRX17709228", + "sample_accession": "SAMN31021822", + "secondary_sample_accession": "SRS15239724", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601461_r1", + "experiment_alias": "GSM6601461_r1", + "sample_alias": "GSM6601461", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601461", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "677912850", + "read_count": "13558257", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "PM2.5-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "PM2.5-treated worms in day 5", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_2": "", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "single_end": true + }, + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" + ], + [ + { + "id": "SRX6725035_SRR9984183", + "run_accession": "SRR9984183", + "experiment_accession": "SRX6725035", + "sample_accession": "SAMN12581720", + "secondary_sample_accession": "SRS5277011", + "study_accession": "PRJNA560329", + "secondary_study_accession": "SRP218535", + "submission_accession": "SRA942061", + "run_alias": "Emb289P1_bin131.fastq", + "experiment_alias": "Emb289P1_bin131", + "sample_alias": "Emb289P1_bin131", + "study_alias": "PRJNA560329", + "library_layout": "SINGLE", + "library_selection": "RANDOM", + "library_source": "METAGENOMIC", + "library_strategy": "WGS", + "library_name": "Emb289P1_bin131", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "1996273", + "read_count": "58", + "tax_id": "2660712", + "scientific_name": "Defluviitaleaceae bacterium", + "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", + "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", + "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", + "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", + "fastq_md5": "0b512d2dc31685983456bd56fd836544", + "fastq_bytes": "605358", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_2": "", + "md5_1": "0b512d2dc31685983456bd56fd836544", + "md5_2": "", + "single_end": true + }, + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" + ], + [ + { + "id": "SRX9315476_SRR12848126", + "run_accession": "SRR12848126", + "experiment_accession": "SRX9315476", + "sample_accession": "SAMN16455283", + "secondary_sample_accession": "SRS7540262", + "study_accession": "PRJNA670070", + "secondary_study_accession": "SRP287769", + "submission_accession": "SRA1145417", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "experiment_alias": "F11-N1-05", + "sample_alias": "F11-N1-05", + "study_alias": "PRJNA670070", + "library_layout": "PAIRED", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "library_name": "F11-N1-05", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "base_count": "431758", + "read_count": "2954", + "tax_id": "10092", + "scientific_name": "Mus musculus domesticus", + "sample_title": "Longshanks_F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "sample_description": "F11-N1-05", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" + ] + ], + [ + { + "id": "SRX9504942_SRR13055517", + "run_accession": "SRR13055517", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r1", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2246028", + "read_count": "29553", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", + "fastq_bytes": "721167;723753", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", + "md5_2": "18dbe96e7f58b63406d9058938df1962", + "single_end": false + }, + [ + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" + ] + ], + [ + { + "id": "SRX9504942_SRR13055518", + "run_accession": "SRR13055518", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r2", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2235236", + "read_count": "29411", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", + "fastq_bytes": "717693;723429", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "md5_1": "5ec894d863fcefe394470a0925aefde4", + "md5_2": "aead170df9851773d5202b5760c76d76", + "single_end": false + }, + [ + "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" + ] + ], + [ + { + "id": "SRX9504942_SRR13055519", + "run_accession": "SRR13055519", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r3", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2232728", + "read_count": "29378", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", + "fastq_bytes": "714907;721705", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", + "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", + "single_end": false + }, + [ + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" + ] + ], + [ + { + "id": "SRX9504942_SRR13055520", + "run_accession": "SRR13055520", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r4", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2214488", + "read_count": "29138", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", + "fastq_bytes": "709867;716862", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "md5_1": "795d460abff6009c7f5ff7c14b773fbe", + "md5_2": "c3f34379356b28d6dac7212abc1a0a04", + "single_end": false + }, + [ + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" + ] + ], + [ + { + "id": "SRX9626017_SRR13191702", + "run_accession": "SRR13191702", + "experiment_accession": "SRX9626017", + "sample_accession": "SAMN16980141", + "secondary_sample_accession": "SRS7827211", + "study_accession": "PRJNA682076", + "secondary_study_accession": "SRP295653", + "submission_accession": "SRA1166126", + "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", + "experiment_alias": "S.170804.00784", + "sample_alias": "S.170804.00784_662", + "study_alias": "PRJNA682076", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "S.170804.00784", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "45682", + "read_count": "91", + "tax_id": "408170", + "scientific_name": "human gut metagenome", + "sample_title": "Metagenome or environmental sample from human gut metagenome", + "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "sample_description": "Metagenome or environmental sample from human gut metagenome", + "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", + "fastq_bytes": "15420;16324", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98", + "single_end": false + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + ] + ] + ], + "mappings": [ + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + ], + "samplesheet": [ + "samplesheet.csv:md5,fcbb1fbe56dc14561ec83e5f6a70ee80" + ], + "versions": [ + "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + ] + } + ], + "timestamp": "2023-09-11T18:51:38.198125" + } +} \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test new file mode 100644 index 00000000..e00793cd --- /dev/null +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test @@ -0,0 +1,31 @@ +nextflow_workflow { + + name "Test workflow: sra/main.nf" + script "workflows/sra/main.nf" + workflow "SRA" + tag "workflows" + tag "workflows_sra" + tag "sra_nf_core_pipeline_taxprofiler" + + test("Parameters: --nf_core_pipeline taxprofiler") { + + when { + workflow { + """ + input[0] = Channel.from('DRR026872','DRR028935','ERR1109373','ERR1160846','GSE214215','GSM4907283','SRR12848126','SRR13191702','SRR14593545','SRR14709033','SRR9984183') + """ + } + params { + outdir = "results" + nf_core_pipeline = "taxprofiler" + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match() } + ) + } + } +} diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap new file mode 100644 index 00000000..b63ad4b7 --- /dev/null +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap @@ -0,0 +1,1353 @@ +{ + "Parameters: --nf_core_pipeline taxprofiler": { + "content": [ + { + "0": [ + [ + { + "id": "DRX024467_DRR026872", + "run_accession": "DRR026872", + "experiment_accession": "DRX024467", + "sample_accession": "SAMD00023098", + "secondary_sample_accession": "DRS033740", + "study_accession": "PRJDB4356", + "secondary_study_accession": "DRP003256", + "submission_accession": "DRA002758", + "run_alias": "DRR026872", + "experiment_alias": "DRX024467", + "sample_alias": "SAMD00023098", + "study_alias": "DRP003256", + "library_layout": "SINGLE", + "library_selection": "Restriction Digest", + "library_source": "GENOMIC", + "library_strategy": "OTHER", + "library_name": "IpeRAD1_3", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "62550", + "read_count": "417", + "tax_id": "35883", + "scientific_name": "Ipomoea nil", + "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", + "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", + "study_title": "The Japanese morning glory genome sequence", + "sample_description": "Keywords: GSC:MIxS MIGS:6.0", + "fastq_md5": "515e5448c55e054113c4a22df5f62791", + "fastq_bytes": "38447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_2": "", + "md5_1": "515e5448c55e054113c4a22df5f62791", + "md5_2": "", + "single_end": true + }, + "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" + ], + [ + { + "id": "DRX026011_DRR028935", + "run_accession": "DRR028935", + "experiment_accession": "DRX026011", + "sample_accession": "SAMD00024405", + "secondary_sample_accession": "DRS019431", + "study_accession": "PRJDB3420", + "secondary_study_accession": "DRP002616", + "submission_accession": "DRA002949", + "run_alias": "DRR028935", + "experiment_alias": "DRX026011", + "sample_alias": "SAMD00024405", + "study_alias": "DRP002616", + "library_layout": "PAIRED", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "day0_BbSQE-I", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "194930", + "read_count": "965", + "tax_id": "1202541", + "scientific_name": "Botryococcus braunii Showa", + "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", + "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", + "sample_description": "Liquid culture", + "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", + "fastq_bytes": "60275;61610", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "md5_1": "cc01df82a9354bb6b3be93483b20c35a", + "md5_2": "941c9998d746416dad53c94c480ddf30", + "single_end": false + }, + [ + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" + ] + ], + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "sample_accession": "SAMEA3643867", + "secondary_sample_accession": "ERS951016", + "study_accession": "PRJEB11633", + "secondary_study_accession": "ERP013030", + "submission_accession": "ERA528939", + "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", + "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", + "sample_alias": "sample_56", + "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", + "library_layout": "PAIRED", + "library_selection": "RT-PCR", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "unspecified", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "29700", + "read_count": "169", + "tax_id": "63433", + "scientific_name": "Leptopilina boulardi", + "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing", + "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", + "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_bytes": "3221;8151;8118", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, + [ + "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" + ] + ], + [ + { + "id": "ERX1234253_ERR1160846", + "run_accession": "ERR1160846", + "experiment_accession": "ERX1234253", + "sample_accession": "SAMEA3687214", + "secondary_sample_accession": "ERS994363", + "study_accession": "PRJEB11419", + "secondary_study_accession": "ERP012803", + "submission_accession": "ERA541392", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "study_alias": "qiita_sid_10317", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "10317.BLANK.93.3E.r22", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "35658", + "read_count": "283", + "tax_id": "256318", + "scientific_name": "metagenome", + "sample_title": "10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "study_title": "American Gut Project", + "sample_description": "American Gut control", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_2": "", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "single_end": true + }, + "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" + ], + [ + { + "id": "SRX10940790_SRR14593545", + "run_accession": "SRR14593545", + "experiment_accession": "SRX10940790", + "sample_accession": "SAMN19097423", + "secondary_sample_accession": "SRS9020442", + "study_accession": "PRJNA728650", + "secondary_study_accession": "SRP319413", + "submission_accession": "SRA1234280", + "run_alias": "577-6_530058_19-037147 Goat_F.ab1", + "experiment_alias": "PRNP_2765", + "sample_alias": "prp_2765", + "study_alias": "PRJNA728650", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "PRNP_2765", + "instrument_model": "AB 3500xL Genetic Analyzer", + "instrument_platform": "CAPILLARY", + "base_count": "828", + "read_count": "1", + "tax_id": "9925", + "scientific_name": "Capra hircus", + "sample_title": "MIGS Eukaryotic sample from Capra hircus", + "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", + "study_title": "Capra hircus Raw sequence reads", + "sample_description": "Keywords: GSC:MIxS MIGS:5.0", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" + ] + ], + [ + { + "id": "SRX11047067_SRR14709033", + "run_accession": "SRR14709033", + "experiment_accession": "SRX11047067", + "sample_accession": "SAMN19373034", + "secondary_sample_accession": "SRS9115923", + "study_accession": "PRJNA733285", + "secondary_study_accession": "SRP322267", + "submission_accession": "SRA1239521", + "run_alias": "Sebastes_levis-2.fastq", + "experiment_alias": "Sebastes_macdonaldi-1", + "sample_alias": "S._macdonaldi-1", + "study_alias": "PRJNA733285", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "Sebastes_macdonaldi-1", + "instrument_model": "AB 5500 Genetic Analyzer", + "instrument_platform": "ABI_SOLID", + "base_count": "153", + "read_count": "1", + "tax_id": "394693", + "scientific_name": "Sebastes macdonaldi", + "sample_title": "Sebastes_macdonaldi-1", + "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", + "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", + "sample_description": "Sebastes_macdonaldi-1", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": true + }, + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" + ], + [ + { + "id": "SRX17709227_SRR21711856", + "run_accession": "SRR21711856", + "experiment_accession": "SRX17709227", + "sample_accession": "SAMN31021823", + "secondary_sample_accession": "SRS15239723", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601460_r1", + "experiment_alias": "GSM6601460_r1", + "sample_alias": "GSM6601460", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601460", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "573417800", + "read_count": "11468356", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "sham-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "sham-treated worms in day 5", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_2": "", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "single_end": true + }, + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" + ], + [ + { + "id": "SRX17709228_SRR21711855", + "run_accession": "SRR21711855", + "experiment_accession": "SRX17709228", + "sample_accession": "SAMN31021822", + "secondary_sample_accession": "SRS15239724", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601461_r1", + "experiment_alias": "GSM6601461_r1", + "sample_alias": "GSM6601461", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601461", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "677912850", + "read_count": "13558257", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "PM2.5-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "PM2.5-treated worms in day 5", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_2": "", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "single_end": true + }, + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" + ], + [ + { + "id": "SRX6725035_SRR9984183", + "run_accession": "SRR9984183", + "experiment_accession": "SRX6725035", + "sample_accession": "SAMN12581720", + "secondary_sample_accession": "SRS5277011", + "study_accession": "PRJNA560329", + "secondary_study_accession": "SRP218535", + "submission_accession": "SRA942061", + "run_alias": "Emb289P1_bin131.fastq", + "experiment_alias": "Emb289P1_bin131", + "sample_alias": "Emb289P1_bin131", + "study_alias": "PRJNA560329", + "library_layout": "SINGLE", + "library_selection": "RANDOM", + "library_source": "METAGENOMIC", + "library_strategy": "WGS", + "library_name": "Emb289P1_bin131", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "1996273", + "read_count": "58", + "tax_id": "2660712", + "scientific_name": "Defluviitaleaceae bacterium", + "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", + "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", + "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", + "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", + "fastq_md5": "0b512d2dc31685983456bd56fd836544", + "fastq_bytes": "605358", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_2": "", + "md5_1": "0b512d2dc31685983456bd56fd836544", + "md5_2": "", + "single_end": true + }, + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" + ], + [ + { + "id": "SRX9315476_SRR12848126", + "run_accession": "SRR12848126", + "experiment_accession": "SRX9315476", + "sample_accession": "SAMN16455283", + "secondary_sample_accession": "SRS7540262", + "study_accession": "PRJNA670070", + "secondary_study_accession": "SRP287769", + "submission_accession": "SRA1145417", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "experiment_alias": "F11-N1-05", + "sample_alias": "F11-N1-05", + "study_alias": "PRJNA670070", + "library_layout": "PAIRED", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "library_name": "F11-N1-05", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "base_count": "431758", + "read_count": "2954", + "tax_id": "10092", + "scientific_name": "Mus musculus domesticus", + "sample_title": "Longshanks_F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "sample_description": "F11-N1-05", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" + ] + ], + [ + { + "id": "SRX9504942_SRR13055517", + "run_accession": "SRR13055517", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r1", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2246028", + "read_count": "29553", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", + "fastq_bytes": "721167;723753", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", + "md5_2": "18dbe96e7f58b63406d9058938df1962", + "single_end": false + }, + [ + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" + ] + ], + [ + { + "id": "SRX9504942_SRR13055518", + "run_accession": "SRR13055518", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r2", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2235236", + "read_count": "29411", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", + "fastq_bytes": "717693;723429", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "md5_1": "5ec894d863fcefe394470a0925aefde4", + "md5_2": "aead170df9851773d5202b5760c76d76", + "single_end": false + }, + [ + "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" + ] + ], + [ + { + "id": "SRX9504942_SRR13055519", + "run_accession": "SRR13055519", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r3", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2232728", + "read_count": "29378", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", + "fastq_bytes": "714907;721705", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", + "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", + "single_end": false + }, + [ + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" + ] + ], + [ + { + "id": "SRX9504942_SRR13055520", + "run_accession": "SRR13055520", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r4", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2214488", + "read_count": "29138", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", + "fastq_bytes": "709867;716862", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "md5_1": "795d460abff6009c7f5ff7c14b773fbe", + "md5_2": "c3f34379356b28d6dac7212abc1a0a04", + "single_end": false + }, + [ + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" + ] + ], + [ + { + "id": "SRX9626017_SRR13191702", + "run_accession": "SRR13191702", + "experiment_accession": "SRX9626017", + "sample_accession": "SAMN16980141", + "secondary_sample_accession": "SRS7827211", + "study_accession": "PRJNA682076", + "secondary_study_accession": "SRP295653", + "submission_accession": "SRA1166126", + "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", + "experiment_alias": "S.170804.00784", + "sample_alias": "S.170804.00784_662", + "study_alias": "PRJNA682076", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "S.170804.00784", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "45682", + "read_count": "91", + "tax_id": "408170", + "scientific_name": "human gut metagenome", + "sample_title": "Metagenome or environmental sample from human gut metagenome", + "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "sample_description": "Metagenome or environmental sample from human gut metagenome", + "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", + "fastq_bytes": "15420;16324", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98", + "single_end": false + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + ] + ] + ], + "1": [ + "samplesheet.csv:md5,0df1f60a9b5bc94f8a85e96edcc90f5c" + ], + "2": [ + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + ], + "3": [ + "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + ], + "fastq": [ + [ + { + "id": "DRX024467_DRR026872", + "run_accession": "DRR026872", + "experiment_accession": "DRX024467", + "sample_accession": "SAMD00023098", + "secondary_sample_accession": "DRS033740", + "study_accession": "PRJDB4356", + "secondary_study_accession": "DRP003256", + "submission_accession": "DRA002758", + "run_alias": "DRR026872", + "experiment_alias": "DRX024467", + "sample_alias": "SAMD00023098", + "study_alias": "DRP003256", + "library_layout": "SINGLE", + "library_selection": "Restriction Digest", + "library_source": "GENOMIC", + "library_strategy": "OTHER", + "library_name": "IpeRAD1_3", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "62550", + "read_count": "417", + "tax_id": "35883", + "scientific_name": "Ipomoea nil", + "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", + "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", + "study_title": "The Japanese morning glory genome sequence", + "sample_description": "Keywords: GSC:MIxS MIGS:6.0", + "fastq_md5": "515e5448c55e054113c4a22df5f62791", + "fastq_bytes": "38447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_2": "", + "md5_1": "515e5448c55e054113c4a22df5f62791", + "md5_2": "", + "single_end": true + }, + "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" + ], + [ + { + "id": "DRX026011_DRR028935", + "run_accession": "DRR028935", + "experiment_accession": "DRX026011", + "sample_accession": "SAMD00024405", + "secondary_sample_accession": "DRS019431", + "study_accession": "PRJDB3420", + "secondary_study_accession": "DRP002616", + "submission_accession": "DRA002949", + "run_alias": "DRR028935", + "experiment_alias": "DRX026011", + "sample_alias": "SAMD00024405", + "study_alias": "DRP002616", + "library_layout": "PAIRED", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "day0_BbSQE-I", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "194930", + "read_count": "965", + "tax_id": "1202541", + "scientific_name": "Botryococcus braunii Showa", + "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", + "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", + "sample_description": "Liquid culture", + "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", + "fastq_bytes": "60275;61610", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "md5_1": "cc01df82a9354bb6b3be93483b20c35a", + "md5_2": "941c9998d746416dad53c94c480ddf30", + "single_end": false + }, + [ + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" + ] + ], + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "sample_accession": "SAMEA3643867", + "secondary_sample_accession": "ERS951016", + "study_accession": "PRJEB11633", + "secondary_study_accession": "ERP013030", + "submission_accession": "ERA528939", + "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", + "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", + "sample_alias": "sample_56", + "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", + "library_layout": "PAIRED", + "library_selection": "RT-PCR", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "unspecified", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "29700", + "read_count": "169", + "tax_id": "63433", + "scientific_name": "Leptopilina boulardi", + "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing", + "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", + "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_bytes": "3221;8151;8118", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, + [ + "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" + ] + ], + [ + { + "id": "ERX1234253_ERR1160846", + "run_accession": "ERR1160846", + "experiment_accession": "ERX1234253", + "sample_accession": "SAMEA3687214", + "secondary_sample_accession": "ERS994363", + "study_accession": "PRJEB11419", + "secondary_study_accession": "ERP012803", + "submission_accession": "ERA541392", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "study_alias": "qiita_sid_10317", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "10317.BLANK.93.3E.r22", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "35658", + "read_count": "283", + "tax_id": "256318", + "scientific_name": "metagenome", + "sample_title": "10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "study_title": "American Gut Project", + "sample_description": "American Gut control", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_2": "", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "single_end": true + }, + "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" + ], + [ + { + "id": "SRX10940790_SRR14593545", + "run_accession": "SRR14593545", + "experiment_accession": "SRX10940790", + "sample_accession": "SAMN19097423", + "secondary_sample_accession": "SRS9020442", + "study_accession": "PRJNA728650", + "secondary_study_accession": "SRP319413", + "submission_accession": "SRA1234280", + "run_alias": "577-6_530058_19-037147 Goat_F.ab1", + "experiment_alias": "PRNP_2765", + "sample_alias": "prp_2765", + "study_alias": "PRJNA728650", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "PRNP_2765", + "instrument_model": "AB 3500xL Genetic Analyzer", + "instrument_platform": "CAPILLARY", + "base_count": "828", + "read_count": "1", + "tax_id": "9925", + "scientific_name": "Capra hircus", + "sample_title": "MIGS Eukaryotic sample from Capra hircus", + "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", + "study_title": "Capra hircus Raw sequence reads", + "sample_description": "Keywords: GSC:MIxS MIGS:5.0", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" + ] + ], + [ + { + "id": "SRX11047067_SRR14709033", + "run_accession": "SRR14709033", + "experiment_accession": "SRX11047067", + "sample_accession": "SAMN19373034", + "secondary_sample_accession": "SRS9115923", + "study_accession": "PRJNA733285", + "secondary_study_accession": "SRP322267", + "submission_accession": "SRA1239521", + "run_alias": "Sebastes_levis-2.fastq", + "experiment_alias": "Sebastes_macdonaldi-1", + "sample_alias": "S._macdonaldi-1", + "study_alias": "PRJNA733285", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "Sebastes_macdonaldi-1", + "instrument_model": "AB 5500 Genetic Analyzer", + "instrument_platform": "ABI_SOLID", + "base_count": "153", + "read_count": "1", + "tax_id": "394693", + "scientific_name": "Sebastes macdonaldi", + "sample_title": "Sebastes_macdonaldi-1", + "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", + "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", + "sample_description": "Sebastes_macdonaldi-1", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": true + }, + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" + ], + [ + { + "id": "SRX17709227_SRR21711856", + "run_accession": "SRR21711856", + "experiment_accession": "SRX17709227", + "sample_accession": "SAMN31021823", + "secondary_sample_accession": "SRS15239723", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601460_r1", + "experiment_alias": "GSM6601460_r1", + "sample_alias": "GSM6601460", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601460", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "573417800", + "read_count": "11468356", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "sham-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "sham-treated worms in day 5", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_2": "", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "single_end": true + }, + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" + ], + [ + { + "id": "SRX17709228_SRR21711855", + "run_accession": "SRR21711855", + "experiment_accession": "SRX17709228", + "sample_accession": "SAMN31021822", + "secondary_sample_accession": "SRS15239724", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601461_r1", + "experiment_alias": "GSM6601461_r1", + "sample_alias": "GSM6601461", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601461", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "677912850", + "read_count": "13558257", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "PM2.5-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "PM2.5-treated worms in day 5", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_2": "", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "single_end": true + }, + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" + ], + [ + { + "id": "SRX6725035_SRR9984183", + "run_accession": "SRR9984183", + "experiment_accession": "SRX6725035", + "sample_accession": "SAMN12581720", + "secondary_sample_accession": "SRS5277011", + "study_accession": "PRJNA560329", + "secondary_study_accession": "SRP218535", + "submission_accession": "SRA942061", + "run_alias": "Emb289P1_bin131.fastq", + "experiment_alias": "Emb289P1_bin131", + "sample_alias": "Emb289P1_bin131", + "study_alias": "PRJNA560329", + "library_layout": "SINGLE", + "library_selection": "RANDOM", + "library_source": "METAGENOMIC", + "library_strategy": "WGS", + "library_name": "Emb289P1_bin131", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "1996273", + "read_count": "58", + "tax_id": "2660712", + "scientific_name": "Defluviitaleaceae bacterium", + "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", + "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", + "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", + "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", + "fastq_md5": "0b512d2dc31685983456bd56fd836544", + "fastq_bytes": "605358", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_2": "", + "md5_1": "0b512d2dc31685983456bd56fd836544", + "md5_2": "", + "single_end": true + }, + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" + ], + [ + { + "id": "SRX9315476_SRR12848126", + "run_accession": "SRR12848126", + "experiment_accession": "SRX9315476", + "sample_accession": "SAMN16455283", + "secondary_sample_accession": "SRS7540262", + "study_accession": "PRJNA670070", + "secondary_study_accession": "SRP287769", + "submission_accession": "SRA1145417", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "experiment_alias": "F11-N1-05", + "sample_alias": "F11-N1-05", + "study_alias": "PRJNA670070", + "library_layout": "PAIRED", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "library_name": "F11-N1-05", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "base_count": "431758", + "read_count": "2954", + "tax_id": "10092", + "scientific_name": "Mus musculus domesticus", + "sample_title": "Longshanks_F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "sample_description": "F11-N1-05", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" + ] + ], + [ + { + "id": "SRX9504942_SRR13055517", + "run_accession": "SRR13055517", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r1", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2246028", + "read_count": "29553", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", + "fastq_bytes": "721167;723753", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", + "md5_2": "18dbe96e7f58b63406d9058938df1962", + "single_end": false + }, + [ + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" + ] + ], + [ + { + "id": "SRX9504942_SRR13055518", + "run_accession": "SRR13055518", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r2", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2235236", + "read_count": "29411", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", + "fastq_bytes": "717693;723429", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "md5_1": "5ec894d863fcefe394470a0925aefde4", + "md5_2": "aead170df9851773d5202b5760c76d76", + "single_end": false + }, + [ + "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" + ] + ], + [ + { + "id": "SRX9504942_SRR13055519", + "run_accession": "SRR13055519", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r3", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2232728", + "read_count": "29378", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", + "fastq_bytes": "714907;721705", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", + "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", + "single_end": false + }, + [ + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" + ] + ], + [ + { + "id": "SRX9504942_SRR13055520", + "run_accession": "SRR13055520", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r4", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2214488", + "read_count": "29138", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", + "fastq_bytes": "709867;716862", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "md5_1": "795d460abff6009c7f5ff7c14b773fbe", + "md5_2": "c3f34379356b28d6dac7212abc1a0a04", + "single_end": false + }, + [ + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" + ] + ], + [ + { + "id": "SRX9626017_SRR13191702", + "run_accession": "SRR13191702", + "experiment_accession": "SRX9626017", + "sample_accession": "SAMN16980141", + "secondary_sample_accession": "SRS7827211", + "study_accession": "PRJNA682076", + "secondary_study_accession": "SRP295653", + "submission_accession": "SRA1166126", + "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", + "experiment_alias": "S.170804.00784", + "sample_alias": "S.170804.00784_662", + "study_alias": "PRJNA682076", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "S.170804.00784", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "45682", + "read_count": "91", + "tax_id": "408170", + "scientific_name": "human gut metagenome", + "sample_title": "Metagenome or environmental sample from human gut metagenome", + "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "sample_description": "Metagenome or environmental sample from human gut metagenome", + "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", + "fastq_bytes": "15420;16324", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98", + "single_end": false + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + ] + ] + ], + "mappings": [ + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + ], + "samplesheet": [ + "samplesheet.csv:md5,0df1f60a9b5bc94f8a85e96edcc90f5c" + ], + "versions": [ + "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + ] + } + ], + "timestamp": "2023-09-11T18:44:02.293186" + } +} \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test new file mode 100644 index 00000000..045e0363 --- /dev/null +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test @@ -0,0 +1,31 @@ +nextflow_workflow { + + name "Test workflow: sra/main.nf" + script "workflows/sra/main.nf" + workflow "SRA" + tag "workflows" + tag "workflows_sra" + tag "sra_nf_core_pipeline_viralrecon" + + test("Parameters: --nf_core_pipeline viralrecon") { + + when { + workflow { + """ + input[0] = Channel.from('DRR026872','DRR028935','ERR1109373','ERR1160846','GSE214215','GSM4907283','SRR12848126','SRR13191702','SRR14593545','SRR14709033','SRR9984183') + """ + } + params { + outdir = "results" + nf_core_pipeline = "viralrecon" + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match() } + ) + } + } +} diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap new file mode 100644 index 00000000..1387f422 --- /dev/null +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap @@ -0,0 +1,1353 @@ +{ + "Parameters: --nf_core_pipeline viralrecon": { + "content": [ + { + "0": [ + [ + { + "id": "DRX024467_DRR026872", + "run_accession": "DRR026872", + "experiment_accession": "DRX024467", + "sample_accession": "SAMD00023098", + "secondary_sample_accession": "DRS033740", + "study_accession": "PRJDB4356", + "secondary_study_accession": "DRP003256", + "submission_accession": "DRA002758", + "run_alias": "DRR026872", + "experiment_alias": "DRX024467", + "sample_alias": "SAMD00023098", + "study_alias": "DRP003256", + "library_layout": "SINGLE", + "library_selection": "Restriction Digest", + "library_source": "GENOMIC", + "library_strategy": "OTHER", + "library_name": "IpeRAD1_3", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "62550", + "read_count": "417", + "tax_id": "35883", + "scientific_name": "Ipomoea nil", + "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", + "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", + "study_title": "The Japanese morning glory genome sequence", + "sample_description": "Keywords: GSC:MIxS MIGS:6.0", + "fastq_md5": "515e5448c55e054113c4a22df5f62791", + "fastq_bytes": "38447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_2": "", + "md5_1": "515e5448c55e054113c4a22df5f62791", + "md5_2": "", + "single_end": true + }, + "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" + ], + [ + { + "id": "DRX026011_DRR028935", + "run_accession": "DRR028935", + "experiment_accession": "DRX026011", + "sample_accession": "SAMD00024405", + "secondary_sample_accession": "DRS019431", + "study_accession": "PRJDB3420", + "secondary_study_accession": "DRP002616", + "submission_accession": "DRA002949", + "run_alias": "DRR028935", + "experiment_alias": "DRX026011", + "sample_alias": "SAMD00024405", + "study_alias": "DRP002616", + "library_layout": "PAIRED", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "day0_BbSQE-I", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "194930", + "read_count": "965", + "tax_id": "1202541", + "scientific_name": "Botryococcus braunii Showa", + "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", + "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", + "sample_description": "Liquid culture", + "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", + "fastq_bytes": "60275;61610", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "md5_1": "cc01df82a9354bb6b3be93483b20c35a", + "md5_2": "941c9998d746416dad53c94c480ddf30", + "single_end": false + }, + [ + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" + ] + ], + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "sample_accession": "SAMEA3643867", + "secondary_sample_accession": "ERS951016", + "study_accession": "PRJEB11633", + "secondary_study_accession": "ERP013030", + "submission_accession": "ERA528939", + "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", + "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", + "sample_alias": "sample_56", + "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", + "library_layout": "PAIRED", + "library_selection": "RT-PCR", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "unspecified", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "29700", + "read_count": "169", + "tax_id": "63433", + "scientific_name": "Leptopilina boulardi", + "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing", + "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", + "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_bytes": "3221;8151;8118", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, + [ + "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" + ] + ], + [ + { + "id": "ERX1234253_ERR1160846", + "run_accession": "ERR1160846", + "experiment_accession": "ERX1234253", + "sample_accession": "SAMEA3687214", + "secondary_sample_accession": "ERS994363", + "study_accession": "PRJEB11419", + "secondary_study_accession": "ERP012803", + "submission_accession": "ERA541392", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "study_alias": "qiita_sid_10317", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "10317.BLANK.93.3E.r22", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "35658", + "read_count": "283", + "tax_id": "256318", + "scientific_name": "metagenome", + "sample_title": "10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "study_title": "American Gut Project", + "sample_description": "American Gut control", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_2": "", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "single_end": true + }, + "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" + ], + [ + { + "id": "SRX10940790_SRR14593545", + "run_accession": "SRR14593545", + "experiment_accession": "SRX10940790", + "sample_accession": "SAMN19097423", + "secondary_sample_accession": "SRS9020442", + "study_accession": "PRJNA728650", + "secondary_study_accession": "SRP319413", + "submission_accession": "SRA1234280", + "run_alias": "577-6_530058_19-037147 Goat_F.ab1", + "experiment_alias": "PRNP_2765", + "sample_alias": "prp_2765", + "study_alias": "PRJNA728650", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "PRNP_2765", + "instrument_model": "AB 3500xL Genetic Analyzer", + "instrument_platform": "CAPILLARY", + "base_count": "828", + "read_count": "1", + "tax_id": "9925", + "scientific_name": "Capra hircus", + "sample_title": "MIGS Eukaryotic sample from Capra hircus", + "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", + "study_title": "Capra hircus Raw sequence reads", + "sample_description": "Keywords: GSC:MIxS MIGS:5.0", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" + ] + ], + [ + { + "id": "SRX11047067_SRR14709033", + "run_accession": "SRR14709033", + "experiment_accession": "SRX11047067", + "sample_accession": "SAMN19373034", + "secondary_sample_accession": "SRS9115923", + "study_accession": "PRJNA733285", + "secondary_study_accession": "SRP322267", + "submission_accession": "SRA1239521", + "run_alias": "Sebastes_levis-2.fastq", + "experiment_alias": "Sebastes_macdonaldi-1", + "sample_alias": "S._macdonaldi-1", + "study_alias": "PRJNA733285", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "Sebastes_macdonaldi-1", + "instrument_model": "AB 5500 Genetic Analyzer", + "instrument_platform": "ABI_SOLID", + "base_count": "153", + "read_count": "1", + "tax_id": "394693", + "scientific_name": "Sebastes macdonaldi", + "sample_title": "Sebastes_macdonaldi-1", + "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", + "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", + "sample_description": "Sebastes_macdonaldi-1", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": true + }, + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" + ], + [ + { + "id": "SRX17709227_SRR21711856", + "run_accession": "SRR21711856", + "experiment_accession": "SRX17709227", + "sample_accession": "SAMN31021823", + "secondary_sample_accession": "SRS15239723", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601460_r1", + "experiment_alias": "GSM6601460_r1", + "sample_alias": "GSM6601460", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601460", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "573417800", + "read_count": "11468356", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "sham-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "sham-treated worms in day 5", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_2": "", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "single_end": true + }, + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" + ], + [ + { + "id": "SRX17709228_SRR21711855", + "run_accession": "SRR21711855", + "experiment_accession": "SRX17709228", + "sample_accession": "SAMN31021822", + "secondary_sample_accession": "SRS15239724", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601461_r1", + "experiment_alias": "GSM6601461_r1", + "sample_alias": "GSM6601461", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601461", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "677912850", + "read_count": "13558257", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "PM2.5-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "PM2.5-treated worms in day 5", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_2": "", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "single_end": true + }, + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" + ], + [ + { + "id": "SRX6725035_SRR9984183", + "run_accession": "SRR9984183", + "experiment_accession": "SRX6725035", + "sample_accession": "SAMN12581720", + "secondary_sample_accession": "SRS5277011", + "study_accession": "PRJNA560329", + "secondary_study_accession": "SRP218535", + "submission_accession": "SRA942061", + "run_alias": "Emb289P1_bin131.fastq", + "experiment_alias": "Emb289P1_bin131", + "sample_alias": "Emb289P1_bin131", + "study_alias": "PRJNA560329", + "library_layout": "SINGLE", + "library_selection": "RANDOM", + "library_source": "METAGENOMIC", + "library_strategy": "WGS", + "library_name": "Emb289P1_bin131", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "1996273", + "read_count": "58", + "tax_id": "2660712", + "scientific_name": "Defluviitaleaceae bacterium", + "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", + "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", + "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", + "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", + "fastq_md5": "0b512d2dc31685983456bd56fd836544", + "fastq_bytes": "605358", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_2": "", + "md5_1": "0b512d2dc31685983456bd56fd836544", + "md5_2": "", + "single_end": true + }, + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" + ], + [ + { + "id": "SRX9315476_SRR12848126", + "run_accession": "SRR12848126", + "experiment_accession": "SRX9315476", + "sample_accession": "SAMN16455283", + "secondary_sample_accession": "SRS7540262", + "study_accession": "PRJNA670070", + "secondary_study_accession": "SRP287769", + "submission_accession": "SRA1145417", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "experiment_alias": "F11-N1-05", + "sample_alias": "F11-N1-05", + "study_alias": "PRJNA670070", + "library_layout": "PAIRED", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "library_name": "F11-N1-05", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "base_count": "431758", + "read_count": "2954", + "tax_id": "10092", + "scientific_name": "Mus musculus domesticus", + "sample_title": "Longshanks_F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "sample_description": "F11-N1-05", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" + ] + ], + [ + { + "id": "SRX9504942_SRR13055517", + "run_accession": "SRR13055517", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r1", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2246028", + "read_count": "29553", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", + "fastq_bytes": "721167;723753", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", + "md5_2": "18dbe96e7f58b63406d9058938df1962", + "single_end": false + }, + [ + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" + ] + ], + [ + { + "id": "SRX9504942_SRR13055518", + "run_accession": "SRR13055518", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r2", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2235236", + "read_count": "29411", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", + "fastq_bytes": "717693;723429", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "md5_1": "5ec894d863fcefe394470a0925aefde4", + "md5_2": "aead170df9851773d5202b5760c76d76", + "single_end": false + }, + [ + "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" + ] + ], + [ + { + "id": "SRX9504942_SRR13055519", + "run_accession": "SRR13055519", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r3", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2232728", + "read_count": "29378", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", + "fastq_bytes": "714907;721705", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", + "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", + "single_end": false + }, + [ + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" + ] + ], + [ + { + "id": "SRX9504942_SRR13055520", + "run_accession": "SRR13055520", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r4", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2214488", + "read_count": "29138", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", + "fastq_bytes": "709867;716862", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "md5_1": "795d460abff6009c7f5ff7c14b773fbe", + "md5_2": "c3f34379356b28d6dac7212abc1a0a04", + "single_end": false + }, + [ + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" + ] + ], + [ + { + "id": "SRX9626017_SRR13191702", + "run_accession": "SRR13191702", + "experiment_accession": "SRX9626017", + "sample_accession": "SAMN16980141", + "secondary_sample_accession": "SRS7827211", + "study_accession": "PRJNA682076", + "secondary_study_accession": "SRP295653", + "submission_accession": "SRA1166126", + "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", + "experiment_alias": "S.170804.00784", + "sample_alias": "S.170804.00784_662", + "study_alias": "PRJNA682076", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "S.170804.00784", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "45682", + "read_count": "91", + "tax_id": "408170", + "scientific_name": "human gut metagenome", + "sample_title": "Metagenome or environmental sample from human gut metagenome", + "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "sample_description": "Metagenome or environmental sample from human gut metagenome", + "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", + "fastq_bytes": "15420;16324", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98", + "single_end": false + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + ] + ] + ], + "1": [ + "samplesheet.csv:md5,4aec9029e063bae998b3fa3dc3481556" + ], + "2": [ + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + ], + "3": [ + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + ], + "fastq": [ + [ + { + "id": "DRX024467_DRR026872", + "run_accession": "DRR026872", + "experiment_accession": "DRX024467", + "sample_accession": "SAMD00023098", + "secondary_sample_accession": "DRS033740", + "study_accession": "PRJDB4356", + "secondary_study_accession": "DRP003256", + "submission_accession": "DRA002758", + "run_alias": "DRR026872", + "experiment_alias": "DRX024467", + "sample_alias": "SAMD00023098", + "study_alias": "DRP003256", + "library_layout": "SINGLE", + "library_selection": "Restriction Digest", + "library_source": "GENOMIC", + "library_strategy": "OTHER", + "library_name": "IpeRAD1_3", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "62550", + "read_count": "417", + "tax_id": "35883", + "scientific_name": "Ipomoea nil", + "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", + "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", + "study_title": "The Japanese morning glory genome sequence", + "sample_description": "Keywords: GSC:MIxS MIGS:6.0", + "fastq_md5": "515e5448c55e054113c4a22df5f62791", + "fastq_bytes": "38447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", + "fastq_2": "", + "md5_1": "515e5448c55e054113c4a22df5f62791", + "md5_2": "", + "single_end": true + }, + "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" + ], + [ + { + "id": "DRX026011_DRR028935", + "run_accession": "DRR028935", + "experiment_accession": "DRX026011", + "sample_accession": "SAMD00024405", + "secondary_sample_accession": "DRS019431", + "study_accession": "PRJDB3420", + "secondary_study_accession": "DRP002616", + "submission_accession": "DRA002949", + "run_alias": "DRR028935", + "experiment_alias": "DRX026011", + "sample_alias": "SAMD00024405", + "study_alias": "DRP002616", + "library_layout": "PAIRED", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "day0_BbSQE-I", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "194930", + "read_count": "965", + "tax_id": "1202541", + "scientific_name": "Botryococcus braunii Showa", + "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", + "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", + "sample_description": "Liquid culture", + "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", + "fastq_bytes": "60275;61610", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "md5_1": "cc01df82a9354bb6b3be93483b20c35a", + "md5_2": "941c9998d746416dad53c94c480ddf30", + "single_end": false + }, + [ + "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", + "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" + ] + ], + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "sample_accession": "SAMEA3643867", + "secondary_sample_accession": "ERS951016", + "study_accession": "PRJEB11633", + "secondary_study_accession": "ERP013030", + "submission_accession": "ERA528939", + "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", + "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", + "sample_alias": "sample_56", + "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", + "library_layout": "PAIRED", + "library_selection": "RT-PCR", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "unspecified", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "29700", + "read_count": "169", + "tax_id": "63433", + "scientific_name": "Leptopilina boulardi", + "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing", + "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", + "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_bytes": "3221;8151;8118", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, + [ + "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", + "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" + ] + ], + [ + { + "id": "ERX1234253_ERR1160846", + "run_accession": "ERR1160846", + "experiment_accession": "ERX1234253", + "sample_accession": "SAMEA3687214", + "secondary_sample_accession": "ERS994363", + "study_accession": "PRJEB11419", + "secondary_study_accession": "ERP012803", + "submission_accession": "ERA541392", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "study_alias": "qiita_sid_10317", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "10317.BLANK.93.3E.r22", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "35658", + "read_count": "283", + "tax_id": "256318", + "scientific_name": "metagenome", + "sample_title": "10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "study_title": "American Gut Project", + "sample_description": "American Gut control", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_2": "", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "single_end": true + }, + "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" + ], + [ + { + "id": "SRX10940790_SRR14593545", + "run_accession": "SRR14593545", + "experiment_accession": "SRX10940790", + "sample_accession": "SAMN19097423", + "secondary_sample_accession": "SRS9020442", + "study_accession": "PRJNA728650", + "secondary_study_accession": "SRP319413", + "submission_accession": "SRA1234280", + "run_alias": "577-6_530058_19-037147 Goat_F.ab1", + "experiment_alias": "PRNP_2765", + "sample_alias": "prp_2765", + "study_alias": "PRJNA728650", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "PRNP_2765", + "instrument_model": "AB 3500xL Genetic Analyzer", + "instrument_platform": "CAPILLARY", + "base_count": "828", + "read_count": "1", + "tax_id": "9925", + "scientific_name": "Capra hircus", + "sample_title": "MIGS Eukaryotic sample from Capra hircus", + "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", + "study_title": "Capra hircus Raw sequence reads", + "sample_description": "Keywords: GSC:MIxS MIGS:5.0", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", + "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" + ] + ], + [ + { + "id": "SRX11047067_SRR14709033", + "run_accession": "SRR14709033", + "experiment_accession": "SRX11047067", + "sample_accession": "SAMN19373034", + "secondary_sample_accession": "SRS9115923", + "study_accession": "PRJNA733285", + "secondary_study_accession": "SRP322267", + "submission_accession": "SRA1239521", + "run_alias": "Sebastes_levis-2.fastq", + "experiment_alias": "Sebastes_macdonaldi-1", + "sample_alias": "S._macdonaldi-1", + "study_alias": "PRJNA733285", + "library_layout": "SINGLE", + "library_selection": "PCR", + "library_source": "GENOMIC", + "library_strategy": "AMPLICON", + "library_name": "Sebastes_macdonaldi-1", + "instrument_model": "AB 5500 Genetic Analyzer", + "instrument_platform": "ABI_SOLID", + "base_count": "153", + "read_count": "1", + "tax_id": "394693", + "scientific_name": "Sebastes macdonaldi", + "sample_title": "Sebastes_macdonaldi-1", + "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", + "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", + "sample_description": "Sebastes_macdonaldi-1", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": true + }, + "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" + ], + [ + { + "id": "SRX17709227_SRR21711856", + "run_accession": "SRR21711856", + "experiment_accession": "SRX17709227", + "sample_accession": "SAMN31021823", + "secondary_sample_accession": "SRS15239723", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601460_r1", + "experiment_alias": "GSM6601460_r1", + "sample_alias": "GSM6601460", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601460", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "573417800", + "read_count": "11468356", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "sham-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "sham-treated worms in day 5", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_2": "", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "single_end": true + }, + "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" + ], + [ + { + "id": "SRX17709228_SRR21711855", + "run_accession": "SRR21711855", + "experiment_accession": "SRX17709228", + "sample_accession": "SAMN31021822", + "secondary_sample_accession": "SRS15239724", + "study_accession": "PRJNA884373", + "secondary_study_accession": "SRP399678", + "submission_accession": "SRA1507236", + "run_alias": "GSM6601461_r1", + "experiment_alias": "GSM6601461_r1", + "sample_alias": "GSM6601461", + "study_alias": "GSE214215", + "library_layout": "SINGLE", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "library_name": "GSM6601461", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "base_count": "677912850", + "read_count": "13558257", + "tax_id": "6239", + "scientific_name": "Caenorhabditis elegans", + "sample_title": "PM2.5-treated worms in day 5", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "sample_description": "PM2.5-treated worms in day 5", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_2": "", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "single_end": true + }, + "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" + ], + [ + { + "id": "SRX6725035_SRR9984183", + "run_accession": "SRR9984183", + "experiment_accession": "SRX6725035", + "sample_accession": "SAMN12581720", + "secondary_sample_accession": "SRS5277011", + "study_accession": "PRJNA560329", + "secondary_study_accession": "SRP218535", + "submission_accession": "SRA942061", + "run_alias": "Emb289P1_bin131.fastq", + "experiment_alias": "Emb289P1_bin131", + "sample_alias": "Emb289P1_bin131", + "study_alias": "PRJNA560329", + "library_layout": "SINGLE", + "library_selection": "RANDOM", + "library_source": "METAGENOMIC", + "library_strategy": "WGS", + "library_name": "Emb289P1_bin131", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "1996273", + "read_count": "58", + "tax_id": "2660712", + "scientific_name": "Defluviitaleaceae bacterium", + "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", + "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", + "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", + "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", + "fastq_md5": "0b512d2dc31685983456bd56fd836544", + "fastq_bytes": "605358", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_2": "", + "md5_1": "0b512d2dc31685983456bd56fd836544", + "md5_2": "", + "single_end": true + }, + "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" + ], + [ + { + "id": "SRX9315476_SRR12848126", + "run_accession": "SRR12848126", + "experiment_accession": "SRX9315476", + "sample_accession": "SAMN16455283", + "secondary_sample_accession": "SRS7540262", + "study_accession": "PRJNA670070", + "secondary_study_accession": "SRP287769", + "submission_accession": "SRA1145417", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "experiment_alias": "F11-N1-05", + "sample_alias": "F11-N1-05", + "study_alias": "PRJNA670070", + "library_layout": "PAIRED", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "library_name": "F11-N1-05", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "base_count": "431758", + "read_count": "2954", + "tax_id": "10092", + "scientific_name": "Mus musculus domesticus", + "sample_title": "Longshanks_F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "sample_description": "F11-N1-05", + "fastq_md5": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_aspera": "", + "fastq_1": "", + "fastq_2": "", + "md5_1": "", + "md5_2": "", + "single_end": false + }, + [ + "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", + "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" + ] + ], + [ + { + "id": "SRX9504942_SRR13055517", + "run_accession": "SRR13055517", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r1", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2246028", + "read_count": "29553", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", + "fastq_bytes": "721167;723753", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", + "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", + "md5_2": "18dbe96e7f58b63406d9058938df1962", + "single_end": false + }, + [ + "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", + "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" + ] + ], + [ + { + "id": "SRX9504942_SRR13055518", + "run_accession": "SRR13055518", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r2", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2235236", + "read_count": "29411", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", + "fastq_bytes": "717693;723429", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", + "md5_1": "5ec894d863fcefe394470a0925aefde4", + "md5_2": "aead170df9851773d5202b5760c76d76", + "single_end": false + }, + [ + "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", + "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" + ] + ], + [ + { + "id": "SRX9504942_SRR13055519", + "run_accession": "SRR13055519", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r3", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2232728", + "read_count": "29378", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", + "fastq_bytes": "714907;721705", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", + "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", + "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", + "single_end": false + }, + [ + "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", + "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" + ] + ], + [ + { + "id": "SRX9504942_SRR13055520", + "run_accession": "SRR13055520", + "experiment_accession": "SRX9504942", + "sample_accession": "SAMN16793052", + "secondary_sample_accession": "SRS7713669", + "study_accession": "PRJNA678298", + "secondary_study_accession": "SRP292504", + "submission_accession": "SRA1158402", + "run_alias": "GSM4907283_r4", + "experiment_alias": "GSM4907283", + "sample_alias": "GSM4907283", + "study_alias": "GSE159787", + "library_layout": "PAIRED", + "library_selection": "other", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "OTHER", + "library_name": "", + "instrument_model": "NextSeq 550", + "instrument_platform": "ILLUMINA", + "base_count": "2214488", + "read_count": "29138", + "tax_id": "9606", + "scientific_name": "Homo sapiens", + "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", + "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", + "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", + "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", + "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", + "fastq_bytes": "709867;716862", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", + "md5_1": "795d460abff6009c7f5ff7c14b773fbe", + "md5_2": "c3f34379356b28d6dac7212abc1a0a04", + "single_end": false + }, + [ + "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", + "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" + ] + ], + [ + { + "id": "SRX9626017_SRR13191702", + "run_accession": "SRR13191702", + "experiment_accession": "SRX9626017", + "sample_accession": "SAMN16980141", + "secondary_sample_accession": "SRS7827211", + "study_accession": "PRJNA682076", + "secondary_study_accession": "SRP295653", + "submission_accession": "SRA1166126", + "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", + "experiment_alias": "S.170804.00784", + "sample_alias": "S.170804.00784_662", + "study_alias": "PRJNA682076", + "library_layout": "PAIRED", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "library_name": "S.170804.00784", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "base_count": "45682", + "read_count": "91", + "tax_id": "408170", + "scientific_name": "human gut metagenome", + "sample_title": "Metagenome or environmental sample from human gut metagenome", + "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", + "sample_description": "Metagenome or environmental sample from human gut metagenome", + "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", + "fastq_bytes": "15420;16324", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", + "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98", + "single_end": false + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + ] + ] + ], + "mappings": [ + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + ], + "samplesheet": [ + "samplesheet.csv:md5,4aec9029e063bae998b3fa3dc3481556" + ], + "versions": [ + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + ] + } + ], + "timestamp": "2023-09-11T18:34:25.049818" + } +} \ No newline at end of file diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test b/workflows/sra/tests/sra_skip_fastq_download.nf.test new file mode 100644 index 00000000..67abee3b --- /dev/null +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test @@ -0,0 +1,31 @@ +nextflow_workflow { + + name "Test workflow: sra/main.nf" + script "workflows/sra/main.nf" + workflow "SRA" + tag "workflows" + tag "workflows_sra" + tag "sra_skip_fastq_download" + + test("Parameters: --skip_fastq_download") { + + when { + workflow { + """ + input[0] = Channel.from('DRR026872','DRR028935','ERR1109373','ERR1160846','GSE214215','GSM4907283','SRR12848126','SRR13191702','SRR14593545','SRR14709033','SRR9984183') + """ + } + params { + outdir = "results" + skip_fastq_download = true + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match() } + ) + } + } +} diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap b/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap new file mode 100644 index 00000000..3b04b917 --- /dev/null +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap @@ -0,0 +1,37 @@ +{ + "Parameters: --skip_fastq_download": { + "content": [ + { + "0": [ + + ], + "1": [ + "samplesheet.csv:md5,7cf3503b651fe016bc1e5fb3c2e996d5" + ], + "2": [ + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + ], + "3": [ + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + ], + "fastq": [ + + ], + "mappings": [ + "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + ], + "samplesheet": [ + "samplesheet.csv:md5,7cf3503b651fe016bc1e5fb3c2e996d5" + ], + "versions": [ + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + ] + } + ], + "timestamp": "2023-09-11T18:56:34.175665" + } +} \ No newline at end of file From 23b75bc70aa22c2d1dd66ce0d1ff3c0ed1a4ff6c Mon Sep 17 00:00:00 2001 From: maxulysse Date: Thu, 21 Sep 2023 19:21:10 +0200 Subject: [PATCH 454/852] restore module tests --- .../tests/main.nf.test | 31 ++++ .../tests/main.nf.test.snap | 52 +++++++ .../local/sra_fastq_ftp/tests/main.nf.test | 34 +++++ .../sra_fastq_ftp/tests/main.nf.test.snap | 140 ++++++++++++++++++ .../sra_ids_to_runinfo/tests/main.nf.test | 32 ++++ .../tests/main.nf.test.snap | 21 +++ .../sra_merge_samplesheet/tests/main.nf.test | 32 ++++ .../tests/main.nf.test.snap | 27 ++++ .../sra_runinfo_to_ftp/tests/main.nf.test | 31 ++++ .../tests/main.nf.test.snap | 21 +++ .../sra_to_samplesheet/tests/main.nf.test | 34 +++++ .../tests/main.nf.test.snap | 113 ++++++++++++++ 12 files changed, 568 insertions(+) create mode 100644 modules/local/multiqc_mappings_config/tests/main.nf.test create mode 100644 modules/local/multiqc_mappings_config/tests/main.nf.test.snap create mode 100644 modules/local/sra_fastq_ftp/tests/main.nf.test create mode 100644 modules/local/sra_fastq_ftp/tests/main.nf.test.snap create mode 100644 modules/local/sra_ids_to_runinfo/tests/main.nf.test create mode 100644 modules/local/sra_ids_to_runinfo/tests/main.nf.test.snap create mode 100644 modules/local/sra_merge_samplesheet/tests/main.nf.test create mode 100644 modules/local/sra_merge_samplesheet/tests/main.nf.test.snap create mode 100644 modules/local/sra_runinfo_to_ftp/tests/main.nf.test create mode 100644 modules/local/sra_runinfo_to_ftp/tests/main.nf.test.snap create mode 100644 modules/local/sra_to_samplesheet/tests/main.nf.test create mode 100644 modules/local/sra_to_samplesheet/tests/main.nf.test.snap diff --git a/modules/local/multiqc_mappings_config/tests/main.nf.test b/modules/local/multiqc_mappings_config/tests/main.nf.test new file mode 100644 index 00000000..3bf79537 --- /dev/null +++ b/modules/local/multiqc_mappings_config/tests/main.nf.test @@ -0,0 +1,31 @@ +nextflow_process { + + name "Test process: MULTIQC_MAPPINGS_CONFIG" + script "modules/local/multiqc_mappings_config/main.nf" + process "MULTIQC_MAPPINGS_CONFIG" + tag "modules" + tag "modules_local" + tag "multiqc_mappings_config" + + test("Should run without failures") { + + when { + params { + outdir = "$outputDir" + } + + process { + """ + input[0] = file(params.test_data['modules_local']['multiqc_mappings_config'], checkIfExists: true) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/local/multiqc_mappings_config/tests/main.nf.test.snap b/modules/local/multiqc_mappings_config/tests/main.nf.test.snap new file mode 100644 index 00000000..9cf7fb38 --- /dev/null +++ b/modules/local/multiqc_mappings_config/tests/main.nf.test.snap @@ -0,0 +1,52 @@ +{ + "SRX9626017_SRR13191702": { + "content": [ + { + "0": [ + [ + "multiqc_config.yml:md5,7f3cb10fff83ba9eb3e8fa6862d1290a", + "versions.yml:md5,dd4c66f0551d15510b36bb2e2b2fdd73" + ] + ], + "1": [ + "versions.yml:md5,dd4c66f0551d15510b36bb2e2b2fdd73" + ], + "versions": [ + "versions.yml:md5,dd4c66f0551d15510b36bb2e2b2fdd73" + ], + "yml": [ + [ + "multiqc_config.yml:md5,7f3cb10fff83ba9eb3e8fa6862d1290a", + "versions.yml:md5,dd4c66f0551d15510b36bb2e2b2fdd73" + ] + ] + } + ], + "timestamp": "2023-08-17T12:02:35+0000" + }, + "Should run without failures": { + "content": [ + { + "0": [ + [ + "multiqc_config.yml:md5,7f3cb10fff83ba9eb3e8fa6862d1290a", + "versions.yml:md5,dd4c66f0551d15510b36bb2e2b2fdd73" + ] + ], + "1": [ + "versions.yml:md5,dd4c66f0551d15510b36bb2e2b2fdd73" + ], + "versions": [ + "versions.yml:md5,dd4c66f0551d15510b36bb2e2b2fdd73" + ], + "yml": [ + [ + "multiqc_config.yml:md5,7f3cb10fff83ba9eb3e8fa6862d1290a", + "versions.yml:md5,dd4c66f0551d15510b36bb2e2b2fdd73" + ] + ] + } + ], + "timestamp": "2023-08-17T12:02:35+0000" + } +} \ No newline at end of file diff --git a/modules/local/sra_fastq_ftp/tests/main.nf.test b/modules/local/sra_fastq_ftp/tests/main.nf.test new file mode 100644 index 00000000..7892d156 --- /dev/null +++ b/modules/local/sra_fastq_ftp/tests/main.nf.test @@ -0,0 +1,34 @@ +nextflow_process { + + name "Test process: SRA_FASTQ_FTP" + script "modules/local/sra_fastq_ftp/main.nf" + process "SRA_FASTQ_FTP" + tag "modules" + tag "modules_local" + tag "sra_fastq_ftp" + + test("Should run without failures") { + + when { + params { + outdir = "$outputDir" + } + + process { + """ + input[0] = [ + [ id:'SRX9626017_SRR13191702', single_end:false, md5_1: '89c5be920021a035084d8aeb74f32df7', md5_2: '56271be38a80db78ef3bdfc5d9909b98' ], // meta map + params.test_data['modules_local']['sra_fastq_ftp'] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/local/sra_fastq_ftp/tests/main.nf.test.snap b/modules/local/sra_fastq_ftp/tests/main.nf.test.snap new file mode 100644 index 00000000..c0d5ffdc --- /dev/null +++ b/modules/local/sra_fastq_ftp/tests/main.nf.test.snap @@ -0,0 +1,140 @@ +{ + "SRX9626017_SRR13191702": { + "content": [ + { + "0": [ + [ + { + "id": "SRX9626017_SRR13191702", + "single_end": false, + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98" + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + ] + ] + ], + "1": [ + [ + { + "id": "SRX9626017_SRR13191702", + "single_end": false, + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98" + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", + "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" + ] + ] + ], + "2": [ + "versions.yml:md5,6b9d69dea1c1305f74a65197ee871f1b" + ], + "fastq": [ + [ + { + "id": "SRX9626017_SRR13191702", + "single_end": false, + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98" + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + ] + ] + ], + "md5": [ + [ + { + "id": "SRX9626017_SRR13191702", + "single_end": false, + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98" + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", + "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" + ] + ] + ], + "versions": [ + "versions.yml:md5,6b9d69dea1c1305f74a65197ee871f1b" + ] + } + ], + "timestamp": "2023-08-06T23:31:57+0000" + }, + "Should run without failures": { + "content": [ + { + "0": [ + [ + { + "id": "SRX9626017_SRR13191702", + "single_end": false, + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98" + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + ] + ] + ], + "1": [ + [ + { + "id": "SRX9626017_SRR13191702", + "single_end": false, + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98" + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", + "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" + ] + ] + ], + "2": [ + "versions.yml:md5,6b9d69dea1c1305f74a65197ee871f1b" + ], + "fastq": [ + [ + { + "id": "SRX9626017_SRR13191702", + "single_end": false, + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98" + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", + "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" + ] + ] + ], + "md5": [ + [ + { + "id": "SRX9626017_SRR13191702", + "single_end": false, + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98" + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", + "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" + ] + ] + ], + "versions": [ + "versions.yml:md5,6b9d69dea1c1305f74a65197ee871f1b" + ] + } + ], + "timestamp": "2023-08-06T23:31:57+0000" + } +} \ No newline at end of file diff --git a/modules/local/sra_ids_to_runinfo/tests/main.nf.test b/modules/local/sra_ids_to_runinfo/tests/main.nf.test new file mode 100644 index 00000000..f8a44086 --- /dev/null +++ b/modules/local/sra_ids_to_runinfo/tests/main.nf.test @@ -0,0 +1,32 @@ +nextflow_process { + + name "Test process: SRA_IDS_TO_RUNINFO" + script "modules/local/sra_ids_to_runinfo/main.nf" + process "SRA_IDS_TO_RUNINFO" + tag "modules" + tag "modules_local" + tag "sra_ids_to_runinfo" + + test("Should run without failures") { + + when { + params { + outdir = "$outputDir" + } + + process { + """ + input[0] = 'SRR13191702' + input[1] = '' + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/local/sra_ids_to_runinfo/tests/main.nf.test.snap b/modules/local/sra_ids_to_runinfo/tests/main.nf.test.snap new file mode 100644 index 00000000..dbca931f --- /dev/null +++ b/modules/local/sra_ids_to_runinfo/tests/main.nf.test.snap @@ -0,0 +1,21 @@ +{ + "Should run without failures": { + "content": [ + { + "0": [ + "SRR13191702.runinfo.tsv:md5,3a1be35781ca6e8a28d8fd4d2f3bbe85" + ], + "1": [ + "versions.yml:md5,1c14442e9b494b586eafe41e77300fae" + ], + "tsv": [ + "SRR13191702.runinfo.tsv:md5,3a1be35781ca6e8a28d8fd4d2f3bbe85" + ], + "versions": [ + "versions.yml:md5,1c14442e9b494b586eafe41e77300fae" + ] + } + ], + "timestamp": "2023-08-06T23:30:51+0000" + } +} \ No newline at end of file diff --git a/modules/local/sra_merge_samplesheet/tests/main.nf.test b/modules/local/sra_merge_samplesheet/tests/main.nf.test new file mode 100644 index 00000000..e37039bd --- /dev/null +++ b/modules/local/sra_merge_samplesheet/tests/main.nf.test @@ -0,0 +1,32 @@ +nextflow_process { + + name "Test process: SRA_MERGE_SAMPLESHEET" + script "modules/local/sra_merge_samplesheet/main.nf" + process "SRA_MERGE_SAMPLESHEET" + tag "modules" + tag "modules_local" + tag "sra_merge_samplesheet" + + test("Should run without failures") { + + when { + params { + outdir = "$outputDir" + } + + process { + """ + input[0] = params.test_data['modules_local']['sra_merge_samplesheet_samplesheets'].collect { file(it, checkIfExists: true) } + input[1] = params.test_data['modules_local']['sra_merge_samplesheet_mappings'].collect { file(it, checkIfExists: true) } + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/local/sra_merge_samplesheet/tests/main.nf.test.snap b/modules/local/sra_merge_samplesheet/tests/main.nf.test.snap new file mode 100644 index 00000000..c5f06aac --- /dev/null +++ b/modules/local/sra_merge_samplesheet/tests/main.nf.test.snap @@ -0,0 +1,27 @@ +{ + "Should run without failures": { + "content": [ + { + "0": [ + "samplesheet.csv:md5,ef756557b0735becd2574c2a3f5840b2" + ], + "1": [ + "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253" + ], + "2": [ + "versions.yml:md5,410006679d5e496d8c55e58e78ca6b34" + ], + "mappings": [ + "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253" + ], + "samplesheet": [ + "samplesheet.csv:md5,ef756557b0735becd2574c2a3f5840b2" + ], + "versions": [ + "versions.yml:md5,410006679d5e496d8c55e58e78ca6b34" + ] + } + ], + "timestamp": "2023-07-06T13:16:36+0000" + } +} \ No newline at end of file diff --git a/modules/local/sra_runinfo_to_ftp/tests/main.nf.test b/modules/local/sra_runinfo_to_ftp/tests/main.nf.test new file mode 100644 index 00000000..1558ff39 --- /dev/null +++ b/modules/local/sra_runinfo_to_ftp/tests/main.nf.test @@ -0,0 +1,31 @@ +nextflow_process { + + name "Test process: SRA_RUNINFO_TO_FTP" + script "modules/local/sra_runinfo_to_ftp/main.nf" + process "SRA_RUNINFO_TO_FTP" + tag "modules" + tag "modules_local" + tag "sra_runinfo_to_ftp" + + test("Should run without failures") { + + when { + params { + outdir = "$outputDir" + } + + process { + """ + input[0] = file(params.test_data['modules_local']['sra_runinfo_to_ftp'], checkIfExists: true) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/local/sra_runinfo_to_ftp/tests/main.nf.test.snap b/modules/local/sra_runinfo_to_ftp/tests/main.nf.test.snap new file mode 100644 index 00000000..71a25f99 --- /dev/null +++ b/modules/local/sra_runinfo_to_ftp/tests/main.nf.test.snap @@ -0,0 +1,21 @@ +{ + "Should run without failures": { + "content": [ + { + "0": [ + "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e" + ], + "1": [ + "versions.yml:md5,e95f8185f665127a73622a19d321bcca" + ], + "tsv": [ + "SRR13191702.runinfo_ftp.tsv:md5,94378c448c044b3e20e5c54e442ab62e" + ], + "versions": [ + "versions.yml:md5,e95f8185f665127a73622a19d321bcca" + ] + } + ], + "timestamp": "2023-08-06T23:13:20+0000" + } +} \ No newline at end of file diff --git a/modules/local/sra_to_samplesheet/tests/main.nf.test b/modules/local/sra_to_samplesheet/tests/main.nf.test new file mode 100644 index 00000000..b2ec5b11 --- /dev/null +++ b/modules/local/sra_to_samplesheet/tests/main.nf.test @@ -0,0 +1,34 @@ +nextflow_process { + + name "Test process: SRA_TO_SAMPLESHEET" + script "modules/local/sra_to_samplesheet/main.nf" + process "SRA_TO_SAMPLESHEET" + tag "modules" + tag "modules_local" + tag "sra_to_samplesheet" + + test("Should run without failures") { + + when { + params { + outdir = "$outputDir" + } + + process { + """ + input[0] = [id:'ERX1188904_ERR1109373', run_accession:'ERR1109373', experiment_accession:'ERX1188904', sample_accession:'SAMEA3643867', experiment_alias:'ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7', run_alias:'ena-RUN-CAM-03-11-2015-17:01:52:847-7', sample_alias:'sample_56', study_alias:'ena-STUDY-CAM-02-11-2015-17:42:24:189-13', library_layout:'PAIRED', experiment_title:'Illumina HiSeq 2500 paired end sequencing', sample_title:'RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome', sample_description:'RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome', fastq_md5:'8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9', fastq_ftp:'ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz', fastq_1:'./results/fastq/ERX1188904_ERR1109373_1.fastq.gz', fastq_2:'./results/fastq/ERX1188904_ERR1109373_2.fastq.gz', md5_1:'9fd57225d6c07a31843276d6df9b15c0', md5_2:'5a62e8f785687dce890cfb4fe3e607f9', single_end:false] + input[1] = 'rnaseq' + input[2] = 'auto' + input[3] = 'experiment_accession,run_accession,sample_accession,experiment_alias,run_alias,sample_alias,experiment_title,sample_title,sample_description' + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/local/sra_to_samplesheet/tests/main.nf.test.snap b/modules/local/sra_to_samplesheet/tests/main.nf.test.snap new file mode 100644 index 00000000..e60c646a --- /dev/null +++ b/modules/local/sra_to_samplesheet/tests/main.nf.test.snap @@ -0,0 +1,113 @@ +{ + "Should run without failures": { + "content": [ + { + "0": [ + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "sample_accession": "SAMEA3643867", + "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", + "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", + "sample_alias": "sample_56", + "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", + "library_layout": "PAIRED", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing", + "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_1": "./results/fastq/ERX1188904_ERR1109373_1.fastq.gz", + "fastq_2": "./results/fastq/ERX1188904_ERR1109373_2.fastq.gz", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, + "ERX1188904_ERR1109373.samplesheet.csv:md5,e7898191d57258e049ee7129d36f5c08" + ] + ], + "1": [ + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "sample_accession": "SAMEA3643867", + "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", + "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", + "sample_alias": "sample_56", + "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", + "library_layout": "PAIRED", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing", + "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_1": "./results/fastq/ERX1188904_ERR1109373_1.fastq.gz", + "fastq_2": "./results/fastq/ERX1188904_ERR1109373_2.fastq.gz", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, + "ERX1188904_ERR1109373.mappings.csv:md5,d09ddb4f0709675e5dfe1eadf12c608f" + ] + ], + "mappings": [ + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "sample_accession": "SAMEA3643867", + "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", + "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", + "sample_alias": "sample_56", + "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", + "library_layout": "PAIRED", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing", + "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_1": "./results/fastq/ERX1188904_ERR1109373_1.fastq.gz", + "fastq_2": "./results/fastq/ERX1188904_ERR1109373_2.fastq.gz", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, + "ERX1188904_ERR1109373.mappings.csv:md5,d09ddb4f0709675e5dfe1eadf12c608f" + ] + ], + "samplesheet": [ + [ + { + "id": "ERX1188904_ERR1109373", + "run_accession": "ERR1109373", + "experiment_accession": "ERX1188904", + "sample_accession": "SAMEA3643867", + "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", + "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", + "sample_alias": "sample_56", + "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", + "library_layout": "PAIRED", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing", + "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", + "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", + "fastq_1": "./results/fastq/ERX1188904_ERR1109373_1.fastq.gz", + "fastq_2": "./results/fastq/ERX1188904_ERR1109373_2.fastq.gz", + "md5_1": "9fd57225d6c07a31843276d6df9b15c0", + "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", + "single_end": false + }, + "ERX1188904_ERR1109373.samplesheet.csv:md5,e7898191d57258e049ee7129d36f5c08" + ] + ] + } + ], + "timestamp": "2023-08-23T09:38:15+0000" + } +} \ No newline at end of file From c95793e1e82b144ffb16ba8703e8072e80929aa5 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Thu, 21 Sep 2023 19:22:53 +0200 Subject: [PATCH 455/852] restore CI --- .github/workflows/ci.yml | 89 +++++++++++++++++++++++++++------------- 1 file changed, 61 insertions(+), 28 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 566ef509..7b7070e7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,28 +1,67 @@ +# This workflow runs the pipeline with the minimal test dataset to check that it completes without any syntax errors name: nf-core CI # This workflow runs the pipeline with the minimal test dataset to check that it completes without any syntax errors on: pull_request: release: types: [published] + merge_group: + types: + - checks_requested + branches: + - master + - dev + - refactor env: NXF_ANSI_LOG: false + NFTEST_VER: "0.8.0-rc1" concurrency: group: "${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}" cancel-in-progress: true jobs: + changes: + name: Check for changes + runs-on: ubuntu-latest + outputs: + # Expose matched filters as job 'tags' output variable + tags: ${{ steps.filter.outputs.changes }} + steps: + - uses: actions/checkout@v3 + - uses: dorny/paths-filter@v2 + id: filter + with: + filters: ".github/tags.yml" + + define_nxf_versions: + name: Choose nextflow versions to test against depending on target branch + runs-on: ubuntu-latest + outputs: + matrix: ${{ steps.nxf_versions.outputs.matrix }} + steps: + - id: nxf_versions + run: | + if [[ "${{ github.event_name }}" == "pull_request" && "${{ github.base_ref }}" == "dev" && "${{ matrix.NXF_VER }}" != "latest-everything" ]]; then + echo matrix='["latest-everything"]' | tee -a $GITHUB_OUTPUT + else + echo matrix='["latest-everything", "22.10.1"]' | tee -a $GITHUB_OUTPUT + fi + test: - name: Run pipeline with test data - # Only run on push if this is the nf-core dev branch (merged PRs) - if: "${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/fetchngs') }}" + name: ${{ matrix.tags }} ${{ matrix.profile }} NF ${{ matrix.NXF_VER }} + needs: [changes, define_nxf_versions] + if: needs.changes.outputs.tags != '[]' runs-on: ubuntu-latest strategy: + fail-fast: false matrix: - NXF_VER: - - "23.04.0" - - "latest-everything" + NXF_VER: ${{ fromJson(needs.define_nxf_versions.outputs.matrix) }} + tags: ["${{ fromJson(needs.changes.outputs.tags) }}"] + profile: + - "docker" + steps: - name: Check out pipeline code uses: actions/checkout@v3 @@ -32,29 +71,23 @@ jobs: with: version: "${{ matrix.NXF_VER }}" - - name: Run pipeline with test data + - name: Install nf-test run: | - nextflow run ${GITHUB_WORKSPACE} -profile test,docker --outdir ./results + wget -qO- https://code.askimed.com/install/nf-test | bash -s $NFTEST_VER + sudo mv nf-test /usr/local/bin/ - parameters: - name: Test workflow parameters - if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/fetchngs') }} - runs-on: ubuntu-latest - strategy: - matrix: - parameters: - - "--nf_core_pipeline rnaseq" - - "--ena_metadata_fields run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5 --sample_mapping_fields run_accession,library_layout" - - "--skip_fastq_download" - - "--force_sratools_download" - steps: - - name: Check out pipeline code - uses: actions/checkout@v2 - - - name: Install Nextflow + - name: Run nf-test run: | - wget -qO- get.nextflow.io | bash - sudo mv nextflow /usr/local/bin/ - - name: Run pipeline with various parameters + nf-test test --tag ${{ matrix.tags }} --profile "test,${{ matrix.profile }}" --junitxml=test.xml + + - name: Output log on failure + if: failure() run: | - nextflow run ${GITHUB_WORKSPACE} -profile test,docker --outdir ./results ${{ matrix.parameters }} + sudo apt install bat > /dev/null + batcat --decorations=always --color=always ${{ github.workspace }}/.nf-test/tests/*/meta/nextflow.log + + - name: Publish Test Report + uses: mikepenz/action-junit-report@v3 + if: always() # always run even if the previous step fails + with: + report_paths: test.xml From 7e935bbbd1705853fd5f8858d9ca50dea4f466fa Mon Sep 17 00:00:00 2001 From: maxulysse Date: Thu, 21 Sep 2023 19:26:37 +0200 Subject: [PATCH 456/852] forgot some files --- .gitattributes | 1 + .gitignore | 3 +++ nf-test.config | 16 ++++++++++++++++ 3 files changed, 20 insertions(+) create mode 100644 nf-test.config diff --git a/.gitattributes b/.gitattributes index 7a2dabc2..c1c17000 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,4 +1,5 @@ *.config linguist-language=nextflow *.nf.test linguist-language=nextflow +tests/**/*nf.test.snap linguist-generated modules/nf-core/** linguist-generated subworkflows/nf-core/** linguist-generated diff --git a/.gitignore b/.gitignore index 5124c9ac..b1b5890a 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,6 @@ results/ testing/ testing* *.pyc +.nf-test/ +nf-test +.nf-test.log diff --git a/nf-test.config b/nf-test.config new file mode 100644 index 00000000..0799cb40 --- /dev/null +++ b/nf-test.config @@ -0,0 +1,16 @@ +config { + // location for all nf-tests + testsDir "." + + // nf-test directory including temporary files for each test + workDir ".nf-test" + + // location of library folder that is added automatically to the classpath + libDir "lib/" + + // location of an optional nextflow.config file specific for executing tests + configFile "nextflow.config" + + // run all test with the defined docker profile from the main nextflow.config + profile "" +} From e43e5f178e3812d000db3739f5f2c55a981e0e15 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 22 Sep 2023 09:39:50 +0200 Subject: [PATCH 457/852] fix NXF_VER --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7b7070e7..59011a37 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -46,7 +46,7 @@ jobs: if [[ "${{ github.event_name }}" == "pull_request" && "${{ github.base_ref }}" == "dev" && "${{ matrix.NXF_VER }}" != "latest-everything" ]]; then echo matrix='["latest-everything"]' | tee -a $GITHUB_OUTPUT else - echo matrix='["latest-everything", "22.10.1"]' | tee -a $GITHUB_OUTPUT + echo matrix='["latest-everything", "23.04.0"]' | tee -a $GITHUB_OUTPUT fi test: From eb11d0b2a54ea8b31411f3d5e5a9ca52bd833a81 Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Fri, 22 Sep 2023 09:42:37 +0200 Subject: [PATCH 458/852] Delete .github/tags.yml this should happen in the `nf-test` branch --- .github/tags.yml | 79 ------------------------------------------------ 1 file changed, 79 deletions(-) delete mode 100644 .github/tags.yml diff --git a/.github/tags.yml b/.github/tags.yml deleted file mode 100644 index 9fc74a2c..00000000 --- a/.github/tags.yml +++ /dev/null @@ -1,79 +0,0 @@ -# local modules -multiqc_mappings_config: - - modules/local/multiqc_mappings_config/* -sra_fastq_ftp: - - modules/local/sra_fastq_ftp/* -sra_ids_to_runinfo: - - modules/local/sra_ids_to_runinfo/* -sra_merge_samplesheet: - - modules/local/sra_merge_samplesheet/* -sra_runinfo_to_ftp: - - modules/local/sra_runinfo_to_ftp/* -sra_to_samplesheet: - - modules/local/sra_to_samplesheet/* - -# workflow: sra -sra_custom_ena_metadata_fields: - - modules/local/sra_ids_to_runinfo/* - - modules/local/sra_runinfo_to_ftp/* - - modules/local/sra_fastq_ftp/* - - modules/local/sra_to_samplesheet/* - - modules/local/sra_merge_samplesheet/* - - workflows/sra/* - - workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test -sra_default_parameters: - - modules/local/sra_ids_to_runinfo/* - - modules/local/sra_runinfo_to_ftp/* - - modules/local/sra_fastq_ftp/* - - modules/local/sra_to_samplesheet/* - - modules/local/sra_merge_samplesheet/* - - workflows/sra/* - - workflows/sra/tests/sra_default_parameters.nf.test -sra_force_sratools_download: - - modules/local/sra_ids_to_runinfo/* - - modules/local/sra_runinfo_to_ftp/* - - modules/local/sra_fastq_ftp/* - - modules/local/sra_to_samplesheet/* - - modules/local/sra_merge_samplesheet/* - - workflows/sra/* - - workflows/sra/tests/sra_force_sratools_download.nf.test -sra_nf_core_pipeline_atacseq: - - modules/local/sra_ids_to_runinfo/* - - modules/local/sra_runinfo_to_ftp/* - - modules/local/sra_fastq_ftp/* - - modules/local/sra_to_samplesheet/* - - modules/local/sra_merge_samplesheet/* - - workflows/sra/* - - workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test -sra_nf_core_pipeline_rnaseq: - - modules/local/sra_ids_to_runinfo/* - - modules/local/sra_runinfo_to_ftp/* - - modules/local/sra_fastq_ftp/* - - modules/local/sra_to_samplesheet/* - - modules/local/sra_merge_samplesheet/* - - workflows/sra/* - - workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test -sra_nf_core_pipeline_taxprofiler: - - modules/local/sra_ids_to_runinfo/* - - modules/local/sra_runinfo_to_ftp/* - - modules/local/sra_fastq_ftp/* - - modules/local/sra_to_samplesheet/* - - modules/local/sra_merge_samplesheet/* - - workflows/sra/* - - workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test -sra_nf_core_pipeline_viralrecon: - - modules/local/sra_ids_to_runinfo/* - - modules/local/sra_runinfo_to_ftp/* - - modules/local/sra_fastq_ftp/* - - modules/local/sra_to_samplesheet/* - - modules/local/sra_merge_samplesheet/* - - workflows/sra/* - - workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test -sra_skip_fastq_download: - - modules/local/sra_ids_to_runinfo/* - - modules/local/sra_runinfo_to_ftp/* - - modules/local/sra_fastq_ftp/* - - modules/local/sra_to_samplesheet/* - - modules/local/sra_merge_samplesheet/* - - workflows/sra/* - - workflows/sra/tests/sra_skip_fastq_download.nf.test From 185e930ca70cc3af853865b24af9f2ce893a1685 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 22 Sep 2023 09:45:59 +0200 Subject: [PATCH 459/852] fix linting --- .nf-core.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.nf-core.yml b/.nf-core.yml index 9975ac5b..d617b3a3 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -6,3 +6,4 @@ lint: files_unchanged: - assets/sendmail_template.txt - lib/NfcoreTemplate.groovy + - .gitattributes From 71e1a319dd342e7ecf5a810a9671e321cb9accce Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Fri, 22 Sep 2023 10:09:15 +0200 Subject: [PATCH 460/852] Delete conf/modules/base.config No need for this file anymore --- conf/modules/base.config | 33 --------------------------------- 1 file changed, 33 deletions(-) delete mode 100644 conf/modules/base.config diff --git a/conf/modules/base.config b/conf/modules/base.config deleted file mode 100644 index 035487c5..00000000 --- a/conf/modules/base.config +++ /dev/null @@ -1,33 +0,0 @@ -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Config file for defining DSL2 per module options and publishing paths -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Available keys to override module options: - ext.args = Additional arguments appended to command in module. - ext.args2 = Second set of arguments appended to command in module (multi-tool modules). - ext.args3 = Third set of arguments appended to command in module (multi-tool modules). - ext.prefix = File name prefix for output files. ----------------------------------------------------------------------------------------- -*/ - -// -// Generic process options for all workflows -// -process { - - publishDir = [ - path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - - withName: CUSTOM_DUMPSOFTWAREVERSIONS { - cache = false - publishDir = [ - path: { "${params.outdir}/pipeline_info" }, - mode: params.publish_dir_mode, - pattern: '*_versions.yml' - ] - } - -} From 07b25b300fb424f8b7cebefd53edccfa8c42b0df Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Fri, 22 Sep 2023 10:10:58 +0200 Subject: [PATCH 461/852] Apply suggestions from code review --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 1e8bea6e..01da14f6 100644 --- a/nextflow.config +++ b/nextflow.config @@ -162,7 +162,7 @@ profiles { executor.cpus = 16 executor.memory = 60.GB } - test { includeConfig 'conf/test.config' } + test { includeConfig 'conf/test.config' } test_synapse { includeConfig 'conf/test_synapse.config' } test_full { includeConfig 'conf/test_full.config' } } From b11c1d8da1e0d68e5b80641690b3d0e5590990c1 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 22 Sep 2023 10:21:03 +0200 Subject: [PATCH 462/852] restore file --- .github/tags.yml | 71 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 .github/tags.yml diff --git a/.github/tags.yml b/.github/tags.yml new file mode 100644 index 00000000..a5914ccf --- /dev/null +++ b/.github/tags.yml @@ -0,0 +1,71 @@ +# local modules +multiqc_mappings_config: + - modules/local/multiqc_mappings_config/* +sra_fastq_ftp: + - modules/local/sra_fastq_ftp/* +sra_ids_to_runinfo: + - modules/local/sra_ids_to_runinfo/* +sra_merge_samplesheet: + - modules/local/sra_merge_samplesheet/* +sra_runinfo_to_ftp: + - modules/local/sra_runinfo_to_ftp/* +sra_to_samplesheet: + - modules/local/sra_to_samplesheet/* + +# workflow: sra +sra_custom_ena_metadata_fields: + - modules/local/sra_ids_to_runinfo/* + - modules/local/sra_runinfo_to_ftp/* + - modules/local/sra_fastq_ftp/* + - modules/local/sra_to_samplesheet/* + - modules/local/sra_merge_samplesheet/* + - workflows/sra/* +sra_default_parameters: + - modules/local/sra_ids_to_runinfo/* + - modules/local/sra_runinfo_to_ftp/* + - modules/local/sra_fastq_ftp/* + - modules/local/sra_to_samplesheet/* + - modules/local/sra_merge_samplesheet/* + - workflows/sra/* +sra_force_sratools_download: + - modules/local/sra_ids_to_runinfo/* + - modules/local/sra_runinfo_to_ftp/* + - modules/local/sra_fastq_ftp/* + - modules/local/sra_to_samplesheet/* + - modules/local/sra_merge_samplesheet/* + - workflows/sra/* +sra_nf_core_pipeline_atacseq: + - modules/local/sra_ids_to_runinfo/* + - modules/local/sra_runinfo_to_ftp/* + - modules/local/sra_fastq_ftp/* + - modules/local/sra_to_samplesheet/* + - modules/local/sra_merge_samplesheet/* + - workflows/sra/* +sra_nf_core_pipeline_rnaseq: + - modules/local/sra_ids_to_runinfo/* + - modules/local/sra_runinfo_to_ftp/* + - modules/local/sra_fastq_ftp/* + - modules/local/sra_to_samplesheet/* + - modules/local/sra_merge_samplesheet/* + - workflows/sra/* +sra_nf_core_pipeline_taxprofiler: + - modules/local/sra_ids_to_runinfo/* + - modules/local/sra_runinfo_to_ftp/* + - modules/local/sra_fastq_ftp/* + - modules/local/sra_to_samplesheet/* + - modules/local/sra_merge_samplesheet/* + - workflows/sra/* +sra_nf_core_pipeline_viralrecon: + - modules/local/sra_ids_to_runinfo/* + - modules/local/sra_runinfo_to_ftp/* + - modules/local/sra_fastq_ftp/* + - modules/local/sra_to_samplesheet/* + - modules/local/sra_merge_samplesheet/* + - workflows/sra/* +sra_skip_fastq_download: + - modules/local/sra_ids_to_runinfo/* + - modules/local/sra_runinfo_to_ftp/* + - modules/local/sra_fastq_ftp/* + - modules/local/sra_to_samplesheet/* + - modules/local/sra_merge_samplesheet/* + - workflows/sra/* From b0dd0a3c27a88371fa9ef5cdf6c42d334c845bb1 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 22 Sep 2023 10:23:07 +0200 Subject: [PATCH 463/852] do some tests --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 59011a37..5642602b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,6 +1,5 @@ # This workflow runs the pipeline with the minimal test dataset to check that it completes without any syntax errors name: nf-core CI -# This workflow runs the pipeline with the minimal test dataset to check that it completes without any syntax errors on: pull_request: release: @@ -12,6 +11,7 @@ on: - master - dev - refactor + - nf-test env: NXF_ANSI_LOG: false From aad776b1166eeea52eeba789c9558233f4e7a4f7 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 22 Sep 2023 10:35:23 +0200 Subject: [PATCH 464/852] 2 * --- .github/tags.yml | 108 +++++++++++++++++++++++------------------------ 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/.github/tags.yml b/.github/tags.yml index a5914ccf..03569f78 100644 --- a/.github/tags.yml +++ b/.github/tags.yml @@ -1,71 +1,71 @@ # local modules multiqc_mappings_config: - - modules/local/multiqc_mappings_config/* + - modules/local/multiqc_mappings_config/** sra_fastq_ftp: - - modules/local/sra_fastq_ftp/* + - modules/local/sra_fastq_ftp/** sra_ids_to_runinfo: - - modules/local/sra_ids_to_runinfo/* + - modules/local/sra_ids_to_runinfo/** sra_merge_samplesheet: - - modules/local/sra_merge_samplesheet/* + - modules/local/sra_merge_samplesheet/** sra_runinfo_to_ftp: - - modules/local/sra_runinfo_to_ftp/* + - modules/local/sra_runinfo_to_ftp/** sra_to_samplesheet: - - modules/local/sra_to_samplesheet/* + - modules/local/sra_to_samplesheet/** # workflow: sra sra_custom_ena_metadata_fields: - - modules/local/sra_ids_to_runinfo/* - - modules/local/sra_runinfo_to_ftp/* - - modules/local/sra_fastq_ftp/* - - modules/local/sra_to_samplesheet/* - - modules/local/sra_merge_samplesheet/* - - workflows/sra/* + - modules/local/sra_ids_to_runinfo/** + - modules/local/sra_runinfo_to_ftp/** + - modules/local/sra_fastq_ftp/** + - modules/local/sra_to_samplesheet/** + - modules/local/sra_merge_samplesheet/** + - workflows/sra/** sra_default_parameters: - - modules/local/sra_ids_to_runinfo/* - - modules/local/sra_runinfo_to_ftp/* - - modules/local/sra_fastq_ftp/* - - modules/local/sra_to_samplesheet/* - - modules/local/sra_merge_samplesheet/* - - workflows/sra/* + - modules/local/sra_ids_to_runinfo/** + - modules/local/sra_runinfo_to_ftp/** + - modules/local/sra_fastq_ftp/** + - modules/local/sra_to_samplesheet/** + - modules/local/sra_merge_samplesheet/** + - workflows/sra/** sra_force_sratools_download: - - modules/local/sra_ids_to_runinfo/* - - modules/local/sra_runinfo_to_ftp/* - - modules/local/sra_fastq_ftp/* - - modules/local/sra_to_samplesheet/* - - modules/local/sra_merge_samplesheet/* - - workflows/sra/* + - modules/local/sra_ids_to_runinfo/** + - modules/local/sra_runinfo_to_ftp/** + - modules/local/sra_fastq_ftp/** + - modules/local/sra_to_samplesheet/** + - modules/local/sra_merge_samplesheet/** + - workflows/sra/** sra_nf_core_pipeline_atacseq: - - modules/local/sra_ids_to_runinfo/* - - modules/local/sra_runinfo_to_ftp/* - - modules/local/sra_fastq_ftp/* - - modules/local/sra_to_samplesheet/* - - modules/local/sra_merge_samplesheet/* - - workflows/sra/* + - modules/local/sra_ids_to_runinfo/** + - modules/local/sra_runinfo_to_ftp/** + - modules/local/sra_fastq_ftp/** + - modules/local/sra_to_samplesheet/** + - modules/local/sra_merge_samplesheet/** + - workflows/sra/** sra_nf_core_pipeline_rnaseq: - - modules/local/sra_ids_to_runinfo/* - - modules/local/sra_runinfo_to_ftp/* - - modules/local/sra_fastq_ftp/* - - modules/local/sra_to_samplesheet/* - - modules/local/sra_merge_samplesheet/* - - workflows/sra/* + - modules/local/sra_ids_to_runinfo/** + - modules/local/sra_runinfo_to_ftp/** + - modules/local/sra_fastq_ftp/** + - modules/local/sra_to_samplesheet/** + - modules/local/sra_merge_samplesheet/** + - workflows/sra/** sra_nf_core_pipeline_taxprofiler: - - modules/local/sra_ids_to_runinfo/* - - modules/local/sra_runinfo_to_ftp/* - - modules/local/sra_fastq_ftp/* - - modules/local/sra_to_samplesheet/* - - modules/local/sra_merge_samplesheet/* - - workflows/sra/* + - modules/local/sra_ids_to_runinfo/** + - modules/local/sra_runinfo_to_ftp/** + - modules/local/sra_fastq_ftp/** + - modules/local/sra_to_samplesheet/** + - modules/local/sra_merge_samplesheet/** + - workflows/sra/** sra_nf_core_pipeline_viralrecon: - - modules/local/sra_ids_to_runinfo/* - - modules/local/sra_runinfo_to_ftp/* - - modules/local/sra_fastq_ftp/* - - modules/local/sra_to_samplesheet/* - - modules/local/sra_merge_samplesheet/* - - workflows/sra/* + - modules/local/sra_ids_to_runinfo/** + - modules/local/sra_runinfo_to_ftp/** + - modules/local/sra_fastq_ftp/** + - modules/local/sra_to_samplesheet/** + - modules/local/sra_merge_samplesheet/** + - workflows/sra/** sra_skip_fastq_download: - - modules/local/sra_ids_to_runinfo/* - - modules/local/sra_runinfo_to_ftp/* - - modules/local/sra_fastq_ftp/* - - modules/local/sra_to_samplesheet/* - - modules/local/sra_merge_samplesheet/* - - workflows/sra/* + - modules/local/sra_ids_to_runinfo/** + - modules/local/sra_runinfo_to_ftp/** + - modules/local/sra_fastq_ftp/** + - modules/local/sra_to_samplesheet/** + - modules/local/sra_merge_samplesheet/** + - workflows/sra/** From 89d39e98727f7f0c8beb868b243f726a27a8bbd5 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 22 Sep 2023 10:49:40 +0200 Subject: [PATCH 465/852] forgot this file --- conf/test_data.config | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 conf/test_data.config diff --git a/conf/test_data.config b/conf/test_data.config new file mode 100644 index 00000000..42d3d818 --- /dev/null +++ b/conf/test_data.config @@ -0,0 +1,36 @@ +params { + // Base directory for test data + test_data_base = "https://raw.githubusercontent.com/nf-core/test-datasets/fetchngs" + + merge_samplesheet_ids = [ "DRX024467_DRR026872", "SRX11047067_SRR14709033", "SRX9504942_SRR13055517", "DRX026011_DRR028935", "SRX17709227_SRR21711856", "SRX9504942_SRR13055518", "ERX1188904_ERR1109373", "SRX17709228_SRR21711855", "SRX9504942_SRR13055519", "ERX1234253_ERR1160846", "SRX6725035_SRR9984183", "SRX9504942_SRR13055520", "SRX10940790_SRR14593545", "SRX9315476_SRR12848126", "SRX9626017_SRR13191702" ] + + def merge_samplesheet_url = "${params.test_data_base}/modules/local/sra_merge_samplesheet/samplesheets/" + def merge_mappings_url = "${params.test_data_base}/modules/local/sra_merge_samplesheet/mappings/" + def merge_samplesheet_urls = [] + def merge_mappings_urls = [] + + merge_samplesheet_ids.each { id -> + merge_samplesheet_urls += "${merge_samplesheet_url}${id}.samplesheet.csv" + merge_mappings_urls += "${merge_mappings_url}/${id}.mappings.csv" + } + + fastq_ftp_ids = ["SRR13191702"] + def fastq_ftp_url = "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/" + def fastq_ftp_urls = [] + + fastq_ftp_ids.each { id -> + fastq_ftp_urls += "${fastq_ftp_url}${id}_1.fastq.gz" + fastq_ftp_urls += "${fastq_ftp_url}${id}_2.fastq.gz" + } + + test_data { + 'modules_local' { + multiqc_mappings_config = "${params.test_data_base}/modules/local/multiqc_mappings_config/SRX9626017_SRR13191702.mappings.csv" + sra_merge_samplesheet_samplesheets = merge_samplesheet_urls + sra_merge_samplesheet_mappings = merge_mappings_urls + sra_to_samplesheet = "${params.test_data_base}/modules/local/sra_to_samplesheet/SRX9626017_SRR13191702.mappings.csv" + sra_fastq_ftp = fastq_ftp_urls + sra_runinfo_to_ftp = "${params.test_data_base}/modules/local/sra_runinfo_to_ftp/SRR13191702.runinfo.tsv" + } + } +} From d456c208def2bf4e046b520ab9a72e91c27c0b2e Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 22 Sep 2023 11:00:43 +0200 Subject: [PATCH 466/852] fix path to file to include and update snapshots --- .../tests/main.nf.test.snap | 27 +------ .../sra_fastq_ftp/tests/main.nf.test.snap | 71 +------------------ .../tests/main.nf.test.snap | 2 +- .../tests/main.nf.test.snap | 2 +- .../tests/main.nf.test.snap | 2 +- .../tests/main.nf.test.snap | 2 +- nextflow.config | 5 +- 7 files changed, 10 insertions(+), 101 deletions(-) diff --git a/modules/local/multiqc_mappings_config/tests/main.nf.test.snap b/modules/local/multiqc_mappings_config/tests/main.nf.test.snap index 9cf7fb38..1a4d16c4 100644 --- a/modules/local/multiqc_mappings_config/tests/main.nf.test.snap +++ b/modules/local/multiqc_mappings_config/tests/main.nf.test.snap @@ -1,29 +1,4 @@ { - "SRX9626017_SRR13191702": { - "content": [ - { - "0": [ - [ - "multiqc_config.yml:md5,7f3cb10fff83ba9eb3e8fa6862d1290a", - "versions.yml:md5,dd4c66f0551d15510b36bb2e2b2fdd73" - ] - ], - "1": [ - "versions.yml:md5,dd4c66f0551d15510b36bb2e2b2fdd73" - ], - "versions": [ - "versions.yml:md5,dd4c66f0551d15510b36bb2e2b2fdd73" - ], - "yml": [ - [ - "multiqc_config.yml:md5,7f3cb10fff83ba9eb3e8fa6862d1290a", - "versions.yml:md5,dd4c66f0551d15510b36bb2e2b2fdd73" - ] - ] - } - ], - "timestamp": "2023-08-17T12:02:35+0000" - }, "Should run without failures": { "content": [ { @@ -47,6 +22,6 @@ ] } ], - "timestamp": "2023-08-17T12:02:35+0000" + "timestamp": "2023-09-22T10:58:18.132284" } } \ No newline at end of file diff --git a/modules/local/sra_fastq_ftp/tests/main.nf.test.snap b/modules/local/sra_fastq_ftp/tests/main.nf.test.snap index c0d5ffdc..fb815455 100644 --- a/modules/local/sra_fastq_ftp/tests/main.nf.test.snap +++ b/modules/local/sra_fastq_ftp/tests/main.nf.test.snap @@ -1,73 +1,4 @@ { - "SRX9626017_SRR13191702": { - "content": [ - { - "0": [ - [ - { - "id": "SRX9626017_SRR13191702", - "single_end": false, - "md5_1": "89c5be920021a035084d8aeb74f32df7", - "md5_2": "56271be38a80db78ef3bdfc5d9909b98" - }, - [ - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" - ] - ] - ], - "1": [ - [ - { - "id": "SRX9626017_SRR13191702", - "single_end": false, - "md5_1": "89c5be920021a035084d8aeb74f32df7", - "md5_2": "56271be38a80db78ef3bdfc5d9909b98" - }, - [ - "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", - "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" - ] - ] - ], - "2": [ - "versions.yml:md5,6b9d69dea1c1305f74a65197ee871f1b" - ], - "fastq": [ - [ - { - "id": "SRX9626017_SRR13191702", - "single_end": false, - "md5_1": "89c5be920021a035084d8aeb74f32df7", - "md5_2": "56271be38a80db78ef3bdfc5d9909b98" - }, - [ - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" - ] - ] - ], - "md5": [ - [ - { - "id": "SRX9626017_SRR13191702", - "single_end": false, - "md5_1": "89c5be920021a035084d8aeb74f32df7", - "md5_2": "56271be38a80db78ef3bdfc5d9909b98" - }, - [ - "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", - "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" - ] - ] - ], - "versions": [ - "versions.yml:md5,6b9d69dea1c1305f74a65197ee871f1b" - ] - } - ], - "timestamp": "2023-08-06T23:31:57+0000" - }, "Should run without failures": { "content": [ { @@ -135,6 +66,6 @@ ] } ], - "timestamp": "2023-08-06T23:31:57+0000" + "timestamp": "2023-09-22T10:58:46.998421" } } \ No newline at end of file diff --git a/modules/local/sra_ids_to_runinfo/tests/main.nf.test.snap b/modules/local/sra_ids_to_runinfo/tests/main.nf.test.snap index dbca931f..241efe2a 100644 --- a/modules/local/sra_ids_to_runinfo/tests/main.nf.test.snap +++ b/modules/local/sra_ids_to_runinfo/tests/main.nf.test.snap @@ -16,6 +16,6 @@ ] } ], - "timestamp": "2023-08-06T23:30:51+0000" + "timestamp": "2023-09-22T10:58:56.721948" } } \ No newline at end of file diff --git a/modules/local/sra_merge_samplesheet/tests/main.nf.test.snap b/modules/local/sra_merge_samplesheet/tests/main.nf.test.snap index c5f06aac..203395ae 100644 --- a/modules/local/sra_merge_samplesheet/tests/main.nf.test.snap +++ b/modules/local/sra_merge_samplesheet/tests/main.nf.test.snap @@ -22,6 +22,6 @@ ] } ], - "timestamp": "2023-07-06T13:16:36+0000" + "timestamp": "2023-09-22T10:59:14.022116" } } \ No newline at end of file diff --git a/modules/local/sra_runinfo_to_ftp/tests/main.nf.test.snap b/modules/local/sra_runinfo_to_ftp/tests/main.nf.test.snap index 71a25f99..cd246303 100644 --- a/modules/local/sra_runinfo_to_ftp/tests/main.nf.test.snap +++ b/modules/local/sra_runinfo_to_ftp/tests/main.nf.test.snap @@ -16,6 +16,6 @@ ] } ], - "timestamp": "2023-08-06T23:13:20+0000" + "timestamp": "2023-09-22T10:58:36.16611" } } \ No newline at end of file diff --git a/modules/local/sra_to_samplesheet/tests/main.nf.test.snap b/modules/local/sra_to_samplesheet/tests/main.nf.test.snap index e60c646a..8cc8686a 100644 --- a/modules/local/sra_to_samplesheet/tests/main.nf.test.snap +++ b/modules/local/sra_to_samplesheet/tests/main.nf.test.snap @@ -108,6 +108,6 @@ ] } ], - "timestamp": "2023-08-23T09:38:15+0000" + "timestamp": "2023-09-22T10:58:27.169349" } } \ No newline at end of file diff --git a/nextflow.config b/nextflow.config index 01da14f6..28fb66a0 100644 --- a/nextflow.config +++ b/nextflow.config @@ -162,7 +162,10 @@ profiles { executor.cpus = 16 executor.memory = 60.GB } - test { includeConfig 'conf/test.config' } + test { + includeConfig 'conf/test.config' + includeConfig 'conf/test_data.config' + } test_synapse { includeConfig 'conf/test_synapse.config' } test_full { includeConfig 'conf/test_full.config' } } From 938e7b99742aba5a285f77989ed839618a72f50b Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 22 Sep 2023 11:30:43 +0200 Subject: [PATCH 467/852] use initialise subworkflows --- main.nf | 22 +------- modules.json | 5 ++ subworkflows/nf-core/initialise/main.nf | 68 ++++++++++++++++++++++++ subworkflows/nf-core/initialise/meta.yml | 33 ++++++++++++ 4 files changed, 108 insertions(+), 20 deletions(-) create mode 100644 subworkflows/nf-core/initialise/main.nf create mode 100644 subworkflows/nf-core/initialise/meta.yml diff --git a/main.nf b/main.nf index 355898d0..a5011951 100644 --- a/main.nf +++ b/main.nf @@ -17,26 +17,6 @@ nextflow.enable.dsl = 2 ======================================================================================== */ -include { paramsHelp; paramsSummaryLog; validateParameters } from 'plugin/nf-validation' - -def logo = NfcoreTemplate.logo(workflow, params.monochrome_logs) -def citation = '\n' + WorkflowMain.citation(workflow) + '\n' - -// Print parameter summary log to screen -log.info logo + paramsSummaryLog(workflow) + citation - -// Print help message if needed -if (params.help) { - def String command = "nextflow run ${workflow.manifest.name} --input id.csv -profile docker" - log.info logo + paramsHelp(command) + citation + NfcoreTemplate.dashedLine(params.monochrome_logs) - System.exit(0) -} - -// Validate input parameters -if (params.validate_params) { - validateParameters() -} - // Check if --input file is empty ch_input = file(params.input, checkIfExists: true) if (ch_input.isEmpty()) { error("File provided with --input is empty: ${ch_input.getName()}!") } @@ -88,6 +68,7 @@ if (params.input_type == 'synapse') { include { MULTIQC_MAPPINGS_CONFIG } from './modules/local/multiqc_mappings_config' include { CUSTOM_DUMPSOFTWAREVERSIONS } from './modules/nf-core/custom/dumpsoftwareversions' +include { INITIALISE } from './subworkflows/nf-core/initialise/main' /* ======================================================================================== @@ -108,6 +89,7 @@ if (params.input_type == 'synapse') include { SYNAPSE } from './workflows/synaps // WORKFLOW: Run main nf-core/fetchngs analysis pipeline depending on type of identifier provided // workflow NFCORE_FETCHNGS { + INITIALISE(params.version, params.help, params.valid_params) ch_versions = Channel.empty() diff --git a/modules.json b/modules.json index ab610dfb..46dc80ef 100644 --- a/modules.json +++ b/modules.json @@ -33,6 +33,11 @@ "branch": "master", "git_sha": "6712754854ae2832abfff3f0800cdb4a6a60bfca", "installed_by": ["subworkflows"] + }, + "initialise": { + "branch": "master", + "git_sha": "7b55a4631bebd1cf827a448d0b70386681fea475", + "installed_by": ["subworkflows"] } } } diff --git a/subworkflows/nf-core/initialise/main.nf b/subworkflows/nf-core/initialise/main.nf new file mode 100644 index 00000000..0cbd3799 --- /dev/null +++ b/subworkflows/nf-core/initialise/main.nf @@ -0,0 +1,68 @@ +// This is a reimplementation of the basic initialise methods in the nf-core template +// The role of this subworkflow is to check the input parameters and print help messages +// Use this to start your nf-core pipeline + +include { paramsHelp; paramsSummaryLog; paramsSummaryMap; validateParameters } from 'plugin/nf-validation' + +workflow INITIALISE { + + take: + version // bool + help // bool + validate_params // bool + + main: + + // Print workflow version and exit on --version + if (version) { + String version_string = "" + + if (workflow.manifest.version) { + def prefix_v = workflow.manifest.version[0] != 'v' ? 'v' : '' + version_string += "${prefix_v}${workflow.manifest.version}" + } + + if (workflow.commitId) { + def git_shortsha = workflow.commitId.substring(0, 7) + version_string += "-g${git_shortsha}" + } + log.info "${workflow.manifest.name} ${version_string}" + System.exit(0) + } + + // Print citation for nf-core + def citation = "If you use ${workflow.manifest.name} for your analysis please cite:\n\n" + + "* The nf-core framework\n" + + " https://doi.org/10.1038/s41587-020-0439-x\n\n" + + "* Software dependencies\n" + + " ${workflow.manifest.homePage}/blob/master/CITATIONS.md" + log.info citation + + // Print help message if needed + if (params.help) { + def String command = "nextflow run ${workflow.manifest.name} --input samplesheet.csv -profile docker" + log.info paramsHelp(command) + System.exit(0) + } + + if ( params.validate_params != false ){ + validateParameters() + } + + if (workflow.profile == 'standard' && workflow.configFiles.size() <= 1) { + log.warn "[$workflow.manifest.name] You are attempting to run the pipeline without any custom configuration!\n\n" + + "This will be dependent on your local compute environment but can be achieved via one or more of the following:\n" + + " (1) Using an existing pipeline profile e.g. `-profile docker` or `-profile singularity`\n" + + " (2) Using an existing nf-core/configs for your Institution e.g. `-profile crick` or `-profile uppmax`\n" + + " (3) Using your own local custom config e.g. `-c /path/to/your/custom.config`\n\n" + + "Please refer to the quick start section and usage docs for the pipeline.\n " + } + + log.info paramsSummaryLog(workflow) + + summary_params = paramsSummaryMap(workflow) + + emit: + summary_params + +} diff --git a/subworkflows/nf-core/initialise/meta.yml b/subworkflows/nf-core/initialise/meta.yml new file mode 100644 index 00000000..69596bb5 --- /dev/null +++ b/subworkflows/nf-core/initialise/meta.yml @@ -0,0 +1,33 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/subworkflows/yaml-schema.json +name: "initialise" +description: Validate input parameters and print help messages +keywords: + - admin + - check + - help + - version +modules: +input: + - version: + type: boolean + description: | + Structure: val(version) + Boolean to show the pipeline version and exit. + - help: + type: boolean + description: | + Structure: val(help) + Boolean to show the pipeline help message and exit. + - validate_params: + type: boolean + description: | + Structure: val(validate_params) + Whether to validate the parameters prior to starting the pipeline. +output: + - summary_params: + type: value + description: | + Structure: val(summary_params) + A map of the parameters used in the pipeline. +authors: + - "@adamrtalbot" From ad25a22c03268c42dc72c3fad8a22ba61589b45a Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 22 Sep 2023 12:00:32 +0200 Subject: [PATCH 468/852] move scripts --- .../main.nf} | 0 .../{sra_fastq_ftp.nf => sra_fastq_ftp/main.nf} | 0 .../main.nf} | 0 .../main.nf} | 0 .../main.nf} | 0 .../main.nf} | 0 .../{synapse_get.nf => synapse_get/main.nf} | 0 .../{synapse_list.nf => synapse_list/main.nf} | 0 .../main.nf} | 0 .../{synapse_show.nf => synapse_show/main.nf} | 0 .../main.nf} | 0 workflows/{sra.nf => sra/main.nf} | 16 ++++++++-------- workflows/{synapse.nf => synapse/main.nf} | 12 ++++++------ 13 files changed, 14 insertions(+), 14 deletions(-) rename modules/local/{multiqc_mappings_config.nf => multiqc_mappings_config/main.nf} (100%) rename modules/local/{sra_fastq_ftp.nf => sra_fastq_ftp/main.nf} (100%) rename modules/local/{sra_ids_to_runinfo.nf => sra_ids_to_runinfo/main.nf} (100%) rename modules/local/{sra_merge_samplesheet.nf => sra_merge_samplesheet/main.nf} (100%) rename modules/local/{sra_runinfo_to_ftp.nf => sra_runinfo_to_ftp/main.nf} (100%) rename modules/local/{sra_to_samplesheet.nf => sra_to_samplesheet/main.nf} (100%) rename modules/local/{synapse_get.nf => synapse_get/main.nf} (100%) rename modules/local/{synapse_list.nf => synapse_list/main.nf} (100%) rename modules/local/{synapse_merge_samplesheet.nf => synapse_merge_samplesheet/main.nf} (100%) rename modules/local/{synapse_show.nf => synapse_show/main.nf} (100%) rename modules/local/{synapse_to_samplesheet.nf => synapse_to_samplesheet/main.nf} (100%) rename workflows/{sra.nf => sra/main.nf} (89%) rename workflows/{synapse.nf => synapse/main.nf} (89%) diff --git a/modules/local/multiqc_mappings_config.nf b/modules/local/multiqc_mappings_config/main.nf similarity index 100% rename from modules/local/multiqc_mappings_config.nf rename to modules/local/multiqc_mappings_config/main.nf diff --git a/modules/local/sra_fastq_ftp.nf b/modules/local/sra_fastq_ftp/main.nf similarity index 100% rename from modules/local/sra_fastq_ftp.nf rename to modules/local/sra_fastq_ftp/main.nf diff --git a/modules/local/sra_ids_to_runinfo.nf b/modules/local/sra_ids_to_runinfo/main.nf similarity index 100% rename from modules/local/sra_ids_to_runinfo.nf rename to modules/local/sra_ids_to_runinfo/main.nf diff --git a/modules/local/sra_merge_samplesheet.nf b/modules/local/sra_merge_samplesheet/main.nf similarity index 100% rename from modules/local/sra_merge_samplesheet.nf rename to modules/local/sra_merge_samplesheet/main.nf diff --git a/modules/local/sra_runinfo_to_ftp.nf b/modules/local/sra_runinfo_to_ftp/main.nf similarity index 100% rename from modules/local/sra_runinfo_to_ftp.nf rename to modules/local/sra_runinfo_to_ftp/main.nf diff --git a/modules/local/sra_to_samplesheet.nf b/modules/local/sra_to_samplesheet/main.nf similarity index 100% rename from modules/local/sra_to_samplesheet.nf rename to modules/local/sra_to_samplesheet/main.nf diff --git a/modules/local/synapse_get.nf b/modules/local/synapse_get/main.nf similarity index 100% rename from modules/local/synapse_get.nf rename to modules/local/synapse_get/main.nf diff --git a/modules/local/synapse_list.nf b/modules/local/synapse_list/main.nf similarity index 100% rename from modules/local/synapse_list.nf rename to modules/local/synapse_list/main.nf diff --git a/modules/local/synapse_merge_samplesheet.nf b/modules/local/synapse_merge_samplesheet/main.nf similarity index 100% rename from modules/local/synapse_merge_samplesheet.nf rename to modules/local/synapse_merge_samplesheet/main.nf diff --git a/modules/local/synapse_show.nf b/modules/local/synapse_show/main.nf similarity index 100% rename from modules/local/synapse_show.nf rename to modules/local/synapse_show/main.nf diff --git a/modules/local/synapse_to_samplesheet.nf b/modules/local/synapse_to_samplesheet/main.nf similarity index 100% rename from modules/local/synapse_to_samplesheet.nf rename to modules/local/synapse_to_samplesheet/main.nf diff --git a/workflows/sra.nf b/workflows/sra/main.nf similarity index 89% rename from workflows/sra.nf rename to workflows/sra/main.nf index 8d396ca1..366e4b28 100644 --- a/workflows/sra.nf +++ b/workflows/sra/main.nf @@ -19,12 +19,12 @@ log.info logo + paramsSummaryLog(workflow) + citation ======================================================================================== */ -include { SRA_IDS_TO_RUNINFO } from '../modules/local/sra_ids_to_runinfo' -include { SRA_RUNINFO_TO_FTP } from '../modules/local/sra_runinfo_to_ftp' -include { SRA_FASTQ_FTP } from '../modules/local/sra_fastq_ftp' -include { SRA_TO_SAMPLESHEET } from '../modules/local/sra_to_samplesheet' -include { SRA_MERGE_SAMPLESHEET } from '../modules/local/sra_merge_samplesheet' -include { MULTIQC_MAPPINGS_CONFIG } from '../modules/local/multiqc_mappings_config' +include { SRA_IDS_TO_RUNINFO } from '../../modules/local/sra_ids_to_runinfo' +include { SRA_RUNINFO_TO_FTP } from '../../modules/local/sra_runinfo_to_ftp' +include { SRA_FASTQ_FTP } from '../../modules/local/sra_fastq_ftp' +include { SRA_TO_SAMPLESHEET } from '../../modules/local/sra_to_samplesheet' +include { SRA_MERGE_SAMPLESHEET } from '../../modules/local/sra_merge_samplesheet' +include { MULTIQC_MAPPINGS_CONFIG } from '../../modules/local/multiqc_mappings_config' /* ======================================================================================== @@ -32,9 +32,9 @@ include { MULTIQC_MAPPINGS_CONFIG } from '../modules/local/multiqc_mappings_conf ======================================================================================== */ -include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/custom/dumpsoftwareversions/main' +include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../../modules/nf-core/custom/dumpsoftwareversions/main' -include { FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS } from '../subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/main' +include { FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS } from '../../subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/main' /* ======================================================================================== diff --git a/workflows/synapse.nf b/workflows/synapse/main.nf similarity index 89% rename from workflows/synapse.nf rename to workflows/synapse/main.nf index f2138a60..7d871659 100644 --- a/workflows/synapse.nf +++ b/workflows/synapse/main.nf @@ -19,11 +19,11 @@ if (params.synapse_config) { ======================================================================================== */ -include { SYNAPSE_LIST } from '../modules/local/synapse_list' -include { SYNAPSE_SHOW } from '../modules/local/synapse_show' -include { SYNAPSE_GET } from '../modules/local/synapse_get' -include { SYNAPSE_TO_SAMPLESHEET } from '../modules/local/synapse_to_samplesheet' -include { SYNAPSE_MERGE_SAMPLESHEET } from '../modules/local/synapse_merge_samplesheet' +include { SYNAPSE_LIST } from '../../modules/local/synapse_list' +include { SYNAPSE_SHOW } from '../../modules/local/synapse_show' +include { SYNAPSE_GET } from '../../modules/local/synapse_get' +include { SYNAPSE_TO_SAMPLESHEET } from '../../modules/local/synapse_to_samplesheet' +include { SYNAPSE_MERGE_SAMPLESHEET } from '../../modules/local/synapse_merge_samplesheet' /* ======================================================================================== @@ -31,7 +31,7 @@ include { SYNAPSE_MERGE_SAMPLESHEET } from '../modules/local/synapse_merge_sampl ======================================================================================== */ -include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/custom/dumpsoftwareversions/main' +include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../../modules/nf-core/custom/dumpsoftwareversions/main' /* ======================================================================================== From a86f54ffe094133f3f26d25fe4d2f76b148ee796 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 22 Sep 2023 12:36:19 +0200 Subject: [PATCH 469/852] remove public_aws_ecr profile --- .github/workflows/cloud_tests_full.yml | 2 +- .github/workflows/cloud_tests_small.yml | 2 +- conf/public_aws_ecr.config | 33 ------------------------- nextflow.config | 3 --- 4 files changed, 2 insertions(+), 38 deletions(-) delete mode 100644 conf/public_aws_ecr.config diff --git a/.github/workflows/cloud_tests_full.yml b/.github/workflows/cloud_tests_full.yml index e25a97aa..d0ed0552 100644 --- a/.github/workflows/cloud_tests_full.yml +++ b/.github/workflows/cloud_tests_full.yml @@ -27,7 +27,7 @@ jobs: compute_env: ${{ secrets.TOWER_CE_AWS_CPU }} workdir: "${{ secrets.TOWER_BUCKET_AWS }}/work/fetchngs/work-${{ github.sha }}" run_name: "aws_fetchngs_full" - profiles: test_full,public_aws_ecr + profiles: test_full parameters: | { "hook_url": "${{ secrets.MEGATESTS_ALERTS_SLACK_HOOK_URL }}", diff --git a/.github/workflows/cloud_tests_small.yml b/.github/workflows/cloud_tests_small.yml index e7636fdc..12b8daab 100644 --- a/.github/workflows/cloud_tests_small.yml +++ b/.github/workflows/cloud_tests_small.yml @@ -25,7 +25,7 @@ jobs: compute_env: ${{ secrets.TOWER_CE_AWS_CPU }} workdir: "${{ secrets.TOWER_BUCKET_AWS }}/work/fetchngs/work-${{ github.sha }}" run_name: "aws_fetchngs_small" - profiles: test,public_aws_ecr + profiles: test parameters: | { "outdir": "${{ secrets.TOWER_BUCKET_AWS }}/fetchngs/results-test-${{ github.sha }}" diff --git a/conf/public_aws_ecr.config b/conf/public_aws_ecr.config deleted file mode 100644 index 14b577d7..00000000 --- a/conf/public_aws_ecr.config +++ /dev/null @@ -1,33 +0,0 @@ -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - AWS ECR Config -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Config to set public AWS ECR images wherever possible - This improves speed when running on AWS infrastructure. - Use this as an example template when using your own private registry. ----------------------------------------------------------------------------------------- -*/ - -docker.registry = 'public.ecr.aws' -podman.registry = 'public.ecr.aws' - -process { - withName: '.*:SRA_IDS_TO_RUNINFO' { - container = 'quay.io/biocontainers/python:3.9--1' - } - withName: '.*:SRA_RUNINFO_TO_FTP' { - container = 'quay.io/biocontainers/python:3.9--1' - } - withName: '.*:MULTIQC_MAPPINGS_CONFIG' { - container = 'quay.io/biocontainers/python:3.9--1' - } - withName: '.*:SRATOOLS_FASTERQDUMP' { - container = 'quay.io/biocontainers/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:6a9ff0e76ec016c3d0d27e0c0d362339f2d787e6-0' - } - withName: '.*:SRA_MERGE_SAMPLESHEET' { - container = 'quay.io/nf-core/ubuntu:20.04' - } - withName: '.*:SYNAPSE_MERGE_SAMPLESHEET' { - container = 'quay.io/nf-core/ubuntu:20.04' - } -} diff --git a/nextflow.config b/nextflow.config index 2a8e9bcc..62c60dd0 100644 --- a/nextflow.config +++ b/nextflow.config @@ -162,9 +162,6 @@ profiles { executor.cpus = 16 executor.memory = 60.GB } - public_aws_ecr { - includeConfig 'conf/public_aws_ecr.config' - } test { includeConfig 'conf/test.config' } test_synapse { includeConfig 'conf/test_synapse.config' } test_full { includeConfig 'conf/test_full.config' } From e89691d10ed1ab576c5d1e2babc33e59a86d2e8d Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 22 Sep 2023 17:59:55 +0200 Subject: [PATCH 470/852] no need to test on push on dev, pr are enough --- .github/workflows/ci.yml | 3 --- .nf-core.yml | 6 ++++++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ac382c1e..566ef509 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,9 +1,6 @@ name: nf-core CI # This workflow runs the pipeline with the minimal test dataset to check that it completes without any syntax errors on: - push: - branches: - - dev pull_request: release: types: [published] diff --git a/.nf-core.yml b/.nf-core.yml index cafd671c..cad7f3e2 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,5 +1,11 @@ repository_type: pipeline lint: + actions_ci: false + files_exist: + - .github/workflows/awsfulltest.yml + - .github/workflows/awstest.yml + - conf/igenomes.config + - lib/WorkflowFetchngs.groovy files_unchanged: - assets/sendmail_template.txt - lib/NfcoreTemplate.groovy From a434c4616c976fbcd109d4c49fcd70f5934545c2 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 22 Sep 2023 18:08:35 +0200 Subject: [PATCH 471/852] more code polish --- main.nf | 55 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 23 deletions(-) diff --git a/main.nf b/main.nf index b600e82f..ed4f6877 100644 --- a/main.nf +++ b/main.nf @@ -1,28 +1,33 @@ #!/usr/bin/env nextflow + /* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +======================================================================================== nf-core/fetchngs -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +======================================================================================== Github : https://github.com/nf-core/fetchngs Website: https://nf-co.re/fetchngs Slack : https://nfcore.slack.com/channels/fetchngs ----------------------------------------------------------------------------------------- +======================================================================================== */ nextflow.enable.dsl = 2 /* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +======================================================================================== VALIDATE & PRINT PARAMETER SUMMARY -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +======================================================================================== */ -include { validateParameters; paramsHelp } from 'plugin/nf-validation' +include { paramsHelp; paramsSummaryLog; validateParameters } from 'plugin/nf-validation' + +def logo = NfcoreTemplate.logo(workflow, params.monochrome_logs) +def citation = '\n' + WorkflowMain.citation(workflow) + '\n' + +// Print parameter summary log to screen +log.info logo + paramsSummaryLog(workflow) + citation // Print help message if needed if (params.help) { - def logo = NfcoreTemplate.logo(workflow, params.monochrome_logs) - def citation = '\n' + WorkflowMain.citation(workflow) + '\n' def String command = "nextflow run ${workflow.manifest.name} --input id.csv -profile docker" log.info logo + paramsHelp(command) + citation + NfcoreTemplate.dashedLine(params.monochrome_logs) System.exit(0) @@ -33,11 +38,9 @@ if (params.validate_params) { validateParameters() } -WorkflowMain.initialise(workflow, params, log) - // Check if --input file is empty ch_input = file(params.input, checkIfExists: true) -if (ch_input.isEmpty()) {exit 1, "File provided with --input is empty: ${ch_input.getName()}!"} +if (ch_input.isEmpty()) { error("File provided with --input is empty: ${ch_input.getName()}!") } // Read in ids from --input file Channel @@ -47,12 +50,6 @@ Channel .unique() .set { ch_ids } -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - NAMED WORKFLOW FOR PIPELINE -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ - // Auto-detect input id type def input_type = '' if (WorkflowMain.isSraId(ch_input)) { @@ -60,9 +57,15 @@ if (WorkflowMain.isSraId(ch_input)) { } else if (WorkflowMain.isSynapseId(ch_input)) { input_type = 'synapse' } else { - exit 1, 'Ids provided via --input not recognised please make sure they are either SRA / ENA / GEO / DDBJ or Synapse ids!' + error('Ids provided via --input not recognised please make sure they are either SRA / ENA / GEO / DDBJ or Synapse ids!') } +/* +======================================================================================== + VALIDATE INPUTS +======================================================================================== +*/ + if (params.input_type == input_type) { if (params.input_type == 'sra') { include { SRA } from './workflows/sra' @@ -70,9 +73,15 @@ if (params.input_type == input_type) { include { SYNAPSE } from './workflows/synapse' } } else { - exit 1, "Ids auto-detected as ${input_type}. Please provide '--input_type ${input_type}' as a parameter to the pipeline!" + error("Ids auto-detected as ${input_type}. Please provide '--input_type ${input_type}' as a parameter to the pipeline!") } +/* +======================================================================================== + NAMED WORKFLOW FOR PIPELINE +======================================================================================== +*/ + // // WORKFLOW: Run main nf-core/fetchngs analysis pipeline depending on type of identifier provided // @@ -93,9 +102,9 @@ workflow NFCORE_FETCHNGS { } /* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +======================================================================================== RUN ALL WORKFLOWS -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +======================================================================================== */ // @@ -107,7 +116,7 @@ workflow { } /* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +======================================================================================== THE END -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +======================================================================================== */ From 5fcb97d2d260d971b9080b17aa070fab3316778b Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 22 Sep 2023 18:12:08 +0200 Subject: [PATCH 472/852] nf-core bump-version 1.10.1 --- assets/multiqc_config.yml | 4 ++-- nextflow.config | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index 5e3d9889..70cc1fc7 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -1,7 +1,7 @@ report_comment: > - This report has been generated by the nf-core/fetchngs + This report has been generated by the nf-core/fetchngs analysis pipeline. For information about how to interpret these results, please see the - documentation. + documentation. report_section_order: "nf-core-fetchngs-methods-description": order: -1000 diff --git a/nextflow.config b/nextflow.config index 62c60dd0..9eb454f4 100644 --- a/nextflow.config +++ b/nextflow.config @@ -219,7 +219,7 @@ manifest { description = """Pipeline to fetch metadata and raw FastQ files from public databases""" mainScript = 'main.nf' nextflowVersion = '!>=23.04.0' - version = '1.10.1dev' + version = '1.10.1' doi = 'https://doi.org/10.5281/zenodo.5070524' } From 89d0cc8aaae7d24ebf983014cc782440249fcbc3 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 22 Sep 2023 18:36:41 +0200 Subject: [PATCH 473/852] update CHANGELOG --- CHANGELOG.md | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index daf474c0..c9dfa84d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,31 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## dev - [date] +## [[1.10.1](https://github.com/nf-core/fetchngs/releases/tag/1.10.1)] - 2023-09-25 + +### Credits + +Special thanks to the following for their contributions to the release: + +- [Adam Talbot](https://github.com/adamrtalbot) +- [Harshil Patel](https://github.com/drpatelh) +- [Maxime Garcia](https://github.com/maxulysse) + +Thank you to everyone else that has contributed by reporting bugs, enhancements or in any other way, shape or form. + +### Enhancements & fixes + +- [#177](https://github.com/nf-core/fetchngs/pull/177) - Template update with nf-core/tools 2.9 +- [#205](https://github.com/nf-core/fetchngs/pull/205) - Rename all local modules, workflows and remove public_aws_ecr profile +- [#206](https://github.com/nf-core/fetchngs/pull/206) - CI improvments and code cleanup + +### Software dependencies + +> **NB:** Dependency has been **updated** if both old and new version information is present. +> +> **NB:** Dependency has been **added** if just the new version information is present. +> +> **NB:** Dependency has been **removed** if new version information isn't present. ## [[1.10.0](https://github.com/nf-core/fetchngs/releases/tag/1.10.0)] - 2023-05-16 From 8b8ed2f1642872c7abbaf86929d9d42f41e963f9 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 25 Sep 2023 09:42:52 +0200 Subject: [PATCH 474/852] code polish --- main.nf | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/main.nf b/main.nf index b7254a45..339eedd6 100644 --- a/main.nf +++ b/main.nf @@ -43,17 +43,24 @@ ch_input = file(params.input, checkIfExists: true) if (ch_input.isEmpty()) { error("File provided with --input is empty: ${ch_input.getName()}!") } // Read in ids from --input file -ch_ids = Channel.from(file(params.input, checkIfExists: true)) +Channel.from(file(params.input, checkIfExists: true)) .splitCsv(header:false, sep:'', strip:true) .map { it[0] } .unique() + .set { ch_ids } -// Auto-detect input type +// Auto-detect input id type def input_type = '' -if (WorkflowMain.isSraId(ch_input)) { input_type = 'sra' } -else if (WorkflowMain.isSynapseId(ch_input)) { input_type = 'synapse' } -else { error('Ids provided via --input not recognised please make sure they are either SRA / ENA / GEO / DDBJ or Synapse ids!') } -if (params.input_type != input_type) { error("Ids auto-detected as ${input_type}. Please provide '--input_type ${input_type}' as a parameter to the pipeline!") } +if (WorkflowMain.isSraId(ch_input)) { + input_type = 'sra' +} else if (WorkflowMain.isSynapseId(ch_input)) { + input_type = 'synapse' +} else { + error('Ids provided via --input not recognised please make sure they are either SRA / ENA / GEO / DDBJ or Synapse ids!') +} +if (params.input_type != input_type) { + error("Ids auto-detected as ${input_type}. Please provide '--input_type ${input_type}' as a parameter to the pipeline!") +} /* ======================================================================================== @@ -83,7 +90,7 @@ if (params.input_type == 'synapse') { /* ======================================================================================== - IMPORT MODULES + IMPORT MODULES/SUBWORKFLOWS ======================================================================================== */ From aa3339953f4e203730bcf4c47f794479e6ab7b07 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 25 Sep 2023 09:57:09 +0200 Subject: [PATCH 475/852] more code polish --- main.nf | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/main.nf b/main.nf index 339eedd6..34f6d9ce 100644 --- a/main.nf +++ b/main.nf @@ -43,7 +43,8 @@ ch_input = file(params.input, checkIfExists: true) if (ch_input.isEmpty()) { error("File provided with --input is empty: ${ch_input.getName()}!") } // Read in ids from --input file -Channel.from(file(params.input, checkIfExists: true)) +Channel + .from(file(params.input, checkIfExists: true)) .splitCsv(header:false, sep:'', strip:true) .map { it[0] } .unique() @@ -75,9 +76,7 @@ if (params.input_type == 'sra') { // Validate input parameters WorkflowSra.initialise(params, valid_params) -} - -if (params.input_type == 'synapse') { +} else if (params.input_type == 'synapse') { // Create channel for synapse config if (params.synapse_config) { @@ -120,12 +119,16 @@ workflow NFCORE_FETCHNGS { ch_versions = Channel.empty() + // // WORKFLOW: Download FastQ files for SRA / ENA / GEO / DDBJ ids + // if (params.input_type == 'sra') { SRA(ch_ids, params.sample_mapping_fields) ch_versions = ch_versions.mix(SRA.out.versions) + // // WORKFLOW: Download FastQ files for Synapse ids + // } else if (params.input_type == 'synapse') { SYNAPSE(ch_ids, ch_synapse_config) ch_versions = ch_versions.mix(SYNAPSE.out.versions) From 8ccf26a95c42c1dcbd2494be3ea1f4e1f2f0785e Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 25 Sep 2023 10:00:34 +0200 Subject: [PATCH 476/852] params --- main.nf | 2 +- workflows/sra/main.nf | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/main.nf b/main.nf index 34f6d9ce..9617f85e 100644 --- a/main.nf +++ b/main.nf @@ -123,7 +123,7 @@ workflow NFCORE_FETCHNGS { // WORKFLOW: Download FastQ files for SRA / ENA / GEO / DDBJ ids // if (params.input_type == 'sra') { - SRA(ch_ids, params.sample_mapping_fields) + SRA(ch_ids) ch_versions = ch_versions.mix(SRA.out.versions) // diff --git a/workflows/sra/main.nf b/workflows/sra/main.nf index e7e56b93..e92ae283 100644 --- a/workflows/sra/main.nf +++ b/workflows/sra/main.nf @@ -22,7 +22,6 @@ workflow SRA { take: ids // channel: [ ids ] - sample_mapping_fields main: ch_versions = Channel.empty() @@ -124,7 +123,7 @@ workflow SRA { ) ch_versions = ch_versions.mix(SRA_MERGE_SAMPLESHEET.out.versions) - if (sample_mapping_fields) { + if (params.sample_mapping_fields) { MULTIQC_MAPPINGS_CONFIG(SRA_MERGE_SAMPLESHEET.out.mappings) ch_versions = ch_versions.mix(MULTIQC_MAPPINGS_CONFIG.out.versions) } From 6f0189a6395f3d2cdb362fc5c8d9baf8c90044cd Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 25 Sep 2023 10:27:52 +0200 Subject: [PATCH 477/852] more code polish --- lib/WorkflowMain.groovy | 111 +++++++++++++++++++++++++++++++++++++ lib/WorkflowSra.groovy | 33 ----------- lib/WorkflowSynapse.groovy | 92 ------------------------------ main.nf | 12 ++-- workflows/sra/main.nf | 14 +++-- workflows/synapse/main.nf | 6 +- 6 files changed, 128 insertions(+), 140 deletions(-) delete mode 100755 lib/WorkflowSra.groovy delete mode 100755 lib/WorkflowSynapse.groovy diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index f9469941..4ec4029a 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -102,4 +102,115 @@ class WorkflowMain { } return is_synapse } + + // + // Check and validate parameters + // + public static void sraInitialise(params, valid_params) { + // Check minimal ENA fields are provided to download FastQ files + def ena_metadata_fields = params.ena_metadata_fields ? params.ena_metadata_fields.split(',').collect{ it.trim().toLowerCase() } : valid_params['ena_metadata_fields'] + if (!ena_metadata_fields.containsAll(valid_params['ena_metadata_fields'])) { + Nextflow.error("Invalid option: '${params.ena_metadata_fields}'. Minimally required fields for '--ena_metadata_fields': '${valid_params['ena_metadata_fields'].join(',')}'") + } + } + + // + // Print a warning after pipeline has completed + // + public static void sraCurateSamplesheetWarn(log) { + log.warn "=============================================================================\n" + + " Please double-check the samplesheet that has been auto-created by the pipeline.\n\n" + + " Public databases don't reliably hold information such as strandedness\n" + + " information, controls etc\n\n" + + " All of the sample metadata obtained from the ENA has been appended\n" + + " as additional columns to help you manually curate the samplesheet before\n" + + " running nf-core/other pipelines.\n" + + "===================================================================================" + } + + // + // Convert metadata obtained from the 'synapse show' command to a Groovy map + // + public static Map synapseShowToMap(synapse_file) { + def meta = [:] + def category = '' + synapse_file.eachLine { line -> + def entries = [null, null] + if (!line.startsWith(' ') && !line.trim().isEmpty()) { + category = line.tokenize(':')[0] + } else { + entries = line.trim().tokenize('=') + } + meta["${category}|${entries[0]}"] = entries[1] + } + meta.id = meta['properties|id'] + meta.name = meta['properties|name'] + meta.md5 = meta['File|md5'] + return meta.findAll{ it.value != null } + } + + // + // Print a warning after pipeline has completed + // + public static void synapseCurateSamplesheetWarn(log) { + log.warn "=============================================================================\n" + + " Please double-check the samplesheet that has been auto-created by the pipeline.\n\n" + + " Where applicable, default values will be used for sample-specific metadata\n" + + " such as strandedness, controls etc as this information is not provided\n" + + " in a standardised manner when uploading data to Synapse.\n" + + "===================================================================================" + } + + // + // Obtain Sample ID from File Name + // + public static String synapseSampleNameFromFastQ(input_file, pattern) { + + def sampleids = "" + + def filePattern = pattern.toString() + int p = filePattern.lastIndexOf('/') + if( p != -1 ) + filePattern = filePattern.substring(p+1) + + input_file.each { + String fileName = input_file.getFileName().toString() + + String indexOfWildcards = filePattern.findIndexOf { it=='*' || it=='?' } + String indexOfBrackets = filePattern.findIndexOf { it=='{' || it=='[' } + if( indexOfWildcards==-1 && indexOfBrackets==-1 ) { + if( fileName == filePattern ) + return actual.getSimpleName() + throw new IllegalArgumentException("Not a valid file pair globbing pattern: pattern=$filePattern file=$fileName") + } + + int groupCount = 0 + for( int i=0; i - def entries = [null, null] - if (!line.startsWith(' ') && !line.trim().isEmpty()) { - category = line.tokenize(':')[0] - } else { - entries = line.trim().tokenize('=') - } - meta["${category}|${entries[0]}"] = entries[1] - } - meta.id = meta['properties|id'] - meta.name = meta['properties|name'] - meta.md5 = meta['File|md5'] - return meta.findAll{ it.value != null } - } - - // - // Print a warning after pipeline has completed - // - public static void curateSamplesheetWarn(log) { - log.warn "=============================================================================\n" + - " Please double-check the samplesheet that has been auto-created by the pipeline.\n\n" + - " Where applicable, default values will be used for sample-specific metadata\n" + - " such as strandedness, controls etc as this information is not provided\n" + - " in a standardised manner when uploading data to Synapse.\n" + - "===================================================================================" - } - - // - // Obtain Sample ID from File Name - // - public static String sampleNameFromFastQ(input_file, pattern) { - - def sampleids = "" - - def filePattern = pattern.toString() - int p = filePattern.lastIndexOf('/') - if( p != -1 ) - filePattern = filePattern.substring(p+1) - - input_file.each { - String fileName = input_file.getFileName().toString() - - String indexOfWildcards = filePattern.findIndexOf { it=='*' || it=='?' } - String indexOfBrackets = filePattern.findIndexOf { it=='{' || it=='[' } - if( indexOfWildcards==-1 && indexOfBrackets==-1 ) { - if( fileName == filePattern ) - return actual.getSimpleName() - throw new IllegalArgumentException("Not a valid file pair globbing pattern: pattern=$filePattern file=$fileName") - } - - int groupCount = 0 - for( int i=0; i [ meta, [ meta.fastq_1, meta.fastq_2 ] ] @@ -69,6 +70,7 @@ workflow SRA { ftp: it[0].fastq_1 && !params.force_sratools_download sra: !it[0].fastq_1 || params.force_sratools_download } + .set { ch_sra_reads } // // MODULE: If FTP link is provided in run information then download FastQ directly via FTP and validate with md5sums @@ -88,12 +90,12 @@ workflow SRA { ch_versions = ch_versions.mix(FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS.out.versions.first()) // Isolate FASTQ channel which will be added to emit block - fastq_files = fastq_files.mix( + fastq_files.mix( SRA_FASTQ_FTP.out.fastq, FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS.out.reads - ) + ).set { fastq_files } - ch_sra_metadata = fastq_files.map { meta, fastq -> + fastq_files.map { meta, fastq -> def reads = fastq instanceof List ? fastq.flatten() : [ fastq ] def meta_clone = meta.clone() @@ -101,7 +103,7 @@ workflow SRA { meta_clone.fastq_2 = reads[1] && !meta.single_end ? "${params.outdir}/fastq/${reads[1].getName()}" : '' return meta_clone - } + }.set { ch_sra_metadata } } // diff --git a/workflows/synapse/main.nf b/workflows/synapse/main.nf index 30d05f4f..785877ac 100644 --- a/workflows/synapse/main.nf +++ b/workflows/synapse/main.nf @@ -56,7 +56,7 @@ workflow SYNAPSE { SYNAPSE_SHOW .out .metadata - .map { it -> WorkflowSynapse.synapseShowToMap(it) } + .map { it -> Workflow.synapseShowToMap(it) } .set { ch_samples_meta } // @@ -72,14 +72,14 @@ workflow SYNAPSE { SYNAPSE_GET .out .fastq - .map { meta, fastq -> [ WorkflowSynapse.sampleNameFromFastQ( fastq , "*{1,2}*"), fastq ] } + .map { meta, fastq -> [ Workflow.synapseSampleNameFromFastQ( fastq , "*{1,2}*"), fastq ] } .groupTuple(sort: { it -> it.baseName }) .set { ch_fastq } SYNAPSE_GET .out .fastq - .map { meta, fastq -> [ WorkflowSynapse.sampleNameFromFastQ( fastq , "*{1,2}*"), meta.id ] } + .map { meta, fastq -> [ Workflow.synapseSampleNameFromFastQ( fastq , "*{1,2}*"), meta.id ] } .groupTuple() .join(ch_fastq) .map { id, synids, fastq -> From 37229aba32279f5fcb1107215847431362b7bdb6 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 25 Sep 2023 10:32:24 +0200 Subject: [PATCH 478/852] typo --- main.nf | 8 ++++---- workflows/synapse/main.nf | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/main.nf b/main.nf index f0f40588..95cc5fbc 100644 --- a/main.nf +++ b/main.nf @@ -28,7 +28,7 @@ log.info logo + paramsSummaryLog(workflow) + citation // Print help message if needed if (params.help) { - def String command = "nextflow run ${workflow.manifest.name} --input id.csv -profile docker" + def String command = "nextflow run ${WorkflowMain.manifest.name} --input id.csv -profile docker" log.info logo + paramsHelp(command) + citation + NfcoreTemplate.dashedLine(params.monochrome_logs) System.exit(0) } @@ -75,7 +75,7 @@ if (params.input_type == 'sra') { ] // Validate input parameters - Workflow.sraInitialise(params, valid_params) + WorkflowMain.sraInitialise(params, valid_params) } else if (params.input_type == 'synapse') { // Create channel for synapse config @@ -163,8 +163,8 @@ workflow.onComplete { NfcoreTemplate.email(workflow, params, summary_params, projectDir, log) } NfcoreTemplate.summary(workflow, params, log) - if (params.input_type == 'sra') { Workflow.sraCurateSamplesheetWarn(log) } - if (params.input_type == 'synapse') { Workflow.synapseCurateSamplesheetWarn(log) } + if (params.input_type == 'sra') { WorkflowMain.sraCurateSamplesheetWarn(log) } + if (params.input_type == 'synapse') { WorkflowMain.synapseCurateSamplesheetWarn(log) } } /* diff --git a/workflows/synapse/main.nf b/workflows/synapse/main.nf index 785877ac..0fc46ed4 100644 --- a/workflows/synapse/main.nf +++ b/workflows/synapse/main.nf @@ -56,7 +56,7 @@ workflow SYNAPSE { SYNAPSE_SHOW .out .metadata - .map { it -> Workflow.synapseShowToMap(it) } + .map { it -> WorkflowMain.synapseShowToMap(it) } .set { ch_samples_meta } // @@ -72,14 +72,14 @@ workflow SYNAPSE { SYNAPSE_GET .out .fastq - .map { meta, fastq -> [ Workflow.synapseSampleNameFromFastQ( fastq , "*{1,2}*"), fastq ] } + .map { meta, fastq -> [ WorkflowMain.synapseSampleNameFromFastQ( fastq , "*{1,2}*"), fastq ] } .groupTuple(sort: { it -> it.baseName }) .set { ch_fastq } SYNAPSE_GET .out .fastq - .map { meta, fastq -> [ Workflow.synapseSampleNameFromFastQ( fastq , "*{1,2}*"), meta.id ] } + .map { meta, fastq -> [ WorkflowMain.synapseSampleNameFromFastQ( fastq , "*{1,2}*"), meta.id ] } .groupTuple() .join(ch_fastq) .map { id, synids, fastq -> From ef3a5cfd3ee6f093ed99b5e535e0d94c747b0c46 Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Mon, 25 Sep 2023 10:45:28 +0200 Subject: [PATCH 479/852] Apply suggestions from code review --- main.nf | 2 +- workflows/sra/main.nf | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/main.nf b/main.nf index 95cc5fbc..70e8ff27 100644 --- a/main.nf +++ b/main.nf @@ -28,7 +28,7 @@ log.info logo + paramsSummaryLog(workflow) + citation // Print help message if needed if (params.help) { - def String command = "nextflow run ${WorkflowMain.manifest.name} --input id.csv -profile docker" + def String command = "nextflow run ${workflow.manifest.name} --input id.csv -profile docker" log.info logo + paramsHelp(command) + citation + NfcoreTemplate.dashedLine(params.monochrome_logs) System.exit(0) } diff --git a/workflows/sra/main.nf b/workflows/sra/main.nf index d59b1908..45efa9c9 100644 --- a/workflows/sra/main.nf +++ b/workflows/sra/main.nf @@ -53,7 +53,7 @@ workflow SRA { return meta_clone } .unique() - .set{ ch_sra_metadata } + .set { ch_sra_metadata } ch_versions = ch_versions.mix(SRA_RUNINFO_TO_FTP.out.versions.first()) @@ -93,9 +93,7 @@ workflow SRA { fastq_files.mix( SRA_FASTQ_FTP.out.fastq, FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS.out.reads - ).set { fastq_files } - - fastq_files.map { meta, fastq -> + ).map { meta, fastq -> def reads = fastq instanceof List ? fastq.flatten() : [ fastq ] def meta_clone = meta.clone() @@ -126,7 +124,9 @@ workflow SRA { ch_versions = ch_versions.mix(SRA_MERGE_SAMPLESHEET.out.versions) if (params.sample_mapping_fields) { - MULTIQC_MAPPINGS_CONFIG(SRA_MERGE_SAMPLESHEET.out.mappings) + MULTIQC_MAPPINGS_CONFIG ( + SRA_MERGE_SAMPLESHEET.out.mappings + ) ch_versions = ch_versions.mix(MULTIQC_MAPPINGS_CONFIG.out.versions) } From cdaf06fa7150f2f994d9214d132f3e83b9e141b5 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 22 Sep 2023 11:30:43 +0200 Subject: [PATCH 480/852] use initialise subworkflows --- main.nf | 22 +------- modules.json | 5 ++ subworkflows/nf-core/initialise/main.nf | 68 ++++++++++++++++++++++++ subworkflows/nf-core/initialise/meta.yml | 33 ++++++++++++ 4 files changed, 108 insertions(+), 20 deletions(-) create mode 100644 subworkflows/nf-core/initialise/main.nf create mode 100644 subworkflows/nf-core/initialise/meta.yml diff --git a/main.nf b/main.nf index 355898d0..a5011951 100644 --- a/main.nf +++ b/main.nf @@ -17,26 +17,6 @@ nextflow.enable.dsl = 2 ======================================================================================== */ -include { paramsHelp; paramsSummaryLog; validateParameters } from 'plugin/nf-validation' - -def logo = NfcoreTemplate.logo(workflow, params.monochrome_logs) -def citation = '\n' + WorkflowMain.citation(workflow) + '\n' - -// Print parameter summary log to screen -log.info logo + paramsSummaryLog(workflow) + citation - -// Print help message if needed -if (params.help) { - def String command = "nextflow run ${workflow.manifest.name} --input id.csv -profile docker" - log.info logo + paramsHelp(command) + citation + NfcoreTemplate.dashedLine(params.monochrome_logs) - System.exit(0) -} - -// Validate input parameters -if (params.validate_params) { - validateParameters() -} - // Check if --input file is empty ch_input = file(params.input, checkIfExists: true) if (ch_input.isEmpty()) { error("File provided with --input is empty: ${ch_input.getName()}!") } @@ -88,6 +68,7 @@ if (params.input_type == 'synapse') { include { MULTIQC_MAPPINGS_CONFIG } from './modules/local/multiqc_mappings_config' include { CUSTOM_DUMPSOFTWAREVERSIONS } from './modules/nf-core/custom/dumpsoftwareversions' +include { INITIALISE } from './subworkflows/nf-core/initialise/main' /* ======================================================================================== @@ -108,6 +89,7 @@ if (params.input_type == 'synapse') include { SYNAPSE } from './workflows/synaps // WORKFLOW: Run main nf-core/fetchngs analysis pipeline depending on type of identifier provided // workflow NFCORE_FETCHNGS { + INITIALISE(params.version, params.help, params.valid_params) ch_versions = Channel.empty() diff --git a/modules.json b/modules.json index ab610dfb..46dc80ef 100644 --- a/modules.json +++ b/modules.json @@ -33,6 +33,11 @@ "branch": "master", "git_sha": "6712754854ae2832abfff3f0800cdb4a6a60bfca", "installed_by": ["subworkflows"] + }, + "initialise": { + "branch": "master", + "git_sha": "7b55a4631bebd1cf827a448d0b70386681fea475", + "installed_by": ["subworkflows"] } } } diff --git a/subworkflows/nf-core/initialise/main.nf b/subworkflows/nf-core/initialise/main.nf new file mode 100644 index 00000000..0cbd3799 --- /dev/null +++ b/subworkflows/nf-core/initialise/main.nf @@ -0,0 +1,68 @@ +// This is a reimplementation of the basic initialise methods in the nf-core template +// The role of this subworkflow is to check the input parameters and print help messages +// Use this to start your nf-core pipeline + +include { paramsHelp; paramsSummaryLog; paramsSummaryMap; validateParameters } from 'plugin/nf-validation' + +workflow INITIALISE { + + take: + version // bool + help // bool + validate_params // bool + + main: + + // Print workflow version and exit on --version + if (version) { + String version_string = "" + + if (workflow.manifest.version) { + def prefix_v = workflow.manifest.version[0] != 'v' ? 'v' : '' + version_string += "${prefix_v}${workflow.manifest.version}" + } + + if (workflow.commitId) { + def git_shortsha = workflow.commitId.substring(0, 7) + version_string += "-g${git_shortsha}" + } + log.info "${workflow.manifest.name} ${version_string}" + System.exit(0) + } + + // Print citation for nf-core + def citation = "If you use ${workflow.manifest.name} for your analysis please cite:\n\n" + + "* The nf-core framework\n" + + " https://doi.org/10.1038/s41587-020-0439-x\n\n" + + "* Software dependencies\n" + + " ${workflow.manifest.homePage}/blob/master/CITATIONS.md" + log.info citation + + // Print help message if needed + if (params.help) { + def String command = "nextflow run ${workflow.manifest.name} --input samplesheet.csv -profile docker" + log.info paramsHelp(command) + System.exit(0) + } + + if ( params.validate_params != false ){ + validateParameters() + } + + if (workflow.profile == 'standard' && workflow.configFiles.size() <= 1) { + log.warn "[$workflow.manifest.name] You are attempting to run the pipeline without any custom configuration!\n\n" + + "This will be dependent on your local compute environment but can be achieved via one or more of the following:\n" + + " (1) Using an existing pipeline profile e.g. `-profile docker` or `-profile singularity`\n" + + " (2) Using an existing nf-core/configs for your Institution e.g. `-profile crick` or `-profile uppmax`\n" + + " (3) Using your own local custom config e.g. `-c /path/to/your/custom.config`\n\n" + + "Please refer to the quick start section and usage docs for the pipeline.\n " + } + + log.info paramsSummaryLog(workflow) + + summary_params = paramsSummaryMap(workflow) + + emit: + summary_params + +} diff --git a/subworkflows/nf-core/initialise/meta.yml b/subworkflows/nf-core/initialise/meta.yml new file mode 100644 index 00000000..69596bb5 --- /dev/null +++ b/subworkflows/nf-core/initialise/meta.yml @@ -0,0 +1,33 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/subworkflows/yaml-schema.json +name: "initialise" +description: Validate input parameters and print help messages +keywords: + - admin + - check + - help + - version +modules: +input: + - version: + type: boolean + description: | + Structure: val(version) + Boolean to show the pipeline version and exit. + - help: + type: boolean + description: | + Structure: val(help) + Boolean to show the pipeline help message and exit. + - validate_params: + type: boolean + description: | + Structure: val(validate_params) + Whether to validate the parameters prior to starting the pipeline. +output: + - summary_params: + type: value + description: | + Structure: val(summary_params) + A map of the parameters used in the pipeline. +authors: + - "@adamrtalbot" From b8b15903aa71378d9357ab61c7e3c2f93a9d4d51 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 22 Sep 2023 12:00:32 +0200 Subject: [PATCH 481/852] move scripts --- workflows/sra/main.nf | 1 + 1 file changed, 1 insertion(+) diff --git a/workflows/sra/main.nf b/workflows/sra/main.nf index 8d5149d2..8b5f649e 100644 --- a/workflows/sra/main.nf +++ b/workflows/sra/main.nf @@ -9,6 +9,7 @@ include { SRA_RUNINFO_TO_FTP } from '../../modules/local/sra_runinfo_to_ftp include { SRA_FASTQ_FTP } from '../../modules/local/sra_fastq_ftp' include { SRA_TO_SAMPLESHEET } from '../../modules/local/sra_to_samplesheet' include { SRA_MERGE_SAMPLESHEET } from '../../modules/local/sra_merge_samplesheet' +include { MULTIQC_MAPPINGS_CONFIG } from '../../modules/local/multiqc_mappings_config' /* ======================================================================================== From b6c71a112e971d918c048bc4899dbfe131dab923 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 22 Sep 2023 17:59:55 +0200 Subject: [PATCH 482/852] no need to test on push on dev, pr are enough --- .nf-core.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.nf-core.yml b/.nf-core.yml index d617b3a3..78f1faff 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -2,7 +2,11 @@ repository_type: pipeline lint: actions_ci: false files_exist: + - .github/workflows/awsfulltest.yml + - .github/workflows/awstest.yml + - conf/igenomes.config - conf/modules.config + - lib/WorkflowFetchngs.groovy files_unchanged: - assets/sendmail_template.txt - lib/NfcoreTemplate.groovy From d6f8971a23c7432cc8a5655340ba627323b2410e Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 22 Sep 2023 18:08:35 +0200 Subject: [PATCH 483/852] more code polish --- main.nf | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/main.nf b/main.nf index a5011951..aa24ed36 100644 --- a/main.nf +++ b/main.nf @@ -1,4 +1,5 @@ #!/usr/bin/env nextflow + /* ======================================================================================== nf-core/fetchngs @@ -66,7 +67,6 @@ if (params.input_type == 'synapse') { ======================================================================================== */ -include { MULTIQC_MAPPINGS_CONFIG } from './modules/local/multiqc_mappings_config' include { CUSTOM_DUMPSOFTWAREVERSIONS } from './modules/nf-core/custom/dumpsoftwareversions' include { INITIALISE } from './subworkflows/nf-core/initialise/main' @@ -98,12 +98,6 @@ workflow NFCORE_FETCHNGS { SRA(ch_ids) ch_versions = ch_versions.mix(SRA.out.versions) - // MODULE: Create a MultiQC config file with sample name mappings - if (params.sample_mapping_fields) { - MULTIQC_MAPPINGS_CONFIG(SRA.out.mappings) - ch_versions = ch_versions.mix(MULTIQC_MAPPINGS_CONFIG.out.versions) - } - // WORKFLOW: Download FastQ files for Synapse ids } else if (params.input_type == 'synapse') { SYNAPSE(ch_ids, ch_synapse_config) @@ -115,9 +109,9 @@ workflow NFCORE_FETCHNGS { } /* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +======================================================================================== RUN ALL WORKFLOWS -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +======================================================================================== */ // From a968fcb29bb5791199f921f2823f7f6c848539e3 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 25 Sep 2023 09:42:52 +0200 Subject: [PATCH 484/852] code polish --- main.nf | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/main.nf b/main.nf index aa24ed36..a67acf26 100644 --- a/main.nf +++ b/main.nf @@ -23,17 +23,24 @@ ch_input = file(params.input, checkIfExists: true) if (ch_input.isEmpty()) { error("File provided with --input is empty: ${ch_input.getName()}!") } // Read in ids from --input file -ch_ids = Channel.from(file(params.input, checkIfExists: true)) +Channel.from(file(params.input, checkIfExists: true)) .splitCsv(header:false, sep:'', strip:true) .map { it[0] } .unique() + .set { ch_ids } -// Auto-detect input type +// Auto-detect input id type def input_type = '' -if (WorkflowMain.isSraId(ch_input)) { input_type = 'sra' } -else if (WorkflowMain.isSynapseId(ch_input)) { input_type = 'synapse' } -else { error('Ids provided via --input not recognised please make sure they are either SRA / ENA / GEO / DDBJ or Synapse ids!') } -if (params.input_type != input_type) { error("Ids auto-detected as ${input_type}. Please provide '--input_type ${input_type}' as a parameter to the pipeline!") } +if (WorkflowMain.isSraId(ch_input)) { + input_type = 'sra' +} else if (WorkflowMain.isSynapseId(ch_input)) { + input_type = 'synapse' +} else { + error('Ids provided via --input not recognised please make sure they are either SRA / ENA / GEO / DDBJ or Synapse ids!') +} +if (params.input_type != input_type) { + error("Ids auto-detected as ${input_type}. Please provide '--input_type ${input_type}' as a parameter to the pipeline!") +} /* ======================================================================================== @@ -63,7 +70,7 @@ if (params.input_type == 'synapse') { /* ======================================================================================== - IMPORT MODULES + IMPORT MODULES/SUBWORKFLOWS ======================================================================================== */ From 58f92b086478fabcb1a106678c34e15f42a6e40d Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 25 Sep 2023 09:57:09 +0200 Subject: [PATCH 485/852] more code polish --- main.nf | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/main.nf b/main.nf index a67acf26..22977145 100644 --- a/main.nf +++ b/main.nf @@ -23,7 +23,8 @@ ch_input = file(params.input, checkIfExists: true) if (ch_input.isEmpty()) { error("File provided with --input is empty: ${ch_input.getName()}!") } // Read in ids from --input file -Channel.from(file(params.input, checkIfExists: true)) +Channel + .from(file(params.input, checkIfExists: true)) .splitCsv(header:false, sep:'', strip:true) .map { it[0] } .unique() @@ -55,9 +56,7 @@ if (params.input_type == 'sra') { // Validate input parameters WorkflowSra.initialise(params, valid_params) -} - -if (params.input_type == 'synapse') { +} else if (params.input_type == 'synapse') { // Create channel for synapse config if (params.synapse_config) { @@ -100,12 +99,16 @@ workflow NFCORE_FETCHNGS { ch_versions = Channel.empty() + // // WORKFLOW: Download FastQ files for SRA / ENA / GEO / DDBJ ids + // if (params.input_type == 'sra') { SRA(ch_ids) ch_versions = ch_versions.mix(SRA.out.versions) + // // WORKFLOW: Download FastQ files for Synapse ids + // } else if (params.input_type == 'synapse') { SYNAPSE(ch_ids, ch_synapse_config) ch_versions = ch_versions.mix(SYNAPSE.out.versions) From c98917663793ea5af43afcf85d8b75a7f83e16af Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 25 Sep 2023 10:00:34 +0200 Subject: [PATCH 486/852] params --- workflows/sra/main.nf | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/workflows/sra/main.nf b/workflows/sra/main.nf index 8b5f649e..de3eaf8b 100644 --- a/workflows/sra/main.nf +++ b/workflows/sra/main.nf @@ -130,6 +130,11 @@ workflow SRA { ) ch_versions = ch_versions.mix(SRA_MERGE_SAMPLESHEET.out.versions) + if (params.sample_mapping_fields) { + MULTIQC_MAPPINGS_CONFIG(SRA_MERGE_SAMPLESHEET.out.mappings) + ch_versions = ch_versions.mix(MULTIQC_MAPPINGS_CONFIG.out.versions) + } + emit: fastq = fastq_files samplesheet = SRA_MERGE_SAMPLESHEET.out.samplesheet From 131fd1b6fa42679d8cd779039e8f40de333d4e95 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 25 Sep 2023 10:27:52 +0200 Subject: [PATCH 487/852] more code polish --- lib/WorkflowMain.groovy | 111 +++++++++++++++++++++++++++++++++++++ lib/WorkflowSra.groovy | 33 ----------- lib/WorkflowSynapse.groovy | 92 ------------------------------ main.nf | 12 ++-- workflows/sra/main.nf | 14 +++-- workflows/synapse/main.nf | 6 +- 6 files changed, 128 insertions(+), 140 deletions(-) delete mode 100755 lib/WorkflowSra.groovy delete mode 100755 lib/WorkflowSynapse.groovy diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index f9469941..4ec4029a 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -102,4 +102,115 @@ class WorkflowMain { } return is_synapse } + + // + // Check and validate parameters + // + public static void sraInitialise(params, valid_params) { + // Check minimal ENA fields are provided to download FastQ files + def ena_metadata_fields = params.ena_metadata_fields ? params.ena_metadata_fields.split(',').collect{ it.trim().toLowerCase() } : valid_params['ena_metadata_fields'] + if (!ena_metadata_fields.containsAll(valid_params['ena_metadata_fields'])) { + Nextflow.error("Invalid option: '${params.ena_metadata_fields}'. Minimally required fields for '--ena_metadata_fields': '${valid_params['ena_metadata_fields'].join(',')}'") + } + } + + // + // Print a warning after pipeline has completed + // + public static void sraCurateSamplesheetWarn(log) { + log.warn "=============================================================================\n" + + " Please double-check the samplesheet that has been auto-created by the pipeline.\n\n" + + " Public databases don't reliably hold information such as strandedness\n" + + " information, controls etc\n\n" + + " All of the sample metadata obtained from the ENA has been appended\n" + + " as additional columns to help you manually curate the samplesheet before\n" + + " running nf-core/other pipelines.\n" + + "===================================================================================" + } + + // + // Convert metadata obtained from the 'synapse show' command to a Groovy map + // + public static Map synapseShowToMap(synapse_file) { + def meta = [:] + def category = '' + synapse_file.eachLine { line -> + def entries = [null, null] + if (!line.startsWith(' ') && !line.trim().isEmpty()) { + category = line.tokenize(':')[0] + } else { + entries = line.trim().tokenize('=') + } + meta["${category}|${entries[0]}"] = entries[1] + } + meta.id = meta['properties|id'] + meta.name = meta['properties|name'] + meta.md5 = meta['File|md5'] + return meta.findAll{ it.value != null } + } + + // + // Print a warning after pipeline has completed + // + public static void synapseCurateSamplesheetWarn(log) { + log.warn "=============================================================================\n" + + " Please double-check the samplesheet that has been auto-created by the pipeline.\n\n" + + " Where applicable, default values will be used for sample-specific metadata\n" + + " such as strandedness, controls etc as this information is not provided\n" + + " in a standardised manner when uploading data to Synapse.\n" + + "===================================================================================" + } + + // + // Obtain Sample ID from File Name + // + public static String synapseSampleNameFromFastQ(input_file, pattern) { + + def sampleids = "" + + def filePattern = pattern.toString() + int p = filePattern.lastIndexOf('/') + if( p != -1 ) + filePattern = filePattern.substring(p+1) + + input_file.each { + String fileName = input_file.getFileName().toString() + + String indexOfWildcards = filePattern.findIndexOf { it=='*' || it=='?' } + String indexOfBrackets = filePattern.findIndexOf { it=='{' || it=='[' } + if( indexOfWildcards==-1 && indexOfBrackets==-1 ) { + if( fileName == filePattern ) + return actual.getSimpleName() + throw new IllegalArgumentException("Not a valid file pair globbing pattern: pattern=$filePattern file=$fileName") + } + + int groupCount = 0 + for( int i=0; i - def entries = [null, null] - if (!line.startsWith(' ') && !line.trim().isEmpty()) { - category = line.tokenize(':')[0] - } else { - entries = line.trim().tokenize('=') - } - meta["${category}|${entries[0]}"] = entries[1] - } - meta.id = meta['properties|id'] - meta.name = meta['properties|name'] - meta.md5 = meta['File|md5'] - return meta.findAll{ it.value != null } - } - - // - // Print a warning after pipeline has completed - // - public static void curateSamplesheetWarn(log) { - log.warn "=============================================================================\n" + - " Please double-check the samplesheet that has been auto-created by the pipeline.\n\n" + - " Where applicable, default values will be used for sample-specific metadata\n" + - " such as strandedness, controls etc as this information is not provided\n" + - " in a standardised manner when uploading data to Synapse.\n" + - "===================================================================================" - } - - // - // Obtain Sample ID from File Name - // - public static String sampleNameFromFastQ(input_file, pattern) { - - def sampleids = "" - - def filePattern = pattern.toString() - int p = filePattern.lastIndexOf('/') - if( p != -1 ) - filePattern = filePattern.substring(p+1) - - input_file.each { - String fileName = input_file.getFileName().toString() - - String indexOfWildcards = filePattern.findIndexOf { it=='*' || it=='?' } - String indexOfBrackets = filePattern.findIndexOf { it=='{' || it=='[' } - if( indexOfWildcards==-1 && indexOfBrackets==-1 ) { - if( fileName == filePattern ) - return actual.getSimpleName() - throw new IllegalArgumentException("Not a valid file pair globbing pattern: pattern=$filePattern file=$fileName") - } - - int groupCount = 0 - for( int i=0; i [ meta, [ meta.fastq_1, meta.fastq_2 ] ] @@ -76,6 +77,7 @@ workflow SRA { ftp: it[0].fastq_1 && !params.force_sratools_download sra: !it[0].fastq_1 || params.force_sratools_download } + .set { ch_sra_reads } // // MODULE: If FTP link is provided in run information then download FastQ directly via FTP and validate with md5sums @@ -95,12 +97,12 @@ workflow SRA { ch_versions = ch_versions.mix(FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS.out.versions.first()) // Isolate FASTQ channel which will be added to emit block - fastq_files = fastq_files.mix( + fastq_files.mix( SRA_FASTQ_FTP.out.fastq, FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS.out.reads - ) + ).set { fastq_files } - ch_sra_metadata = fastq_files.map { meta, fastq -> + fastq_files.map { meta, fastq -> def reads = fastq instanceof List ? fastq.flatten() : [ fastq ] def meta_clone = meta.clone() @@ -108,7 +110,7 @@ workflow SRA { meta_clone.fastq_2 = reads[1] && !meta.single_end ? "${params.outdir}/fastq/${reads[1].getName()}" : '' return meta_clone - } + }.set { ch_sra_metadata } } // diff --git a/workflows/synapse/main.nf b/workflows/synapse/main.nf index 30d05f4f..785877ac 100644 --- a/workflows/synapse/main.nf +++ b/workflows/synapse/main.nf @@ -56,7 +56,7 @@ workflow SYNAPSE { SYNAPSE_SHOW .out .metadata - .map { it -> WorkflowSynapse.synapseShowToMap(it) } + .map { it -> Workflow.synapseShowToMap(it) } .set { ch_samples_meta } // @@ -72,14 +72,14 @@ workflow SYNAPSE { SYNAPSE_GET .out .fastq - .map { meta, fastq -> [ WorkflowSynapse.sampleNameFromFastQ( fastq , "*{1,2}*"), fastq ] } + .map { meta, fastq -> [ Workflow.synapseSampleNameFromFastQ( fastq , "*{1,2}*"), fastq ] } .groupTuple(sort: { it -> it.baseName }) .set { ch_fastq } SYNAPSE_GET .out .fastq - .map { meta, fastq -> [ WorkflowSynapse.sampleNameFromFastQ( fastq , "*{1,2}*"), meta.id ] } + .map { meta, fastq -> [ Workflow.synapseSampleNameFromFastQ( fastq , "*{1,2}*"), meta.id ] } .groupTuple() .join(ch_fastq) .map { id, synids, fastq -> From 08d30eb30dad60108b780517a2bb70540b1090d8 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 25 Sep 2023 10:32:24 +0200 Subject: [PATCH 488/852] typo --- main.nf | 6 +++--- workflows/synapse/main.nf | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/main.nf b/main.nf index 91aa6601..d74b62f8 100644 --- a/main.nf +++ b/main.nf @@ -55,7 +55,7 @@ if (params.input_type == 'sra') { ] // Validate input parameters - Workflow.sraInitialise(params, valid_params) + WorkflowMain.sraInitialise(params, valid_params) } else if (params.input_type == 'synapse') { // Create channel for synapse config @@ -143,8 +143,8 @@ workflow.onComplete { NfcoreTemplate.email(workflow, params, summary_params, projectDir, log) } NfcoreTemplate.summary(workflow, params, log) - if (params.input_type == 'sra') { Workflow.sraCurateSamplesheetWarn(log) } - if (params.input_type == 'synapse') { Workflow.synapseCurateSamplesheetWarn(log) } + if (params.input_type == 'sra') { WorkflowMain.sraCurateSamplesheetWarn(log) } + if (params.input_type == 'synapse') { WorkflowMain.synapseCurateSamplesheetWarn(log) } } /* diff --git a/workflows/synapse/main.nf b/workflows/synapse/main.nf index 785877ac..0fc46ed4 100644 --- a/workflows/synapse/main.nf +++ b/workflows/synapse/main.nf @@ -56,7 +56,7 @@ workflow SYNAPSE { SYNAPSE_SHOW .out .metadata - .map { it -> Workflow.synapseShowToMap(it) } + .map { it -> WorkflowMain.synapseShowToMap(it) } .set { ch_samples_meta } // @@ -72,14 +72,14 @@ workflow SYNAPSE { SYNAPSE_GET .out .fastq - .map { meta, fastq -> [ Workflow.synapseSampleNameFromFastQ( fastq , "*{1,2}*"), fastq ] } + .map { meta, fastq -> [ WorkflowMain.synapseSampleNameFromFastQ( fastq , "*{1,2}*"), fastq ] } .groupTuple(sort: { it -> it.baseName }) .set { ch_fastq } SYNAPSE_GET .out .fastq - .map { meta, fastq -> [ Workflow.synapseSampleNameFromFastQ( fastq , "*{1,2}*"), meta.id ] } + .map { meta, fastq -> [ WorkflowMain.synapseSampleNameFromFastQ( fastq , "*{1,2}*"), meta.id ] } .groupTuple() .join(ch_fastq) .map { id, synids, fastq -> From 034a52023931d1bcdd07cef94e1bff8fa1e2b0fe Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 25 Sep 2023 11:11:07 +0200 Subject: [PATCH 489/852] use rc2 --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5642602b..30656e1a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,7 +15,7 @@ on: env: NXF_ANSI_LOG: false - NFTEST_VER: "0.8.0-rc1" + NFTEST_VER: "0.8.0-rc2" concurrency: group: "${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}" From 45c9020c2d24e669ed2f9b8a5e30dbb56018bc51 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 25 Sep 2023 11:11:25 +0200 Subject: [PATCH 490/852] regenerate tests and snapshots --- .../sra_custom_ena_metadata_fields.nf.test | 2 +- ...ra_custom_ena_metadata_fields.nf.test.snap | 62 ++-------- .../sra/tests/sra_default_parameters.nf.test | 2 +- .../tests/sra_default_parameters.nf.test.snap | 114 ++---------------- .../tests/sra_force_sratools_download.nf.test | 2 +- .../sra_force_sratools_download.nf.test.snap | 110 ++--------------- .../sra_nf_core_pipeline_atacseq.nf.test | 2 +- .../sra_nf_core_pipeline_atacseq.nf.test.snap | 114 ++---------------- .../tests/sra_nf_core_pipeline_rnaseq.nf.test | 2 +- .../sra_nf_core_pipeline_rnaseq.nf.test.snap | 114 ++---------------- .../sra_nf_core_pipeline_taxprofiler.nf.test | 2 +- ..._nf_core_pipeline_taxprofiler.nf.test.snap | 114 ++---------------- .../sra_nf_core_pipeline_viralrecon.nf.test | 2 +- ...a_nf_core_pipeline_viralrecon.nf.test.snap | 114 ++---------------- .../sra/tests/sra_skip_fastq_download.nf.test | 2 +- .../sra_skip_fastq_download.nf.test.snap | 20 +-- 16 files changed, 108 insertions(+), 670 deletions(-) diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test index 45280ab0..7c9df9d9 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test @@ -12,7 +12,7 @@ nextflow_workflow { when { workflow { """ - input[0] = Channel.from('DRR026872','DRR028935','ERR1109373','ERR1160846','GSE214215','GSM4907283','SRR12848126','SRR13191702','SRR14593545','SRR14709033','SRR9984183') + input[0] = Channel.from('DRR026872', 'DRR028935', 'ERR1160846', 'GSE214215', 'GSM4907283', 'SRR12848126', 'SRR13191702', 'SRR14593545', 'SRR14709033', 'SRR9984183') """ } params { diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap index a2537a95..29feb896 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap @@ -38,25 +38,6 @@ "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" ] ], - [ - { - "id": "ERX1188904_ERR1109373", - "run_accession": "ERR1109373", - "experiment_accession": "ERX1188904", - "library_layout": "PAIRED", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "md5_1": "9fd57225d6c07a31843276d6df9b15c0", - "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", - "single_end": false - }, - [ - "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" - ] - ], [ { "id": "ERX1234253_ERR1160846", @@ -272,17 +253,18 @@ ] ], "1": [ - "samplesheet.csv:md5,be5465f34924356e136c804d63e1b562" + "samplesheet.csv:md5,d161b1a26b415a61064d8c558c9695c5" ], "2": [ - "id_mappings.csv:md5,8473773df806859c6af7acafcfe5aa6f" + "id_mappings.csv:md5,e8a7d8effe4af1d999dc26cf92cf6621" ], "3": [ + "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", - "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd", + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e" ], "fastq": [ [ @@ -320,25 +302,6 @@ "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" ] ], - [ - { - "id": "ERX1188904_ERR1109373", - "run_accession": "ERR1109373", - "experiment_accession": "ERX1188904", - "library_layout": "PAIRED", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "md5_1": "9fd57225d6c07a31843276d6df9b15c0", - "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", - "single_end": false - }, - [ - "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" - ] - ], [ { "id": "ERX1234253_ERR1160846", @@ -554,20 +517,21 @@ ] ], "mappings": [ - "id_mappings.csv:md5,8473773df806859c6af7acafcfe5aa6f" + "id_mappings.csv:md5,e8a7d8effe4af1d999dc26cf92cf6621" ], "samplesheet": [ - "samplesheet.csv:md5,be5465f34924356e136c804d63e1b562" + "samplesheet.csv:md5,d161b1a26b415a61064d8c558c9695c5" ], "versions": [ + "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", - "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd", + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e" ] } ], - "timestamp": "2023-09-11T18:48:18.757655" + "timestamp": "2023-09-25T10:51:46.450639" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_default_parameters.nf.test b/workflows/sra/tests/sra_default_parameters.nf.test index ef35c80a..b525bec5 100644 --- a/workflows/sra/tests/sra_default_parameters.nf.test +++ b/workflows/sra/tests/sra_default_parameters.nf.test @@ -12,7 +12,7 @@ nextflow_workflow { when { workflow { """ - input[0] = Channel.from('DRR026872','DRR028935','ERR1109373','ERR1160846','GSE214215','GSM4907283','SRR12848126','SRR13191702','SRR14593545','SRR14709033','SRR9984183') + input[0] = Channel.from('DRR026872', 'DRR028935', 'ERR1160846', 'GSE214215', 'GSM4907283', 'SRR12848126', 'SRR13191702', 'SRR14593545', 'SRR14709033', 'SRR9984183') """ } params { diff --git a/workflows/sra/tests/sra_default_parameters.nf.test.snap b/workflows/sra/tests/sra_default_parameters.nf.test.snap index b8dc88ca..ea2b868a 100644 --- a/workflows/sra/tests/sra_default_parameters.nf.test.snap +++ b/workflows/sra/tests/sra_default_parameters.nf.test.snap @@ -90,51 +90,6 @@ "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" ] ], - [ - { - "id": "ERX1188904_ERR1109373", - "run_accession": "ERR1109373", - "experiment_accession": "ERX1188904", - "sample_accession": "SAMEA3643867", - "secondary_sample_accession": "ERS951016", - "study_accession": "PRJEB11633", - "secondary_study_accession": "ERP013030", - "submission_accession": "ERA528939", - "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", - "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", - "sample_alias": "sample_56", - "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", - "library_layout": "PAIRED", - "library_selection": "RT-PCR", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "unspecified", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "29700", - "read_count": "169", - "tax_id": "63433", - "scientific_name": "Leptopilina boulardi", - "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing", - "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", - "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", - "fastq_bytes": "3221;8151;8118", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "md5_1": "9fd57225d6c07a31843276d6df9b15c0", - "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", - "single_end": false - }, - [ - "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" - ] - ], [ { "id": "ERX1234253_ERR1160846", @@ -662,17 +617,18 @@ ] ], "1": [ - "samplesheet.csv:md5,4aec9029e063bae998b3fa3dc3481556" + "samplesheet.csv:md5,c1104c2edfc663b103f79b0551450192" ], "2": [ - "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" ], "3": [ - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", - "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd", + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e" ], "fastq": [ [ @@ -762,51 +718,6 @@ "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" ] ], - [ - { - "id": "ERX1188904_ERR1109373", - "run_accession": "ERR1109373", - "experiment_accession": "ERX1188904", - "sample_accession": "SAMEA3643867", - "secondary_sample_accession": "ERS951016", - "study_accession": "PRJEB11633", - "secondary_study_accession": "ERP013030", - "submission_accession": "ERA528939", - "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", - "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", - "sample_alias": "sample_56", - "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", - "library_layout": "PAIRED", - "library_selection": "RT-PCR", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "unspecified", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "29700", - "read_count": "169", - "tax_id": "63433", - "scientific_name": "Leptopilina boulardi", - "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing", - "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", - "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", - "fastq_bytes": "3221;8151;8118", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "md5_1": "9fd57225d6c07a31843276d6df9b15c0", - "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", - "single_end": false - }, - [ - "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" - ] - ], [ { "id": "ERX1234253_ERR1160846", @@ -1334,20 +1245,21 @@ ] ], "mappings": [ - "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" ], "samplesheet": [ - "samplesheet.csv:md5,4aec9029e063bae998b3fa3dc3481556" + "samplesheet.csv:md5,c1104c2edfc663b103f79b0551450192" ], "versions": [ - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", - "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd", + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e" ] } ], - "timestamp": "2023-09-11T18:56:05.693225" + "timestamp": "2023-09-25T10:59:42.069791" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test b/workflows/sra/tests/sra_force_sratools_download.nf.test index 76ce7cd3..2548689d 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test @@ -12,7 +12,7 @@ nextflow_workflow { when { workflow { """ - input[0] = Channel.from('DRR026872','DRR028935','ERR1109373','ERR1160846','GSE214215','GSM4907283','SRR12848126','SRR13191702','SRR14593545','SRR14709033','SRR9984183') + input[0] = Channel.from('DRR026872', 'DRR028935', 'ERR1160846', 'GSE214215', 'GSM4907283', 'SRR12848126', 'SRR13191702', 'SRR14593545', 'SRR14709033', 'SRR9984183') """ } params { diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test.snap b/workflows/sra/tests/sra_force_sratools_download.nf.test.snap index 4e1b8aaf..7fdbbf66 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test.snap +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test.snap @@ -90,51 +90,6 @@ "DRX026011_DRR028935_2.fastq.gz:md5,b97b1e0e806bcae10a7443e2f22d6ca2" ] ], - [ - { - "id": "ERX1188904_ERR1109373", - "run_accession": "ERR1109373", - "experiment_accession": "ERX1188904", - "sample_accession": "SAMEA3643867", - "secondary_sample_accession": "ERS951016", - "study_accession": "PRJEB11633", - "secondary_study_accession": "ERP013030", - "submission_accession": "ERA528939", - "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", - "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", - "sample_alias": "sample_56", - "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", - "library_layout": "PAIRED", - "library_selection": "RT-PCR", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "unspecified", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "29700", - "read_count": "169", - "tax_id": "63433", - "scientific_name": "Leptopilina boulardi", - "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing", - "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", - "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", - "fastq_bytes": "3221;8151;8118", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "md5_1": "9fd57225d6c07a31843276d6df9b15c0", - "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", - "single_end": false - }, - [ - "ERX1188904_ERR1109373_1.fastq.gz:md5,e7edae2715dfaf4c318d37959fd9ae22", - "ERX1188904_ERR1109373_2.fastq.gz:md5,34ab048c92201a5ec4ab36d8dc1c5732" - ] - ], [ { "id": "ERX1234253_ERR1160846", @@ -662,16 +617,17 @@ ] ], "1": [ - "samplesheet.csv:md5,4aec9029e063bae998b3fa3dc3481556" + "samplesheet.csv:md5,c1104c2edfc663b103f79b0551450192" ], "2": [ - "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" ], "3": [ + "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd", + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" ], "fastq": [ [ @@ -761,51 +717,6 @@ "DRX026011_DRR028935_2.fastq.gz:md5,b97b1e0e806bcae10a7443e2f22d6ca2" ] ], - [ - { - "id": "ERX1188904_ERR1109373", - "run_accession": "ERR1109373", - "experiment_accession": "ERX1188904", - "sample_accession": "SAMEA3643867", - "secondary_sample_accession": "ERS951016", - "study_accession": "PRJEB11633", - "secondary_study_accession": "ERP013030", - "submission_accession": "ERA528939", - "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", - "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", - "sample_alias": "sample_56", - "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", - "library_layout": "PAIRED", - "library_selection": "RT-PCR", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "unspecified", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "29700", - "read_count": "169", - "tax_id": "63433", - "scientific_name": "Leptopilina boulardi", - "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing", - "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", - "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", - "fastq_bytes": "3221;8151;8118", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "md5_1": "9fd57225d6c07a31843276d6df9b15c0", - "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", - "single_end": false - }, - [ - "ERX1188904_ERR1109373_1.fastq.gz:md5,e7edae2715dfaf4c318d37959fd9ae22", - "ERX1188904_ERR1109373_2.fastq.gz:md5,34ab048c92201a5ec4ab36d8dc1c5732" - ] - ], [ { "id": "ERX1234253_ERR1160846", @@ -1333,19 +1244,20 @@ ] ], "mappings": [ - "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" ], "samplesheet": [ - "samplesheet.csv:md5,4aec9029e063bae998b3fa3dc3481556" + "samplesheet.csv:md5,c1104c2edfc663b103f79b0551450192" ], "versions": [ + "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd", + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" ] } ], - "timestamp": "2023-09-11T19:02:05.556134" + "timestamp": "2023-09-25T11:09:38.27192" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test index 0ce0c230..ad60725c 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test @@ -12,7 +12,7 @@ nextflow_workflow { when { workflow { """ - input[0] = Channel.from('DRR026872','DRR028935','ERR1109373','ERR1160846','GSE214215','GSM4907283','SRR12848126','SRR13191702','SRR14593545','SRR14709033','SRR9984183') + input[0] = Channel.from('DRR026872', 'DRR028935', 'ERR1160846', 'GSE214215', 'GSM4907283', 'SRR12848126', 'SRR13191702', 'SRR14593545', 'SRR14709033', 'SRR9984183') """ } params { diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap index f6528e52..0cbec631 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap @@ -90,51 +90,6 @@ "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" ] ], - [ - { - "id": "ERX1188904_ERR1109373", - "run_accession": "ERR1109373", - "experiment_accession": "ERX1188904", - "sample_accession": "SAMEA3643867", - "secondary_sample_accession": "ERS951016", - "study_accession": "PRJEB11633", - "secondary_study_accession": "ERP013030", - "submission_accession": "ERA528939", - "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", - "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", - "sample_alias": "sample_56", - "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", - "library_layout": "PAIRED", - "library_selection": "RT-PCR", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "unspecified", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "29700", - "read_count": "169", - "tax_id": "63433", - "scientific_name": "Leptopilina boulardi", - "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing", - "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", - "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", - "fastq_bytes": "3221;8151;8118", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "md5_1": "9fd57225d6c07a31843276d6df9b15c0", - "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", - "single_end": false - }, - [ - "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" - ] - ], [ { "id": "ERX1234253_ERR1160846", @@ -662,17 +617,18 @@ ] ], "1": [ - "samplesheet.csv:md5,16e5161103702777b2d763c1ed660d3c" + "samplesheet.csv:md5,46752dd6abac80b59573910f7ce4babe" ], "2": [ - "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" ], "3": [ - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", - "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd", + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e" ], "fastq": [ [ @@ -762,51 +718,6 @@ "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" ] ], - [ - { - "id": "ERX1188904_ERR1109373", - "run_accession": "ERR1109373", - "experiment_accession": "ERX1188904", - "sample_accession": "SAMEA3643867", - "secondary_sample_accession": "ERS951016", - "study_accession": "PRJEB11633", - "secondary_study_accession": "ERP013030", - "submission_accession": "ERA528939", - "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", - "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", - "sample_alias": "sample_56", - "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", - "library_layout": "PAIRED", - "library_selection": "RT-PCR", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "unspecified", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "29700", - "read_count": "169", - "tax_id": "63433", - "scientific_name": "Leptopilina boulardi", - "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing", - "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", - "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", - "fastq_bytes": "3221;8151;8118", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "md5_1": "9fd57225d6c07a31843276d6df9b15c0", - "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", - "single_end": false - }, - [ - "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" - ] - ], [ { "id": "ERX1234253_ERR1160846", @@ -1334,20 +1245,21 @@ ] ], "mappings": [ - "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" ], "samplesheet": [ - "samplesheet.csv:md5,16e5161103702777b2d763c1ed660d3c" + "samplesheet.csv:md5,46752dd6abac80b59573910f7ce4babe" ], "versions": [ - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", - "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd", + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e" ] } ], - "timestamp": "2023-09-11T18:37:54.607231" + "timestamp": "2023-09-25T10:45:48.713699" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test index 67c0fbe4..993590ff 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test @@ -12,7 +12,7 @@ nextflow_workflow { when { workflow { """ - input[0] = Channel.from('DRR026872','DRR028935','ERR1109373','ERR1160846','GSE214215','GSM4907283','SRR12848126','SRR13191702','SRR14593545','SRR14709033','SRR9984183') + input[0] = Channel.from('DRR026872', 'DRR028935', 'ERR1160846', 'GSE214215', 'GSM4907283', 'SRR12848126', 'SRR13191702', 'SRR14593545', 'SRR14709033', 'SRR9984183') """ } params { diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap index 124877ae..c6bd2d32 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap @@ -90,51 +90,6 @@ "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" ] ], - [ - { - "id": "ERX1188904_ERR1109373", - "run_accession": "ERR1109373", - "experiment_accession": "ERX1188904", - "sample_accession": "SAMEA3643867", - "secondary_sample_accession": "ERS951016", - "study_accession": "PRJEB11633", - "secondary_study_accession": "ERP013030", - "submission_accession": "ERA528939", - "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", - "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", - "sample_alias": "sample_56", - "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", - "library_layout": "PAIRED", - "library_selection": "RT-PCR", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "unspecified", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "29700", - "read_count": "169", - "tax_id": "63433", - "scientific_name": "Leptopilina boulardi", - "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing", - "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", - "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", - "fastq_bytes": "3221;8151;8118", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "md5_1": "9fd57225d6c07a31843276d6df9b15c0", - "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", - "single_end": false - }, - [ - "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" - ] - ], [ { "id": "ERX1234253_ERR1160846", @@ -662,17 +617,18 @@ ] ], "1": [ - "samplesheet.csv:md5,fcbb1fbe56dc14561ec83e5f6a70ee80" + "samplesheet.csv:md5,69117245b73776d6e4daecdbfdff9767" ], "2": [ - "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" ], "3": [ + "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", - "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd", + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e" ], "fastq": [ [ @@ -762,51 +718,6 @@ "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" ] ], - [ - { - "id": "ERX1188904_ERR1109373", - "run_accession": "ERR1109373", - "experiment_accession": "ERX1188904", - "sample_accession": "SAMEA3643867", - "secondary_sample_accession": "ERS951016", - "study_accession": "PRJEB11633", - "secondary_study_accession": "ERP013030", - "submission_accession": "ERA528939", - "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", - "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", - "sample_alias": "sample_56", - "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", - "library_layout": "PAIRED", - "library_selection": "RT-PCR", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "unspecified", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "29700", - "read_count": "169", - "tax_id": "63433", - "scientific_name": "Leptopilina boulardi", - "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing", - "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", - "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", - "fastq_bytes": "3221;8151;8118", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "md5_1": "9fd57225d6c07a31843276d6df9b15c0", - "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", - "single_end": false - }, - [ - "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" - ] - ], [ { "id": "ERX1234253_ERR1160846", @@ -1334,20 +1245,21 @@ ] ], "mappings": [ - "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" ], "samplesheet": [ - "samplesheet.csv:md5,fcbb1fbe56dc14561ec83e5f6a70ee80" + "samplesheet.csv:md5,69117245b73776d6e4daecdbfdff9767" ], "versions": [ + "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", - "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd", + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e" ] } ], - "timestamp": "2023-09-11T18:51:38.198125" + "timestamp": "2023-09-25T11:02:54.001279" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test index e00793cd..a5e69da1 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test @@ -12,7 +12,7 @@ nextflow_workflow { when { workflow { """ - input[0] = Channel.from('DRR026872','DRR028935','ERR1109373','ERR1160846','GSE214215','GSM4907283','SRR12848126','SRR13191702','SRR14593545','SRR14709033','SRR9984183') + input[0] = Channel.from('DRR026872', 'DRR028935', 'ERR1160846', 'GSE214215', 'GSM4907283', 'SRR12848126', 'SRR13191702', 'SRR14593545', 'SRR14709033', 'SRR9984183') """ } params { diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap index b63ad4b7..4d57827d 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap @@ -90,51 +90,6 @@ "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" ] ], - [ - { - "id": "ERX1188904_ERR1109373", - "run_accession": "ERR1109373", - "experiment_accession": "ERX1188904", - "sample_accession": "SAMEA3643867", - "secondary_sample_accession": "ERS951016", - "study_accession": "PRJEB11633", - "secondary_study_accession": "ERP013030", - "submission_accession": "ERA528939", - "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", - "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", - "sample_alias": "sample_56", - "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", - "library_layout": "PAIRED", - "library_selection": "RT-PCR", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "unspecified", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "29700", - "read_count": "169", - "tax_id": "63433", - "scientific_name": "Leptopilina boulardi", - "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing", - "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", - "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", - "fastq_bytes": "3221;8151;8118", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "md5_1": "9fd57225d6c07a31843276d6df9b15c0", - "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", - "single_end": false - }, - [ - "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" - ] - ], [ { "id": "ERX1234253_ERR1160846", @@ -662,17 +617,18 @@ ] ], "1": [ - "samplesheet.csv:md5,0df1f60a9b5bc94f8a85e96edcc90f5c" + "samplesheet.csv:md5,0705e78609390cc464c2fb10051178bc" ], "2": [ - "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" ], "3": [ + "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", - "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd", + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e" ], "fastq": [ [ @@ -762,51 +718,6 @@ "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" ] ], - [ - { - "id": "ERX1188904_ERR1109373", - "run_accession": "ERR1109373", - "experiment_accession": "ERX1188904", - "sample_accession": "SAMEA3643867", - "secondary_sample_accession": "ERS951016", - "study_accession": "PRJEB11633", - "secondary_study_accession": "ERP013030", - "submission_accession": "ERA528939", - "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", - "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", - "sample_alias": "sample_56", - "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", - "library_layout": "PAIRED", - "library_selection": "RT-PCR", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "unspecified", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "29700", - "read_count": "169", - "tax_id": "63433", - "scientific_name": "Leptopilina boulardi", - "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing", - "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", - "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", - "fastq_bytes": "3221;8151;8118", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "md5_1": "9fd57225d6c07a31843276d6df9b15c0", - "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", - "single_end": false - }, - [ - "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" - ] - ], [ { "id": "ERX1234253_ERR1160846", @@ -1334,20 +1245,21 @@ ] ], "mappings": [ - "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" ], "samplesheet": [ - "samplesheet.csv:md5,0df1f60a9b5bc94f8a85e96edcc90f5c" + "samplesheet.csv:md5,0705e78609390cc464c2fb10051178bc" ], "versions": [ + "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", - "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd", + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e" ] } ], - "timestamp": "2023-09-11T18:44:02.293186" + "timestamp": "2023-09-25T10:48:46.519896" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test index 045e0363..f64cf92e 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test @@ -12,7 +12,7 @@ nextflow_workflow { when { workflow { """ - input[0] = Channel.from('DRR026872','DRR028935','ERR1109373','ERR1160846','GSE214215','GSM4907283','SRR12848126','SRR13191702','SRR14593545','SRR14709033','SRR9984183') + input[0] = Channel.from('DRR026872', 'DRR028935', 'ERR1160846', 'GSE214215', 'GSM4907283', 'SRR12848126', 'SRR13191702', 'SRR14593545', 'SRR14709033', 'SRR9984183') """ } params { diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap index 1387f422..3520d5bf 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap @@ -90,51 +90,6 @@ "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" ] ], - [ - { - "id": "ERX1188904_ERR1109373", - "run_accession": "ERR1109373", - "experiment_accession": "ERX1188904", - "sample_accession": "SAMEA3643867", - "secondary_sample_accession": "ERS951016", - "study_accession": "PRJEB11633", - "secondary_study_accession": "ERP013030", - "submission_accession": "ERA528939", - "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", - "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", - "sample_alias": "sample_56", - "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", - "library_layout": "PAIRED", - "library_selection": "RT-PCR", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "unspecified", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "29700", - "read_count": "169", - "tax_id": "63433", - "scientific_name": "Leptopilina boulardi", - "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing", - "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", - "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", - "fastq_bytes": "3221;8151;8118", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "md5_1": "9fd57225d6c07a31843276d6df9b15c0", - "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", - "single_end": false - }, - [ - "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" - ] - ], [ { "id": "ERX1234253_ERR1160846", @@ -662,17 +617,18 @@ ] ], "1": [ - "samplesheet.csv:md5,4aec9029e063bae998b3fa3dc3481556" + "samplesheet.csv:md5,c1104c2edfc663b103f79b0551450192" ], "2": [ - "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" ], "3": [ - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", - "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd", + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e" ], "fastq": [ [ @@ -762,51 +718,6 @@ "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" ] ], - [ - { - "id": "ERX1188904_ERR1109373", - "run_accession": "ERR1109373", - "experiment_accession": "ERX1188904", - "sample_accession": "SAMEA3643867", - "secondary_sample_accession": "ERS951016", - "study_accession": "PRJEB11633", - "secondary_study_accession": "ERP013030", - "submission_accession": "ERA528939", - "run_alias": "ena-RUN-CAM-03-11-2015-17:01:52:847-7", - "experiment_alias": "ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7", - "sample_alias": "sample_56", - "study_alias": "ena-STUDY-CAM-02-11-2015-17:42:24:189-13", - "library_layout": "PAIRED", - "library_selection": "RT-PCR", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "unspecified", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "29700", - "read_count": "169", - "tax_id": "63433", - "scientific_name": "Leptopilina boulardi", - "sample_title": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing", - "study_title": "Total RNA from abdomen and head of L. boulardi females and alignment of the RNA-Seq reads against the genome of L. boulardi Toti-like Virus.", - "sample_description": "RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome", - "fastq_md5": "8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9", - "fastq_bytes": "3221;8151;8118", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz", - "md5_1": "9fd57225d6c07a31843276d6df9b15c0", - "md5_2": "5a62e8f785687dce890cfb4fe3e607f9", - "single_end": false - }, - [ - "ERX1188904_ERR1109373_1.fastq.gz:md5,9fd57225d6c07a31843276d6df9b15c0", - "ERX1188904_ERR1109373_2.fastq.gz:md5,5a62e8f785687dce890cfb4fe3e607f9" - ] - ], [ { "id": "ERX1234253_ERR1160846", @@ -1334,20 +1245,21 @@ ] ], "mappings": [ - "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" ], "samplesheet": [ - "samplesheet.csv:md5,4aec9029e063bae998b3fa3dc3481556" + "samplesheet.csv:md5,c1104c2edfc663b103f79b0551450192" ], "versions": [ - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,e977678bd13a54fc9c31addf135be15e", - "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd", + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,e977678bd13a54fc9c31addf135be15e" ] } ], - "timestamp": "2023-09-11T18:34:25.049818" + "timestamp": "2023-09-25T10:42:52.035768" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test b/workflows/sra/tests/sra_skip_fastq_download.nf.test index 67abee3b..aa290c68 100644 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test @@ -12,7 +12,7 @@ nextflow_workflow { when { workflow { """ - input[0] = Channel.from('DRR026872','DRR028935','ERR1109373','ERR1160846','GSE214215','GSM4907283','SRR12848126','SRR13191702','SRR14593545','SRR14709033','SRR9984183') + input[0] = Channel.from('DRR026872', 'DRR028935', 'ERR1160846', 'GSE214215', 'GSM4907283', 'SRR12848126', 'SRR13191702', 'SRR14593545', 'SRR14709033', 'SRR9984183') """ } params { diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap b/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap index 3b04b917..91a10c87 100644 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap @@ -6,32 +6,34 @@ ], "1": [ - "samplesheet.csv:md5,7cf3503b651fe016bc1e5fb3c2e996d5" + "samplesheet.csv:md5,b1636e896008b96044d352a0757a390b" ], "2": [ - "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" ], "3": [ - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd", + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" ], "fastq": [ ], "mappings": [ - "id_mappings.csv:md5,3e287081f1e9349921fa8c709a874565" + "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" ], "samplesheet": [ - "samplesheet.csv:md5,7cf3503b651fe016bc1e5fb3c2e996d5" + "samplesheet.csv:md5,b1636e896008b96044d352a0757a390b" ], "versions": [ - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", + "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd" + "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd", + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" ] } ], - "timestamp": "2023-09-11T18:56:34.175665" + "timestamp": "2023-09-25T11:03:28.968158" } } \ No newline at end of file From 191a8e724285471f8d698ce15eebac3fbdeeb95f Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Mon, 25 Sep 2023 10:45:28 +0200 Subject: [PATCH 491/852] Apply suggestions from code review --- workflows/sra/main.nf | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/workflows/sra/main.nf b/workflows/sra/main.nf index 46a2c809..43beb51d 100644 --- a/workflows/sra/main.nf +++ b/workflows/sra/main.nf @@ -60,7 +60,7 @@ workflow SRA { return meta_clone } .unique() - .set{ ch_sra_metadata } + .set { ch_sra_metadata } ch_versions = ch_versions.mix(SRA_RUNINFO_TO_FTP.out.versions.first()) @@ -100,9 +100,7 @@ workflow SRA { fastq_files.mix( SRA_FASTQ_FTP.out.fastq, FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS.out.reads - ).set { fastq_files } - - fastq_files.map { meta, fastq -> + ).map { meta, fastq -> def reads = fastq instanceof List ? fastq.flatten() : [ fastq ] def meta_clone = meta.clone() @@ -133,7 +131,9 @@ workflow SRA { ch_versions = ch_versions.mix(SRA_MERGE_SAMPLESHEET.out.versions) if (params.sample_mapping_fields) { - MULTIQC_MAPPINGS_CONFIG(SRA_MERGE_SAMPLESHEET.out.mappings) + MULTIQC_MAPPINGS_CONFIG ( + SRA_MERGE_SAMPLESHEET.out.mappings + ) ch_versions = ch_versions.mix(MULTIQC_MAPPINGS_CONFIG.out.versions) } From e4fddb4901c935c11fac01ab0efddc5755555be7 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 25 Sep 2023 11:46:06 +0200 Subject: [PATCH 492/852] final code polish --- main.nf | 20 -------------------- workflows/sra/main.nf | 21 ++++++++++++++------- 2 files changed, 14 insertions(+), 27 deletions(-) diff --git a/main.nf b/main.nf index 70e8ff27..d74b62f8 100644 --- a/main.nf +++ b/main.nf @@ -18,26 +18,6 @@ nextflow.enable.dsl = 2 ======================================================================================== */ -include { paramsHelp; paramsSummaryLog; validateParameters } from 'plugin/nf-validation' - -def logo = NfcoreTemplate.logo(workflow, params.monochrome_logs) -def citation = '\n' + WorkflowMain.citation(workflow) + '\n' - -// Print parameter summary log to screen -log.info logo + paramsSummaryLog(workflow) + citation - -// Print help message if needed -if (params.help) { - def String command = "nextflow run ${workflow.manifest.name} --input id.csv -profile docker" - log.info logo + paramsHelp(command) + citation + NfcoreTemplate.dashedLine(params.monochrome_logs) - System.exit(0) -} - -// Validate input parameters -if (params.validate_params) { - validateParameters() -} - // Check if --input file is empty ch_input = file(params.input, checkIfExists: true) if (ch_input.isEmpty()) { error("File provided with --input is empty: ${ch_input.getName()}!") } diff --git a/workflows/sra/main.nf b/workflows/sra/main.nf index 45efa9c9..920579d1 100644 --- a/workflows/sra/main.nf +++ b/workflows/sra/main.nf @@ -1,15 +1,22 @@ /* ======================================================================================== - IMPORT LOCAL MODULES/SUBWORKFLOWS + IMPORT LOCAL MODULES +======================================================================================== +*/ + +include { MULTIQC_MAPPINGS_CONFIG } from '../../modules/local/multiqc_mappings_config' +include { SRA_FASTQ_FTP } from '../../modules/local/sra_fastq_ftp' +include { SRA_IDS_TO_RUNINFO } from '../../modules/local/sra_ids_to_runinfo' +include { SRA_MERGE_SAMPLESHEET } from '../../modules/local/sra_merge_samplesheet' +include { SRA_RUNINFO_TO_FTP } from '../../modules/local/sra_runinfo_to_ftp' +include { SRA_TO_SAMPLESHEET } from '../../modules/local/sra_to_samplesheet' + +/* +======================================================================================== + IMPORT NF-CORE SUBWORKFLOWS ======================================================================================== */ -include { MULTIQC_MAPPINGS_CONFIG } from '../../modules/local/multiqc_mappings_config' -include { SRA_FASTQ_FTP } from '../../modules/local/sra_fastq_ftp' -include { SRA_IDS_TO_RUNINFO } from '../../modules/local/sra_ids_to_runinfo' -include { SRA_MERGE_SAMPLESHEET } from '../../modules/local/sra_merge_samplesheet' -include { SRA_RUNINFO_TO_FTP } from '../../modules/local/sra_runinfo_to_ftp' -include { SRA_TO_SAMPLESHEET } from '../../modules/local/sra_to_samplesheet' include { FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS } from '../../subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools' /* From 9b850ba02896b4753c7a3c9921616f70a611269c Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Mon, 25 Sep 2023 12:11:13 +0200 Subject: [PATCH 493/852] Apply suggestions from code review --- main.nf | 4 +++- workflows/sra/main.nf | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/main.nf b/main.nf index d74b62f8..c6d7d13e 100644 --- a/main.nf +++ b/main.nf @@ -115,7 +115,9 @@ workflow NFCORE_FETCHNGS { } // MODULE: Dump software versions for all tools used in the workflow - CUSTOM_DUMPSOFTWAREVERSIONS(ch_versions.unique().collectFile(name: 'collated_versions.yml')) + // + // MODULE: Dump software versions for all tools used in the workflow + // } /* diff --git a/workflows/sra/main.nf b/workflows/sra/main.nf index 920579d1..2b221739 100644 --- a/workflows/sra/main.nf +++ b/workflows/sra/main.nf @@ -130,6 +130,9 @@ workflow SRA { ) ch_versions = ch_versions.mix(SRA_MERGE_SAMPLESHEET.out.versions) + // + // MODULE: Create a MutiQC config file with sample name mappings + // if (params.sample_mapping_fields) { MULTIQC_MAPPINGS_CONFIG ( SRA_MERGE_SAMPLESHEET.out.mappings From 6cf3085c08ab4654cba21ac3bdfccd6d3e7745b5 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 25 Sep 2023 12:12:16 +0200 Subject: [PATCH 494/852] update snapshots --- ...ra_custom_ena_metadata_fields.nf.test.snap | 500 +------ .../tests/sra_default_parameters.nf.test.snap | 1228 +---------------- .../sra_force_sratools_download.nf.test.snap | 1228 +---------------- .../sra_nf_core_pipeline_atacseq.nf.test.snap | 1228 +---------------- .../sra_nf_core_pipeline_rnaseq.nf.test.snap | 1228 +---------------- ..._nf_core_pipeline_taxprofiler.nf.test.snap | 1228 +---------------- ...a_nf_core_pipeline_viralrecon.nf.test.snap | 1228 +---------------- 7 files changed, 21 insertions(+), 7847 deletions(-) diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap index 29feb896..7a7df129 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap @@ -3,254 +3,7 @@ "content": [ { "0": [ - [ - { - "id": "DRX024467_DRR026872", - "run_accession": "DRR026872", - "experiment_accession": "DRX024467", - "library_layout": "SINGLE", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_md5": "515e5448c55e054113c4a22df5f62791", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_2": "", - "md5_1": "515e5448c55e054113c4a22df5f62791", - "md5_2": "", - "single_end": true - }, - "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" - ], - [ - { - "id": "DRX026011_DRR028935", - "run_accession": "DRR028935", - "experiment_accession": "DRX026011", - "library_layout": "PAIRED", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "md5_1": "cc01df82a9354bb6b3be93483b20c35a", - "md5_2": "941c9998d746416dad53c94c480ddf30", - "single_end": false - }, - [ - "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", - "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" - ] - ], - [ - { - "id": "ERX1234253_ERR1160846", - "run_accession": "ERR1160846", - "experiment_accession": "ERX1234253", - "library_layout": "SINGLE", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_2": "", - "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", - "md5_2": "", - "single_end": true - }, - "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" - ], - [ - { - "id": "SRX10940790_SRR14593545", - "run_accession": "SRR14593545", - "experiment_accession": "SRX10940790", - "library_layout": "PAIRED", - "fastq_ftp": "", - "fastq_md5": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": false - }, - [ - "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", - "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" - ] - ], - [ - { - "id": "SRX11047067_SRR14709033", - "run_accession": "SRR14709033", - "experiment_accession": "SRX11047067", - "library_layout": "SINGLE", - "fastq_ftp": "", - "fastq_md5": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": true - }, - "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" - ], - [ - { - "id": "SRX17709227_SRR21711856", - "run_accession": "SRR21711856", - "experiment_accession": "SRX17709227", - "library_layout": "SINGLE", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_md5": "7cd1402155befc87be338132d1f31f64", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_2": "", - "md5_1": "7cd1402155befc87be338132d1f31f64", - "md5_2": "", - "single_end": true - }, - "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" - ], - [ - { - "id": "SRX17709228_SRR21711855", - "run_accession": "SRR21711855", - "experiment_accession": "SRX17709228", - "library_layout": "SINGLE", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_2": "", - "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", - "md5_2": "", - "single_end": true - }, - "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" - ], - [ - { - "id": "SRX6725035_SRR9984183", - "run_accession": "SRR9984183", - "experiment_accession": "SRX6725035", - "library_layout": "SINGLE", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_md5": "0b512d2dc31685983456bd56fd836544", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_2": "", - "md5_1": "0b512d2dc31685983456bd56fd836544", - "md5_2": "", - "single_end": true - }, - "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" - ], - [ - { - "id": "SRX9315476_SRR12848126", - "run_accession": "SRR12848126", - "experiment_accession": "SRX9315476", - "library_layout": "PAIRED", - "fastq_ftp": "", - "fastq_md5": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": false - }, - [ - "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", - "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" - ] - ], - [ - { - "id": "SRX9504942_SRR13055517", - "run_accession": "SRR13055517", - "experiment_accession": "SRX9504942", - "library_layout": "PAIRED", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", - "md5_2": "18dbe96e7f58b63406d9058938df1962", - "single_end": false - }, - [ - "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", - "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" - ] - ], - [ - { - "id": "SRX9504942_SRR13055518", - "run_accession": "SRR13055518", - "experiment_accession": "SRX9504942", - "library_layout": "PAIRED", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "md5_1": "5ec894d863fcefe394470a0925aefde4", - "md5_2": "aead170df9851773d5202b5760c76d76", - "single_end": false - }, - [ - "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", - "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" - ] - ], - [ - { - "id": "SRX9504942_SRR13055519", - "run_accession": "SRR13055519", - "experiment_accession": "SRX9504942", - "library_layout": "PAIRED", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", - "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", - "single_end": false - }, - [ - "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", - "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" - ] - ], - [ - { - "id": "SRX9504942_SRR13055520", - "run_accession": "SRR13055520", - "experiment_accession": "SRX9504942", - "library_layout": "PAIRED", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "md5_1": "795d460abff6009c7f5ff7c14b773fbe", - "md5_2": "c3f34379356b28d6dac7212abc1a0a04", - "single_end": false - }, - [ - "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", - "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" - ] - ], - [ - { - "id": "SRX9626017_SRR13191702", - "run_accession": "SRR13191702", - "experiment_accession": "SRX9626017", - "library_layout": "PAIRED", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "md5_1": "89c5be920021a035084d8aeb74f32df7", - "md5_2": "56271be38a80db78ef3bdfc5d9909b98", - "single_end": false - }, - [ - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" - ] - ] + ], "1": [ "samplesheet.csv:md5,d161b1a26b415a61064d8c558c9695c5" @@ -267,254 +20,7 @@ "versions.yml:md5,e977678bd13a54fc9c31addf135be15e" ], "fastq": [ - [ - { - "id": "DRX024467_DRR026872", - "run_accession": "DRR026872", - "experiment_accession": "DRX024467", - "library_layout": "SINGLE", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_md5": "515e5448c55e054113c4a22df5f62791", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_2": "", - "md5_1": "515e5448c55e054113c4a22df5f62791", - "md5_2": "", - "single_end": true - }, - "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" - ], - [ - { - "id": "DRX026011_DRR028935", - "run_accession": "DRR028935", - "experiment_accession": "DRX026011", - "library_layout": "PAIRED", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "md5_1": "cc01df82a9354bb6b3be93483b20c35a", - "md5_2": "941c9998d746416dad53c94c480ddf30", - "single_end": false - }, - [ - "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", - "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" - ] - ], - [ - { - "id": "ERX1234253_ERR1160846", - "run_accession": "ERR1160846", - "experiment_accession": "ERX1234253", - "library_layout": "SINGLE", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_2": "", - "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", - "md5_2": "", - "single_end": true - }, - "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" - ], - [ - { - "id": "SRX10940790_SRR14593545", - "run_accession": "SRR14593545", - "experiment_accession": "SRX10940790", - "library_layout": "PAIRED", - "fastq_ftp": "", - "fastq_md5": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": false - }, - [ - "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", - "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" - ] - ], - [ - { - "id": "SRX11047067_SRR14709033", - "run_accession": "SRR14709033", - "experiment_accession": "SRX11047067", - "library_layout": "SINGLE", - "fastq_ftp": "", - "fastq_md5": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": true - }, - "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" - ], - [ - { - "id": "SRX17709227_SRR21711856", - "run_accession": "SRR21711856", - "experiment_accession": "SRX17709227", - "library_layout": "SINGLE", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_md5": "7cd1402155befc87be338132d1f31f64", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_2": "", - "md5_1": "7cd1402155befc87be338132d1f31f64", - "md5_2": "", - "single_end": true - }, - "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" - ], - [ - { - "id": "SRX17709228_SRR21711855", - "run_accession": "SRR21711855", - "experiment_accession": "SRX17709228", - "library_layout": "SINGLE", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_2": "", - "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", - "md5_2": "", - "single_end": true - }, - "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" - ], - [ - { - "id": "SRX6725035_SRR9984183", - "run_accession": "SRR9984183", - "experiment_accession": "SRX6725035", - "library_layout": "SINGLE", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_md5": "0b512d2dc31685983456bd56fd836544", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_2": "", - "md5_1": "0b512d2dc31685983456bd56fd836544", - "md5_2": "", - "single_end": true - }, - "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" - ], - [ - { - "id": "SRX9315476_SRR12848126", - "run_accession": "SRR12848126", - "experiment_accession": "SRX9315476", - "library_layout": "PAIRED", - "fastq_ftp": "", - "fastq_md5": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": false - }, - [ - "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", - "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" - ] - ], - [ - { - "id": "SRX9504942_SRR13055517", - "run_accession": "SRR13055517", - "experiment_accession": "SRX9504942", - "library_layout": "PAIRED", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", - "md5_2": "18dbe96e7f58b63406d9058938df1962", - "single_end": false - }, - [ - "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", - "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" - ] - ], - [ - { - "id": "SRX9504942_SRR13055518", - "run_accession": "SRR13055518", - "experiment_accession": "SRX9504942", - "library_layout": "PAIRED", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "md5_1": "5ec894d863fcefe394470a0925aefde4", - "md5_2": "aead170df9851773d5202b5760c76d76", - "single_end": false - }, - [ - "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", - "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" - ] - ], - [ - { - "id": "SRX9504942_SRR13055519", - "run_accession": "SRR13055519", - "experiment_accession": "SRX9504942", - "library_layout": "PAIRED", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", - "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", - "single_end": false - }, - [ - "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", - "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" - ] - ], - [ - { - "id": "SRX9504942_SRR13055520", - "run_accession": "SRR13055520", - "experiment_accession": "SRX9504942", - "library_layout": "PAIRED", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "md5_1": "795d460abff6009c7f5ff7c14b773fbe", - "md5_2": "c3f34379356b28d6dac7212abc1a0a04", - "single_end": false - }, - [ - "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", - "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" - ] - ], - [ - { - "id": "SRX9626017_SRR13191702", - "run_accession": "SRR13191702", - "experiment_accession": "SRX9626017", - "library_layout": "PAIRED", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "md5_1": "89c5be920021a035084d8aeb74f32df7", - "md5_2": "56271be38a80db78ef3bdfc5d9909b98", - "single_end": false - }, - [ - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" - ] - ] + ], "mappings": [ "id_mappings.csv:md5,e8a7d8effe4af1d999dc26cf92cf6621" @@ -532,6 +38,6 @@ ] } ], - "timestamp": "2023-09-25T10:51:46.450639" + "timestamp": "2023-09-25T11:58:11.85816" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_default_parameters.nf.test.snap b/workflows/sra/tests/sra_default_parameters.nf.test.snap index ea2b868a..edb662a2 100644 --- a/workflows/sra/tests/sra_default_parameters.nf.test.snap +++ b/workflows/sra/tests/sra_default_parameters.nf.test.snap @@ -3,618 +3,7 @@ "content": [ { "0": [ - [ - { - "id": "DRX024467_DRR026872", - "run_accession": "DRR026872", - "experiment_accession": "DRX024467", - "sample_accession": "SAMD00023098", - "secondary_sample_accession": "DRS033740", - "study_accession": "PRJDB4356", - "secondary_study_accession": "DRP003256", - "submission_accession": "DRA002758", - "run_alias": "DRR026872", - "experiment_alias": "DRX024467", - "sample_alias": "SAMD00023098", - "study_alias": "DRP003256", - "library_layout": "SINGLE", - "library_selection": "Restriction Digest", - "library_source": "GENOMIC", - "library_strategy": "OTHER", - "library_name": "IpeRAD1_3", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "62550", - "read_count": "417", - "tax_id": "35883", - "scientific_name": "Ipomoea nil", - "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", - "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", - "study_title": "The Japanese morning glory genome sequence", - "sample_description": "Keywords: GSC:MIxS MIGS:6.0", - "fastq_md5": "515e5448c55e054113c4a22df5f62791", - "fastq_bytes": "38447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_2": "", - "md5_1": "515e5448c55e054113c4a22df5f62791", - "md5_2": "", - "single_end": true - }, - "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" - ], - [ - { - "id": "DRX026011_DRR028935", - "run_accession": "DRR028935", - "experiment_accession": "DRX026011", - "sample_accession": "SAMD00024405", - "secondary_sample_accession": "DRS019431", - "study_accession": "PRJDB3420", - "secondary_study_accession": "DRP002616", - "submission_accession": "DRA002949", - "run_alias": "DRR028935", - "experiment_alias": "DRX026011", - "sample_alias": "SAMD00024405", - "study_alias": "DRP002616", - "library_layout": "PAIRED", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "day0_BbSQE-I", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "194930", - "read_count": "965", - "tax_id": "1202541", - "scientific_name": "Botryococcus braunii Showa", - "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", - "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", - "sample_description": "Liquid culture", - "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", - "fastq_bytes": "60275;61610", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "md5_1": "cc01df82a9354bb6b3be93483b20c35a", - "md5_2": "941c9998d746416dad53c94c480ddf30", - "single_end": false - }, - [ - "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", - "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" - ] - ], - [ - { - "id": "ERX1234253_ERR1160846", - "run_accession": "ERR1160846", - "experiment_accession": "ERX1234253", - "sample_accession": "SAMEA3687214", - "secondary_sample_accession": "ERS994363", - "study_accession": "PRJEB11419", - "secondary_study_accession": "ERP012803", - "submission_accession": "ERA541392", - "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", - "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", - "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", - "study_alias": "qiita_sid_10317", - "library_layout": "SINGLE", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "library_name": "10317.BLANK.93.3E.r22", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "35658", - "read_count": "283", - "tax_id": "256318", - "scientific_name": "metagenome", - "sample_title": "10317.BLANK.93.3E.r22", - "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", - "study_title": "American Gut Project", - "sample_description": "American Gut control", - "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", - "fastq_bytes": "18077", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_2": "", - "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", - "md5_2": "", - "single_end": true - }, - "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" - ], - [ - { - "id": "SRX10940790_SRR14593545", - "run_accession": "SRR14593545", - "experiment_accession": "SRX10940790", - "sample_accession": "SAMN19097423", - "secondary_sample_accession": "SRS9020442", - "study_accession": "PRJNA728650", - "secondary_study_accession": "SRP319413", - "submission_accession": "SRA1234280", - "run_alias": "577-6_530058_19-037147 Goat_F.ab1", - "experiment_alias": "PRNP_2765", - "sample_alias": "prp_2765", - "study_alias": "PRJNA728650", - "library_layout": "PAIRED", - "library_selection": "PCR", - "library_source": "GENOMIC", - "library_strategy": "AMPLICON", - "library_name": "PRNP_2765", - "instrument_model": "AB 3500xL Genetic Analyzer", - "instrument_platform": "CAPILLARY", - "base_count": "828", - "read_count": "1", - "tax_id": "9925", - "scientific_name": "Capra hircus", - "sample_title": "MIGS Eukaryotic sample from Capra hircus", - "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", - "study_title": "Capra hircus Raw sequence reads", - "sample_description": "Keywords: GSC:MIxS MIGS:5.0", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": false - }, - [ - "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", - "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" - ] - ], - [ - { - "id": "SRX11047067_SRR14709033", - "run_accession": "SRR14709033", - "experiment_accession": "SRX11047067", - "sample_accession": "SAMN19373034", - "secondary_sample_accession": "SRS9115923", - "study_accession": "PRJNA733285", - "secondary_study_accession": "SRP322267", - "submission_accession": "SRA1239521", - "run_alias": "Sebastes_levis-2.fastq", - "experiment_alias": "Sebastes_macdonaldi-1", - "sample_alias": "S._macdonaldi-1", - "study_alias": "PRJNA733285", - "library_layout": "SINGLE", - "library_selection": "PCR", - "library_source": "GENOMIC", - "library_strategy": "AMPLICON", - "library_name": "Sebastes_macdonaldi-1", - "instrument_model": "AB 5500 Genetic Analyzer", - "instrument_platform": "ABI_SOLID", - "base_count": "153", - "read_count": "1", - "tax_id": "394693", - "scientific_name": "Sebastes macdonaldi", - "sample_title": "Sebastes_macdonaldi-1", - "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", - "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", - "sample_description": "Sebastes_macdonaldi-1", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": true - }, - "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" - ], - [ - { - "id": "SRX17709227_SRR21711856", - "run_accession": "SRR21711856", - "experiment_accession": "SRX17709227", - "sample_accession": "SAMN31021823", - "secondary_sample_accession": "SRS15239723", - "study_accession": "PRJNA884373", - "secondary_study_accession": "SRP399678", - "submission_accession": "SRA1507236", - "run_alias": "GSM6601460_r1", - "experiment_alias": "GSM6601460_r1", - "sample_alias": "GSM6601460", - "study_alias": "GSE214215", - "library_layout": "SINGLE", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "GSM6601460", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "base_count": "573417800", - "read_count": "11468356", - "tax_id": "6239", - "scientific_name": "Caenorhabditis elegans", - "sample_title": "sham-treated worms in day 5", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "sample_description": "sham-treated worms in day 5", - "fastq_md5": "7cd1402155befc87be338132d1f31f64", - "fastq_bytes": "447377777", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_2": "", - "md5_1": "7cd1402155befc87be338132d1f31f64", - "md5_2": "", - "single_end": true - }, - "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" - ], - [ - { - "id": "SRX17709228_SRR21711855", - "run_accession": "SRR21711855", - "experiment_accession": "SRX17709228", - "sample_accession": "SAMN31021822", - "secondary_sample_accession": "SRS15239724", - "study_accession": "PRJNA884373", - "secondary_study_accession": "SRP399678", - "submission_accession": "SRA1507236", - "run_alias": "GSM6601461_r1", - "experiment_alias": "GSM6601461_r1", - "sample_alias": "GSM6601461", - "study_alias": "GSE214215", - "library_layout": "SINGLE", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "GSM6601461", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "base_count": "677912850", - "read_count": "13558257", - "tax_id": "6239", - "scientific_name": "Caenorhabditis elegans", - "sample_title": "PM2.5-treated worms in day 5", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "sample_description": "PM2.5-treated worms in day 5", - "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", - "fastq_bytes": "529798447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_2": "", - "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", - "md5_2": "", - "single_end": true - }, - "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" - ], - [ - { - "id": "SRX6725035_SRR9984183", - "run_accession": "SRR9984183", - "experiment_accession": "SRX6725035", - "sample_accession": "SAMN12581720", - "secondary_sample_accession": "SRS5277011", - "study_accession": "PRJNA560329", - "secondary_study_accession": "SRP218535", - "submission_accession": "SRA942061", - "run_alias": "Emb289P1_bin131.fastq", - "experiment_alias": "Emb289P1_bin131", - "sample_alias": "Emb289P1_bin131", - "study_alias": "PRJNA560329", - "library_layout": "SINGLE", - "library_selection": "RANDOM", - "library_source": "METAGENOMIC", - "library_strategy": "WGS", - "library_name": "Emb289P1_bin131", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "1996273", - "read_count": "58", - "tax_id": "2660712", - "scientific_name": "Defluviitaleaceae bacterium", - "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", - "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", - "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", - "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", - "fastq_md5": "0b512d2dc31685983456bd56fd836544", - "fastq_bytes": "605358", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_2": "", - "md5_1": "0b512d2dc31685983456bd56fd836544", - "md5_2": "", - "single_end": true - }, - "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" - ], - [ - { - "id": "SRX9315476_SRR12848126", - "run_accession": "SRR12848126", - "experiment_accession": "SRX9315476", - "sample_accession": "SAMN16455283", - "secondary_sample_accession": "SRS7540262", - "study_accession": "PRJNA670070", - "secondary_study_accession": "SRP287769", - "submission_accession": "SRA1145417", - "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", - "experiment_alias": "F11-N1-05", - "sample_alias": "F11-N1-05", - "study_alias": "PRJNA670070", - "library_layout": "PAIRED", - "library_selection": "RANDOM PCR", - "library_source": "GENOMIC", - "library_strategy": "Synthetic-Long-Read", - "library_name": "F11-N1-05", - "instrument_model": "Illumina HiSeq 3000", - "instrument_platform": "ILLUMINA", - "base_count": "431758", - "read_count": "2954", - "tax_id": "10092", - "scientific_name": "Mus musculus domesticus", - "sample_title": "Longshanks_F11-N1-05", - "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "sample_description": "F11-N1-05", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": false - }, - [ - "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", - "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" - ] - ], - [ - { - "id": "SRX9504942_SRR13055517", - "run_accession": "SRR13055517", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r1", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2246028", - "read_count": "29553", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", - "fastq_bytes": "721167;723753", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", - "md5_2": "18dbe96e7f58b63406d9058938df1962", - "single_end": false - }, - [ - "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", - "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" - ] - ], - [ - { - "id": "SRX9504942_SRR13055518", - "run_accession": "SRR13055518", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r2", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2235236", - "read_count": "29411", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", - "fastq_bytes": "717693;723429", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "md5_1": "5ec894d863fcefe394470a0925aefde4", - "md5_2": "aead170df9851773d5202b5760c76d76", - "single_end": false - }, - [ - "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", - "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" - ] - ], - [ - { - "id": "SRX9504942_SRR13055519", - "run_accession": "SRR13055519", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r3", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2232728", - "read_count": "29378", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", - "fastq_bytes": "714907;721705", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", - "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", - "single_end": false - }, - [ - "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", - "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" - ] - ], - [ - { - "id": "SRX9504942_SRR13055520", - "run_accession": "SRR13055520", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r4", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2214488", - "read_count": "29138", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", - "fastq_bytes": "709867;716862", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "md5_1": "795d460abff6009c7f5ff7c14b773fbe", - "md5_2": "c3f34379356b28d6dac7212abc1a0a04", - "single_end": false - }, - [ - "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", - "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" - ] - ], - [ - { - "id": "SRX9626017_SRR13191702", - "run_accession": "SRR13191702", - "experiment_accession": "SRX9626017", - "sample_accession": "SAMN16980141", - "secondary_sample_accession": "SRS7827211", - "study_accession": "PRJNA682076", - "secondary_study_accession": "SRP295653", - "submission_accession": "SRA1166126", - "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", - "experiment_alias": "S.170804.00784", - "sample_alias": "S.170804.00784_662", - "study_alias": "PRJNA682076", - "library_layout": "PAIRED", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "library_name": "S.170804.00784", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "45682", - "read_count": "91", - "tax_id": "408170", - "scientific_name": "human gut metagenome", - "sample_title": "Metagenome or environmental sample from human gut metagenome", - "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "sample_description": "Metagenome or environmental sample from human gut metagenome", - "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", - "fastq_bytes": "15420;16324", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "md5_1": "89c5be920021a035084d8aeb74f32df7", - "md5_2": "56271be38a80db78ef3bdfc5d9909b98", - "single_end": false - }, - [ - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" - ] - ] + ], "1": [ "samplesheet.csv:md5,c1104c2edfc663b103f79b0551450192" @@ -631,618 +20,7 @@ "versions.yml:md5,e977678bd13a54fc9c31addf135be15e" ], "fastq": [ - [ - { - "id": "DRX024467_DRR026872", - "run_accession": "DRR026872", - "experiment_accession": "DRX024467", - "sample_accession": "SAMD00023098", - "secondary_sample_accession": "DRS033740", - "study_accession": "PRJDB4356", - "secondary_study_accession": "DRP003256", - "submission_accession": "DRA002758", - "run_alias": "DRR026872", - "experiment_alias": "DRX024467", - "sample_alias": "SAMD00023098", - "study_alias": "DRP003256", - "library_layout": "SINGLE", - "library_selection": "Restriction Digest", - "library_source": "GENOMIC", - "library_strategy": "OTHER", - "library_name": "IpeRAD1_3", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "62550", - "read_count": "417", - "tax_id": "35883", - "scientific_name": "Ipomoea nil", - "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", - "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", - "study_title": "The Japanese morning glory genome sequence", - "sample_description": "Keywords: GSC:MIxS MIGS:6.0", - "fastq_md5": "515e5448c55e054113c4a22df5f62791", - "fastq_bytes": "38447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_2": "", - "md5_1": "515e5448c55e054113c4a22df5f62791", - "md5_2": "", - "single_end": true - }, - "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" - ], - [ - { - "id": "DRX026011_DRR028935", - "run_accession": "DRR028935", - "experiment_accession": "DRX026011", - "sample_accession": "SAMD00024405", - "secondary_sample_accession": "DRS019431", - "study_accession": "PRJDB3420", - "secondary_study_accession": "DRP002616", - "submission_accession": "DRA002949", - "run_alias": "DRR028935", - "experiment_alias": "DRX026011", - "sample_alias": "SAMD00024405", - "study_alias": "DRP002616", - "library_layout": "PAIRED", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "day0_BbSQE-I", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "194930", - "read_count": "965", - "tax_id": "1202541", - "scientific_name": "Botryococcus braunii Showa", - "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", - "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", - "sample_description": "Liquid culture", - "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", - "fastq_bytes": "60275;61610", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "md5_1": "cc01df82a9354bb6b3be93483b20c35a", - "md5_2": "941c9998d746416dad53c94c480ddf30", - "single_end": false - }, - [ - "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", - "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" - ] - ], - [ - { - "id": "ERX1234253_ERR1160846", - "run_accession": "ERR1160846", - "experiment_accession": "ERX1234253", - "sample_accession": "SAMEA3687214", - "secondary_sample_accession": "ERS994363", - "study_accession": "PRJEB11419", - "secondary_study_accession": "ERP012803", - "submission_accession": "ERA541392", - "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", - "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", - "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", - "study_alias": "qiita_sid_10317", - "library_layout": "SINGLE", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "library_name": "10317.BLANK.93.3E.r22", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "35658", - "read_count": "283", - "tax_id": "256318", - "scientific_name": "metagenome", - "sample_title": "10317.BLANK.93.3E.r22", - "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", - "study_title": "American Gut Project", - "sample_description": "American Gut control", - "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", - "fastq_bytes": "18077", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_2": "", - "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", - "md5_2": "", - "single_end": true - }, - "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" - ], - [ - { - "id": "SRX10940790_SRR14593545", - "run_accession": "SRR14593545", - "experiment_accession": "SRX10940790", - "sample_accession": "SAMN19097423", - "secondary_sample_accession": "SRS9020442", - "study_accession": "PRJNA728650", - "secondary_study_accession": "SRP319413", - "submission_accession": "SRA1234280", - "run_alias": "577-6_530058_19-037147 Goat_F.ab1", - "experiment_alias": "PRNP_2765", - "sample_alias": "prp_2765", - "study_alias": "PRJNA728650", - "library_layout": "PAIRED", - "library_selection": "PCR", - "library_source": "GENOMIC", - "library_strategy": "AMPLICON", - "library_name": "PRNP_2765", - "instrument_model": "AB 3500xL Genetic Analyzer", - "instrument_platform": "CAPILLARY", - "base_count": "828", - "read_count": "1", - "tax_id": "9925", - "scientific_name": "Capra hircus", - "sample_title": "MIGS Eukaryotic sample from Capra hircus", - "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", - "study_title": "Capra hircus Raw sequence reads", - "sample_description": "Keywords: GSC:MIxS MIGS:5.0", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": false - }, - [ - "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", - "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" - ] - ], - [ - { - "id": "SRX11047067_SRR14709033", - "run_accession": "SRR14709033", - "experiment_accession": "SRX11047067", - "sample_accession": "SAMN19373034", - "secondary_sample_accession": "SRS9115923", - "study_accession": "PRJNA733285", - "secondary_study_accession": "SRP322267", - "submission_accession": "SRA1239521", - "run_alias": "Sebastes_levis-2.fastq", - "experiment_alias": "Sebastes_macdonaldi-1", - "sample_alias": "S._macdonaldi-1", - "study_alias": "PRJNA733285", - "library_layout": "SINGLE", - "library_selection": "PCR", - "library_source": "GENOMIC", - "library_strategy": "AMPLICON", - "library_name": "Sebastes_macdonaldi-1", - "instrument_model": "AB 5500 Genetic Analyzer", - "instrument_platform": "ABI_SOLID", - "base_count": "153", - "read_count": "1", - "tax_id": "394693", - "scientific_name": "Sebastes macdonaldi", - "sample_title": "Sebastes_macdonaldi-1", - "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", - "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", - "sample_description": "Sebastes_macdonaldi-1", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": true - }, - "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" - ], - [ - { - "id": "SRX17709227_SRR21711856", - "run_accession": "SRR21711856", - "experiment_accession": "SRX17709227", - "sample_accession": "SAMN31021823", - "secondary_sample_accession": "SRS15239723", - "study_accession": "PRJNA884373", - "secondary_study_accession": "SRP399678", - "submission_accession": "SRA1507236", - "run_alias": "GSM6601460_r1", - "experiment_alias": "GSM6601460_r1", - "sample_alias": "GSM6601460", - "study_alias": "GSE214215", - "library_layout": "SINGLE", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "GSM6601460", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "base_count": "573417800", - "read_count": "11468356", - "tax_id": "6239", - "scientific_name": "Caenorhabditis elegans", - "sample_title": "sham-treated worms in day 5", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "sample_description": "sham-treated worms in day 5", - "fastq_md5": "7cd1402155befc87be338132d1f31f64", - "fastq_bytes": "447377777", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_2": "", - "md5_1": "7cd1402155befc87be338132d1f31f64", - "md5_2": "", - "single_end": true - }, - "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" - ], - [ - { - "id": "SRX17709228_SRR21711855", - "run_accession": "SRR21711855", - "experiment_accession": "SRX17709228", - "sample_accession": "SAMN31021822", - "secondary_sample_accession": "SRS15239724", - "study_accession": "PRJNA884373", - "secondary_study_accession": "SRP399678", - "submission_accession": "SRA1507236", - "run_alias": "GSM6601461_r1", - "experiment_alias": "GSM6601461_r1", - "sample_alias": "GSM6601461", - "study_alias": "GSE214215", - "library_layout": "SINGLE", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "GSM6601461", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "base_count": "677912850", - "read_count": "13558257", - "tax_id": "6239", - "scientific_name": "Caenorhabditis elegans", - "sample_title": "PM2.5-treated worms in day 5", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "sample_description": "PM2.5-treated worms in day 5", - "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", - "fastq_bytes": "529798447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_2": "", - "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", - "md5_2": "", - "single_end": true - }, - "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" - ], - [ - { - "id": "SRX6725035_SRR9984183", - "run_accession": "SRR9984183", - "experiment_accession": "SRX6725035", - "sample_accession": "SAMN12581720", - "secondary_sample_accession": "SRS5277011", - "study_accession": "PRJNA560329", - "secondary_study_accession": "SRP218535", - "submission_accession": "SRA942061", - "run_alias": "Emb289P1_bin131.fastq", - "experiment_alias": "Emb289P1_bin131", - "sample_alias": "Emb289P1_bin131", - "study_alias": "PRJNA560329", - "library_layout": "SINGLE", - "library_selection": "RANDOM", - "library_source": "METAGENOMIC", - "library_strategy": "WGS", - "library_name": "Emb289P1_bin131", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "1996273", - "read_count": "58", - "tax_id": "2660712", - "scientific_name": "Defluviitaleaceae bacterium", - "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", - "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", - "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", - "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", - "fastq_md5": "0b512d2dc31685983456bd56fd836544", - "fastq_bytes": "605358", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_2": "", - "md5_1": "0b512d2dc31685983456bd56fd836544", - "md5_2": "", - "single_end": true - }, - "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" - ], - [ - { - "id": "SRX9315476_SRR12848126", - "run_accession": "SRR12848126", - "experiment_accession": "SRX9315476", - "sample_accession": "SAMN16455283", - "secondary_sample_accession": "SRS7540262", - "study_accession": "PRJNA670070", - "secondary_study_accession": "SRP287769", - "submission_accession": "SRA1145417", - "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", - "experiment_alias": "F11-N1-05", - "sample_alias": "F11-N1-05", - "study_alias": "PRJNA670070", - "library_layout": "PAIRED", - "library_selection": "RANDOM PCR", - "library_source": "GENOMIC", - "library_strategy": "Synthetic-Long-Read", - "library_name": "F11-N1-05", - "instrument_model": "Illumina HiSeq 3000", - "instrument_platform": "ILLUMINA", - "base_count": "431758", - "read_count": "2954", - "tax_id": "10092", - "scientific_name": "Mus musculus domesticus", - "sample_title": "Longshanks_F11-N1-05", - "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "sample_description": "F11-N1-05", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": false - }, - [ - "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", - "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" - ] - ], - [ - { - "id": "SRX9504942_SRR13055517", - "run_accession": "SRR13055517", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r1", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2246028", - "read_count": "29553", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", - "fastq_bytes": "721167;723753", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", - "md5_2": "18dbe96e7f58b63406d9058938df1962", - "single_end": false - }, - [ - "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", - "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" - ] - ], - [ - { - "id": "SRX9504942_SRR13055518", - "run_accession": "SRR13055518", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r2", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2235236", - "read_count": "29411", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", - "fastq_bytes": "717693;723429", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "md5_1": "5ec894d863fcefe394470a0925aefde4", - "md5_2": "aead170df9851773d5202b5760c76d76", - "single_end": false - }, - [ - "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", - "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" - ] - ], - [ - { - "id": "SRX9504942_SRR13055519", - "run_accession": "SRR13055519", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r3", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2232728", - "read_count": "29378", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", - "fastq_bytes": "714907;721705", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", - "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", - "single_end": false - }, - [ - "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", - "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" - ] - ], - [ - { - "id": "SRX9504942_SRR13055520", - "run_accession": "SRR13055520", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r4", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2214488", - "read_count": "29138", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", - "fastq_bytes": "709867;716862", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "md5_1": "795d460abff6009c7f5ff7c14b773fbe", - "md5_2": "c3f34379356b28d6dac7212abc1a0a04", - "single_end": false - }, - [ - "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", - "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" - ] - ], - [ - { - "id": "SRX9626017_SRR13191702", - "run_accession": "SRR13191702", - "experiment_accession": "SRX9626017", - "sample_accession": "SAMN16980141", - "secondary_sample_accession": "SRS7827211", - "study_accession": "PRJNA682076", - "secondary_study_accession": "SRP295653", - "submission_accession": "SRA1166126", - "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", - "experiment_alias": "S.170804.00784", - "sample_alias": "S.170804.00784_662", - "study_alias": "PRJNA682076", - "library_layout": "PAIRED", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "library_name": "S.170804.00784", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "45682", - "read_count": "91", - "tax_id": "408170", - "scientific_name": "human gut metagenome", - "sample_title": "Metagenome or environmental sample from human gut metagenome", - "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "sample_description": "Metagenome or environmental sample from human gut metagenome", - "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", - "fastq_bytes": "15420;16324", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "md5_1": "89c5be920021a035084d8aeb74f32df7", - "md5_2": "56271be38a80db78ef3bdfc5d9909b98", - "single_end": false - }, - [ - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" - ] - ] + ], "mappings": [ "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" @@ -1260,6 +38,6 @@ ] } ], - "timestamp": "2023-09-25T10:59:42.069791" + "timestamp": "2023-09-25T12:00:37.501679" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test.snap b/workflows/sra/tests/sra_force_sratools_download.nf.test.snap index 7fdbbf66..91eec432 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test.snap +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test.snap @@ -3,618 +3,7 @@ "content": [ { "0": [ - [ - { - "id": "DRX024467_DRR026872", - "run_accession": "DRR026872", - "experiment_accession": "DRX024467", - "sample_accession": "SAMD00023098", - "secondary_sample_accession": "DRS033740", - "study_accession": "PRJDB4356", - "secondary_study_accession": "DRP003256", - "submission_accession": "DRA002758", - "run_alias": "DRR026872", - "experiment_alias": "DRX024467", - "sample_alias": "SAMD00023098", - "study_alias": "DRP003256", - "library_layout": "SINGLE", - "library_selection": "Restriction Digest", - "library_source": "GENOMIC", - "library_strategy": "OTHER", - "library_name": "IpeRAD1_3", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "62550", - "read_count": "417", - "tax_id": "35883", - "scientific_name": "Ipomoea nil", - "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", - "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", - "study_title": "The Japanese morning glory genome sequence", - "sample_description": "Keywords: GSC:MIxS MIGS:6.0", - "fastq_md5": "515e5448c55e054113c4a22df5f62791", - "fastq_bytes": "38447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_2": "", - "md5_1": "515e5448c55e054113c4a22df5f62791", - "md5_2": "", - "single_end": true - }, - "DRX024467_DRR026872.fastq.gz:md5,bd3f113c3b06cf4499fa0e00c634ec85" - ], - [ - { - "id": "DRX026011_DRR028935", - "run_accession": "DRR028935", - "experiment_accession": "DRX026011", - "sample_accession": "SAMD00024405", - "secondary_sample_accession": "DRS019431", - "study_accession": "PRJDB3420", - "secondary_study_accession": "DRP002616", - "submission_accession": "DRA002949", - "run_alias": "DRR028935", - "experiment_alias": "DRX026011", - "sample_alias": "SAMD00024405", - "study_alias": "DRP002616", - "library_layout": "PAIRED", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "day0_BbSQE-I", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "194930", - "read_count": "965", - "tax_id": "1202541", - "scientific_name": "Botryococcus braunii Showa", - "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", - "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", - "sample_description": "Liquid culture", - "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", - "fastq_bytes": "60275;61610", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "md5_1": "cc01df82a9354bb6b3be93483b20c35a", - "md5_2": "941c9998d746416dad53c94c480ddf30", - "single_end": false - }, - [ - "DRX026011_DRR028935_1.fastq.gz:md5,0f96fb60e903c8cbd55a6977e66f7c93", - "DRX026011_DRR028935_2.fastq.gz:md5,b97b1e0e806bcae10a7443e2f22d6ca2" - ] - ], - [ - { - "id": "ERX1234253_ERR1160846", - "run_accession": "ERR1160846", - "experiment_accession": "ERX1234253", - "sample_accession": "SAMEA3687214", - "secondary_sample_accession": "ERS994363", - "study_accession": "PRJEB11419", - "secondary_study_accession": "ERP012803", - "submission_accession": "ERA541392", - "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", - "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", - "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", - "study_alias": "qiita_sid_10317", - "library_layout": "SINGLE", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "library_name": "10317.BLANK.93.3E.r22", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "35658", - "read_count": "283", - "tax_id": "256318", - "scientific_name": "metagenome", - "sample_title": "10317.BLANK.93.3E.r22", - "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", - "study_title": "American Gut Project", - "sample_description": "American Gut control", - "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", - "fastq_bytes": "18077", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_2": "", - "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", - "md5_2": "", - "single_end": true - }, - "ERX1234253_ERR1160846.fastq.gz:md5,22683b24b2467494e430643423f1e275" - ], - [ - { - "id": "SRX10940790_SRR14593545", - "run_accession": "SRR14593545", - "experiment_accession": "SRX10940790", - "sample_accession": "SAMN19097423", - "secondary_sample_accession": "SRS9020442", - "study_accession": "PRJNA728650", - "secondary_study_accession": "SRP319413", - "submission_accession": "SRA1234280", - "run_alias": "577-6_530058_19-037147 Goat_F.ab1", - "experiment_alias": "PRNP_2765", - "sample_alias": "prp_2765", - "study_alias": "PRJNA728650", - "library_layout": "PAIRED", - "library_selection": "PCR", - "library_source": "GENOMIC", - "library_strategy": "AMPLICON", - "library_name": "PRNP_2765", - "instrument_model": "AB 3500xL Genetic Analyzer", - "instrument_platform": "CAPILLARY", - "base_count": "828", - "read_count": "1", - "tax_id": "9925", - "scientific_name": "Capra hircus", - "sample_title": "MIGS Eukaryotic sample from Capra hircus", - "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", - "study_title": "Capra hircus Raw sequence reads", - "sample_description": "Keywords: GSC:MIxS MIGS:5.0", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": false - }, - [ - "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", - "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" - ] - ], - [ - { - "id": "SRX11047067_SRR14709033", - "run_accession": "SRR14709033", - "experiment_accession": "SRX11047067", - "sample_accession": "SAMN19373034", - "secondary_sample_accession": "SRS9115923", - "study_accession": "PRJNA733285", - "secondary_study_accession": "SRP322267", - "submission_accession": "SRA1239521", - "run_alias": "Sebastes_levis-2.fastq", - "experiment_alias": "Sebastes_macdonaldi-1", - "sample_alias": "S._macdonaldi-1", - "study_alias": "PRJNA733285", - "library_layout": "SINGLE", - "library_selection": "PCR", - "library_source": "GENOMIC", - "library_strategy": "AMPLICON", - "library_name": "Sebastes_macdonaldi-1", - "instrument_model": "AB 5500 Genetic Analyzer", - "instrument_platform": "ABI_SOLID", - "base_count": "153", - "read_count": "1", - "tax_id": "394693", - "scientific_name": "Sebastes macdonaldi", - "sample_title": "Sebastes_macdonaldi-1", - "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", - "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", - "sample_description": "Sebastes_macdonaldi-1", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": true - }, - "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" - ], - [ - { - "id": "SRX17709227_SRR21711856", - "run_accession": "SRR21711856", - "experiment_accession": "SRX17709227", - "sample_accession": "SAMN31021823", - "secondary_sample_accession": "SRS15239723", - "study_accession": "PRJNA884373", - "secondary_study_accession": "SRP399678", - "submission_accession": "SRA1507236", - "run_alias": "GSM6601460_r1", - "experiment_alias": "GSM6601460_r1", - "sample_alias": "GSM6601460", - "study_alias": "GSE214215", - "library_layout": "SINGLE", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "GSM6601460", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "base_count": "573417800", - "read_count": "11468356", - "tax_id": "6239", - "scientific_name": "Caenorhabditis elegans", - "sample_title": "sham-treated worms in day 5", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "sample_description": "sham-treated worms in day 5", - "fastq_md5": "7cd1402155befc87be338132d1f31f64", - "fastq_bytes": "447377777", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_2": "", - "md5_1": "7cd1402155befc87be338132d1f31f64", - "md5_2": "", - "single_end": true - }, - "SRX17709227_SRR21711856.fastq.gz:md5,eae43f1368d4568f415581394dc9726e" - ], - [ - { - "id": "SRX17709228_SRR21711855", - "run_accession": "SRR21711855", - "experiment_accession": "SRX17709228", - "sample_accession": "SAMN31021822", - "secondary_sample_accession": "SRS15239724", - "study_accession": "PRJNA884373", - "secondary_study_accession": "SRP399678", - "submission_accession": "SRA1507236", - "run_alias": "GSM6601461_r1", - "experiment_alias": "GSM6601461_r1", - "sample_alias": "GSM6601461", - "study_alias": "GSE214215", - "library_layout": "SINGLE", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "GSM6601461", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "base_count": "677912850", - "read_count": "13558257", - "tax_id": "6239", - "scientific_name": "Caenorhabditis elegans", - "sample_title": "PM2.5-treated worms in day 5", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "sample_description": "PM2.5-treated worms in day 5", - "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", - "fastq_bytes": "529798447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_2": "", - "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", - "md5_2": "", - "single_end": true - }, - "SRX17709228_SRR21711855.fastq.gz:md5,5194f8009b74552595c4ec5b7605d231" - ], - [ - { - "id": "SRX6725035_SRR9984183", - "run_accession": "SRR9984183", - "experiment_accession": "SRX6725035", - "sample_accession": "SAMN12581720", - "secondary_sample_accession": "SRS5277011", - "study_accession": "PRJNA560329", - "secondary_study_accession": "SRP218535", - "submission_accession": "SRA942061", - "run_alias": "Emb289P1_bin131.fastq", - "experiment_alias": "Emb289P1_bin131", - "sample_alias": "Emb289P1_bin131", - "study_alias": "PRJNA560329", - "library_layout": "SINGLE", - "library_selection": "RANDOM", - "library_source": "METAGENOMIC", - "library_strategy": "WGS", - "library_name": "Emb289P1_bin131", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "1996273", - "read_count": "58", - "tax_id": "2660712", - "scientific_name": "Defluviitaleaceae bacterium", - "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", - "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", - "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", - "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", - "fastq_md5": "0b512d2dc31685983456bd56fd836544", - "fastq_bytes": "605358", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_2": "", - "md5_1": "0b512d2dc31685983456bd56fd836544", - "md5_2": "", - "single_end": true - }, - "SRX6725035_SRR9984183.fastq.gz:md5,7a70e678c400366869601c8be41fe74b" - ], - [ - { - "id": "SRX9315476_SRR12848126", - "run_accession": "SRR12848126", - "experiment_accession": "SRX9315476", - "sample_accession": "SAMN16455283", - "secondary_sample_accession": "SRS7540262", - "study_accession": "PRJNA670070", - "secondary_study_accession": "SRP287769", - "submission_accession": "SRA1145417", - "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", - "experiment_alias": "F11-N1-05", - "sample_alias": "F11-N1-05", - "study_alias": "PRJNA670070", - "library_layout": "PAIRED", - "library_selection": "RANDOM PCR", - "library_source": "GENOMIC", - "library_strategy": "Synthetic-Long-Read", - "library_name": "F11-N1-05", - "instrument_model": "Illumina HiSeq 3000", - "instrument_platform": "ILLUMINA", - "base_count": "431758", - "read_count": "2954", - "tax_id": "10092", - "scientific_name": "Mus musculus domesticus", - "sample_title": "Longshanks_F11-N1-05", - "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "sample_description": "F11-N1-05", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": false - }, - [ - "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", - "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" - ] - ], - [ - { - "id": "SRX9504942_SRR13055517", - "run_accession": "SRR13055517", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r1", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2246028", - "read_count": "29553", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", - "fastq_bytes": "721167;723753", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", - "md5_2": "18dbe96e7f58b63406d9058938df1962", - "single_end": false - }, - [ - "SRX9504942_SRR13055517_1.fastq.gz:md5,b6d912a73466c8f27b1d8021f80ec2bb", - "SRX9504942_SRR13055517_2.fastq.gz:md5,7c6e220694fa5d6d9124c739aa70ea92" - ] - ], - [ - { - "id": "SRX9504942_SRR13055518", - "run_accession": "SRR13055518", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r2", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2235236", - "read_count": "29411", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", - "fastq_bytes": "717693;723429", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "md5_1": "5ec894d863fcefe394470a0925aefde4", - "md5_2": "aead170df9851773d5202b5760c76d76", - "single_end": false - }, - [ - "SRX9504942_SRR13055518_1.fastq.gz:md5,ed29278c21a1bb2d8907a74be0dd4bc4", - "SRX9504942_SRR13055518_2.fastq.gz:md5,83785b728312deb81483fc1fd5b14264" - ] - ], - [ - { - "id": "SRX9504942_SRR13055519", - "run_accession": "SRR13055519", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r3", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2232728", - "read_count": "29378", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", - "fastq_bytes": "714907;721705", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", - "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", - "single_end": false - }, - [ - "SRX9504942_SRR13055519_1.fastq.gz:md5,28babc59a625b5161d97392efd4d0018", - "SRX9504942_SRR13055519_2.fastq.gz:md5,cf1eb4c61ab3522f4d473c86b2f696e1" - ] - ], - [ - { - "id": "SRX9504942_SRR13055520", - "run_accession": "SRR13055520", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r4", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2214488", - "read_count": "29138", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", - "fastq_bytes": "709867;716862", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "md5_1": "795d460abff6009c7f5ff7c14b773fbe", - "md5_2": "c3f34379356b28d6dac7212abc1a0a04", - "single_end": false - }, - [ - "SRX9504942_SRR13055520_1.fastq.gz:md5,cc75af896ec8a7cececb37851b0c6fcd", - "SRX9504942_SRR13055520_2.fastq.gz:md5,fe3e2bf9f738e4959243fad59e879eae" - ] - ], - [ - { - "id": "SRX9626017_SRR13191702", - "run_accession": "SRR13191702", - "experiment_accession": "SRX9626017", - "sample_accession": "SAMN16980141", - "secondary_sample_accession": "SRS7827211", - "study_accession": "PRJNA682076", - "secondary_study_accession": "SRP295653", - "submission_accession": "SRA1166126", - "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", - "experiment_alias": "S.170804.00784", - "sample_alias": "S.170804.00784_662", - "study_alias": "PRJNA682076", - "library_layout": "PAIRED", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "library_name": "S.170804.00784", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "45682", - "read_count": "91", - "tax_id": "408170", - "scientific_name": "human gut metagenome", - "sample_title": "Metagenome or environmental sample from human gut metagenome", - "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "sample_description": "Metagenome or environmental sample from human gut metagenome", - "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", - "fastq_bytes": "15420;16324", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "md5_1": "89c5be920021a035084d8aeb74f32df7", - "md5_2": "56271be38a80db78ef3bdfc5d9909b98", - "single_end": false - }, - [ - "SRX9626017_SRR13191702_1.fastq.gz:md5,627a90afcd9f3cfc7f5f91074f9a2df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,3d9b2c68a8ad1547105b17de81b2d9af" - ] - ] + ], "1": [ "samplesheet.csv:md5,c1104c2edfc663b103f79b0551450192" @@ -630,618 +19,7 @@ "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" ], "fastq": [ - [ - { - "id": "DRX024467_DRR026872", - "run_accession": "DRR026872", - "experiment_accession": "DRX024467", - "sample_accession": "SAMD00023098", - "secondary_sample_accession": "DRS033740", - "study_accession": "PRJDB4356", - "secondary_study_accession": "DRP003256", - "submission_accession": "DRA002758", - "run_alias": "DRR026872", - "experiment_alias": "DRX024467", - "sample_alias": "SAMD00023098", - "study_alias": "DRP003256", - "library_layout": "SINGLE", - "library_selection": "Restriction Digest", - "library_source": "GENOMIC", - "library_strategy": "OTHER", - "library_name": "IpeRAD1_3", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "62550", - "read_count": "417", - "tax_id": "35883", - "scientific_name": "Ipomoea nil", - "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", - "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", - "study_title": "The Japanese morning glory genome sequence", - "sample_description": "Keywords: GSC:MIxS MIGS:6.0", - "fastq_md5": "515e5448c55e054113c4a22df5f62791", - "fastq_bytes": "38447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_2": "", - "md5_1": "515e5448c55e054113c4a22df5f62791", - "md5_2": "", - "single_end": true - }, - "DRX024467_DRR026872.fastq.gz:md5,bd3f113c3b06cf4499fa0e00c634ec85" - ], - [ - { - "id": "DRX026011_DRR028935", - "run_accession": "DRR028935", - "experiment_accession": "DRX026011", - "sample_accession": "SAMD00024405", - "secondary_sample_accession": "DRS019431", - "study_accession": "PRJDB3420", - "secondary_study_accession": "DRP002616", - "submission_accession": "DRA002949", - "run_alias": "DRR028935", - "experiment_alias": "DRX026011", - "sample_alias": "SAMD00024405", - "study_alias": "DRP002616", - "library_layout": "PAIRED", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "day0_BbSQE-I", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "194930", - "read_count": "965", - "tax_id": "1202541", - "scientific_name": "Botryococcus braunii Showa", - "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", - "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", - "sample_description": "Liquid culture", - "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", - "fastq_bytes": "60275;61610", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "md5_1": "cc01df82a9354bb6b3be93483b20c35a", - "md5_2": "941c9998d746416dad53c94c480ddf30", - "single_end": false - }, - [ - "DRX026011_DRR028935_1.fastq.gz:md5,0f96fb60e903c8cbd55a6977e66f7c93", - "DRX026011_DRR028935_2.fastq.gz:md5,b97b1e0e806bcae10a7443e2f22d6ca2" - ] - ], - [ - { - "id": "ERX1234253_ERR1160846", - "run_accession": "ERR1160846", - "experiment_accession": "ERX1234253", - "sample_accession": "SAMEA3687214", - "secondary_sample_accession": "ERS994363", - "study_accession": "PRJEB11419", - "secondary_study_accession": "ERP012803", - "submission_accession": "ERA541392", - "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", - "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", - "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", - "study_alias": "qiita_sid_10317", - "library_layout": "SINGLE", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "library_name": "10317.BLANK.93.3E.r22", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "35658", - "read_count": "283", - "tax_id": "256318", - "scientific_name": "metagenome", - "sample_title": "10317.BLANK.93.3E.r22", - "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", - "study_title": "American Gut Project", - "sample_description": "American Gut control", - "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", - "fastq_bytes": "18077", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_2": "", - "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", - "md5_2": "", - "single_end": true - }, - "ERX1234253_ERR1160846.fastq.gz:md5,22683b24b2467494e430643423f1e275" - ], - [ - { - "id": "SRX10940790_SRR14593545", - "run_accession": "SRR14593545", - "experiment_accession": "SRX10940790", - "sample_accession": "SAMN19097423", - "secondary_sample_accession": "SRS9020442", - "study_accession": "PRJNA728650", - "secondary_study_accession": "SRP319413", - "submission_accession": "SRA1234280", - "run_alias": "577-6_530058_19-037147 Goat_F.ab1", - "experiment_alias": "PRNP_2765", - "sample_alias": "prp_2765", - "study_alias": "PRJNA728650", - "library_layout": "PAIRED", - "library_selection": "PCR", - "library_source": "GENOMIC", - "library_strategy": "AMPLICON", - "library_name": "PRNP_2765", - "instrument_model": "AB 3500xL Genetic Analyzer", - "instrument_platform": "CAPILLARY", - "base_count": "828", - "read_count": "1", - "tax_id": "9925", - "scientific_name": "Capra hircus", - "sample_title": "MIGS Eukaryotic sample from Capra hircus", - "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", - "study_title": "Capra hircus Raw sequence reads", - "sample_description": "Keywords: GSC:MIxS MIGS:5.0", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": false - }, - [ - "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", - "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" - ] - ], - [ - { - "id": "SRX11047067_SRR14709033", - "run_accession": "SRR14709033", - "experiment_accession": "SRX11047067", - "sample_accession": "SAMN19373034", - "secondary_sample_accession": "SRS9115923", - "study_accession": "PRJNA733285", - "secondary_study_accession": "SRP322267", - "submission_accession": "SRA1239521", - "run_alias": "Sebastes_levis-2.fastq", - "experiment_alias": "Sebastes_macdonaldi-1", - "sample_alias": "S._macdonaldi-1", - "study_alias": "PRJNA733285", - "library_layout": "SINGLE", - "library_selection": "PCR", - "library_source": "GENOMIC", - "library_strategy": "AMPLICON", - "library_name": "Sebastes_macdonaldi-1", - "instrument_model": "AB 5500 Genetic Analyzer", - "instrument_platform": "ABI_SOLID", - "base_count": "153", - "read_count": "1", - "tax_id": "394693", - "scientific_name": "Sebastes macdonaldi", - "sample_title": "Sebastes_macdonaldi-1", - "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", - "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", - "sample_description": "Sebastes_macdonaldi-1", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": true - }, - "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" - ], - [ - { - "id": "SRX17709227_SRR21711856", - "run_accession": "SRR21711856", - "experiment_accession": "SRX17709227", - "sample_accession": "SAMN31021823", - "secondary_sample_accession": "SRS15239723", - "study_accession": "PRJNA884373", - "secondary_study_accession": "SRP399678", - "submission_accession": "SRA1507236", - "run_alias": "GSM6601460_r1", - "experiment_alias": "GSM6601460_r1", - "sample_alias": "GSM6601460", - "study_alias": "GSE214215", - "library_layout": "SINGLE", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "GSM6601460", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "base_count": "573417800", - "read_count": "11468356", - "tax_id": "6239", - "scientific_name": "Caenorhabditis elegans", - "sample_title": "sham-treated worms in day 5", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "sample_description": "sham-treated worms in day 5", - "fastq_md5": "7cd1402155befc87be338132d1f31f64", - "fastq_bytes": "447377777", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_2": "", - "md5_1": "7cd1402155befc87be338132d1f31f64", - "md5_2": "", - "single_end": true - }, - "SRX17709227_SRR21711856.fastq.gz:md5,eae43f1368d4568f415581394dc9726e" - ], - [ - { - "id": "SRX17709228_SRR21711855", - "run_accession": "SRR21711855", - "experiment_accession": "SRX17709228", - "sample_accession": "SAMN31021822", - "secondary_sample_accession": "SRS15239724", - "study_accession": "PRJNA884373", - "secondary_study_accession": "SRP399678", - "submission_accession": "SRA1507236", - "run_alias": "GSM6601461_r1", - "experiment_alias": "GSM6601461_r1", - "sample_alias": "GSM6601461", - "study_alias": "GSE214215", - "library_layout": "SINGLE", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "GSM6601461", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "base_count": "677912850", - "read_count": "13558257", - "tax_id": "6239", - "scientific_name": "Caenorhabditis elegans", - "sample_title": "PM2.5-treated worms in day 5", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "sample_description": "PM2.5-treated worms in day 5", - "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", - "fastq_bytes": "529798447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_2": "", - "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", - "md5_2": "", - "single_end": true - }, - "SRX17709228_SRR21711855.fastq.gz:md5,5194f8009b74552595c4ec5b7605d231" - ], - [ - { - "id": "SRX6725035_SRR9984183", - "run_accession": "SRR9984183", - "experiment_accession": "SRX6725035", - "sample_accession": "SAMN12581720", - "secondary_sample_accession": "SRS5277011", - "study_accession": "PRJNA560329", - "secondary_study_accession": "SRP218535", - "submission_accession": "SRA942061", - "run_alias": "Emb289P1_bin131.fastq", - "experiment_alias": "Emb289P1_bin131", - "sample_alias": "Emb289P1_bin131", - "study_alias": "PRJNA560329", - "library_layout": "SINGLE", - "library_selection": "RANDOM", - "library_source": "METAGENOMIC", - "library_strategy": "WGS", - "library_name": "Emb289P1_bin131", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "1996273", - "read_count": "58", - "tax_id": "2660712", - "scientific_name": "Defluviitaleaceae bacterium", - "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", - "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", - "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", - "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", - "fastq_md5": "0b512d2dc31685983456bd56fd836544", - "fastq_bytes": "605358", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_2": "", - "md5_1": "0b512d2dc31685983456bd56fd836544", - "md5_2": "", - "single_end": true - }, - "SRX6725035_SRR9984183.fastq.gz:md5,7a70e678c400366869601c8be41fe74b" - ], - [ - { - "id": "SRX9315476_SRR12848126", - "run_accession": "SRR12848126", - "experiment_accession": "SRX9315476", - "sample_accession": "SAMN16455283", - "secondary_sample_accession": "SRS7540262", - "study_accession": "PRJNA670070", - "secondary_study_accession": "SRP287769", - "submission_accession": "SRA1145417", - "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", - "experiment_alias": "F11-N1-05", - "sample_alias": "F11-N1-05", - "study_alias": "PRJNA670070", - "library_layout": "PAIRED", - "library_selection": "RANDOM PCR", - "library_source": "GENOMIC", - "library_strategy": "Synthetic-Long-Read", - "library_name": "F11-N1-05", - "instrument_model": "Illumina HiSeq 3000", - "instrument_platform": "ILLUMINA", - "base_count": "431758", - "read_count": "2954", - "tax_id": "10092", - "scientific_name": "Mus musculus domesticus", - "sample_title": "Longshanks_F11-N1-05", - "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "sample_description": "F11-N1-05", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": false - }, - [ - "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", - "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" - ] - ], - [ - { - "id": "SRX9504942_SRR13055517", - "run_accession": "SRR13055517", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r1", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2246028", - "read_count": "29553", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", - "fastq_bytes": "721167;723753", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", - "md5_2": "18dbe96e7f58b63406d9058938df1962", - "single_end": false - }, - [ - "SRX9504942_SRR13055517_1.fastq.gz:md5,b6d912a73466c8f27b1d8021f80ec2bb", - "SRX9504942_SRR13055517_2.fastq.gz:md5,7c6e220694fa5d6d9124c739aa70ea92" - ] - ], - [ - { - "id": "SRX9504942_SRR13055518", - "run_accession": "SRR13055518", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r2", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2235236", - "read_count": "29411", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", - "fastq_bytes": "717693;723429", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "md5_1": "5ec894d863fcefe394470a0925aefde4", - "md5_2": "aead170df9851773d5202b5760c76d76", - "single_end": false - }, - [ - "SRX9504942_SRR13055518_1.fastq.gz:md5,ed29278c21a1bb2d8907a74be0dd4bc4", - "SRX9504942_SRR13055518_2.fastq.gz:md5,83785b728312deb81483fc1fd5b14264" - ] - ], - [ - { - "id": "SRX9504942_SRR13055519", - "run_accession": "SRR13055519", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r3", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2232728", - "read_count": "29378", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", - "fastq_bytes": "714907;721705", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", - "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", - "single_end": false - }, - [ - "SRX9504942_SRR13055519_1.fastq.gz:md5,28babc59a625b5161d97392efd4d0018", - "SRX9504942_SRR13055519_2.fastq.gz:md5,cf1eb4c61ab3522f4d473c86b2f696e1" - ] - ], - [ - { - "id": "SRX9504942_SRR13055520", - "run_accession": "SRR13055520", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r4", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2214488", - "read_count": "29138", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", - "fastq_bytes": "709867;716862", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "md5_1": "795d460abff6009c7f5ff7c14b773fbe", - "md5_2": "c3f34379356b28d6dac7212abc1a0a04", - "single_end": false - }, - [ - "SRX9504942_SRR13055520_1.fastq.gz:md5,cc75af896ec8a7cececb37851b0c6fcd", - "SRX9504942_SRR13055520_2.fastq.gz:md5,fe3e2bf9f738e4959243fad59e879eae" - ] - ], - [ - { - "id": "SRX9626017_SRR13191702", - "run_accession": "SRR13191702", - "experiment_accession": "SRX9626017", - "sample_accession": "SAMN16980141", - "secondary_sample_accession": "SRS7827211", - "study_accession": "PRJNA682076", - "secondary_study_accession": "SRP295653", - "submission_accession": "SRA1166126", - "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", - "experiment_alias": "S.170804.00784", - "sample_alias": "S.170804.00784_662", - "study_alias": "PRJNA682076", - "library_layout": "PAIRED", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "library_name": "S.170804.00784", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "45682", - "read_count": "91", - "tax_id": "408170", - "scientific_name": "human gut metagenome", - "sample_title": "Metagenome or environmental sample from human gut metagenome", - "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "sample_description": "Metagenome or environmental sample from human gut metagenome", - "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", - "fastq_bytes": "15420;16324", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "md5_1": "89c5be920021a035084d8aeb74f32df7", - "md5_2": "56271be38a80db78ef3bdfc5d9909b98", - "single_end": false - }, - [ - "SRX9626017_SRR13191702_1.fastq.gz:md5,627a90afcd9f3cfc7f5f91074f9a2df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,3d9b2c68a8ad1547105b17de81b2d9af" - ] - ] + ], "mappings": [ "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" @@ -1258,6 +36,6 @@ ] } ], - "timestamp": "2023-09-25T11:09:38.27192" + "timestamp": "2023-09-25T12:08:28.465466" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap index 0cbec631..4560b05b 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap @@ -3,618 +3,7 @@ "content": [ { "0": [ - [ - { - "id": "DRX024467_DRR026872", - "run_accession": "DRR026872", - "experiment_accession": "DRX024467", - "sample_accession": "SAMD00023098", - "secondary_sample_accession": "DRS033740", - "study_accession": "PRJDB4356", - "secondary_study_accession": "DRP003256", - "submission_accession": "DRA002758", - "run_alias": "DRR026872", - "experiment_alias": "DRX024467", - "sample_alias": "SAMD00023098", - "study_alias": "DRP003256", - "library_layout": "SINGLE", - "library_selection": "Restriction Digest", - "library_source": "GENOMIC", - "library_strategy": "OTHER", - "library_name": "IpeRAD1_3", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "62550", - "read_count": "417", - "tax_id": "35883", - "scientific_name": "Ipomoea nil", - "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", - "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", - "study_title": "The Japanese morning glory genome sequence", - "sample_description": "Keywords: GSC:MIxS MIGS:6.0", - "fastq_md5": "515e5448c55e054113c4a22df5f62791", - "fastq_bytes": "38447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_2": "", - "md5_1": "515e5448c55e054113c4a22df5f62791", - "md5_2": "", - "single_end": true - }, - "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" - ], - [ - { - "id": "DRX026011_DRR028935", - "run_accession": "DRR028935", - "experiment_accession": "DRX026011", - "sample_accession": "SAMD00024405", - "secondary_sample_accession": "DRS019431", - "study_accession": "PRJDB3420", - "secondary_study_accession": "DRP002616", - "submission_accession": "DRA002949", - "run_alias": "DRR028935", - "experiment_alias": "DRX026011", - "sample_alias": "SAMD00024405", - "study_alias": "DRP002616", - "library_layout": "PAIRED", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "day0_BbSQE-I", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "194930", - "read_count": "965", - "tax_id": "1202541", - "scientific_name": "Botryococcus braunii Showa", - "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", - "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", - "sample_description": "Liquid culture", - "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", - "fastq_bytes": "60275;61610", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "md5_1": "cc01df82a9354bb6b3be93483b20c35a", - "md5_2": "941c9998d746416dad53c94c480ddf30", - "single_end": false - }, - [ - "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", - "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" - ] - ], - [ - { - "id": "ERX1234253_ERR1160846", - "run_accession": "ERR1160846", - "experiment_accession": "ERX1234253", - "sample_accession": "SAMEA3687214", - "secondary_sample_accession": "ERS994363", - "study_accession": "PRJEB11419", - "secondary_study_accession": "ERP012803", - "submission_accession": "ERA541392", - "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", - "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", - "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", - "study_alias": "qiita_sid_10317", - "library_layout": "SINGLE", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "library_name": "10317.BLANK.93.3E.r22", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "35658", - "read_count": "283", - "tax_id": "256318", - "scientific_name": "metagenome", - "sample_title": "10317.BLANK.93.3E.r22", - "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", - "study_title": "American Gut Project", - "sample_description": "American Gut control", - "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", - "fastq_bytes": "18077", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_2": "", - "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", - "md5_2": "", - "single_end": true - }, - "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" - ], - [ - { - "id": "SRX10940790_SRR14593545", - "run_accession": "SRR14593545", - "experiment_accession": "SRX10940790", - "sample_accession": "SAMN19097423", - "secondary_sample_accession": "SRS9020442", - "study_accession": "PRJNA728650", - "secondary_study_accession": "SRP319413", - "submission_accession": "SRA1234280", - "run_alias": "577-6_530058_19-037147 Goat_F.ab1", - "experiment_alias": "PRNP_2765", - "sample_alias": "prp_2765", - "study_alias": "PRJNA728650", - "library_layout": "PAIRED", - "library_selection": "PCR", - "library_source": "GENOMIC", - "library_strategy": "AMPLICON", - "library_name": "PRNP_2765", - "instrument_model": "AB 3500xL Genetic Analyzer", - "instrument_platform": "CAPILLARY", - "base_count": "828", - "read_count": "1", - "tax_id": "9925", - "scientific_name": "Capra hircus", - "sample_title": "MIGS Eukaryotic sample from Capra hircus", - "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", - "study_title": "Capra hircus Raw sequence reads", - "sample_description": "Keywords: GSC:MIxS MIGS:5.0", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": false - }, - [ - "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", - "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" - ] - ], - [ - { - "id": "SRX11047067_SRR14709033", - "run_accession": "SRR14709033", - "experiment_accession": "SRX11047067", - "sample_accession": "SAMN19373034", - "secondary_sample_accession": "SRS9115923", - "study_accession": "PRJNA733285", - "secondary_study_accession": "SRP322267", - "submission_accession": "SRA1239521", - "run_alias": "Sebastes_levis-2.fastq", - "experiment_alias": "Sebastes_macdonaldi-1", - "sample_alias": "S._macdonaldi-1", - "study_alias": "PRJNA733285", - "library_layout": "SINGLE", - "library_selection": "PCR", - "library_source": "GENOMIC", - "library_strategy": "AMPLICON", - "library_name": "Sebastes_macdonaldi-1", - "instrument_model": "AB 5500 Genetic Analyzer", - "instrument_platform": "ABI_SOLID", - "base_count": "153", - "read_count": "1", - "tax_id": "394693", - "scientific_name": "Sebastes macdonaldi", - "sample_title": "Sebastes_macdonaldi-1", - "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", - "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", - "sample_description": "Sebastes_macdonaldi-1", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": true - }, - "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" - ], - [ - { - "id": "SRX17709227_SRR21711856", - "run_accession": "SRR21711856", - "experiment_accession": "SRX17709227", - "sample_accession": "SAMN31021823", - "secondary_sample_accession": "SRS15239723", - "study_accession": "PRJNA884373", - "secondary_study_accession": "SRP399678", - "submission_accession": "SRA1507236", - "run_alias": "GSM6601460_r1", - "experiment_alias": "GSM6601460_r1", - "sample_alias": "GSM6601460", - "study_alias": "GSE214215", - "library_layout": "SINGLE", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "GSM6601460", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "base_count": "573417800", - "read_count": "11468356", - "tax_id": "6239", - "scientific_name": "Caenorhabditis elegans", - "sample_title": "sham-treated worms in day 5", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "sample_description": "sham-treated worms in day 5", - "fastq_md5": "7cd1402155befc87be338132d1f31f64", - "fastq_bytes": "447377777", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_2": "", - "md5_1": "7cd1402155befc87be338132d1f31f64", - "md5_2": "", - "single_end": true - }, - "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" - ], - [ - { - "id": "SRX17709228_SRR21711855", - "run_accession": "SRR21711855", - "experiment_accession": "SRX17709228", - "sample_accession": "SAMN31021822", - "secondary_sample_accession": "SRS15239724", - "study_accession": "PRJNA884373", - "secondary_study_accession": "SRP399678", - "submission_accession": "SRA1507236", - "run_alias": "GSM6601461_r1", - "experiment_alias": "GSM6601461_r1", - "sample_alias": "GSM6601461", - "study_alias": "GSE214215", - "library_layout": "SINGLE", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "GSM6601461", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "base_count": "677912850", - "read_count": "13558257", - "tax_id": "6239", - "scientific_name": "Caenorhabditis elegans", - "sample_title": "PM2.5-treated worms in day 5", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "sample_description": "PM2.5-treated worms in day 5", - "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", - "fastq_bytes": "529798447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_2": "", - "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", - "md5_2": "", - "single_end": true - }, - "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" - ], - [ - { - "id": "SRX6725035_SRR9984183", - "run_accession": "SRR9984183", - "experiment_accession": "SRX6725035", - "sample_accession": "SAMN12581720", - "secondary_sample_accession": "SRS5277011", - "study_accession": "PRJNA560329", - "secondary_study_accession": "SRP218535", - "submission_accession": "SRA942061", - "run_alias": "Emb289P1_bin131.fastq", - "experiment_alias": "Emb289P1_bin131", - "sample_alias": "Emb289P1_bin131", - "study_alias": "PRJNA560329", - "library_layout": "SINGLE", - "library_selection": "RANDOM", - "library_source": "METAGENOMIC", - "library_strategy": "WGS", - "library_name": "Emb289P1_bin131", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "1996273", - "read_count": "58", - "tax_id": "2660712", - "scientific_name": "Defluviitaleaceae bacterium", - "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", - "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", - "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", - "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", - "fastq_md5": "0b512d2dc31685983456bd56fd836544", - "fastq_bytes": "605358", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_2": "", - "md5_1": "0b512d2dc31685983456bd56fd836544", - "md5_2": "", - "single_end": true - }, - "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" - ], - [ - { - "id": "SRX9315476_SRR12848126", - "run_accession": "SRR12848126", - "experiment_accession": "SRX9315476", - "sample_accession": "SAMN16455283", - "secondary_sample_accession": "SRS7540262", - "study_accession": "PRJNA670070", - "secondary_study_accession": "SRP287769", - "submission_accession": "SRA1145417", - "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", - "experiment_alias": "F11-N1-05", - "sample_alias": "F11-N1-05", - "study_alias": "PRJNA670070", - "library_layout": "PAIRED", - "library_selection": "RANDOM PCR", - "library_source": "GENOMIC", - "library_strategy": "Synthetic-Long-Read", - "library_name": "F11-N1-05", - "instrument_model": "Illumina HiSeq 3000", - "instrument_platform": "ILLUMINA", - "base_count": "431758", - "read_count": "2954", - "tax_id": "10092", - "scientific_name": "Mus musculus domesticus", - "sample_title": "Longshanks_F11-N1-05", - "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "sample_description": "F11-N1-05", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": false - }, - [ - "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", - "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" - ] - ], - [ - { - "id": "SRX9504942_SRR13055517", - "run_accession": "SRR13055517", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r1", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2246028", - "read_count": "29553", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", - "fastq_bytes": "721167;723753", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", - "md5_2": "18dbe96e7f58b63406d9058938df1962", - "single_end": false - }, - [ - "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", - "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" - ] - ], - [ - { - "id": "SRX9504942_SRR13055518", - "run_accession": "SRR13055518", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r2", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2235236", - "read_count": "29411", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", - "fastq_bytes": "717693;723429", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "md5_1": "5ec894d863fcefe394470a0925aefde4", - "md5_2": "aead170df9851773d5202b5760c76d76", - "single_end": false - }, - [ - "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", - "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" - ] - ], - [ - { - "id": "SRX9504942_SRR13055519", - "run_accession": "SRR13055519", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r3", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2232728", - "read_count": "29378", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", - "fastq_bytes": "714907;721705", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", - "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", - "single_end": false - }, - [ - "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", - "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" - ] - ], - [ - { - "id": "SRX9504942_SRR13055520", - "run_accession": "SRR13055520", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r4", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2214488", - "read_count": "29138", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", - "fastq_bytes": "709867;716862", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "md5_1": "795d460abff6009c7f5ff7c14b773fbe", - "md5_2": "c3f34379356b28d6dac7212abc1a0a04", - "single_end": false - }, - [ - "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", - "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" - ] - ], - [ - { - "id": "SRX9626017_SRR13191702", - "run_accession": "SRR13191702", - "experiment_accession": "SRX9626017", - "sample_accession": "SAMN16980141", - "secondary_sample_accession": "SRS7827211", - "study_accession": "PRJNA682076", - "secondary_study_accession": "SRP295653", - "submission_accession": "SRA1166126", - "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", - "experiment_alias": "S.170804.00784", - "sample_alias": "S.170804.00784_662", - "study_alias": "PRJNA682076", - "library_layout": "PAIRED", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "library_name": "S.170804.00784", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "45682", - "read_count": "91", - "tax_id": "408170", - "scientific_name": "human gut metagenome", - "sample_title": "Metagenome or environmental sample from human gut metagenome", - "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "sample_description": "Metagenome or environmental sample from human gut metagenome", - "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", - "fastq_bytes": "15420;16324", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "md5_1": "89c5be920021a035084d8aeb74f32df7", - "md5_2": "56271be38a80db78ef3bdfc5d9909b98", - "single_end": false - }, - [ - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" - ] - ] + ], "1": [ "samplesheet.csv:md5,46752dd6abac80b59573910f7ce4babe" @@ -631,618 +20,7 @@ "versions.yml:md5,e977678bd13a54fc9c31addf135be15e" ], "fastq": [ - [ - { - "id": "DRX024467_DRR026872", - "run_accession": "DRR026872", - "experiment_accession": "DRX024467", - "sample_accession": "SAMD00023098", - "secondary_sample_accession": "DRS033740", - "study_accession": "PRJDB4356", - "secondary_study_accession": "DRP003256", - "submission_accession": "DRA002758", - "run_alias": "DRR026872", - "experiment_alias": "DRX024467", - "sample_alias": "SAMD00023098", - "study_alias": "DRP003256", - "library_layout": "SINGLE", - "library_selection": "Restriction Digest", - "library_source": "GENOMIC", - "library_strategy": "OTHER", - "library_name": "IpeRAD1_3", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "62550", - "read_count": "417", - "tax_id": "35883", - "scientific_name": "Ipomoea nil", - "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", - "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", - "study_title": "The Japanese morning glory genome sequence", - "sample_description": "Keywords: GSC:MIxS MIGS:6.0", - "fastq_md5": "515e5448c55e054113c4a22df5f62791", - "fastq_bytes": "38447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_2": "", - "md5_1": "515e5448c55e054113c4a22df5f62791", - "md5_2": "", - "single_end": true - }, - "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" - ], - [ - { - "id": "DRX026011_DRR028935", - "run_accession": "DRR028935", - "experiment_accession": "DRX026011", - "sample_accession": "SAMD00024405", - "secondary_sample_accession": "DRS019431", - "study_accession": "PRJDB3420", - "secondary_study_accession": "DRP002616", - "submission_accession": "DRA002949", - "run_alias": "DRR028935", - "experiment_alias": "DRX026011", - "sample_alias": "SAMD00024405", - "study_alias": "DRP002616", - "library_layout": "PAIRED", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "day0_BbSQE-I", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "194930", - "read_count": "965", - "tax_id": "1202541", - "scientific_name": "Botryococcus braunii Showa", - "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", - "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", - "sample_description": "Liquid culture", - "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", - "fastq_bytes": "60275;61610", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "md5_1": "cc01df82a9354bb6b3be93483b20c35a", - "md5_2": "941c9998d746416dad53c94c480ddf30", - "single_end": false - }, - [ - "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", - "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" - ] - ], - [ - { - "id": "ERX1234253_ERR1160846", - "run_accession": "ERR1160846", - "experiment_accession": "ERX1234253", - "sample_accession": "SAMEA3687214", - "secondary_sample_accession": "ERS994363", - "study_accession": "PRJEB11419", - "secondary_study_accession": "ERP012803", - "submission_accession": "ERA541392", - "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", - "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", - "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", - "study_alias": "qiita_sid_10317", - "library_layout": "SINGLE", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "library_name": "10317.BLANK.93.3E.r22", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "35658", - "read_count": "283", - "tax_id": "256318", - "scientific_name": "metagenome", - "sample_title": "10317.BLANK.93.3E.r22", - "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", - "study_title": "American Gut Project", - "sample_description": "American Gut control", - "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", - "fastq_bytes": "18077", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_2": "", - "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", - "md5_2": "", - "single_end": true - }, - "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" - ], - [ - { - "id": "SRX10940790_SRR14593545", - "run_accession": "SRR14593545", - "experiment_accession": "SRX10940790", - "sample_accession": "SAMN19097423", - "secondary_sample_accession": "SRS9020442", - "study_accession": "PRJNA728650", - "secondary_study_accession": "SRP319413", - "submission_accession": "SRA1234280", - "run_alias": "577-6_530058_19-037147 Goat_F.ab1", - "experiment_alias": "PRNP_2765", - "sample_alias": "prp_2765", - "study_alias": "PRJNA728650", - "library_layout": "PAIRED", - "library_selection": "PCR", - "library_source": "GENOMIC", - "library_strategy": "AMPLICON", - "library_name": "PRNP_2765", - "instrument_model": "AB 3500xL Genetic Analyzer", - "instrument_platform": "CAPILLARY", - "base_count": "828", - "read_count": "1", - "tax_id": "9925", - "scientific_name": "Capra hircus", - "sample_title": "MIGS Eukaryotic sample from Capra hircus", - "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", - "study_title": "Capra hircus Raw sequence reads", - "sample_description": "Keywords: GSC:MIxS MIGS:5.0", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": false - }, - [ - "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", - "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" - ] - ], - [ - { - "id": "SRX11047067_SRR14709033", - "run_accession": "SRR14709033", - "experiment_accession": "SRX11047067", - "sample_accession": "SAMN19373034", - "secondary_sample_accession": "SRS9115923", - "study_accession": "PRJNA733285", - "secondary_study_accession": "SRP322267", - "submission_accession": "SRA1239521", - "run_alias": "Sebastes_levis-2.fastq", - "experiment_alias": "Sebastes_macdonaldi-1", - "sample_alias": "S._macdonaldi-1", - "study_alias": "PRJNA733285", - "library_layout": "SINGLE", - "library_selection": "PCR", - "library_source": "GENOMIC", - "library_strategy": "AMPLICON", - "library_name": "Sebastes_macdonaldi-1", - "instrument_model": "AB 5500 Genetic Analyzer", - "instrument_platform": "ABI_SOLID", - "base_count": "153", - "read_count": "1", - "tax_id": "394693", - "scientific_name": "Sebastes macdonaldi", - "sample_title": "Sebastes_macdonaldi-1", - "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", - "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", - "sample_description": "Sebastes_macdonaldi-1", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": true - }, - "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" - ], - [ - { - "id": "SRX17709227_SRR21711856", - "run_accession": "SRR21711856", - "experiment_accession": "SRX17709227", - "sample_accession": "SAMN31021823", - "secondary_sample_accession": "SRS15239723", - "study_accession": "PRJNA884373", - "secondary_study_accession": "SRP399678", - "submission_accession": "SRA1507236", - "run_alias": "GSM6601460_r1", - "experiment_alias": "GSM6601460_r1", - "sample_alias": "GSM6601460", - "study_alias": "GSE214215", - "library_layout": "SINGLE", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "GSM6601460", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "base_count": "573417800", - "read_count": "11468356", - "tax_id": "6239", - "scientific_name": "Caenorhabditis elegans", - "sample_title": "sham-treated worms in day 5", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "sample_description": "sham-treated worms in day 5", - "fastq_md5": "7cd1402155befc87be338132d1f31f64", - "fastq_bytes": "447377777", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_2": "", - "md5_1": "7cd1402155befc87be338132d1f31f64", - "md5_2": "", - "single_end": true - }, - "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" - ], - [ - { - "id": "SRX17709228_SRR21711855", - "run_accession": "SRR21711855", - "experiment_accession": "SRX17709228", - "sample_accession": "SAMN31021822", - "secondary_sample_accession": "SRS15239724", - "study_accession": "PRJNA884373", - "secondary_study_accession": "SRP399678", - "submission_accession": "SRA1507236", - "run_alias": "GSM6601461_r1", - "experiment_alias": "GSM6601461_r1", - "sample_alias": "GSM6601461", - "study_alias": "GSE214215", - "library_layout": "SINGLE", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "GSM6601461", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "base_count": "677912850", - "read_count": "13558257", - "tax_id": "6239", - "scientific_name": "Caenorhabditis elegans", - "sample_title": "PM2.5-treated worms in day 5", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "sample_description": "PM2.5-treated worms in day 5", - "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", - "fastq_bytes": "529798447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_2": "", - "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", - "md5_2": "", - "single_end": true - }, - "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" - ], - [ - { - "id": "SRX6725035_SRR9984183", - "run_accession": "SRR9984183", - "experiment_accession": "SRX6725035", - "sample_accession": "SAMN12581720", - "secondary_sample_accession": "SRS5277011", - "study_accession": "PRJNA560329", - "secondary_study_accession": "SRP218535", - "submission_accession": "SRA942061", - "run_alias": "Emb289P1_bin131.fastq", - "experiment_alias": "Emb289P1_bin131", - "sample_alias": "Emb289P1_bin131", - "study_alias": "PRJNA560329", - "library_layout": "SINGLE", - "library_selection": "RANDOM", - "library_source": "METAGENOMIC", - "library_strategy": "WGS", - "library_name": "Emb289P1_bin131", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "1996273", - "read_count": "58", - "tax_id": "2660712", - "scientific_name": "Defluviitaleaceae bacterium", - "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", - "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", - "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", - "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", - "fastq_md5": "0b512d2dc31685983456bd56fd836544", - "fastq_bytes": "605358", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_2": "", - "md5_1": "0b512d2dc31685983456bd56fd836544", - "md5_2": "", - "single_end": true - }, - "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" - ], - [ - { - "id": "SRX9315476_SRR12848126", - "run_accession": "SRR12848126", - "experiment_accession": "SRX9315476", - "sample_accession": "SAMN16455283", - "secondary_sample_accession": "SRS7540262", - "study_accession": "PRJNA670070", - "secondary_study_accession": "SRP287769", - "submission_accession": "SRA1145417", - "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", - "experiment_alias": "F11-N1-05", - "sample_alias": "F11-N1-05", - "study_alias": "PRJNA670070", - "library_layout": "PAIRED", - "library_selection": "RANDOM PCR", - "library_source": "GENOMIC", - "library_strategy": "Synthetic-Long-Read", - "library_name": "F11-N1-05", - "instrument_model": "Illumina HiSeq 3000", - "instrument_platform": "ILLUMINA", - "base_count": "431758", - "read_count": "2954", - "tax_id": "10092", - "scientific_name": "Mus musculus domesticus", - "sample_title": "Longshanks_F11-N1-05", - "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "sample_description": "F11-N1-05", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": false - }, - [ - "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", - "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" - ] - ], - [ - { - "id": "SRX9504942_SRR13055517", - "run_accession": "SRR13055517", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r1", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2246028", - "read_count": "29553", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", - "fastq_bytes": "721167;723753", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", - "md5_2": "18dbe96e7f58b63406d9058938df1962", - "single_end": false - }, - [ - "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", - "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" - ] - ], - [ - { - "id": "SRX9504942_SRR13055518", - "run_accession": "SRR13055518", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r2", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2235236", - "read_count": "29411", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", - "fastq_bytes": "717693;723429", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "md5_1": "5ec894d863fcefe394470a0925aefde4", - "md5_2": "aead170df9851773d5202b5760c76d76", - "single_end": false - }, - [ - "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", - "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" - ] - ], - [ - { - "id": "SRX9504942_SRR13055519", - "run_accession": "SRR13055519", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r3", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2232728", - "read_count": "29378", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", - "fastq_bytes": "714907;721705", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", - "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", - "single_end": false - }, - [ - "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", - "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" - ] - ], - [ - { - "id": "SRX9504942_SRR13055520", - "run_accession": "SRR13055520", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r4", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2214488", - "read_count": "29138", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", - "fastq_bytes": "709867;716862", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "md5_1": "795d460abff6009c7f5ff7c14b773fbe", - "md5_2": "c3f34379356b28d6dac7212abc1a0a04", - "single_end": false - }, - [ - "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", - "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" - ] - ], - [ - { - "id": "SRX9626017_SRR13191702", - "run_accession": "SRR13191702", - "experiment_accession": "SRX9626017", - "sample_accession": "SAMN16980141", - "secondary_sample_accession": "SRS7827211", - "study_accession": "PRJNA682076", - "secondary_study_accession": "SRP295653", - "submission_accession": "SRA1166126", - "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", - "experiment_alias": "S.170804.00784", - "sample_alias": "S.170804.00784_662", - "study_alias": "PRJNA682076", - "library_layout": "PAIRED", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "library_name": "S.170804.00784", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "45682", - "read_count": "91", - "tax_id": "408170", - "scientific_name": "human gut metagenome", - "sample_title": "Metagenome or environmental sample from human gut metagenome", - "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "sample_description": "Metagenome or environmental sample from human gut metagenome", - "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", - "fastq_bytes": "15420;16324", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "md5_1": "89c5be920021a035084d8aeb74f32df7", - "md5_2": "56271be38a80db78ef3bdfc5d9909b98", - "single_end": false - }, - [ - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" - ] - ] + ], "mappings": [ "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" @@ -1260,6 +38,6 @@ ] } ], - "timestamp": "2023-09-25T10:45:48.713699" + "timestamp": "2023-09-25T11:53:25.411769" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap index c6bd2d32..26357aa5 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap @@ -3,618 +3,7 @@ "content": [ { "0": [ - [ - { - "id": "DRX024467_DRR026872", - "run_accession": "DRR026872", - "experiment_accession": "DRX024467", - "sample_accession": "SAMD00023098", - "secondary_sample_accession": "DRS033740", - "study_accession": "PRJDB4356", - "secondary_study_accession": "DRP003256", - "submission_accession": "DRA002758", - "run_alias": "DRR026872", - "experiment_alias": "DRX024467", - "sample_alias": "SAMD00023098", - "study_alias": "DRP003256", - "library_layout": "SINGLE", - "library_selection": "Restriction Digest", - "library_source": "GENOMIC", - "library_strategy": "OTHER", - "library_name": "IpeRAD1_3", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "62550", - "read_count": "417", - "tax_id": "35883", - "scientific_name": "Ipomoea nil", - "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", - "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", - "study_title": "The Japanese morning glory genome sequence", - "sample_description": "Keywords: GSC:MIxS MIGS:6.0", - "fastq_md5": "515e5448c55e054113c4a22df5f62791", - "fastq_bytes": "38447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_2": "", - "md5_1": "515e5448c55e054113c4a22df5f62791", - "md5_2": "", - "single_end": true - }, - "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" - ], - [ - { - "id": "DRX026011_DRR028935", - "run_accession": "DRR028935", - "experiment_accession": "DRX026011", - "sample_accession": "SAMD00024405", - "secondary_sample_accession": "DRS019431", - "study_accession": "PRJDB3420", - "secondary_study_accession": "DRP002616", - "submission_accession": "DRA002949", - "run_alias": "DRR028935", - "experiment_alias": "DRX026011", - "sample_alias": "SAMD00024405", - "study_alias": "DRP002616", - "library_layout": "PAIRED", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "day0_BbSQE-I", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "194930", - "read_count": "965", - "tax_id": "1202541", - "scientific_name": "Botryococcus braunii Showa", - "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", - "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", - "sample_description": "Liquid culture", - "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", - "fastq_bytes": "60275;61610", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "md5_1": "cc01df82a9354bb6b3be93483b20c35a", - "md5_2": "941c9998d746416dad53c94c480ddf30", - "single_end": false - }, - [ - "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", - "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" - ] - ], - [ - { - "id": "ERX1234253_ERR1160846", - "run_accession": "ERR1160846", - "experiment_accession": "ERX1234253", - "sample_accession": "SAMEA3687214", - "secondary_sample_accession": "ERS994363", - "study_accession": "PRJEB11419", - "secondary_study_accession": "ERP012803", - "submission_accession": "ERA541392", - "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", - "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", - "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", - "study_alias": "qiita_sid_10317", - "library_layout": "SINGLE", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "library_name": "10317.BLANK.93.3E.r22", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "35658", - "read_count": "283", - "tax_id": "256318", - "scientific_name": "metagenome", - "sample_title": "10317.BLANK.93.3E.r22", - "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", - "study_title": "American Gut Project", - "sample_description": "American Gut control", - "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", - "fastq_bytes": "18077", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_2": "", - "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", - "md5_2": "", - "single_end": true - }, - "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" - ], - [ - { - "id": "SRX10940790_SRR14593545", - "run_accession": "SRR14593545", - "experiment_accession": "SRX10940790", - "sample_accession": "SAMN19097423", - "secondary_sample_accession": "SRS9020442", - "study_accession": "PRJNA728650", - "secondary_study_accession": "SRP319413", - "submission_accession": "SRA1234280", - "run_alias": "577-6_530058_19-037147 Goat_F.ab1", - "experiment_alias": "PRNP_2765", - "sample_alias": "prp_2765", - "study_alias": "PRJNA728650", - "library_layout": "PAIRED", - "library_selection": "PCR", - "library_source": "GENOMIC", - "library_strategy": "AMPLICON", - "library_name": "PRNP_2765", - "instrument_model": "AB 3500xL Genetic Analyzer", - "instrument_platform": "CAPILLARY", - "base_count": "828", - "read_count": "1", - "tax_id": "9925", - "scientific_name": "Capra hircus", - "sample_title": "MIGS Eukaryotic sample from Capra hircus", - "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", - "study_title": "Capra hircus Raw sequence reads", - "sample_description": "Keywords: GSC:MIxS MIGS:5.0", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": false - }, - [ - "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", - "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" - ] - ], - [ - { - "id": "SRX11047067_SRR14709033", - "run_accession": "SRR14709033", - "experiment_accession": "SRX11047067", - "sample_accession": "SAMN19373034", - "secondary_sample_accession": "SRS9115923", - "study_accession": "PRJNA733285", - "secondary_study_accession": "SRP322267", - "submission_accession": "SRA1239521", - "run_alias": "Sebastes_levis-2.fastq", - "experiment_alias": "Sebastes_macdonaldi-1", - "sample_alias": "S._macdonaldi-1", - "study_alias": "PRJNA733285", - "library_layout": "SINGLE", - "library_selection": "PCR", - "library_source": "GENOMIC", - "library_strategy": "AMPLICON", - "library_name": "Sebastes_macdonaldi-1", - "instrument_model": "AB 5500 Genetic Analyzer", - "instrument_platform": "ABI_SOLID", - "base_count": "153", - "read_count": "1", - "tax_id": "394693", - "scientific_name": "Sebastes macdonaldi", - "sample_title": "Sebastes_macdonaldi-1", - "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", - "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", - "sample_description": "Sebastes_macdonaldi-1", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": true - }, - "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" - ], - [ - { - "id": "SRX17709227_SRR21711856", - "run_accession": "SRR21711856", - "experiment_accession": "SRX17709227", - "sample_accession": "SAMN31021823", - "secondary_sample_accession": "SRS15239723", - "study_accession": "PRJNA884373", - "secondary_study_accession": "SRP399678", - "submission_accession": "SRA1507236", - "run_alias": "GSM6601460_r1", - "experiment_alias": "GSM6601460_r1", - "sample_alias": "GSM6601460", - "study_alias": "GSE214215", - "library_layout": "SINGLE", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "GSM6601460", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "base_count": "573417800", - "read_count": "11468356", - "tax_id": "6239", - "scientific_name": "Caenorhabditis elegans", - "sample_title": "sham-treated worms in day 5", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "sample_description": "sham-treated worms in day 5", - "fastq_md5": "7cd1402155befc87be338132d1f31f64", - "fastq_bytes": "447377777", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_2": "", - "md5_1": "7cd1402155befc87be338132d1f31f64", - "md5_2": "", - "single_end": true - }, - "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" - ], - [ - { - "id": "SRX17709228_SRR21711855", - "run_accession": "SRR21711855", - "experiment_accession": "SRX17709228", - "sample_accession": "SAMN31021822", - "secondary_sample_accession": "SRS15239724", - "study_accession": "PRJNA884373", - "secondary_study_accession": "SRP399678", - "submission_accession": "SRA1507236", - "run_alias": "GSM6601461_r1", - "experiment_alias": "GSM6601461_r1", - "sample_alias": "GSM6601461", - "study_alias": "GSE214215", - "library_layout": "SINGLE", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "GSM6601461", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "base_count": "677912850", - "read_count": "13558257", - "tax_id": "6239", - "scientific_name": "Caenorhabditis elegans", - "sample_title": "PM2.5-treated worms in day 5", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "sample_description": "PM2.5-treated worms in day 5", - "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", - "fastq_bytes": "529798447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_2": "", - "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", - "md5_2": "", - "single_end": true - }, - "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" - ], - [ - { - "id": "SRX6725035_SRR9984183", - "run_accession": "SRR9984183", - "experiment_accession": "SRX6725035", - "sample_accession": "SAMN12581720", - "secondary_sample_accession": "SRS5277011", - "study_accession": "PRJNA560329", - "secondary_study_accession": "SRP218535", - "submission_accession": "SRA942061", - "run_alias": "Emb289P1_bin131.fastq", - "experiment_alias": "Emb289P1_bin131", - "sample_alias": "Emb289P1_bin131", - "study_alias": "PRJNA560329", - "library_layout": "SINGLE", - "library_selection": "RANDOM", - "library_source": "METAGENOMIC", - "library_strategy": "WGS", - "library_name": "Emb289P1_bin131", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "1996273", - "read_count": "58", - "tax_id": "2660712", - "scientific_name": "Defluviitaleaceae bacterium", - "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", - "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", - "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", - "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", - "fastq_md5": "0b512d2dc31685983456bd56fd836544", - "fastq_bytes": "605358", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_2": "", - "md5_1": "0b512d2dc31685983456bd56fd836544", - "md5_2": "", - "single_end": true - }, - "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" - ], - [ - { - "id": "SRX9315476_SRR12848126", - "run_accession": "SRR12848126", - "experiment_accession": "SRX9315476", - "sample_accession": "SAMN16455283", - "secondary_sample_accession": "SRS7540262", - "study_accession": "PRJNA670070", - "secondary_study_accession": "SRP287769", - "submission_accession": "SRA1145417", - "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", - "experiment_alias": "F11-N1-05", - "sample_alias": "F11-N1-05", - "study_alias": "PRJNA670070", - "library_layout": "PAIRED", - "library_selection": "RANDOM PCR", - "library_source": "GENOMIC", - "library_strategy": "Synthetic-Long-Read", - "library_name": "F11-N1-05", - "instrument_model": "Illumina HiSeq 3000", - "instrument_platform": "ILLUMINA", - "base_count": "431758", - "read_count": "2954", - "tax_id": "10092", - "scientific_name": "Mus musculus domesticus", - "sample_title": "Longshanks_F11-N1-05", - "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "sample_description": "F11-N1-05", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": false - }, - [ - "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", - "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" - ] - ], - [ - { - "id": "SRX9504942_SRR13055517", - "run_accession": "SRR13055517", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r1", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2246028", - "read_count": "29553", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", - "fastq_bytes": "721167;723753", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", - "md5_2": "18dbe96e7f58b63406d9058938df1962", - "single_end": false - }, - [ - "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", - "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" - ] - ], - [ - { - "id": "SRX9504942_SRR13055518", - "run_accession": "SRR13055518", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r2", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2235236", - "read_count": "29411", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", - "fastq_bytes": "717693;723429", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "md5_1": "5ec894d863fcefe394470a0925aefde4", - "md5_2": "aead170df9851773d5202b5760c76d76", - "single_end": false - }, - [ - "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", - "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" - ] - ], - [ - { - "id": "SRX9504942_SRR13055519", - "run_accession": "SRR13055519", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r3", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2232728", - "read_count": "29378", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", - "fastq_bytes": "714907;721705", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", - "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", - "single_end": false - }, - [ - "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", - "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" - ] - ], - [ - { - "id": "SRX9504942_SRR13055520", - "run_accession": "SRR13055520", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r4", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2214488", - "read_count": "29138", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", - "fastq_bytes": "709867;716862", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "md5_1": "795d460abff6009c7f5ff7c14b773fbe", - "md5_2": "c3f34379356b28d6dac7212abc1a0a04", - "single_end": false - }, - [ - "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", - "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" - ] - ], - [ - { - "id": "SRX9626017_SRR13191702", - "run_accession": "SRR13191702", - "experiment_accession": "SRX9626017", - "sample_accession": "SAMN16980141", - "secondary_sample_accession": "SRS7827211", - "study_accession": "PRJNA682076", - "secondary_study_accession": "SRP295653", - "submission_accession": "SRA1166126", - "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", - "experiment_alias": "S.170804.00784", - "sample_alias": "S.170804.00784_662", - "study_alias": "PRJNA682076", - "library_layout": "PAIRED", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "library_name": "S.170804.00784", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "45682", - "read_count": "91", - "tax_id": "408170", - "scientific_name": "human gut metagenome", - "sample_title": "Metagenome or environmental sample from human gut metagenome", - "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "sample_description": "Metagenome or environmental sample from human gut metagenome", - "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", - "fastq_bytes": "15420;16324", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "md5_1": "89c5be920021a035084d8aeb74f32df7", - "md5_2": "56271be38a80db78ef3bdfc5d9909b98", - "single_end": false - }, - [ - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" - ] - ] + ], "1": [ "samplesheet.csv:md5,69117245b73776d6e4daecdbfdff9767" @@ -631,618 +20,7 @@ "versions.yml:md5,e977678bd13a54fc9c31addf135be15e" ], "fastq": [ - [ - { - "id": "DRX024467_DRR026872", - "run_accession": "DRR026872", - "experiment_accession": "DRX024467", - "sample_accession": "SAMD00023098", - "secondary_sample_accession": "DRS033740", - "study_accession": "PRJDB4356", - "secondary_study_accession": "DRP003256", - "submission_accession": "DRA002758", - "run_alias": "DRR026872", - "experiment_alias": "DRX024467", - "sample_alias": "SAMD00023098", - "study_alias": "DRP003256", - "library_layout": "SINGLE", - "library_selection": "Restriction Digest", - "library_source": "GENOMIC", - "library_strategy": "OTHER", - "library_name": "IpeRAD1_3", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "62550", - "read_count": "417", - "tax_id": "35883", - "scientific_name": "Ipomoea nil", - "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", - "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", - "study_title": "The Japanese morning glory genome sequence", - "sample_description": "Keywords: GSC:MIxS MIGS:6.0", - "fastq_md5": "515e5448c55e054113c4a22df5f62791", - "fastq_bytes": "38447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_2": "", - "md5_1": "515e5448c55e054113c4a22df5f62791", - "md5_2": "", - "single_end": true - }, - "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" - ], - [ - { - "id": "DRX026011_DRR028935", - "run_accession": "DRR028935", - "experiment_accession": "DRX026011", - "sample_accession": "SAMD00024405", - "secondary_sample_accession": "DRS019431", - "study_accession": "PRJDB3420", - "secondary_study_accession": "DRP002616", - "submission_accession": "DRA002949", - "run_alias": "DRR028935", - "experiment_alias": "DRX026011", - "sample_alias": "SAMD00024405", - "study_alias": "DRP002616", - "library_layout": "PAIRED", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "day0_BbSQE-I", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "194930", - "read_count": "965", - "tax_id": "1202541", - "scientific_name": "Botryococcus braunii Showa", - "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", - "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", - "sample_description": "Liquid culture", - "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", - "fastq_bytes": "60275;61610", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "md5_1": "cc01df82a9354bb6b3be93483b20c35a", - "md5_2": "941c9998d746416dad53c94c480ddf30", - "single_end": false - }, - [ - "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", - "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" - ] - ], - [ - { - "id": "ERX1234253_ERR1160846", - "run_accession": "ERR1160846", - "experiment_accession": "ERX1234253", - "sample_accession": "SAMEA3687214", - "secondary_sample_accession": "ERS994363", - "study_accession": "PRJEB11419", - "secondary_study_accession": "ERP012803", - "submission_accession": "ERA541392", - "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", - "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", - "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", - "study_alias": "qiita_sid_10317", - "library_layout": "SINGLE", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "library_name": "10317.BLANK.93.3E.r22", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "35658", - "read_count": "283", - "tax_id": "256318", - "scientific_name": "metagenome", - "sample_title": "10317.BLANK.93.3E.r22", - "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", - "study_title": "American Gut Project", - "sample_description": "American Gut control", - "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", - "fastq_bytes": "18077", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_2": "", - "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", - "md5_2": "", - "single_end": true - }, - "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" - ], - [ - { - "id": "SRX10940790_SRR14593545", - "run_accession": "SRR14593545", - "experiment_accession": "SRX10940790", - "sample_accession": "SAMN19097423", - "secondary_sample_accession": "SRS9020442", - "study_accession": "PRJNA728650", - "secondary_study_accession": "SRP319413", - "submission_accession": "SRA1234280", - "run_alias": "577-6_530058_19-037147 Goat_F.ab1", - "experiment_alias": "PRNP_2765", - "sample_alias": "prp_2765", - "study_alias": "PRJNA728650", - "library_layout": "PAIRED", - "library_selection": "PCR", - "library_source": "GENOMIC", - "library_strategy": "AMPLICON", - "library_name": "PRNP_2765", - "instrument_model": "AB 3500xL Genetic Analyzer", - "instrument_platform": "CAPILLARY", - "base_count": "828", - "read_count": "1", - "tax_id": "9925", - "scientific_name": "Capra hircus", - "sample_title": "MIGS Eukaryotic sample from Capra hircus", - "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", - "study_title": "Capra hircus Raw sequence reads", - "sample_description": "Keywords: GSC:MIxS MIGS:5.0", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": false - }, - [ - "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", - "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" - ] - ], - [ - { - "id": "SRX11047067_SRR14709033", - "run_accession": "SRR14709033", - "experiment_accession": "SRX11047067", - "sample_accession": "SAMN19373034", - "secondary_sample_accession": "SRS9115923", - "study_accession": "PRJNA733285", - "secondary_study_accession": "SRP322267", - "submission_accession": "SRA1239521", - "run_alias": "Sebastes_levis-2.fastq", - "experiment_alias": "Sebastes_macdonaldi-1", - "sample_alias": "S._macdonaldi-1", - "study_alias": "PRJNA733285", - "library_layout": "SINGLE", - "library_selection": "PCR", - "library_source": "GENOMIC", - "library_strategy": "AMPLICON", - "library_name": "Sebastes_macdonaldi-1", - "instrument_model": "AB 5500 Genetic Analyzer", - "instrument_platform": "ABI_SOLID", - "base_count": "153", - "read_count": "1", - "tax_id": "394693", - "scientific_name": "Sebastes macdonaldi", - "sample_title": "Sebastes_macdonaldi-1", - "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", - "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", - "sample_description": "Sebastes_macdonaldi-1", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": true - }, - "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" - ], - [ - { - "id": "SRX17709227_SRR21711856", - "run_accession": "SRR21711856", - "experiment_accession": "SRX17709227", - "sample_accession": "SAMN31021823", - "secondary_sample_accession": "SRS15239723", - "study_accession": "PRJNA884373", - "secondary_study_accession": "SRP399678", - "submission_accession": "SRA1507236", - "run_alias": "GSM6601460_r1", - "experiment_alias": "GSM6601460_r1", - "sample_alias": "GSM6601460", - "study_alias": "GSE214215", - "library_layout": "SINGLE", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "GSM6601460", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "base_count": "573417800", - "read_count": "11468356", - "tax_id": "6239", - "scientific_name": "Caenorhabditis elegans", - "sample_title": "sham-treated worms in day 5", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "sample_description": "sham-treated worms in day 5", - "fastq_md5": "7cd1402155befc87be338132d1f31f64", - "fastq_bytes": "447377777", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_2": "", - "md5_1": "7cd1402155befc87be338132d1f31f64", - "md5_2": "", - "single_end": true - }, - "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" - ], - [ - { - "id": "SRX17709228_SRR21711855", - "run_accession": "SRR21711855", - "experiment_accession": "SRX17709228", - "sample_accession": "SAMN31021822", - "secondary_sample_accession": "SRS15239724", - "study_accession": "PRJNA884373", - "secondary_study_accession": "SRP399678", - "submission_accession": "SRA1507236", - "run_alias": "GSM6601461_r1", - "experiment_alias": "GSM6601461_r1", - "sample_alias": "GSM6601461", - "study_alias": "GSE214215", - "library_layout": "SINGLE", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "GSM6601461", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "base_count": "677912850", - "read_count": "13558257", - "tax_id": "6239", - "scientific_name": "Caenorhabditis elegans", - "sample_title": "PM2.5-treated worms in day 5", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "sample_description": "PM2.5-treated worms in day 5", - "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", - "fastq_bytes": "529798447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_2": "", - "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", - "md5_2": "", - "single_end": true - }, - "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" - ], - [ - { - "id": "SRX6725035_SRR9984183", - "run_accession": "SRR9984183", - "experiment_accession": "SRX6725035", - "sample_accession": "SAMN12581720", - "secondary_sample_accession": "SRS5277011", - "study_accession": "PRJNA560329", - "secondary_study_accession": "SRP218535", - "submission_accession": "SRA942061", - "run_alias": "Emb289P1_bin131.fastq", - "experiment_alias": "Emb289P1_bin131", - "sample_alias": "Emb289P1_bin131", - "study_alias": "PRJNA560329", - "library_layout": "SINGLE", - "library_selection": "RANDOM", - "library_source": "METAGENOMIC", - "library_strategy": "WGS", - "library_name": "Emb289P1_bin131", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "1996273", - "read_count": "58", - "tax_id": "2660712", - "scientific_name": "Defluviitaleaceae bacterium", - "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", - "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", - "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", - "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", - "fastq_md5": "0b512d2dc31685983456bd56fd836544", - "fastq_bytes": "605358", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_2": "", - "md5_1": "0b512d2dc31685983456bd56fd836544", - "md5_2": "", - "single_end": true - }, - "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" - ], - [ - { - "id": "SRX9315476_SRR12848126", - "run_accession": "SRR12848126", - "experiment_accession": "SRX9315476", - "sample_accession": "SAMN16455283", - "secondary_sample_accession": "SRS7540262", - "study_accession": "PRJNA670070", - "secondary_study_accession": "SRP287769", - "submission_accession": "SRA1145417", - "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", - "experiment_alias": "F11-N1-05", - "sample_alias": "F11-N1-05", - "study_alias": "PRJNA670070", - "library_layout": "PAIRED", - "library_selection": "RANDOM PCR", - "library_source": "GENOMIC", - "library_strategy": "Synthetic-Long-Read", - "library_name": "F11-N1-05", - "instrument_model": "Illumina HiSeq 3000", - "instrument_platform": "ILLUMINA", - "base_count": "431758", - "read_count": "2954", - "tax_id": "10092", - "scientific_name": "Mus musculus domesticus", - "sample_title": "Longshanks_F11-N1-05", - "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "sample_description": "F11-N1-05", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": false - }, - [ - "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", - "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" - ] - ], - [ - { - "id": "SRX9504942_SRR13055517", - "run_accession": "SRR13055517", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r1", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2246028", - "read_count": "29553", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", - "fastq_bytes": "721167;723753", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", - "md5_2": "18dbe96e7f58b63406d9058938df1962", - "single_end": false - }, - [ - "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", - "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" - ] - ], - [ - { - "id": "SRX9504942_SRR13055518", - "run_accession": "SRR13055518", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r2", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2235236", - "read_count": "29411", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", - "fastq_bytes": "717693;723429", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "md5_1": "5ec894d863fcefe394470a0925aefde4", - "md5_2": "aead170df9851773d5202b5760c76d76", - "single_end": false - }, - [ - "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", - "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" - ] - ], - [ - { - "id": "SRX9504942_SRR13055519", - "run_accession": "SRR13055519", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r3", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2232728", - "read_count": "29378", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", - "fastq_bytes": "714907;721705", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", - "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", - "single_end": false - }, - [ - "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", - "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" - ] - ], - [ - { - "id": "SRX9504942_SRR13055520", - "run_accession": "SRR13055520", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r4", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2214488", - "read_count": "29138", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", - "fastq_bytes": "709867;716862", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "md5_1": "795d460abff6009c7f5ff7c14b773fbe", - "md5_2": "c3f34379356b28d6dac7212abc1a0a04", - "single_end": false - }, - [ - "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", - "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" - ] - ], - [ - { - "id": "SRX9626017_SRR13191702", - "run_accession": "SRR13191702", - "experiment_accession": "SRX9626017", - "sample_accession": "SAMN16980141", - "secondary_sample_accession": "SRS7827211", - "study_accession": "PRJNA682076", - "secondary_study_accession": "SRP295653", - "submission_accession": "SRA1166126", - "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", - "experiment_alias": "S.170804.00784", - "sample_alias": "S.170804.00784_662", - "study_alias": "PRJNA682076", - "library_layout": "PAIRED", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "library_name": "S.170804.00784", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "45682", - "read_count": "91", - "tax_id": "408170", - "scientific_name": "human gut metagenome", - "sample_title": "Metagenome or environmental sample from human gut metagenome", - "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "sample_description": "Metagenome or environmental sample from human gut metagenome", - "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", - "fastq_bytes": "15420;16324", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "md5_1": "89c5be920021a035084d8aeb74f32df7", - "md5_2": "56271be38a80db78ef3bdfc5d9909b98", - "single_end": false - }, - [ - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" - ] - ] + ], "mappings": [ "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" @@ -1260,6 +38,6 @@ ] } ], - "timestamp": "2023-09-25T11:02:54.001279" + "timestamp": "2023-09-25T12:03:02.485911" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap index 4d57827d..ff4b27df 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap @@ -3,618 +3,7 @@ "content": [ { "0": [ - [ - { - "id": "DRX024467_DRR026872", - "run_accession": "DRR026872", - "experiment_accession": "DRX024467", - "sample_accession": "SAMD00023098", - "secondary_sample_accession": "DRS033740", - "study_accession": "PRJDB4356", - "secondary_study_accession": "DRP003256", - "submission_accession": "DRA002758", - "run_alias": "DRR026872", - "experiment_alias": "DRX024467", - "sample_alias": "SAMD00023098", - "study_alias": "DRP003256", - "library_layout": "SINGLE", - "library_selection": "Restriction Digest", - "library_source": "GENOMIC", - "library_strategy": "OTHER", - "library_name": "IpeRAD1_3", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "62550", - "read_count": "417", - "tax_id": "35883", - "scientific_name": "Ipomoea nil", - "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", - "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", - "study_title": "The Japanese morning glory genome sequence", - "sample_description": "Keywords: GSC:MIxS MIGS:6.0", - "fastq_md5": "515e5448c55e054113c4a22df5f62791", - "fastq_bytes": "38447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_2": "", - "md5_1": "515e5448c55e054113c4a22df5f62791", - "md5_2": "", - "single_end": true - }, - "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" - ], - [ - { - "id": "DRX026011_DRR028935", - "run_accession": "DRR028935", - "experiment_accession": "DRX026011", - "sample_accession": "SAMD00024405", - "secondary_sample_accession": "DRS019431", - "study_accession": "PRJDB3420", - "secondary_study_accession": "DRP002616", - "submission_accession": "DRA002949", - "run_alias": "DRR028935", - "experiment_alias": "DRX026011", - "sample_alias": "SAMD00024405", - "study_alias": "DRP002616", - "library_layout": "PAIRED", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "day0_BbSQE-I", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "194930", - "read_count": "965", - "tax_id": "1202541", - "scientific_name": "Botryococcus braunii Showa", - "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", - "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", - "sample_description": "Liquid culture", - "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", - "fastq_bytes": "60275;61610", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "md5_1": "cc01df82a9354bb6b3be93483b20c35a", - "md5_2": "941c9998d746416dad53c94c480ddf30", - "single_end": false - }, - [ - "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", - "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" - ] - ], - [ - { - "id": "ERX1234253_ERR1160846", - "run_accession": "ERR1160846", - "experiment_accession": "ERX1234253", - "sample_accession": "SAMEA3687214", - "secondary_sample_accession": "ERS994363", - "study_accession": "PRJEB11419", - "secondary_study_accession": "ERP012803", - "submission_accession": "ERA541392", - "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", - "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", - "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", - "study_alias": "qiita_sid_10317", - "library_layout": "SINGLE", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "library_name": "10317.BLANK.93.3E.r22", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "35658", - "read_count": "283", - "tax_id": "256318", - "scientific_name": "metagenome", - "sample_title": "10317.BLANK.93.3E.r22", - "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", - "study_title": "American Gut Project", - "sample_description": "American Gut control", - "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", - "fastq_bytes": "18077", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_2": "", - "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", - "md5_2": "", - "single_end": true - }, - "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" - ], - [ - { - "id": "SRX10940790_SRR14593545", - "run_accession": "SRR14593545", - "experiment_accession": "SRX10940790", - "sample_accession": "SAMN19097423", - "secondary_sample_accession": "SRS9020442", - "study_accession": "PRJNA728650", - "secondary_study_accession": "SRP319413", - "submission_accession": "SRA1234280", - "run_alias": "577-6_530058_19-037147 Goat_F.ab1", - "experiment_alias": "PRNP_2765", - "sample_alias": "prp_2765", - "study_alias": "PRJNA728650", - "library_layout": "PAIRED", - "library_selection": "PCR", - "library_source": "GENOMIC", - "library_strategy": "AMPLICON", - "library_name": "PRNP_2765", - "instrument_model": "AB 3500xL Genetic Analyzer", - "instrument_platform": "CAPILLARY", - "base_count": "828", - "read_count": "1", - "tax_id": "9925", - "scientific_name": "Capra hircus", - "sample_title": "MIGS Eukaryotic sample from Capra hircus", - "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", - "study_title": "Capra hircus Raw sequence reads", - "sample_description": "Keywords: GSC:MIxS MIGS:5.0", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": false - }, - [ - "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", - "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" - ] - ], - [ - { - "id": "SRX11047067_SRR14709033", - "run_accession": "SRR14709033", - "experiment_accession": "SRX11047067", - "sample_accession": "SAMN19373034", - "secondary_sample_accession": "SRS9115923", - "study_accession": "PRJNA733285", - "secondary_study_accession": "SRP322267", - "submission_accession": "SRA1239521", - "run_alias": "Sebastes_levis-2.fastq", - "experiment_alias": "Sebastes_macdonaldi-1", - "sample_alias": "S._macdonaldi-1", - "study_alias": "PRJNA733285", - "library_layout": "SINGLE", - "library_selection": "PCR", - "library_source": "GENOMIC", - "library_strategy": "AMPLICON", - "library_name": "Sebastes_macdonaldi-1", - "instrument_model": "AB 5500 Genetic Analyzer", - "instrument_platform": "ABI_SOLID", - "base_count": "153", - "read_count": "1", - "tax_id": "394693", - "scientific_name": "Sebastes macdonaldi", - "sample_title": "Sebastes_macdonaldi-1", - "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", - "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", - "sample_description": "Sebastes_macdonaldi-1", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": true - }, - "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" - ], - [ - { - "id": "SRX17709227_SRR21711856", - "run_accession": "SRR21711856", - "experiment_accession": "SRX17709227", - "sample_accession": "SAMN31021823", - "secondary_sample_accession": "SRS15239723", - "study_accession": "PRJNA884373", - "secondary_study_accession": "SRP399678", - "submission_accession": "SRA1507236", - "run_alias": "GSM6601460_r1", - "experiment_alias": "GSM6601460_r1", - "sample_alias": "GSM6601460", - "study_alias": "GSE214215", - "library_layout": "SINGLE", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "GSM6601460", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "base_count": "573417800", - "read_count": "11468356", - "tax_id": "6239", - "scientific_name": "Caenorhabditis elegans", - "sample_title": "sham-treated worms in day 5", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "sample_description": "sham-treated worms in day 5", - "fastq_md5": "7cd1402155befc87be338132d1f31f64", - "fastq_bytes": "447377777", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_2": "", - "md5_1": "7cd1402155befc87be338132d1f31f64", - "md5_2": "", - "single_end": true - }, - "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" - ], - [ - { - "id": "SRX17709228_SRR21711855", - "run_accession": "SRR21711855", - "experiment_accession": "SRX17709228", - "sample_accession": "SAMN31021822", - "secondary_sample_accession": "SRS15239724", - "study_accession": "PRJNA884373", - "secondary_study_accession": "SRP399678", - "submission_accession": "SRA1507236", - "run_alias": "GSM6601461_r1", - "experiment_alias": "GSM6601461_r1", - "sample_alias": "GSM6601461", - "study_alias": "GSE214215", - "library_layout": "SINGLE", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "GSM6601461", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "base_count": "677912850", - "read_count": "13558257", - "tax_id": "6239", - "scientific_name": "Caenorhabditis elegans", - "sample_title": "PM2.5-treated worms in day 5", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "sample_description": "PM2.5-treated worms in day 5", - "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", - "fastq_bytes": "529798447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_2": "", - "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", - "md5_2": "", - "single_end": true - }, - "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" - ], - [ - { - "id": "SRX6725035_SRR9984183", - "run_accession": "SRR9984183", - "experiment_accession": "SRX6725035", - "sample_accession": "SAMN12581720", - "secondary_sample_accession": "SRS5277011", - "study_accession": "PRJNA560329", - "secondary_study_accession": "SRP218535", - "submission_accession": "SRA942061", - "run_alias": "Emb289P1_bin131.fastq", - "experiment_alias": "Emb289P1_bin131", - "sample_alias": "Emb289P1_bin131", - "study_alias": "PRJNA560329", - "library_layout": "SINGLE", - "library_selection": "RANDOM", - "library_source": "METAGENOMIC", - "library_strategy": "WGS", - "library_name": "Emb289P1_bin131", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "1996273", - "read_count": "58", - "tax_id": "2660712", - "scientific_name": "Defluviitaleaceae bacterium", - "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", - "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", - "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", - "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", - "fastq_md5": "0b512d2dc31685983456bd56fd836544", - "fastq_bytes": "605358", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_2": "", - "md5_1": "0b512d2dc31685983456bd56fd836544", - "md5_2": "", - "single_end": true - }, - "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" - ], - [ - { - "id": "SRX9315476_SRR12848126", - "run_accession": "SRR12848126", - "experiment_accession": "SRX9315476", - "sample_accession": "SAMN16455283", - "secondary_sample_accession": "SRS7540262", - "study_accession": "PRJNA670070", - "secondary_study_accession": "SRP287769", - "submission_accession": "SRA1145417", - "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", - "experiment_alias": "F11-N1-05", - "sample_alias": "F11-N1-05", - "study_alias": "PRJNA670070", - "library_layout": "PAIRED", - "library_selection": "RANDOM PCR", - "library_source": "GENOMIC", - "library_strategy": "Synthetic-Long-Read", - "library_name": "F11-N1-05", - "instrument_model": "Illumina HiSeq 3000", - "instrument_platform": "ILLUMINA", - "base_count": "431758", - "read_count": "2954", - "tax_id": "10092", - "scientific_name": "Mus musculus domesticus", - "sample_title": "Longshanks_F11-N1-05", - "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "sample_description": "F11-N1-05", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": false - }, - [ - "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", - "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" - ] - ], - [ - { - "id": "SRX9504942_SRR13055517", - "run_accession": "SRR13055517", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r1", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2246028", - "read_count": "29553", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", - "fastq_bytes": "721167;723753", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", - "md5_2": "18dbe96e7f58b63406d9058938df1962", - "single_end": false - }, - [ - "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", - "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" - ] - ], - [ - { - "id": "SRX9504942_SRR13055518", - "run_accession": "SRR13055518", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r2", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2235236", - "read_count": "29411", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", - "fastq_bytes": "717693;723429", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "md5_1": "5ec894d863fcefe394470a0925aefde4", - "md5_2": "aead170df9851773d5202b5760c76d76", - "single_end": false - }, - [ - "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", - "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" - ] - ], - [ - { - "id": "SRX9504942_SRR13055519", - "run_accession": "SRR13055519", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r3", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2232728", - "read_count": "29378", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", - "fastq_bytes": "714907;721705", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", - "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", - "single_end": false - }, - [ - "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", - "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" - ] - ], - [ - { - "id": "SRX9504942_SRR13055520", - "run_accession": "SRR13055520", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r4", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2214488", - "read_count": "29138", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", - "fastq_bytes": "709867;716862", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "md5_1": "795d460abff6009c7f5ff7c14b773fbe", - "md5_2": "c3f34379356b28d6dac7212abc1a0a04", - "single_end": false - }, - [ - "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", - "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" - ] - ], - [ - { - "id": "SRX9626017_SRR13191702", - "run_accession": "SRR13191702", - "experiment_accession": "SRX9626017", - "sample_accession": "SAMN16980141", - "secondary_sample_accession": "SRS7827211", - "study_accession": "PRJNA682076", - "secondary_study_accession": "SRP295653", - "submission_accession": "SRA1166126", - "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", - "experiment_alias": "S.170804.00784", - "sample_alias": "S.170804.00784_662", - "study_alias": "PRJNA682076", - "library_layout": "PAIRED", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "library_name": "S.170804.00784", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "45682", - "read_count": "91", - "tax_id": "408170", - "scientific_name": "human gut metagenome", - "sample_title": "Metagenome or environmental sample from human gut metagenome", - "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "sample_description": "Metagenome or environmental sample from human gut metagenome", - "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", - "fastq_bytes": "15420;16324", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "md5_1": "89c5be920021a035084d8aeb74f32df7", - "md5_2": "56271be38a80db78ef3bdfc5d9909b98", - "single_end": false - }, - [ - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" - ] - ] + ], "1": [ "samplesheet.csv:md5,0705e78609390cc464c2fb10051178bc" @@ -631,618 +20,7 @@ "versions.yml:md5,e977678bd13a54fc9c31addf135be15e" ], "fastq": [ - [ - { - "id": "DRX024467_DRR026872", - "run_accession": "DRR026872", - "experiment_accession": "DRX024467", - "sample_accession": "SAMD00023098", - "secondary_sample_accession": "DRS033740", - "study_accession": "PRJDB4356", - "secondary_study_accession": "DRP003256", - "submission_accession": "DRA002758", - "run_alias": "DRR026872", - "experiment_alias": "DRX024467", - "sample_alias": "SAMD00023098", - "study_alias": "DRP003256", - "library_layout": "SINGLE", - "library_selection": "Restriction Digest", - "library_source": "GENOMIC", - "library_strategy": "OTHER", - "library_name": "IpeRAD1_3", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "62550", - "read_count": "417", - "tax_id": "35883", - "scientific_name": "Ipomoea nil", - "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", - "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", - "study_title": "The Japanese morning glory genome sequence", - "sample_description": "Keywords: GSC:MIxS MIGS:6.0", - "fastq_md5": "515e5448c55e054113c4a22df5f62791", - "fastq_bytes": "38447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_2": "", - "md5_1": "515e5448c55e054113c4a22df5f62791", - "md5_2": "", - "single_end": true - }, - "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" - ], - [ - { - "id": "DRX026011_DRR028935", - "run_accession": "DRR028935", - "experiment_accession": "DRX026011", - "sample_accession": "SAMD00024405", - "secondary_sample_accession": "DRS019431", - "study_accession": "PRJDB3420", - "secondary_study_accession": "DRP002616", - "submission_accession": "DRA002949", - "run_alias": "DRR028935", - "experiment_alias": "DRX026011", - "sample_alias": "SAMD00024405", - "study_alias": "DRP002616", - "library_layout": "PAIRED", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "day0_BbSQE-I", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "194930", - "read_count": "965", - "tax_id": "1202541", - "scientific_name": "Botryococcus braunii Showa", - "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", - "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", - "sample_description": "Liquid culture", - "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", - "fastq_bytes": "60275;61610", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "md5_1": "cc01df82a9354bb6b3be93483b20c35a", - "md5_2": "941c9998d746416dad53c94c480ddf30", - "single_end": false - }, - [ - "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", - "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" - ] - ], - [ - { - "id": "ERX1234253_ERR1160846", - "run_accession": "ERR1160846", - "experiment_accession": "ERX1234253", - "sample_accession": "SAMEA3687214", - "secondary_sample_accession": "ERS994363", - "study_accession": "PRJEB11419", - "secondary_study_accession": "ERP012803", - "submission_accession": "ERA541392", - "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", - "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", - "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", - "study_alias": "qiita_sid_10317", - "library_layout": "SINGLE", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "library_name": "10317.BLANK.93.3E.r22", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "35658", - "read_count": "283", - "tax_id": "256318", - "scientific_name": "metagenome", - "sample_title": "10317.BLANK.93.3E.r22", - "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", - "study_title": "American Gut Project", - "sample_description": "American Gut control", - "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", - "fastq_bytes": "18077", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_2": "", - "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", - "md5_2": "", - "single_end": true - }, - "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" - ], - [ - { - "id": "SRX10940790_SRR14593545", - "run_accession": "SRR14593545", - "experiment_accession": "SRX10940790", - "sample_accession": "SAMN19097423", - "secondary_sample_accession": "SRS9020442", - "study_accession": "PRJNA728650", - "secondary_study_accession": "SRP319413", - "submission_accession": "SRA1234280", - "run_alias": "577-6_530058_19-037147 Goat_F.ab1", - "experiment_alias": "PRNP_2765", - "sample_alias": "prp_2765", - "study_alias": "PRJNA728650", - "library_layout": "PAIRED", - "library_selection": "PCR", - "library_source": "GENOMIC", - "library_strategy": "AMPLICON", - "library_name": "PRNP_2765", - "instrument_model": "AB 3500xL Genetic Analyzer", - "instrument_platform": "CAPILLARY", - "base_count": "828", - "read_count": "1", - "tax_id": "9925", - "scientific_name": "Capra hircus", - "sample_title": "MIGS Eukaryotic sample from Capra hircus", - "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", - "study_title": "Capra hircus Raw sequence reads", - "sample_description": "Keywords: GSC:MIxS MIGS:5.0", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": false - }, - [ - "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", - "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" - ] - ], - [ - { - "id": "SRX11047067_SRR14709033", - "run_accession": "SRR14709033", - "experiment_accession": "SRX11047067", - "sample_accession": "SAMN19373034", - "secondary_sample_accession": "SRS9115923", - "study_accession": "PRJNA733285", - "secondary_study_accession": "SRP322267", - "submission_accession": "SRA1239521", - "run_alias": "Sebastes_levis-2.fastq", - "experiment_alias": "Sebastes_macdonaldi-1", - "sample_alias": "S._macdonaldi-1", - "study_alias": "PRJNA733285", - "library_layout": "SINGLE", - "library_selection": "PCR", - "library_source": "GENOMIC", - "library_strategy": "AMPLICON", - "library_name": "Sebastes_macdonaldi-1", - "instrument_model": "AB 5500 Genetic Analyzer", - "instrument_platform": "ABI_SOLID", - "base_count": "153", - "read_count": "1", - "tax_id": "394693", - "scientific_name": "Sebastes macdonaldi", - "sample_title": "Sebastes_macdonaldi-1", - "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", - "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", - "sample_description": "Sebastes_macdonaldi-1", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": true - }, - "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" - ], - [ - { - "id": "SRX17709227_SRR21711856", - "run_accession": "SRR21711856", - "experiment_accession": "SRX17709227", - "sample_accession": "SAMN31021823", - "secondary_sample_accession": "SRS15239723", - "study_accession": "PRJNA884373", - "secondary_study_accession": "SRP399678", - "submission_accession": "SRA1507236", - "run_alias": "GSM6601460_r1", - "experiment_alias": "GSM6601460_r1", - "sample_alias": "GSM6601460", - "study_alias": "GSE214215", - "library_layout": "SINGLE", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "GSM6601460", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "base_count": "573417800", - "read_count": "11468356", - "tax_id": "6239", - "scientific_name": "Caenorhabditis elegans", - "sample_title": "sham-treated worms in day 5", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "sample_description": "sham-treated worms in day 5", - "fastq_md5": "7cd1402155befc87be338132d1f31f64", - "fastq_bytes": "447377777", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_2": "", - "md5_1": "7cd1402155befc87be338132d1f31f64", - "md5_2": "", - "single_end": true - }, - "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" - ], - [ - { - "id": "SRX17709228_SRR21711855", - "run_accession": "SRR21711855", - "experiment_accession": "SRX17709228", - "sample_accession": "SAMN31021822", - "secondary_sample_accession": "SRS15239724", - "study_accession": "PRJNA884373", - "secondary_study_accession": "SRP399678", - "submission_accession": "SRA1507236", - "run_alias": "GSM6601461_r1", - "experiment_alias": "GSM6601461_r1", - "sample_alias": "GSM6601461", - "study_alias": "GSE214215", - "library_layout": "SINGLE", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "GSM6601461", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "base_count": "677912850", - "read_count": "13558257", - "tax_id": "6239", - "scientific_name": "Caenorhabditis elegans", - "sample_title": "PM2.5-treated worms in day 5", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "sample_description": "PM2.5-treated worms in day 5", - "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", - "fastq_bytes": "529798447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_2": "", - "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", - "md5_2": "", - "single_end": true - }, - "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" - ], - [ - { - "id": "SRX6725035_SRR9984183", - "run_accession": "SRR9984183", - "experiment_accession": "SRX6725035", - "sample_accession": "SAMN12581720", - "secondary_sample_accession": "SRS5277011", - "study_accession": "PRJNA560329", - "secondary_study_accession": "SRP218535", - "submission_accession": "SRA942061", - "run_alias": "Emb289P1_bin131.fastq", - "experiment_alias": "Emb289P1_bin131", - "sample_alias": "Emb289P1_bin131", - "study_alias": "PRJNA560329", - "library_layout": "SINGLE", - "library_selection": "RANDOM", - "library_source": "METAGENOMIC", - "library_strategy": "WGS", - "library_name": "Emb289P1_bin131", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "1996273", - "read_count": "58", - "tax_id": "2660712", - "scientific_name": "Defluviitaleaceae bacterium", - "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", - "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", - "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", - "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", - "fastq_md5": "0b512d2dc31685983456bd56fd836544", - "fastq_bytes": "605358", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_2": "", - "md5_1": "0b512d2dc31685983456bd56fd836544", - "md5_2": "", - "single_end": true - }, - "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" - ], - [ - { - "id": "SRX9315476_SRR12848126", - "run_accession": "SRR12848126", - "experiment_accession": "SRX9315476", - "sample_accession": "SAMN16455283", - "secondary_sample_accession": "SRS7540262", - "study_accession": "PRJNA670070", - "secondary_study_accession": "SRP287769", - "submission_accession": "SRA1145417", - "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", - "experiment_alias": "F11-N1-05", - "sample_alias": "F11-N1-05", - "study_alias": "PRJNA670070", - "library_layout": "PAIRED", - "library_selection": "RANDOM PCR", - "library_source": "GENOMIC", - "library_strategy": "Synthetic-Long-Read", - "library_name": "F11-N1-05", - "instrument_model": "Illumina HiSeq 3000", - "instrument_platform": "ILLUMINA", - "base_count": "431758", - "read_count": "2954", - "tax_id": "10092", - "scientific_name": "Mus musculus domesticus", - "sample_title": "Longshanks_F11-N1-05", - "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "sample_description": "F11-N1-05", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": false - }, - [ - "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", - "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" - ] - ], - [ - { - "id": "SRX9504942_SRR13055517", - "run_accession": "SRR13055517", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r1", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2246028", - "read_count": "29553", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", - "fastq_bytes": "721167;723753", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", - "md5_2": "18dbe96e7f58b63406d9058938df1962", - "single_end": false - }, - [ - "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", - "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" - ] - ], - [ - { - "id": "SRX9504942_SRR13055518", - "run_accession": "SRR13055518", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r2", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2235236", - "read_count": "29411", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", - "fastq_bytes": "717693;723429", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "md5_1": "5ec894d863fcefe394470a0925aefde4", - "md5_2": "aead170df9851773d5202b5760c76d76", - "single_end": false - }, - [ - "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", - "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" - ] - ], - [ - { - "id": "SRX9504942_SRR13055519", - "run_accession": "SRR13055519", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r3", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2232728", - "read_count": "29378", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", - "fastq_bytes": "714907;721705", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", - "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", - "single_end": false - }, - [ - "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", - "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" - ] - ], - [ - { - "id": "SRX9504942_SRR13055520", - "run_accession": "SRR13055520", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r4", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2214488", - "read_count": "29138", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", - "fastq_bytes": "709867;716862", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "md5_1": "795d460abff6009c7f5ff7c14b773fbe", - "md5_2": "c3f34379356b28d6dac7212abc1a0a04", - "single_end": false - }, - [ - "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", - "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" - ] - ], - [ - { - "id": "SRX9626017_SRR13191702", - "run_accession": "SRR13191702", - "experiment_accession": "SRX9626017", - "sample_accession": "SAMN16980141", - "secondary_sample_accession": "SRS7827211", - "study_accession": "PRJNA682076", - "secondary_study_accession": "SRP295653", - "submission_accession": "SRA1166126", - "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", - "experiment_alias": "S.170804.00784", - "sample_alias": "S.170804.00784_662", - "study_alias": "PRJNA682076", - "library_layout": "PAIRED", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "library_name": "S.170804.00784", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "45682", - "read_count": "91", - "tax_id": "408170", - "scientific_name": "human gut metagenome", - "sample_title": "Metagenome or environmental sample from human gut metagenome", - "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "sample_description": "Metagenome or environmental sample from human gut metagenome", - "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", - "fastq_bytes": "15420;16324", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "md5_1": "89c5be920021a035084d8aeb74f32df7", - "md5_2": "56271be38a80db78ef3bdfc5d9909b98", - "single_end": false - }, - [ - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" - ] - ] + ], "mappings": [ "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" @@ -1260,6 +38,6 @@ ] } ], - "timestamp": "2023-09-25T10:48:46.519896" + "timestamp": "2023-09-25T11:55:48.759498" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap index 3520d5bf..4b38d6a1 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap @@ -3,618 +3,7 @@ "content": [ { "0": [ - [ - { - "id": "DRX024467_DRR026872", - "run_accession": "DRR026872", - "experiment_accession": "DRX024467", - "sample_accession": "SAMD00023098", - "secondary_sample_accession": "DRS033740", - "study_accession": "PRJDB4356", - "secondary_study_accession": "DRP003256", - "submission_accession": "DRA002758", - "run_alias": "DRR026872", - "experiment_alias": "DRX024467", - "sample_alias": "SAMD00023098", - "study_alias": "DRP003256", - "library_layout": "SINGLE", - "library_selection": "Restriction Digest", - "library_source": "GENOMIC", - "library_strategy": "OTHER", - "library_name": "IpeRAD1_3", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "62550", - "read_count": "417", - "tax_id": "35883", - "scientific_name": "Ipomoea nil", - "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", - "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", - "study_title": "The Japanese morning glory genome sequence", - "sample_description": "Keywords: GSC:MIxS MIGS:6.0", - "fastq_md5": "515e5448c55e054113c4a22df5f62791", - "fastq_bytes": "38447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_2": "", - "md5_1": "515e5448c55e054113c4a22df5f62791", - "md5_2": "", - "single_end": true - }, - "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" - ], - [ - { - "id": "DRX026011_DRR028935", - "run_accession": "DRR028935", - "experiment_accession": "DRX026011", - "sample_accession": "SAMD00024405", - "secondary_sample_accession": "DRS019431", - "study_accession": "PRJDB3420", - "secondary_study_accession": "DRP002616", - "submission_accession": "DRA002949", - "run_alias": "DRR028935", - "experiment_alias": "DRX026011", - "sample_alias": "SAMD00024405", - "study_alias": "DRP002616", - "library_layout": "PAIRED", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "day0_BbSQE-I", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "194930", - "read_count": "965", - "tax_id": "1202541", - "scientific_name": "Botryococcus braunii Showa", - "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", - "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", - "sample_description": "Liquid culture", - "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", - "fastq_bytes": "60275;61610", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "md5_1": "cc01df82a9354bb6b3be93483b20c35a", - "md5_2": "941c9998d746416dad53c94c480ddf30", - "single_end": false - }, - [ - "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", - "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" - ] - ], - [ - { - "id": "ERX1234253_ERR1160846", - "run_accession": "ERR1160846", - "experiment_accession": "ERX1234253", - "sample_accession": "SAMEA3687214", - "secondary_sample_accession": "ERS994363", - "study_accession": "PRJEB11419", - "secondary_study_accession": "ERP012803", - "submission_accession": "ERA541392", - "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", - "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", - "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", - "study_alias": "qiita_sid_10317", - "library_layout": "SINGLE", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "library_name": "10317.BLANK.93.3E.r22", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "35658", - "read_count": "283", - "tax_id": "256318", - "scientific_name": "metagenome", - "sample_title": "10317.BLANK.93.3E.r22", - "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", - "study_title": "American Gut Project", - "sample_description": "American Gut control", - "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", - "fastq_bytes": "18077", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_2": "", - "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", - "md5_2": "", - "single_end": true - }, - "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" - ], - [ - { - "id": "SRX10940790_SRR14593545", - "run_accession": "SRR14593545", - "experiment_accession": "SRX10940790", - "sample_accession": "SAMN19097423", - "secondary_sample_accession": "SRS9020442", - "study_accession": "PRJNA728650", - "secondary_study_accession": "SRP319413", - "submission_accession": "SRA1234280", - "run_alias": "577-6_530058_19-037147 Goat_F.ab1", - "experiment_alias": "PRNP_2765", - "sample_alias": "prp_2765", - "study_alias": "PRJNA728650", - "library_layout": "PAIRED", - "library_selection": "PCR", - "library_source": "GENOMIC", - "library_strategy": "AMPLICON", - "library_name": "PRNP_2765", - "instrument_model": "AB 3500xL Genetic Analyzer", - "instrument_platform": "CAPILLARY", - "base_count": "828", - "read_count": "1", - "tax_id": "9925", - "scientific_name": "Capra hircus", - "sample_title": "MIGS Eukaryotic sample from Capra hircus", - "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", - "study_title": "Capra hircus Raw sequence reads", - "sample_description": "Keywords: GSC:MIxS MIGS:5.0", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": false - }, - [ - "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", - "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" - ] - ], - [ - { - "id": "SRX11047067_SRR14709033", - "run_accession": "SRR14709033", - "experiment_accession": "SRX11047067", - "sample_accession": "SAMN19373034", - "secondary_sample_accession": "SRS9115923", - "study_accession": "PRJNA733285", - "secondary_study_accession": "SRP322267", - "submission_accession": "SRA1239521", - "run_alias": "Sebastes_levis-2.fastq", - "experiment_alias": "Sebastes_macdonaldi-1", - "sample_alias": "S._macdonaldi-1", - "study_alias": "PRJNA733285", - "library_layout": "SINGLE", - "library_selection": "PCR", - "library_source": "GENOMIC", - "library_strategy": "AMPLICON", - "library_name": "Sebastes_macdonaldi-1", - "instrument_model": "AB 5500 Genetic Analyzer", - "instrument_platform": "ABI_SOLID", - "base_count": "153", - "read_count": "1", - "tax_id": "394693", - "scientific_name": "Sebastes macdonaldi", - "sample_title": "Sebastes_macdonaldi-1", - "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", - "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", - "sample_description": "Sebastes_macdonaldi-1", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": true - }, - "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" - ], - [ - { - "id": "SRX17709227_SRR21711856", - "run_accession": "SRR21711856", - "experiment_accession": "SRX17709227", - "sample_accession": "SAMN31021823", - "secondary_sample_accession": "SRS15239723", - "study_accession": "PRJNA884373", - "secondary_study_accession": "SRP399678", - "submission_accession": "SRA1507236", - "run_alias": "GSM6601460_r1", - "experiment_alias": "GSM6601460_r1", - "sample_alias": "GSM6601460", - "study_alias": "GSE214215", - "library_layout": "SINGLE", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "GSM6601460", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "base_count": "573417800", - "read_count": "11468356", - "tax_id": "6239", - "scientific_name": "Caenorhabditis elegans", - "sample_title": "sham-treated worms in day 5", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "sample_description": "sham-treated worms in day 5", - "fastq_md5": "7cd1402155befc87be338132d1f31f64", - "fastq_bytes": "447377777", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_2": "", - "md5_1": "7cd1402155befc87be338132d1f31f64", - "md5_2": "", - "single_end": true - }, - "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" - ], - [ - { - "id": "SRX17709228_SRR21711855", - "run_accession": "SRR21711855", - "experiment_accession": "SRX17709228", - "sample_accession": "SAMN31021822", - "secondary_sample_accession": "SRS15239724", - "study_accession": "PRJNA884373", - "secondary_study_accession": "SRP399678", - "submission_accession": "SRA1507236", - "run_alias": "GSM6601461_r1", - "experiment_alias": "GSM6601461_r1", - "sample_alias": "GSM6601461", - "study_alias": "GSE214215", - "library_layout": "SINGLE", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "GSM6601461", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "base_count": "677912850", - "read_count": "13558257", - "tax_id": "6239", - "scientific_name": "Caenorhabditis elegans", - "sample_title": "PM2.5-treated worms in day 5", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "sample_description": "PM2.5-treated worms in day 5", - "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", - "fastq_bytes": "529798447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_2": "", - "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", - "md5_2": "", - "single_end": true - }, - "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" - ], - [ - { - "id": "SRX6725035_SRR9984183", - "run_accession": "SRR9984183", - "experiment_accession": "SRX6725035", - "sample_accession": "SAMN12581720", - "secondary_sample_accession": "SRS5277011", - "study_accession": "PRJNA560329", - "secondary_study_accession": "SRP218535", - "submission_accession": "SRA942061", - "run_alias": "Emb289P1_bin131.fastq", - "experiment_alias": "Emb289P1_bin131", - "sample_alias": "Emb289P1_bin131", - "study_alias": "PRJNA560329", - "library_layout": "SINGLE", - "library_selection": "RANDOM", - "library_source": "METAGENOMIC", - "library_strategy": "WGS", - "library_name": "Emb289P1_bin131", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "1996273", - "read_count": "58", - "tax_id": "2660712", - "scientific_name": "Defluviitaleaceae bacterium", - "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", - "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", - "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", - "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", - "fastq_md5": "0b512d2dc31685983456bd56fd836544", - "fastq_bytes": "605358", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_2": "", - "md5_1": "0b512d2dc31685983456bd56fd836544", - "md5_2": "", - "single_end": true - }, - "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" - ], - [ - { - "id": "SRX9315476_SRR12848126", - "run_accession": "SRR12848126", - "experiment_accession": "SRX9315476", - "sample_accession": "SAMN16455283", - "secondary_sample_accession": "SRS7540262", - "study_accession": "PRJNA670070", - "secondary_study_accession": "SRP287769", - "submission_accession": "SRA1145417", - "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", - "experiment_alias": "F11-N1-05", - "sample_alias": "F11-N1-05", - "study_alias": "PRJNA670070", - "library_layout": "PAIRED", - "library_selection": "RANDOM PCR", - "library_source": "GENOMIC", - "library_strategy": "Synthetic-Long-Read", - "library_name": "F11-N1-05", - "instrument_model": "Illumina HiSeq 3000", - "instrument_platform": "ILLUMINA", - "base_count": "431758", - "read_count": "2954", - "tax_id": "10092", - "scientific_name": "Mus musculus domesticus", - "sample_title": "Longshanks_F11-N1-05", - "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "sample_description": "F11-N1-05", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": false - }, - [ - "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", - "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" - ] - ], - [ - { - "id": "SRX9504942_SRR13055517", - "run_accession": "SRR13055517", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r1", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2246028", - "read_count": "29553", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", - "fastq_bytes": "721167;723753", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", - "md5_2": "18dbe96e7f58b63406d9058938df1962", - "single_end": false - }, - [ - "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", - "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" - ] - ], - [ - { - "id": "SRX9504942_SRR13055518", - "run_accession": "SRR13055518", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r2", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2235236", - "read_count": "29411", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", - "fastq_bytes": "717693;723429", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "md5_1": "5ec894d863fcefe394470a0925aefde4", - "md5_2": "aead170df9851773d5202b5760c76d76", - "single_end": false - }, - [ - "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", - "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" - ] - ], - [ - { - "id": "SRX9504942_SRR13055519", - "run_accession": "SRR13055519", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r3", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2232728", - "read_count": "29378", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", - "fastq_bytes": "714907;721705", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", - "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", - "single_end": false - }, - [ - "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", - "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" - ] - ], - [ - { - "id": "SRX9504942_SRR13055520", - "run_accession": "SRR13055520", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r4", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2214488", - "read_count": "29138", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", - "fastq_bytes": "709867;716862", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "md5_1": "795d460abff6009c7f5ff7c14b773fbe", - "md5_2": "c3f34379356b28d6dac7212abc1a0a04", - "single_end": false - }, - [ - "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", - "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" - ] - ], - [ - { - "id": "SRX9626017_SRR13191702", - "run_accession": "SRR13191702", - "experiment_accession": "SRX9626017", - "sample_accession": "SAMN16980141", - "secondary_sample_accession": "SRS7827211", - "study_accession": "PRJNA682076", - "secondary_study_accession": "SRP295653", - "submission_accession": "SRA1166126", - "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", - "experiment_alias": "S.170804.00784", - "sample_alias": "S.170804.00784_662", - "study_alias": "PRJNA682076", - "library_layout": "PAIRED", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "library_name": "S.170804.00784", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "45682", - "read_count": "91", - "tax_id": "408170", - "scientific_name": "human gut metagenome", - "sample_title": "Metagenome or environmental sample from human gut metagenome", - "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "sample_description": "Metagenome or environmental sample from human gut metagenome", - "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", - "fastq_bytes": "15420;16324", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "md5_1": "89c5be920021a035084d8aeb74f32df7", - "md5_2": "56271be38a80db78ef3bdfc5d9909b98", - "single_end": false - }, - [ - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" - ] - ] + ], "1": [ "samplesheet.csv:md5,c1104c2edfc663b103f79b0551450192" @@ -631,618 +20,7 @@ "versions.yml:md5,e977678bd13a54fc9c31addf135be15e" ], "fastq": [ - [ - { - "id": "DRX024467_DRR026872", - "run_accession": "DRR026872", - "experiment_accession": "DRX024467", - "sample_accession": "SAMD00023098", - "secondary_sample_accession": "DRS033740", - "study_accession": "PRJDB4356", - "secondary_study_accession": "DRP003256", - "submission_accession": "DRA002758", - "run_alias": "DRR026872", - "experiment_alias": "DRX024467", - "sample_alias": "SAMD00023098", - "study_alias": "DRP003256", - "library_layout": "SINGLE", - "library_selection": "Restriction Digest", - "library_source": "GENOMIC", - "library_strategy": "OTHER", - "library_name": "IpeRAD1_3", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "62550", - "read_count": "417", - "tax_id": "35883", - "scientific_name": "Ipomoea nil", - "sample_title": "F2 plant dreived from a cross between Tokyo Kokei-standard and Africa #21", - "experiment_title": "Illumina HiSeq 2500 sequencing: Illumina HiSeq 2500 sequencing of SAMD00023098", - "study_title": "The Japanese morning glory genome sequence", - "sample_description": "Keywords: GSC:MIxS MIGS:6.0", - "fastq_md5": "515e5448c55e054113c4a22df5f62791", - "fastq_bytes": "38447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR026/DRR026872/DRR026872.fastq.gz", - "fastq_2": "", - "md5_1": "515e5448c55e054113c4a22df5f62791", - "md5_2": "", - "single_end": true - }, - "DRX024467_DRR026872.fastq.gz:md5,515e5448c55e054113c4a22df5f62791" - ], - [ - { - "id": "DRX026011_DRR028935", - "run_accession": "DRR028935", - "experiment_accession": "DRX026011", - "sample_accession": "SAMD00024405", - "secondary_sample_accession": "DRS019431", - "study_accession": "PRJDB3420", - "secondary_study_accession": "DRP002616", - "submission_accession": "DRA002949", - "run_alias": "DRR028935", - "experiment_alias": "DRX026011", - "sample_alias": "SAMD00024405", - "study_alias": "DRP002616", - "library_layout": "PAIRED", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "day0_BbSQE-I", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "194930", - "read_count": "965", - "tax_id": "1202541", - "scientific_name": "Botryococcus braunii Showa", - "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", - "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", - "sample_description": "Liquid culture", - "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", - "fastq_bytes": "60275;61610", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "md5_1": "cc01df82a9354bb6b3be93483b20c35a", - "md5_2": "941c9998d746416dad53c94c480ddf30", - "single_end": false - }, - [ - "DRX026011_DRR028935_1.fastq.gz:md5,cc01df82a9354bb6b3be93483b20c35a", - "DRX026011_DRR028935_2.fastq.gz:md5,941c9998d746416dad53c94c480ddf30" - ] - ], - [ - { - "id": "ERX1234253_ERR1160846", - "run_accession": "ERR1160846", - "experiment_accession": "ERX1234253", - "sample_accession": "SAMEA3687214", - "secondary_sample_accession": "ERS994363", - "study_accession": "PRJEB11419", - "secondary_study_accession": "ERP012803", - "submission_accession": "ERA541392", - "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", - "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", - "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", - "study_alias": "qiita_sid_10317", - "library_layout": "SINGLE", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "library_name": "10317.BLANK.93.3E.r22", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "35658", - "read_count": "283", - "tax_id": "256318", - "scientific_name": "metagenome", - "sample_title": "10317.BLANK.93.3E.r22", - "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", - "study_title": "American Gut Project", - "sample_description": "American Gut control", - "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", - "fastq_bytes": "18077", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_2": "", - "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", - "md5_2": "", - "single_end": true - }, - "ERX1234253_ERR1160846.fastq.gz:md5,5924f20ef547ebdfed7cad795bbab6e6" - ], - [ - { - "id": "SRX10940790_SRR14593545", - "run_accession": "SRR14593545", - "experiment_accession": "SRX10940790", - "sample_accession": "SAMN19097423", - "secondary_sample_accession": "SRS9020442", - "study_accession": "PRJNA728650", - "secondary_study_accession": "SRP319413", - "submission_accession": "SRA1234280", - "run_alias": "577-6_530058_19-037147 Goat_F.ab1", - "experiment_alias": "PRNP_2765", - "sample_alias": "prp_2765", - "study_alias": "PRJNA728650", - "library_layout": "PAIRED", - "library_selection": "PCR", - "library_source": "GENOMIC", - "library_strategy": "AMPLICON", - "library_name": "PRNP_2765", - "instrument_model": "AB 3500xL Genetic Analyzer", - "instrument_platform": "CAPILLARY", - "base_count": "828", - "read_count": "1", - "tax_id": "9925", - "scientific_name": "Capra hircus", - "sample_title": "MIGS Eukaryotic sample from Capra hircus", - "experiment_title": "AB 3500xL Genetic Analyzer sequencing: prp_2765", - "study_title": "Capra hircus Raw sequence reads", - "sample_description": "Keywords: GSC:MIxS MIGS:5.0", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": false - }, - [ - "SRX10940790_SRR14593545_1.fastq.gz:md5,6a4762cf0f1f9f5544d3735e2e07c5d3", - "SRX10940790_SRR14593545_2.fastq.gz:md5,cbd30715fdef457d7aa24a12f19eedf2" - ] - ], - [ - { - "id": "SRX11047067_SRR14709033", - "run_accession": "SRR14709033", - "experiment_accession": "SRX11047067", - "sample_accession": "SAMN19373034", - "secondary_sample_accession": "SRS9115923", - "study_accession": "PRJNA733285", - "secondary_study_accession": "SRP322267", - "submission_accession": "SRA1239521", - "run_alias": "Sebastes_levis-2.fastq", - "experiment_alias": "Sebastes_macdonaldi-1", - "sample_alias": "S._macdonaldi-1", - "study_alias": "PRJNA733285", - "library_layout": "SINGLE", - "library_selection": "PCR", - "library_source": "GENOMIC", - "library_strategy": "AMPLICON", - "library_name": "Sebastes_macdonaldi-1", - "instrument_model": "AB 5500 Genetic Analyzer", - "instrument_platform": "ABI_SOLID", - "base_count": "153", - "read_count": "1", - "tax_id": "394693", - "scientific_name": "Sebastes macdonaldi", - "sample_title": "Sebastes_macdonaldi-1", - "experiment_title": "AB 5500 Genetic Analyzer sequencing: Sebastes macdonaldi", - "study_title": "MiSebastes: An eDNA metabarcoding primer set for rockfishes (genus Sebastes)", - "sample_description": "Sebastes_macdonaldi-1", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": true - }, - "SRX11047067_SRR14709033.fastq.gz:md5,79140dd1cb3fd1c5e02d88e01f7c3eda" - ], - [ - { - "id": "SRX17709227_SRR21711856", - "run_accession": "SRR21711856", - "experiment_accession": "SRX17709227", - "sample_accession": "SAMN31021823", - "secondary_sample_accession": "SRS15239723", - "study_accession": "PRJNA884373", - "secondary_study_accession": "SRP399678", - "submission_accession": "SRA1507236", - "run_alias": "GSM6601460_r1", - "experiment_alias": "GSM6601460_r1", - "sample_alias": "GSM6601460", - "study_alias": "GSE214215", - "library_layout": "SINGLE", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "GSM6601460", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "base_count": "573417800", - "read_count": "11468356", - "tax_id": "6239", - "scientific_name": "Caenorhabditis elegans", - "sample_title": "sham-treated worms in day 5", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "sample_description": "sham-treated worms in day 5", - "fastq_md5": "7cd1402155befc87be338132d1f31f64", - "fastq_bytes": "447377777", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_2": "", - "md5_1": "7cd1402155befc87be338132d1f31f64", - "md5_2": "", - "single_end": true - }, - "SRX17709227_SRR21711856.fastq.gz:md5,7cd1402155befc87be338132d1f31f64" - ], - [ - { - "id": "SRX17709228_SRR21711855", - "run_accession": "SRR21711855", - "experiment_accession": "SRX17709228", - "sample_accession": "SAMN31021822", - "secondary_sample_accession": "SRS15239724", - "study_accession": "PRJNA884373", - "secondary_study_accession": "SRP399678", - "submission_accession": "SRA1507236", - "run_alias": "GSM6601461_r1", - "experiment_alias": "GSM6601461_r1", - "sample_alias": "GSM6601461", - "study_alias": "GSE214215", - "library_layout": "SINGLE", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "library_name": "GSM6601461", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "base_count": "677912850", - "read_count": "13558257", - "tax_id": "6239", - "scientific_name": "Caenorhabditis elegans", - "sample_title": "PM2.5-treated worms in day 5", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "sample_description": "PM2.5-treated worms in day 5", - "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", - "fastq_bytes": "529798447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_2": "", - "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", - "md5_2": "", - "single_end": true - }, - "SRX17709228_SRR21711855.fastq.gz:md5,cbe4e9f967a71593f9ec3c6edaf11c83" - ], - [ - { - "id": "SRX6725035_SRR9984183", - "run_accession": "SRR9984183", - "experiment_accession": "SRX6725035", - "sample_accession": "SAMN12581720", - "secondary_sample_accession": "SRS5277011", - "study_accession": "PRJNA560329", - "secondary_study_accession": "SRP218535", - "submission_accession": "SRA942061", - "run_alias": "Emb289P1_bin131.fastq", - "experiment_alias": "Emb289P1_bin131", - "sample_alias": "Emb289P1_bin131", - "study_alias": "PRJNA560329", - "library_layout": "SINGLE", - "library_selection": "RANDOM", - "library_source": "METAGENOMIC", - "library_strategy": "WGS", - "library_name": "Emb289P1_bin131", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "1996273", - "read_count": "58", - "tax_id": "2660712", - "scientific_name": "Defluviitaleaceae bacterium", - "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", - "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", - "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", - "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", - "fastq_md5": "0b512d2dc31685983456bd56fd836544", - "fastq_bytes": "605358", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_2": "", - "md5_1": "0b512d2dc31685983456bd56fd836544", - "md5_2": "", - "single_end": true - }, - "SRX6725035_SRR9984183.fastq.gz:md5,0b512d2dc31685983456bd56fd836544" - ], - [ - { - "id": "SRX9315476_SRR12848126", - "run_accession": "SRR12848126", - "experiment_accession": "SRX9315476", - "sample_accession": "SAMN16455283", - "secondary_sample_accession": "SRS7540262", - "study_accession": "PRJNA670070", - "secondary_study_accession": "SRP287769", - "submission_accession": "SRA1145417", - "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", - "experiment_alias": "F11-N1-05", - "sample_alias": "F11-N1-05", - "study_alias": "PRJNA670070", - "library_layout": "PAIRED", - "library_selection": "RANDOM PCR", - "library_source": "GENOMIC", - "library_strategy": "Synthetic-Long-Read", - "library_name": "F11-N1-05", - "instrument_model": "Illumina HiSeq 3000", - "instrument_platform": "ILLUMINA", - "base_count": "431758", - "read_count": "2954", - "tax_id": "10092", - "scientific_name": "Mus musculus domesticus", - "sample_title": "Longshanks_F11-N1-05", - "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "sample_description": "F11-N1-05", - "fastq_md5": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_aspera": "", - "fastq_1": "", - "fastq_2": "", - "md5_1": "", - "md5_2": "", - "single_end": false - }, - [ - "SRX9315476_SRR12848126_1.fastq.gz:md5,03f5a34586aef9cd61f54eb26831a665", - "SRX9315476_SRR12848126_2.fastq.gz:md5,97701c5d884af8d96ba95d7237f3bf79" - ] - ], - [ - { - "id": "SRX9504942_SRR13055517", - "run_accession": "SRR13055517", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r1", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2246028", - "read_count": "29553", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "dcf4438c0b682242ee90c5f3a803fb40;18dbe96e7f58b63406d9058938df1962", - "fastq_bytes": "721167;723753", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/017/SRR13055517/SRR13055517_2.fastq.gz", - "md5_1": "dcf4438c0b682242ee90c5f3a803fb40", - "md5_2": "18dbe96e7f58b63406d9058938df1962", - "single_end": false - }, - [ - "SRX9504942_SRR13055517_1.fastq.gz:md5,dcf4438c0b682242ee90c5f3a803fb40", - "SRX9504942_SRR13055517_2.fastq.gz:md5,18dbe96e7f58b63406d9058938df1962" - ] - ], - [ - { - "id": "SRX9504942_SRR13055518", - "run_accession": "SRR13055518", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r2", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2235236", - "read_count": "29411", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "5ec894d863fcefe394470a0925aefde4;aead170df9851773d5202b5760c76d76", - "fastq_bytes": "717693;723429", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/018/SRR13055518/SRR13055518_2.fastq.gz", - "md5_1": "5ec894d863fcefe394470a0925aefde4", - "md5_2": "aead170df9851773d5202b5760c76d76", - "single_end": false - }, - [ - "SRX9504942_SRR13055518_1.fastq.gz:md5,5ec894d863fcefe394470a0925aefde4", - "SRX9504942_SRR13055518_2.fastq.gz:md5,aead170df9851773d5202b5760c76d76" - ] - ], - [ - { - "id": "SRX9504942_SRR13055519", - "run_accession": "SRR13055519", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r3", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2232728", - "read_count": "29378", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "5ad51460c6c4a850dd37a206e2c441c1;a977367bf41dacf4c21bc0c8201b8b88", - "fastq_bytes": "714907;721705", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/019/SRR13055519/SRR13055519_2.fastq.gz", - "md5_1": "5ad51460c6c4a850dd37a206e2c441c1", - "md5_2": "a977367bf41dacf4c21bc0c8201b8b88", - "single_end": false - }, - [ - "SRX9504942_SRR13055519_1.fastq.gz:md5,5ad51460c6c4a850dd37a206e2c441c1", - "SRX9504942_SRR13055519_2.fastq.gz:md5,a977367bf41dacf4c21bc0c8201b8b88" - ] - ], - [ - { - "id": "SRX9504942_SRR13055520", - "run_accession": "SRR13055520", - "experiment_accession": "SRX9504942", - "sample_accession": "SAMN16793052", - "secondary_sample_accession": "SRS7713669", - "study_accession": "PRJNA678298", - "secondary_study_accession": "SRP292504", - "submission_accession": "SRA1158402", - "run_alias": "GSM4907283_r4", - "experiment_alias": "GSM4907283", - "sample_alias": "GSM4907283", - "study_alias": "GSE159787", - "library_layout": "PAIRED", - "library_selection": "other", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "OTHER", - "library_name": "", - "instrument_model": "NextSeq 550", - "instrument_platform": "ILLUMINA", - "base_count": "2214488", - "read_count": "29138", - "tax_id": "9606", - "scientific_name": "Homo sapiens", - "sample_title": "A20-35 A11A20-35 A11_ROI009PanCK+", - "experiment_title": "NextSeq 550 sequencing: GSM4907283: A20-35 A11A20-35 A11_ROI009PanCK+ Homo sapiens OTHER", - "study_title": "Temporal and Spatial Heterogeneity of Host Response to SARS-CoV-2 Pulmonary Infection [gene expression]", - "sample_description": "A20-35 A11A20-35 A11_ROI009PanCK+", - "fastq_md5": "795d460abff6009c7f5ff7c14b773fbe;c3f34379356b28d6dac7212abc1a0a04", - "fastq_bytes": "709867;716862", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz", - "md5_1": "795d460abff6009c7f5ff7c14b773fbe", - "md5_2": "c3f34379356b28d6dac7212abc1a0a04", - "single_end": false - }, - [ - "SRX9504942_SRR13055520_1.fastq.gz:md5,795d460abff6009c7f5ff7c14b773fbe", - "SRX9504942_SRR13055520_2.fastq.gz:md5,c3f34379356b28d6dac7212abc1a0a04" - ] - ], - [ - { - "id": "SRX9626017_SRR13191702", - "run_accession": "SRR13191702", - "experiment_accession": "SRX9626017", - "sample_accession": "SAMN16980141", - "secondary_sample_accession": "SRS7827211", - "study_accession": "PRJNA682076", - "secondary_study_accession": "SRP295653", - "submission_accession": "SRA1166126", - "run_alias": "S.170804.00784_662_L001_R1_001.fastq.gz", - "experiment_alias": "S.170804.00784", - "sample_alias": "S.170804.00784_662", - "study_alias": "PRJNA682076", - "library_layout": "PAIRED", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "library_name": "S.170804.00784", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "base_count": "45682", - "read_count": "91", - "tax_id": "408170", - "scientific_name": "human gut metagenome", - "sample_title": "Metagenome or environmental sample from human gut metagenome", - "experiment_title": "Illumina HiSeq 2500 sequencing: Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "study_title": "Stool Microbiome Features to Discriminate Clostridium Difficile Colonization and Infection", - "sample_description": "Metagenome or environmental sample from human gut metagenome", - "fastq_md5": "89c5be920021a035084d8aeb74f32df7;56271be38a80db78ef3bdfc5d9909b98", - "fastq_bytes": "15420;16324", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz", - "fastq_2": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz", - "md5_1": "89c5be920021a035084d8aeb74f32df7", - "md5_2": "56271be38a80db78ef3bdfc5d9909b98", - "single_end": false - }, - [ - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" - ] - ] + ], "mappings": [ "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" @@ -1260,6 +38,6 @@ ] } ], - "timestamp": "2023-09-25T10:42:52.035768" + "timestamp": "2023-09-25T11:50:52.373496" } } \ No newline at end of file From 41c5a71836b8738d2bb296d3f7b3eed9ebebbebc Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 25 Sep 2023 12:16:23 +0200 Subject: [PATCH 495/852] Update CHANGELOG.md --- CHANGELOG.md | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c9dfa84d..952ff499 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,17 +18,9 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements ### Enhancements & fixes - [#177](https://github.com/nf-core/fetchngs/pull/177) - Template update with nf-core/tools 2.9 -- [#205](https://github.com/nf-core/fetchngs/pull/205) - Rename all local modules, workflows and remove public_aws_ecr profile +- [#205](https://github.com/nf-core/fetchngs/pull/205) - Rename all local modules, workflows and remove `public_aws_ecr profile` - [#206](https://github.com/nf-core/fetchngs/pull/206) - CI improvments and code cleanup -### Software dependencies - -> **NB:** Dependency has been **updated** if both old and new version information is present. -> -> **NB:** Dependency has been **added** if just the new version information is present. -> -> **NB:** Dependency has been **removed** if new version information isn't present. - ## [[1.10.0](https://github.com/nf-core/fetchngs/releases/tag/1.10.0)] - 2023-05-16 ### Credits From 67ffe73a4eb1270983542fef47823037f2636834 Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Mon, 25 Sep 2023 12:32:06 +0200 Subject: [PATCH 496/852] Update main.nf --- main.nf | 5 ----- 1 file changed, 5 deletions(-) diff --git a/main.nf b/main.nf index c6d7d13e..2733a41a 100644 --- a/main.nf +++ b/main.nf @@ -113,11 +113,6 @@ workflow NFCORE_FETCHNGS { SYNAPSE ( ch_ids, ch_synapse_config ) ch_versions = ch_versions.mix(SYNAPSE.out.versions) } - - // MODULE: Dump software versions for all tools used in the workflow - // - // MODULE: Dump software versions for all tools used in the workflow - // } /* From fbe5be6886761d5ae751d82c49c4b3955ee8ed93 Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Mon, 25 Sep 2023 13:53:23 +0200 Subject: [PATCH 497/852] Apply suggestions from code review --- main.nf | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/main.nf b/main.nf index ed4f6877..93afa437 100644 --- a/main.nf +++ b/main.nf @@ -59,6 +59,9 @@ if (WorkflowMain.isSraId(ch_input)) { } else { error('Ids provided via --input not recognised please make sure they are either SRA / ENA / GEO / DDBJ or Synapse ids!') } +if (params.input_type != input_type) { + error("Ids auto-detected as ${input_type}. Please provide '--input_type ${input_type}' as a parameter to the pipeline!") +} /* ======================================================================================== @@ -72,8 +75,6 @@ if (params.input_type == input_type) { } else if (params.input_type == 'synapse') { include { SYNAPSE } from './workflows/synapse' } -} else { - error("Ids auto-detected as ${input_type}. Please provide '--input_type ${input_type}' as a parameter to the pipeline!") } /* From 328c387a1a2bcb5247031be67c2e14b3911e98d9 Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Mon, 25 Sep 2023 14:04:22 +0200 Subject: [PATCH 498/852] Apply suggestions from code review --- main.nf | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/main.nf b/main.nf index 93afa437..191de3ad 100644 --- a/main.nf +++ b/main.nf @@ -65,17 +65,12 @@ if (params.input_type != input_type) { /* ======================================================================================== - VALIDATE INPUTS + IMPORT WORKFLOWS ======================================================================================== */ -if (params.input_type == input_type) { - if (params.input_type == 'sra') { - include { SRA } from './workflows/sra' - } else if (params.input_type == 'synapse') { - include { SYNAPSE } from './workflows/synapse' - } -} +if (params.input_type == 'sra') include { SRA } from './workflows/sra' +if (params.input_type == 'synapse') include { SYNAPSE } from './workflows/synapse' /* ======================================================================================== From 84d9aa87663f8e287920bb59cc785057a6d1062a Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Mon, 25 Sep 2023 14:05:26 +0200 Subject: [PATCH 499/852] Update main.nf --- main.nf | 6 ------ 1 file changed, 6 deletions(-) diff --git a/main.nf b/main.nf index 191de3ad..943aa301 100644 --- a/main.nf +++ b/main.nf @@ -72,12 +72,6 @@ if (params.input_type != input_type) { if (params.input_type == 'sra') include { SRA } from './workflows/sra' if (params.input_type == 'synapse') include { SYNAPSE } from './workflows/synapse' -/* -======================================================================================== - NAMED WORKFLOW FOR PIPELINE -======================================================================================== -*/ - // // WORKFLOW: Run main nf-core/fetchngs analysis pipeline depending on type of identifier provided // From 6ee945e3555527b86987cc4a94ec5bd115083d40 Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Tue, 26 Sep 2023 09:54:29 +0200 Subject: [PATCH 500/852] Apply suggestions from code review --- conf/modules.config | 9 --------- nextflow.config | 2 +- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 8bffcb2a..f5cb1c77 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -29,15 +29,6 @@ process { ] } - withName: 'MULTIQC' { - ext.args = params.multiqc_title ? "--title \"$params.multiqc_title\"" : '' - publishDir = [ - path: { "${params.outdir}/multiqc" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - } // diff --git a/nextflow.config b/nextflow.config index b91e67a5..f6f53063 100644 --- a/nextflow.config +++ b/nextflow.config @@ -49,7 +49,7 @@ params { // Schema validation default options validationFailUnrecognisedParams = false validationLenientMode = false - validationSchemaIgnoreParams = 'genomes,igenomes_base' + validationSchemaIgnoreParams = 'genomes' validationShowHiddenParams = false validate_params = true From 7bc7a5e94eb5a5af3efb8709d54d8fa9124b28fc Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Fri, 29 Sep 2023 17:05:54 +0200 Subject: [PATCH 501/852] Update main.nf squiggles all the way --- main.nf | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/main.nf b/main.nf index 943aa301..8ab3ae5e 100644 --- a/main.nf +++ b/main.nf @@ -1,21 +1,21 @@ #!/usr/bin/env nextflow /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ nf-core/fetchngs -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Github : https://github.com/nf-core/fetchngs Website: https://nf-co.re/fetchngs Slack : https://nfcore.slack.com/channels/fetchngs -======================================================================================== +---------------------------------------------------------------------------------------- */ nextflow.enable.dsl = 2 /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ VALIDATE & PRINT PARAMETER SUMMARY -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ include { paramsHelp; paramsSummaryLog; validateParameters } from 'plugin/nf-validation' @@ -64,9 +64,9 @@ if (params.input_type != input_type) { } /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ IMPORT WORKFLOWS -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ if (params.input_type == 'sra') include { SRA } from './workflows/sra' @@ -92,9 +92,9 @@ workflow NFCORE_FETCHNGS { } /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RUN ALL WORKFLOWS -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ // @@ -106,7 +106,7 @@ workflow { } /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ THE END -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ From 9dc4c4e47a1e47853715ee9a27d8314b0154a08f Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Fri, 29 Sep 2023 17:06:16 +0200 Subject: [PATCH 502/852] Apply suggestions from code review --- main.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/main.nf b/main.nf index 8ab3ae5e..7de31c2c 100644 --- a/main.nf +++ b/main.nf @@ -1,5 +1,4 @@ #!/usr/bin/env nextflow - /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ nf-core/fetchngs From 3eda77d16a2f24732f52fa68eebe4e60c779ec85 Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Fri, 29 Sep 2023 17:07:09 +0200 Subject: [PATCH 503/852] Update main.nf squiggles all the way --- workflows/sra/main.nf | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/workflows/sra/main.nf b/workflows/sra/main.nf index 366e4b28..e393b726 100644 --- a/workflows/sra/main.nf +++ b/workflows/sra/main.nf @@ -1,7 +1,7 @@ /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ VALIDATE INPUTS -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ include { paramsSummaryLog; paramsSummaryMap } from 'plugin/nf-validation' @@ -14,9 +14,9 @@ def summary_params = paramsSummaryMap(workflow) log.info logo + paramsSummaryLog(workflow) + citation /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ IMPORT LOCAL MODULES/SUBWORKFLOWS -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ include { SRA_IDS_TO_RUNINFO } from '../../modules/local/sra_ids_to_runinfo' @@ -27,9 +27,9 @@ include { SRA_MERGE_SAMPLESHEET } from '../../modules/local/sra_merge_samplesh include { MULTIQC_MAPPINGS_CONFIG } from '../../modules/local/multiqc_mappings_config' /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ IMPORT NF-CORE MODULES/SUBWORKFLOWS -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../../modules/nf-core/custom/dumpsoftwareversions/main' @@ -37,9 +37,9 @@ include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../../modules/nf-core/custom/dumps include { FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS } from '../../subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/main' /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RUN MAIN WORKFLOW -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ workflow SRA { @@ -164,9 +164,9 @@ workflow SRA { } /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ COMPLETION EMAIL AND SUMMARY -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ workflow.onComplete { @@ -178,7 +178,7 @@ workflow.onComplete { } /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ THE END -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ From 907ad76d139ac243fab3a3c135eb80b2e8f21eaf Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Fri, 29 Sep 2023 17:07:46 +0200 Subject: [PATCH 504/852] Update main.nf squiggles all the way --- workflows/synapse/main.nf | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/workflows/synapse/main.nf b/workflows/synapse/main.nf index 7d871659..4f015e0e 100644 --- a/workflows/synapse/main.nf +++ b/workflows/synapse/main.nf @@ -1,7 +1,7 @@ /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ VALIDATE INPUTS -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ def summary_params = NfcoreSchema.paramsSummaryMap(workflow, params) @@ -14,9 +14,9 @@ if (params.synapse_config) { } /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ IMPORT LOCAL MODULES/SUBWORKFLOWS -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ include { SYNAPSE_LIST } from '../../modules/local/synapse_list' @@ -26,17 +26,17 @@ include { SYNAPSE_TO_SAMPLESHEET } from '../../modules/local/synapse_to_sampl include { SYNAPSE_MERGE_SAMPLESHEET } from '../../modules/local/synapse_merge_samplesheet' /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ IMPORT NF-CORE MODULES/SUBWORKFLOWS -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../../modules/nf-core/custom/dumpsoftwareversions/main' /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RUN MAIN WORKFLOW -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ workflow SYNAPSE { @@ -136,9 +136,9 @@ workflow SYNAPSE { } /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ COMPLETION EMAIL AND SUMMARY -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ workflow.onComplete { @@ -150,7 +150,7 @@ workflow.onComplete { } /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ THE END -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ From 2d08cb4b7c52ba59df89d72b13a59a6daead0d83 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 6 Oct 2023 11:27:49 +0200 Subject: [PATCH 505/852] Update CHANGELOG.md --- CHANGELOG.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 952ff499..e85a5564 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [[1.10.1](https://github.com/nf-core/fetchngs/releases/tag/1.10.1)] - 2023-09-25 +## [[1.10.1](https://github.com/nf-core/fetchngs/releases/tag/1.10.1)] - 2023-10-09 ### Credits @@ -17,9 +17,9 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements ### Enhancements & fixes -- [#177](https://github.com/nf-core/fetchngs/pull/177) - Template update with nf-core/tools 2.9 -- [#205](https://github.com/nf-core/fetchngs/pull/205) - Rename all local modules, workflows and remove `public_aws_ecr profile` -- [#206](https://github.com/nf-core/fetchngs/pull/206) - CI improvments and code cleanup +- [PR #205](https://github.com/nf-core/fetchngs/pull/205) - Rename all local modules, workflows and remove `public_aws_ecr profile` +- [PR #206](https://github.com/nf-core/fetchngs/pull/206) - CI improvments and code cleanup +- [PR #208](https://github.com/nf-core/fetchngs/pull/208) - Template update with nf-core/tools 2.10 ## [[1.10.0](https://github.com/nf-core/fetchngs/releases/tag/1.10.0)] - 2023-05-16 From 8114abc1c23c92fc1021fb79dfc27e79b01a3fbc Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Fri, 6 Oct 2023 11:47:54 +0200 Subject: [PATCH 506/852] Update main.nf --- workflows/sra/main.nf | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/workflows/sra/main.nf b/workflows/sra/main.nf index 441430ea..562d1726 100644 --- a/workflows/sra/main.nf +++ b/workflows/sra/main.nf @@ -133,18 +133,21 @@ workflow SRA { // // MODULE: Create a MutiQC config file with sample name mappings // + ch_sample_mappings_yml = Channel.empty() if (params.sample_mapping_fields) { MULTIQC_MAPPINGS_CONFIG ( SRA_MERGE_SAMPLESHEET.out.mappings ) ch_versions = ch_versions.mix(MULTIQC_MAPPINGS_CONFIG.out.versions) + ch_sample_mappings_yml = MULTIQC_MAPPINGS_CONFIG.out.yml } emit: - fastq = fastq_files - samplesheet = SRA_MERGE_SAMPLESHEET.out.samplesheet - mappings = SRA_MERGE_SAMPLESHEET.out.mappings - versions = ch_versions.unique() + fastq = fastq_files + samplesheet = SRA_MERGE_SAMPLESHEET.out.samplesheet + mappings = SRA_MERGE_SAMPLESHEET.out.mappings + sample_mappings = ch_sample_mappings_yml + versions = ch_versions.unique() } /* From 588cef665272ceddd1f27cec8c2f660584c98a18 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 6 Oct 2023 12:00:10 +0200 Subject: [PATCH 507/852] Update multiqc_config.yml --- assets/multiqc_config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index 70cc1fc7..bafbf577 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -1,7 +1,7 @@ report_comment: > - This report has been generated by the nf-core/fetchngs + This report has been generated by the nf-core/fetchngs analysis pipeline. For information about how to interpret these results, please see the - documentation. + documentation. report_section_order: "nf-core-fetchngs-methods-description": order: -1000 From 56e5143fbf3d14b944183df461e5c0903ac7faea Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 6 Oct 2023 12:25:48 +0200 Subject: [PATCH 508/852] update snapshots --- .github/workflows/ci.yml | 2 +- ...sra_default_parameters.nf.test => main.nf.test} | 0 ...t_parameters.nf.test.snap => main.nf.test.snap} | 14 +++++++++++++- .../sra_custom_ena_metadata_fields.nf.test.snap | 14 +++++++++++++- .../tests/sra_force_sratools_download.nf.test.snap | 14 +++++++++++++- .../sra_nf_core_pipeline_atacseq.nf.test.snap | 14 +++++++++++++- .../tests/sra_nf_core_pipeline_rnaseq.nf.test.snap | 14 +++++++++++++- .../sra_nf_core_pipeline_taxprofiler.nf.test.snap | 14 +++++++++++++- .../sra_nf_core_pipeline_viralrecon.nf.test.snap | 14 +++++++++++++- .../sra/tests/sra_skip_fastq_download.nf.test.snap | 14 +++++++++++++- 10 files changed, 105 insertions(+), 9 deletions(-) rename workflows/sra/tests/{sra_default_parameters.nf.test => main.nf.test} (100%) rename workflows/sra/tests/{sra_default_parameters.nf.test.snap => main.nf.test.snap} (75%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 30656e1a..68e2773c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,7 +15,7 @@ on: env: NXF_ANSI_LOG: false - NFTEST_VER: "0.8.0-rc2" + NFTEST_VER: "0.8.0" concurrency: group: "${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}" diff --git a/workflows/sra/tests/sra_default_parameters.nf.test b/workflows/sra/tests/main.nf.test similarity index 100% rename from workflows/sra/tests/sra_default_parameters.nf.test rename to workflows/sra/tests/main.nf.test diff --git a/workflows/sra/tests/sra_default_parameters.nf.test.snap b/workflows/sra/tests/main.nf.test.snap similarity index 75% rename from workflows/sra/tests/sra_default_parameters.nf.test.snap rename to workflows/sra/tests/main.nf.test.snap index edb662a2..955dd72a 100644 --- a/workflows/sra/tests/sra_default_parameters.nf.test.snap +++ b/workflows/sra/tests/main.nf.test.snap @@ -12,6 +12,12 @@ "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" ], "3": [ + [ + "multiqc_config.yml:md5,bb99e81ddd360988338c10ecbdbce65a", + "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" + ] + ], + "4": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", @@ -25,6 +31,12 @@ "mappings": [ "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" ], + "sample_mappings": [ + [ + "multiqc_config.yml:md5,bb99e81ddd360988338c10ecbdbce65a", + "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" + ] + ], "samplesheet": [ "samplesheet.csv:md5,c1104c2edfc663b103f79b0551450192" ], @@ -38,6 +50,6 @@ ] } ], - "timestamp": "2023-09-25T12:00:37.501679" + "timestamp": "2023-10-06T12:18:32.149462" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap index 7a7df129..143375ac 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap @@ -12,6 +12,12 @@ "id_mappings.csv:md5,e8a7d8effe4af1d999dc26cf92cf6621" ], "3": [ + [ + "multiqc_config.yml:md5,b1c25951b237552448e878f7c9dc4235", + "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" + ] + ], + "4": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", @@ -25,6 +31,12 @@ "mappings": [ "id_mappings.csv:md5,e8a7d8effe4af1d999dc26cf92cf6621" ], + "sample_mappings": [ + [ + "multiqc_config.yml:md5,b1c25951b237552448e878f7c9dc4235", + "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" + ] + ], "samplesheet": [ "samplesheet.csv:md5,d161b1a26b415a61064d8c558c9695c5" ], @@ -38,6 +50,6 @@ ] } ], - "timestamp": "2023-09-25T11:58:11.85816" + "timestamp": "2023-10-06T12:10:32.762201" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test.snap b/workflows/sra/tests/sra_force_sratools_download.nf.test.snap index 91eec432..5cb1876c 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test.snap +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test.snap @@ -12,6 +12,12 @@ "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" ], "3": [ + [ + "multiqc_config.yml:md5,bb99e81ddd360988338c10ecbdbce65a", + "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" + ] + ], + "4": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", @@ -24,6 +30,12 @@ "mappings": [ "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" ], + "sample_mappings": [ + [ + "multiqc_config.yml:md5,bb99e81ddd360988338c10ecbdbce65a", + "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" + ] + ], "samplesheet": [ "samplesheet.csv:md5,c1104c2edfc663b103f79b0551450192" ], @@ -36,6 +48,6 @@ ] } ], - "timestamp": "2023-09-25T12:08:28.465466" + "timestamp": "2023-10-06T12:24:57.695874" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap index 4560b05b..60cd3444 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap @@ -12,6 +12,12 @@ "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" ], "3": [ + [ + "multiqc_config.yml:md5,bb99e81ddd360988338c10ecbdbce65a", + "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" + ] + ], + "4": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", @@ -25,6 +31,12 @@ "mappings": [ "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" ], + "sample_mappings": [ + [ + "multiqc_config.yml:md5,bb99e81ddd360988338c10ecbdbce65a", + "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" + ] + ], "samplesheet": [ "samplesheet.csv:md5,46752dd6abac80b59573910f7ce4babe" ], @@ -38,6 +50,6 @@ ] } ], - "timestamp": "2023-09-25T11:53:25.411769" + "timestamp": "2023-10-06T12:03:19.401141" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap index 26357aa5..a0c20a40 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap @@ -12,6 +12,12 @@ "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" ], "3": [ + [ + "multiqc_config.yml:md5,bb99e81ddd360988338c10ecbdbce65a", + "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" + ] + ], + "4": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", @@ -25,6 +31,12 @@ "mappings": [ "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" ], + "sample_mappings": [ + [ + "multiqc_config.yml:md5,bb99e81ddd360988338c10ecbdbce65a", + "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" + ] + ], "samplesheet": [ "samplesheet.csv:md5,69117245b73776d6e4daecdbfdff9767" ], @@ -38,6 +50,6 @@ ] } ], - "timestamp": "2023-09-25T12:03:02.485911" + "timestamp": "2023-10-06T12:14:02.500312" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap index ff4b27df..d9d6ddee 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap @@ -12,6 +12,12 @@ "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" ], "3": [ + [ + "multiqc_config.yml:md5,bb99e81ddd360988338c10ecbdbce65a", + "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" + ] + ], + "4": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", @@ -25,6 +31,12 @@ "mappings": [ "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" ], + "sample_mappings": [ + [ + "multiqc_config.yml:md5,bb99e81ddd360988338c10ecbdbce65a", + "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" + ] + ], "samplesheet": [ "samplesheet.csv:md5,0705e78609390cc464c2fb10051178bc" ], @@ -38,6 +50,6 @@ ] } ], - "timestamp": "2023-09-25T11:55:48.759498" + "timestamp": "2023-10-06T12:07:01.184728" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap index 4b38d6a1..c3e9ae8b 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap @@ -12,6 +12,12 @@ "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" ], "3": [ + [ + "multiqc_config.yml:md5,bb99e81ddd360988338c10ecbdbce65a", + "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" + ] + ], + "4": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", @@ -25,6 +31,12 @@ "mappings": [ "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" ], + "sample_mappings": [ + [ + "multiqc_config.yml:md5,bb99e81ddd360988338c10ecbdbce65a", + "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" + ] + ], "samplesheet": [ "samplesheet.csv:md5,c1104c2edfc663b103f79b0551450192" ], @@ -38,6 +50,6 @@ ] } ], - "timestamp": "2023-09-25T11:50:52.373496" + "timestamp": "2023-10-06T11:59:31.7356" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap b/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap index 91a10c87..c137d853 100644 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap @@ -12,6 +12,12 @@ "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" ], "3": [ + [ + "multiqc_config.yml:md5,bb99e81ddd360988338c10ecbdbce65a", + "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" + ] + ], + "4": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd", @@ -23,6 +29,12 @@ "mappings": [ "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" ], + "sample_mappings": [ + [ + "multiqc_config.yml:md5,bb99e81ddd360988338c10ecbdbce65a", + "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" + ] + ], "samplesheet": [ "samplesheet.csv:md5,b1636e896008b96044d352a0757a390b" ], @@ -34,6 +46,6 @@ ] } ], - "timestamp": "2023-09-25T11:03:28.968158" + "timestamp": "2023-10-06T12:18:48.477246" } } \ No newline at end of file From 3c011b1f580c2f2b4c4748ccbba96e90f2cf5891 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 6 Oct 2023 12:14:14 +0100 Subject: [PATCH 509/852] Minor pre-release tweaks and bug fixes --- lib/WorkflowSra.groovy | 9 +++++---- main.nf | 41 ++++++++++++++++++++++----------------- workflows/sra/main.nf | 8 ++------ workflows/synapse/main.nf | 4 +++- 4 files changed, 33 insertions(+), 29 deletions(-) diff --git a/lib/WorkflowSra.groovy b/lib/WorkflowSra.groovy index 3c092a6f..8b17a2c1 100755 --- a/lib/WorkflowSra.groovy +++ b/lib/WorkflowSra.groovy @@ -9,11 +9,12 @@ class WorkflowSra { // // Check and validate parameters // - public static void initialise(params, valid_params) { + public static void initialise(params) { // Check minimal ENA fields are provided to download FastQ files - def ena_metadata_fields = params.ena_metadata_fields ? params.ena_metadata_fields.split(',').collect{ it.trim().toLowerCase() } : valid_params['ena_metadata_fields'] - if (!ena_metadata_fields.containsAll(valid_params['ena_metadata_fields'])) { - Nextflow.error("Invalid option: '${params.ena_metadata_fields}'. Minimally required fields for '--ena_metadata_fields': '${valid_params['ena_metadata_fields'].join(',')}'") + def valid_ena_metadata_fields = ['run_accession', 'experiment_accession', 'library_layout', 'fastq_ftp', 'fastq_md5'] + def ena_metadata_fields = params.ena_metadata_fields ? params.ena_metadata_fields.split(',').collect{ it.trim().toLowerCase() } : valid_ena_metadata_fields + if (!ena_metadata_fields.containsAll(valid_ena_metadata_fields)) { + Nextflow.error("Invalid option: '${params.ena_metadata_fields}'. Minimally required fields for '--ena_metadata_fields': '${valid_ena_metadata_fields.join(',')}'") } } diff --git a/main.nf b/main.nf index 7de31c2c..3afd60db 100644 --- a/main.nf +++ b/main.nf @@ -19,35 +19,25 @@ nextflow.enable.dsl = 2 include { paramsHelp; paramsSummaryLog; validateParameters } from 'plugin/nf-validation' +// Print parameter summary log to screen def logo = NfcoreTemplate.logo(workflow, params.monochrome_logs) def citation = '\n' + WorkflowMain.citation(workflow) + '\n' - -// Print parameter summary log to screen -log.info logo + paramsSummaryLog(workflow) + citation - -// Print help message if needed +def String command = "nextflow run ${workflow.manifest.name} --input id.csv -profile docker" if (params.help) { - def String command = "nextflow run ${workflow.manifest.name} --input id.csv -profile docker" log.info logo + paramsHelp(command) + citation + NfcoreTemplate.dashedLine(params.monochrome_logs) System.exit(0) -} - -// Validate input parameters -if (params.validate_params) { - validateParameters() +} else { + log.info logo + paramsSummaryLog(workflow) + citation + NfcoreTemplate.dashedLine(params.monochrome_logs) } // Check if --input file is empty ch_input = file(params.input, checkIfExists: true) if (ch_input.isEmpty()) { error("File provided with --input is empty: ${ch_input.getName()}!") } -// Read in ids from --input file -Channel - .from(file(params.input, checkIfExists: true)) - .splitCsv(header:false, sep:'', strip:true) - .map { it[0] } - .unique() - .set { ch_ids } +// Validate input parameters +if (params.validate_params) { + validateParameters() +} // Auto-detect input id type def input_type = '' @@ -58,10 +48,19 @@ if (WorkflowMain.isSraId(ch_input)) { } else { error('Ids provided via --input not recognised please make sure they are either SRA / ENA / GEO / DDBJ or Synapse ids!') } + if (params.input_type != input_type) { error("Ids auto-detected as ${input_type}. Please provide '--input_type ${input_type}' as a parameter to the pipeline!") } +// Read in ids from --input file +Channel + .from(file(params.input, checkIfExists: true)) + .splitCsv(header:false, sep:'', strip:true) + .map { it[0] } + .unique() + .set { ch_ids } + /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ IMPORT WORKFLOWS @@ -71,6 +70,12 @@ if (params.input_type != input_type) { if (params.input_type == 'sra') include { SRA } from './workflows/sra' if (params.input_type == 'synapse') include { SYNAPSE } from './workflows/synapse' +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + NAMED WORKFLOWS FOR PIPELINE +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + // // WORKFLOW: Run main nf-core/fetchngs analysis pipeline depending on type of identifier provided // diff --git a/workflows/sra/main.nf b/workflows/sra/main.nf index e393b726..6b2ce98b 100644 --- a/workflows/sra/main.nf +++ b/workflows/sra/main.nf @@ -4,14 +4,11 @@ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -include { paramsSummaryLog; paramsSummaryMap } from 'plugin/nf-validation' +include { paramsSummaryMap } from 'plugin/nf-validation' -def logo = NfcoreTemplate.logo(workflow, params.monochrome_logs) -def citation = '\n' + WorkflowMain.citation(workflow) + '\n' def summary_params = paramsSummaryMap(workflow) -// Print parameter summary log to screen -log.info logo + paramsSummaryLog(workflow) + citation +WorkflowSra.initialise(params) /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -33,7 +30,6 @@ include { MULTIQC_MAPPINGS_CONFIG } from '../../modules/local/multiqc_mappings_c */ include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../../modules/nf-core/custom/dumpsoftwareversions/main' - include { FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS } from '../../subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/main' /* diff --git a/workflows/synapse/main.nf b/workflows/synapse/main.nf index 4f015e0e..abe7cb22 100644 --- a/workflows/synapse/main.nf +++ b/workflows/synapse/main.nf @@ -4,7 +4,9 @@ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -def summary_params = NfcoreSchema.paramsSummaryMap(workflow, params) +include { paramsSummaryMap } from 'plugin/nf-validation' + +def summary_params = paramsSummaryMap(workflow) // Create channel for synapse config if (params.synapse_config) { From a9e5646e60a24f59346392d7acc657f8efcd29e0 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 6 Oct 2023 17:13:28 +0100 Subject: [PATCH 510/852] Fix #173 --- CHANGELOG.md | 14 ++++++++++++++ modules.json | 6 +++--- modules/nf-core/sratools/fasterqdump/main.nf | 8 ++++---- modules/nf-core/sratools/prefetch/main.nf | 6 +++--- .../prefetch/templates/retry_with_backoff.sh | 4 +--- .../meta.yml | 2 +- 6 files changed, 26 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e85a5564..019b46bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,15 +12,29 @@ Special thanks to the following for their contributions to the release: - [Adam Talbot](https://github.com/adamrtalbot) - [Harshil Patel](https://github.com/drpatelh) - [Maxime Garcia](https://github.com/maxulysse) +- [Rob Syme](https://github.com/robsyme) Thank you to everyone else that has contributed by reporting bugs, enhancements or in any other way, shape or form. ### Enhancements & fixes +- [#173](https://github.com/nf-core/fetchngs/issues/173) - Add compatibility for sralite files - [PR #205](https://github.com/nf-core/fetchngs/pull/205) - Rename all local modules, workflows and remove `public_aws_ecr profile` - [PR #206](https://github.com/nf-core/fetchngs/pull/206) - CI improvments and code cleanup - [PR #208](https://github.com/nf-core/fetchngs/pull/208) - Template update with nf-core/tools 2.10 +### Software dependencies + +| Dependency | Old version | New version | +| --------------- | ----------- | ----------- | +| `sra-tools` | 2.11.0 | 3.0.8 | + +> **NB:** Dependency has been **updated** if both old and new version information is present. +> +> **NB:** Dependency has been **added** if just the new version information is present. +> +> **NB:** Dependency has been **removed** if new version information isn't present. + ## [[1.10.0](https://github.com/nf-core/fetchngs/releases/tag/1.10.0)] - 2023-05-16 ### Credits diff --git a/modules.json b/modules.json index ab610dfb..6dd402db 100644 --- a/modules.json +++ b/modules.json @@ -17,12 +17,12 @@ }, "sratools/fasterqdump": { "branch": "master", - "git_sha": "6712754854ae2832abfff3f0800cdb4a6a60bfca", + "git_sha": "4d9951c6c9c4c19ea944bb73149caf9d3cb1f2fc", "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] }, "sratools/prefetch": { "branch": "master", - "git_sha": "6712754854ae2832abfff3f0800cdb4a6a60bfca", + "git_sha": "4d9951c6c9c4c19ea944bb73149caf9d3cb1f2fc", "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] } } @@ -31,7 +31,7 @@ "nf-core": { "fastq_download_prefetch_fasterqdump_sratools": { "branch": "master", - "git_sha": "6712754854ae2832abfff3f0800cdb4a6a60bfca", + "git_sha": "dedc0e31087f3306101c38835d051bf49789445a", "installed_by": ["subworkflows"] } } diff --git a/modules/nf-core/sratools/fasterqdump/main.nf b/modules/nf-core/sratools/fasterqdump/main.nf index 2d9090e2..2c5cc8f6 100644 --- a/modules/nf-core/sratools/fasterqdump/main.nf +++ b/modules/nf-core/sratools/fasterqdump/main.nf @@ -2,10 +2,10 @@ process SRATOOLS_FASTERQDUMP { tag "$meta.id" label 'process_medium' - conda "bioconda::sra-tools=2.11.0 conda-forge::pigz=2.6" + conda "bioconda::sra-tools=3.0.8 conda-forge::pigz=2.6" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:6a9ff0e76ec016c3d0d27e0c0d362339f2d787e6-0' : - 'biocontainers/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:6a9ff0e76ec016c3d0d27e0c0d362339f2d787e6-0' }" + 'https://depot.galaxyproject.org/singularity/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:2f4a4c900edd6801ff0068c2b3048b4459d119eb-0' : + 'biocontainers/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:2f4a4c900edd6801ff0068c2b3048b4459d119eb-0' }" input: tuple val(meta), path(sra) @@ -33,7 +33,7 @@ process SRATOOLS_FASTERQDUMP { --threads $task.cpus \\ --outfile $outfile \\ ${key_file} \\ - ${sra.name} + ${sra} pigz \\ $args2 \\ diff --git a/modules/nf-core/sratools/prefetch/main.nf b/modules/nf-core/sratools/prefetch/main.nf index ba7be4bd..fb226962 100644 --- a/modules/nf-core/sratools/prefetch/main.nf +++ b/modules/nf-core/sratools/prefetch/main.nf @@ -2,10 +2,10 @@ process SRATOOLS_PREFETCH { tag "$id" label 'process_low' - conda "bioconda::sra-tools=2.11.0" + conda "bioconda::sra-tools=3.0.8" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/sra-tools:2.11.0--pl5321ha49a11a_3' : - 'biocontainers/sra-tools:2.11.0--pl5321ha49a11a_3' }" + 'https://depot.galaxyproject.org/singularity/sra-tools:3.0.8--h9f5acd7_0' : + 'biocontainers/sra-tools:3.0.8--h9f5acd7_0' }" input: tuple val(meta), val(id) diff --git a/modules/nf-core/sratools/prefetch/templates/retry_with_backoff.sh b/modules/nf-core/sratools/prefetch/templates/retry_with_backoff.sh index e08dbb6a..a72a4bfb 100755 --- a/modules/nf-core/sratools/prefetch/templates/retry_with_backoff.sh +++ b/modules/nf-core/sratools/prefetch/templates/retry_with_backoff.sh @@ -47,9 +47,7 @@ retry_with_backoff !{args2} \ !{args} \ !{id} -[ -f !{id}.sralite ] && { mkdir -p !{id}; mv "!{id}.sralite" !{id}/; } - -vdb-validate !{id} +[ -f !{id}.sralite ] && vdb-validate !{id}.sralite || vdb-validate !{id} cat <<-END_VERSIONS > versions.yml "!{task.process}": diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/meta.yml b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/meta.yml index 6ff9442b..6a36b225 100644 --- a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/meta.yml +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/meta.yml @@ -8,7 +8,7 @@ keywords: - fastq - prefetch - fasterq-dump -modules: +components: - custom/sratoolsncbisettings - sratools/prefetch - sratools/fasterqdump From ec4c8fef344bcb2893fc0cd84df0ce7ca6b2b2c9 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 6 Oct 2023 17:15:37 +0100 Subject: [PATCH 511/852] Fix prettier --- CHANGELOG.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 019b46bd..ce1ddae0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,9 +25,9 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements ### Software dependencies -| Dependency | Old version | New version | -| --------------- | ----------- | ----------- | -| `sra-tools` | 2.11.0 | 3.0.8 | +| Dependency | Old version | New version | +| ----------- | ----------- | ----------- | +| `sra-tools` | 2.11.0 | 3.0.8 | > **NB:** Dependency has been **updated** if both old and new version information is present. > From f689be7aa466dfdd4842ce5ffcd841fa6c5109cc Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 8 Oct 2023 16:47:06 +0100 Subject: [PATCH 512/852] Bump pipeline version to 1.11.0dev --- CHANGELOG.md | 4 ++++ assets/multiqc_config.yml | 4 ++-- nextflow.config | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4a33776a..c500efcc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unpublished Version / DEV] + +### Enhancements & fixes + ## [[1.10.1](https://github.com/nf-core/fetchngs/releases/tag/1.10.1)] - 2023-10-08 ### Credits diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index bafbf577..a8974f98 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -1,7 +1,7 @@ report_comment: > - This report has been generated by the nf-core/fetchngs + This report has been generated by the nf-core/fetchngs analysis pipeline. For information about how to interpret these results, please see the - documentation. + documentation. report_section_order: "nf-core-fetchngs-methods-description": order: -1000 diff --git a/nextflow.config b/nextflow.config index 3877ed26..912ce43c 100644 --- a/nextflow.config +++ b/nextflow.config @@ -220,7 +220,7 @@ manifest { description = """Pipeline to fetch metadata and raw FastQ files from public databases""" mainScript = 'main.nf' nextflowVersion = '!>=23.04.0' - version = '1.10.1' + version = '1.11.0dev' doi = 'https://doi.org/10.5281/zenodo.5070524' } From 524ebe92c5076ae70be4634a503c9593d4d28a00 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 8 Oct 2023 20:20:24 +0200 Subject: [PATCH 513/852] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ce1ddae0..4a33776a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [[1.10.1](https://github.com/nf-core/fetchngs/releases/tag/1.10.1)] - 2023-10-09 +## [[1.10.1](https://github.com/nf-core/fetchngs/releases/tag/1.10.1)] - 2023-10-08 ### Credits From b3d79dfa75875cd518d5bf2d3c93c929737d13d0 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 9 Oct 2023 09:59:25 +0200 Subject: [PATCH 514/852] fix conflicts + update initialise + code polish --- .prettierignore | 1 + README.md | 1 + conf/test.config | 2 + main.nf | 13 ++- modules.json | 2 +- nextflow.config | 1 - subworkflows/nf-core/initialise/main.nf | 124 +++++++++++++++++++++-- subworkflows/nf-core/initialise/meta.yml | 34 +++---- 8 files changed, 143 insertions(+), 35 deletions(-) diff --git a/.prettierignore b/.prettierignore index 437d763d..bd464e26 100644 --- a/.prettierignore +++ b/.prettierignore @@ -5,6 +5,7 @@ slackreport.json work/ data/ results/ +.nf-test/ .DS_Store testing/ testing* diff --git a/README.md b/README.md index de90338a..02be6056 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ [![GitHub Actions CI Status](https://github.com/nf-core/fetchngs/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/fetchngs/actions?query=workflow%3A%22nf-core+CI%22) [![GitHub Actions Linting Status](https://github.com/nf-core/fetchngs/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/fetchngs/actions?query=workflow%3A%22nf-core+linting%22) [![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/fetchngs/results) +[![nf-test](https://img.shields.io/badge/tested_with-nf--test-337ab7.svg)](https://github.com/askimed/nf-test) [![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.5070524-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.5070524) [![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A523.04.0-23aa62.svg)](https://www.nextflow.io/) diff --git a/conf/test.config b/conf/test.config index 3c58e9cf..cb77f578 100644 --- a/conf/test.config +++ b/conf/test.config @@ -21,4 +21,6 @@ params { // Input data input = 'https://raw.githubusercontent.com/nf-core/test-datasets/fetchngs/sra_ids_test.csv' + + validationSchemaIgnoreParams = 'test_data_base,merge_samplesheet_ids,fastq_ftp_ids,test_data' } diff --git a/main.nf b/main.nf index 428273c4..b7445e20 100644 --- a/main.nf +++ b/main.nf @@ -21,10 +21,13 @@ nextflow.enable.dsl = 2 ch_input = file(params.input, checkIfExists: true) if (ch_input.isEmpty()) { error("File provided with --input is empty: ${ch_input.getName()}!") } -// Validate input parameters -if (params.validate_params) { - validateParameters() -} +// Read in ids from --input file +Channel + .from(file(params.input, checkIfExists: true)) + .splitCsv(header:false, sep:'', strip:true) + .map { it[0] } + .unique() + .set { ch_ids } // Auto-detect input id type def input_type = '' @@ -85,7 +88,7 @@ if (params.input_type == 'synapse') include { SYNAPSE } from './workflows/synaps // WORKFLOW: Run main nf-core/fetchngs analysis pipeline depending on type of identifier provided // workflow NFCORE_FETCHNGS { - INITIALISE ( params.version, params.help, params.valid_params ) + INITIALISE ( params.version, params.help, params.validate_params, true ) ch_versions = Channel.empty() diff --git a/modules.json b/modules.json index 7bfa0ad2..aebf22de 100644 --- a/modules.json +++ b/modules.json @@ -36,7 +36,7 @@ }, "initialise": { "branch": "master", - "git_sha": "7b55a4631bebd1cf827a448d0b70386681fea475", + "git_sha": "8340fb3779fe3233a455aeee1f60ceb203434ab6", "installed_by": ["subworkflows"] } } diff --git a/nextflow.config b/nextflow.config index 8e333cba..8f6f9721 100644 --- a/nextflow.config +++ b/nextflow.config @@ -49,7 +49,6 @@ params { // Schema validation default options validationFailUnrecognisedParams = false validationLenientMode = false - validationSchemaIgnoreParams = 'genomes' validationShowHiddenParams = false validate_params = true diff --git a/subworkflows/nf-core/initialise/main.nf b/subworkflows/nf-core/initialise/main.nf index 0cbd3799..31fb1b4c 100644 --- a/subworkflows/nf-core/initialise/main.nf +++ b/subworkflows/nf-core/initialise/main.nf @@ -10,26 +10,34 @@ workflow INITIALISE { version // bool help // bool validate_params // bool + logo // bool main: - // Print workflow version and exit on --version - if (version) { - String version_string = "" + // Get version string for use with --version or printing to log when creating + String version_string = "" + + if (workflow.manifest.version) { + def prefix_v = workflow.manifest.version[0] != 'v' ? 'v' : '' + version_string += "${prefix_v}${workflow.manifest.version}" + } - if (workflow.manifest.version) { - def prefix_v = workflow.manifest.version[0] != 'v' ? 'v' : '' - version_string += "${prefix_v}${workflow.manifest.version}" - } + if (workflow.commitId) { + def git_shortsha = workflow.commitId.substring(0, 7) + version_string += "-g${git_shortsha}" + } - if (workflow.commitId) { - def git_shortsha = workflow.commitId.substring(0, 7) - version_string += "-g${git_shortsha}" - } + // Print workflow version and exit on --version + if (version) { log.info "${workflow.manifest.name} ${version_string}" System.exit(0) } + if ( logo ) { + log.info logo(workflow, params.monochrome_logs) + } + log.info "${workflow.manifest.name} ${version_string}" + // Print citation for nf-core def citation = "If you use ${workflow.manifest.name} for your analysis please cite:\n\n" + "* The nf-core framework\n" + @@ -66,3 +74,97 @@ workflow INITIALISE { summary_params } + +// +// ANSII Colours used for terminal logging +// +def logColours(Boolean monochrome_logs) { + Map colorcodes = [:] + + // Reset / Meta + colorcodes['reset'] = monochrome_logs ? '' : "\033[0m" + colorcodes['bold'] = monochrome_logs ? '' : "\033[1m" + colorcodes['dim'] = monochrome_logs ? '' : "\033[2m" + colorcodes['underlined'] = monochrome_logs ? '' : "\033[4m" + colorcodes['blink'] = monochrome_logs ? '' : "\033[5m" + colorcodes['reverse'] = monochrome_logs ? '' : "\033[7m" + colorcodes['hidden'] = monochrome_logs ? '' : "\033[8m" + + // Regular Colors + colorcodes['black'] = monochrome_logs ? '' : "\033[0;30m" + colorcodes['red'] = monochrome_logs ? '' : "\033[0;31m" + colorcodes['green'] = monochrome_logs ? '' : "\033[0;32m" + colorcodes['yellow'] = monochrome_logs ? '' : "\033[0;33m" + colorcodes['blue'] = monochrome_logs ? '' : "\033[0;34m" + colorcodes['purple'] = monochrome_logs ? '' : "\033[0;35m" + colorcodes['cyan'] = monochrome_logs ? '' : "\033[0;36m" + colorcodes['white'] = monochrome_logs ? '' : "\033[0;37m" + + // Bold + colorcodes['bblack'] = monochrome_logs ? '' : "\033[1;30m" + colorcodes['bred'] = monochrome_logs ? '' : "\033[1;31m" + colorcodes['bgreen'] = monochrome_logs ? '' : "\033[1;32m" + colorcodes['byellow'] = monochrome_logs ? '' : "\033[1;33m" + colorcodes['bblue'] = monochrome_logs ? '' : "\033[1;34m" + colorcodes['bpurple'] = monochrome_logs ? '' : "\033[1;35m" + colorcodes['bcyan'] = monochrome_logs ? '' : "\033[1;36m" + colorcodes['bwhite'] = monochrome_logs ? '' : "\033[1;37m" + + // Underline + colorcodes['ublack'] = monochrome_logs ? '' : "\033[4;30m" + colorcodes['ured'] = monochrome_logs ? '' : "\033[4;31m" + colorcodes['ugreen'] = monochrome_logs ? '' : "\033[4;32m" + colorcodes['uyellow'] = monochrome_logs ? '' : "\033[4;33m" + colorcodes['ublue'] = monochrome_logs ? '' : "\033[4;34m" + colorcodes['upurple'] = monochrome_logs ? '' : "\033[4;35m" + colorcodes['ucyan'] = monochrome_logs ? '' : "\033[4;36m" + colorcodes['uwhite'] = monochrome_logs ? '' : "\033[4;37m" + + // High Intensity + colorcodes['iblack'] = monochrome_logs ? '' : "\033[0;90m" + colorcodes['ired'] = monochrome_logs ? '' : "\033[0;91m" + colorcodes['igreen'] = monochrome_logs ? '' : "\033[0;92m" + colorcodes['iyellow'] = monochrome_logs ? '' : "\033[0;93m" + colorcodes['iblue'] = monochrome_logs ? '' : "\033[0;94m" + colorcodes['ipurple'] = monochrome_logs ? '' : "\033[0;95m" + colorcodes['icyan'] = monochrome_logs ? '' : "\033[0;96m" + colorcodes['iwhite'] = monochrome_logs ? '' : "\033[0;97m" + + // Bold High Intensity + colorcodes['biblack'] = monochrome_logs ? '' : "\033[1;90m" + colorcodes['bired'] = monochrome_logs ? '' : "\033[1;91m" + colorcodes['bigreen'] = monochrome_logs ? '' : "\033[1;92m" + colorcodes['biyellow'] = monochrome_logs ? '' : "\033[1;93m" + colorcodes['biblue'] = monochrome_logs ? '' : "\033[1;94m" + colorcodes['bipurple'] = monochrome_logs ? '' : "\033[1;95m" + colorcodes['bicyan'] = monochrome_logs ? '' : "\033[1;96m" + colorcodes['biwhite'] = monochrome_logs ? '' : "\033[1;97m" + + return colorcodes +} + +// +// Does what is says on the tin +// +def dashedLine(monochrome_logs) { + Map colors = logColours(monochrome_logs) + return "-${colors.dim}----------------------------------------------------${colors.reset}-" +} + +// +// nf-core logo +// +def logo(workflow, monochrome_logs) { + Map colors = logColours(monochrome_logs) + String.format( + """\n + ${dashedLine(monochrome_logs)} + ${colors.green},--.${colors.black}/${colors.green},-.${colors.reset} + ${colors.blue} ___ __ __ __ ___ ${colors.green}/,-._.--~\'${colors.reset} + ${colors.blue} |\\ | |__ __ / ` / \\ |__) |__ ${colors.yellow}} {${colors.reset} + ${colors.blue} | \\| | \\__, \\__/ | \\ |___ ${colors.green}\\`-._,-`-,${colors.reset} + ${colors.green}`._,._,\'${colors.reset} + ${dashedLine(monochrome_logs)} + """.stripIndent() + ) +} diff --git a/subworkflows/nf-core/initialise/meta.yml b/subworkflows/nf-core/initialise/meta.yml index 69596bb5..1d364847 100644 --- a/subworkflows/nf-core/initialise/meta.yml +++ b/subworkflows/nf-core/initialise/meta.yml @@ -6,28 +6,28 @@ keywords: - check - help - version -modules: +components: [] input: - version: - type: boolean - description: | - Structure: val(version) - Boolean to show the pipeline version and exit. + type: boolean + description: | + Structure: val(version) + Boolean to show the pipeline version and exit. - help: - type: boolean - description: | - Structure: val(help) - Boolean to show the pipeline help message and exit. + type: boolean + description: | + Structure: val(help) + Boolean to show the pipeline help message and exit. - validate_params: - type: boolean - description: | - Structure: val(validate_params) - Whether to validate the parameters prior to starting the pipeline. + type: boolean + description: | + Structure: val(validate_params) + Whether to validate the parameters prior to starting the pipeline. output: - summary_params: - type: value - description: | - Structure: val(summary_params) - A map of the parameters used in the pipeline. + type: value + description: | + Structure: val(summary_params) + A map of the parameters used in the pipeline. authors: - "@adamrtalbot" From e37fba215c02025b1a749fe1150edd27eb547c5b Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 9 Oct 2023 10:03:32 +0200 Subject: [PATCH 515/852] fix linting --- .nf-core.yml | 3 ++- modules.json | 26 +++++++++++++++++++------- nextflow.config | 1 + 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index 78f1faff..8d668011 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -8,6 +8,7 @@ lint: - conf/modules.config - lib/WorkflowFetchngs.groovy files_unchanged: + - .gitattributes + - .prettierignore - assets/sendmail_template.txt - lib/NfcoreTemplate.groovy - - .gitattributes diff --git a/modules.json b/modules.json index aebf22de..9f6805c1 100644 --- a/modules.json +++ b/modules.json @@ -8,22 +8,30 @@ "custom/dumpsoftwareversions": { "branch": "master", "git_sha": "05c280924b6c768d484c7c443dad5e605c4ff4b4", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "custom/sratoolsncbisettings": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] + "installed_by": [ + "fastq_download_prefetch_fasterqdump_sratools" + ] }, "sratools/fasterqdump": { "branch": "master", "git_sha": "4d9951c6c9c4c19ea944bb73149caf9d3cb1f2fc", - "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] + "installed_by": [ + "fastq_download_prefetch_fasterqdump_sratools" + ] }, "sratools/prefetch": { "branch": "master", "git_sha": "4d9951c6c9c4c19ea944bb73149caf9d3cb1f2fc", - "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] + "installed_by": [ + "fastq_download_prefetch_fasterqdump_sratools" + ] } } }, @@ -32,15 +40,19 @@ "fastq_download_prefetch_fasterqdump_sratools": { "branch": "master", "git_sha": "dedc0e31087f3306101c38835d051bf49789445a", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "initialise": { "branch": "master", "git_sha": "8340fb3779fe3233a455aeee1f60ceb203434ab6", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] } } } } } -} +} \ No newline at end of file diff --git a/nextflow.config b/nextflow.config index 8f6f9721..5ad350c9 100644 --- a/nextflow.config +++ b/nextflow.config @@ -50,6 +50,7 @@ params { validationFailUnrecognisedParams = false validationLenientMode = false validationShowHiddenParams = false + validationSchemaIgnoreParams = '' validate_params = true } From e6b7c71767a7f06fa37c8a1ec28d346d15667af6 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 9 Oct 2023 10:08:31 +0200 Subject: [PATCH 516/852] prettier --- modules.json | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/modules.json b/modules.json index 9f6805c1..aebf22de 100644 --- a/modules.json +++ b/modules.json @@ -8,30 +8,22 @@ "custom/dumpsoftwareversions": { "branch": "master", "git_sha": "05c280924b6c768d484c7c443dad5e605c4ff4b4", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "custom/sratoolsncbisettings": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "fastq_download_prefetch_fasterqdump_sratools" - ] + "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] }, "sratools/fasterqdump": { "branch": "master", "git_sha": "4d9951c6c9c4c19ea944bb73149caf9d3cb1f2fc", - "installed_by": [ - "fastq_download_prefetch_fasterqdump_sratools" - ] + "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] }, "sratools/prefetch": { "branch": "master", "git_sha": "4d9951c6c9c4c19ea944bb73149caf9d3cb1f2fc", - "installed_by": [ - "fastq_download_prefetch_fasterqdump_sratools" - ] + "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] } } }, @@ -40,19 +32,15 @@ "fastq_download_prefetch_fasterqdump_sratools": { "branch": "master", "git_sha": "dedc0e31087f3306101c38835d051bf49789445a", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "initialise": { "branch": "master", "git_sha": "8340fb3779fe3233a455aeee1f60ceb203434ab6", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] } } } } } -} \ No newline at end of file +} From b37087e7da4814eeca851826a62fe8d84724e81c Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 9 Oct 2023 11:40:58 +0200 Subject: [PATCH 517/852] use /tmp for nf-test tests --- .gitignore | 15 ++++++++------- nf-test.config | 2 +- workflows/sra/tests/main.nf.test.snap | 2 +- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index b1b5890a..267dd7d9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,12 @@ +*.pyc +.DS_Store .nextflow* -work/ +.nf-test.log +.nf-test/ data/ +nf-test results/ -.DS_Store -testing/ +test.xml testing* -*.pyc -.nf-test/ -nf-test -.nf-test.log +testing/ +work/ diff --git a/nf-test.config b/nf-test.config index 0799cb40..cb656b94 100644 --- a/nf-test.config +++ b/nf-test.config @@ -3,7 +3,7 @@ config { testsDir "." // nf-test directory including temporary files for each test - workDir ".nf-test" + workDir "/tmp" // location of library folder that is added automatically to the classpath libDir "lib/" diff --git a/workflows/sra/tests/main.nf.test.snap b/workflows/sra/tests/main.nf.test.snap index 955dd72a..d53f3de2 100644 --- a/workflows/sra/tests/main.nf.test.snap +++ b/workflows/sra/tests/main.nf.test.snap @@ -50,6 +50,6 @@ ] } ], - "timestamp": "2023-10-06T12:18:32.149462" + "timestamp": "2023-10-09T11:10:06.701286" } } \ No newline at end of file From cb6d4f34586d7ff0d54dfa3803cd2eebdb161175 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 9 Oct 2023 12:37:44 +0200 Subject: [PATCH 518/852] update snapshots --- .../sra/tests/sra_force_sratools_download.nf.test.snap | 6 +++--- .../sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap | 2 +- .../sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test.snap b/workflows/sra/tests/sra_force_sratools_download.nf.test.snap index 5cb1876c..a22fad41 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test.snap +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test.snap @@ -6,7 +6,7 @@ ], "1": [ - "samplesheet.csv:md5,c1104c2edfc663b103f79b0551450192" + "samplesheet.csv:md5,f582a7cf6b4a507e3ccbd2ebd134bd26" ], "2": [ "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" @@ -37,7 +37,7 @@ ] ], "samplesheet": [ - "samplesheet.csv:md5,c1104c2edfc663b103f79b0551450192" + "samplesheet.csv:md5,f582a7cf6b4a507e3ccbd2ebd134bd26" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", @@ -48,6 +48,6 @@ ] } ], - "timestamp": "2023-10-06T12:24:57.695874" + "timestamp": "2023-10-09T12:31:35.173406" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap index 60cd3444..3e26ff24 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap @@ -50,6 +50,6 @@ ] } ], - "timestamp": "2023-10-06T12:03:19.401141" + "timestamp": "2023-10-09T11:48:46.177797" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap index c3e9ae8b..cacb42cc 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap @@ -50,6 +50,6 @@ ] } ], - "timestamp": "2023-10-06T11:59:31.7356" + "timestamp": "2023-10-09T11:44:49.759545" } } \ No newline at end of file From 07b253567bb9701735fb12469f00fcf19c3d9818 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 10 Oct 2023 10:57:10 +0100 Subject: [PATCH 519/852] Remove nf-test files from .gitattributes --- .gitattributes | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitattributes b/.gitattributes index c1c17000..7a2dabc2 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,5 +1,4 @@ *.config linguist-language=nextflow *.nf.test linguist-language=nextflow -tests/**/*nf.test.snap linguist-generated modules/nf-core/** linguist-generated subworkflows/nf-core/** linguist-generated From 7169d6bf31a6ca86cd0ccfb6093549867873ab42 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 10 Oct 2023 10:57:31 +0100 Subject: [PATCH 520/852] Remove unused multiqc_config.yml --- assets/multiqc_config.yml | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 assets/multiqc_config.yml diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml deleted file mode 100644 index a8974f98..00000000 --- a/assets/multiqc_config.yml +++ /dev/null @@ -1,13 +0,0 @@ -report_comment: > - This report has been generated by the nf-core/fetchngs - analysis pipeline. For information about how to interpret these results, please see the - documentation. -report_section_order: - "nf-core-fetchngs-methods-description": - order: -1000 - software_versions: - order: -1001 - "nf-core-fetchngs-summary": - order: -1002 - -export_plots: true From 728360ce4c69f956ea11cc8cc6dd2b8456558d3e Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Tue, 10 Oct 2023 12:39:36 +0200 Subject: [PATCH 521/852] Update main.nf --- main.nf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/main.nf b/main.nf index b7445e20..d6c239a0 100644 --- a/main.nf +++ b/main.nf @@ -17,6 +17,8 @@ nextflow.enable.dsl = 2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ +include { paramsHelp; paramsSummaryLog; validateParameters } from 'plugin/nf-validation' + // Check if --input file is empty ch_input = file(params.input, checkIfExists: true) if (ch_input.isEmpty()) { error("File provided with --input is empty: ${ch_input.getName()}!") } From 4d9a38dcdc42fbbe341ff6860ff57bbbff4ef564 Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Tue, 10 Oct 2023 12:42:22 +0200 Subject: [PATCH 522/852] Apply suggestions from code review --- .gitignore | 1 - .nf-core.yml | 1 - .prettierignore | 1 - 3 files changed, 3 deletions(-) diff --git a/.gitignore b/.gitignore index 267dd7d9..ff233cdb 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,6 @@ .DS_Store .nextflow* .nf-test.log -.nf-test/ data/ nf-test results/ diff --git a/.nf-core.yml b/.nf-core.yml index 8d668011..143f4821 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -9,6 +9,5 @@ lint: - lib/WorkflowFetchngs.groovy files_unchanged: - .gitattributes - - .prettierignore - assets/sendmail_template.txt - lib/NfcoreTemplate.groovy diff --git a/.prettierignore b/.prettierignore index bd464e26..437d763d 100644 --- a/.prettierignore +++ b/.prettierignore @@ -5,7 +5,6 @@ slackreport.json work/ data/ results/ -.nf-test/ .DS_Store testing/ testing* From 56abd32f7a81e812b449b79bd1abf960448387fa Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Tue, 10 Oct 2023 14:22:14 +0200 Subject: [PATCH 523/852] Apply suggestions from code review --- .nf-core.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.nf-core.yml b/.nf-core.yml index 143f4821..bb27a4e9 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -9,5 +9,6 @@ lint: - lib/WorkflowFetchngs.groovy files_unchanged: - .gitattributes + - .gitignore - assets/sendmail_template.txt - lib/NfcoreTemplate.groovy From 538cc2339fd7be0748cf93f2b5693054faf8c593 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Tue, 10 Oct 2023 14:47:47 +0100 Subject: [PATCH 524/852] Per module/subworkflow tags.yml file Changes: - Add separate tags.yml files for all modules and subworkflows that featured in the original tags.yml file. - Removes old tags.yml file - Adds github action to combine all tags.yml files for pattern matching using yq --- .github/workflows/ci.yml | 9 ++++++++- .../local/multiqc_mappings_config/tests/tags.yml | 2 ++ modules/local/sra_fastq_ftp/tests/tags.yml | 2 ++ modules/local/sra_ids_to_runinfo/tests/tags.yml | 2 ++ .../local/sra_merge_samplesheet/tests/tags.yml | 2 ++ modules/local/sra_runinfo_to_ftp/tests/tags.yml | 2 ++ modules/local/sra_to_samplesheet/tests/tags.yml | 2 ++ {.github => workflows/sra/tests}/tags.yml | 15 --------------- 8 files changed, 20 insertions(+), 16 deletions(-) create mode 100644 modules/local/multiqc_mappings_config/tests/tags.yml create mode 100644 modules/local/sra_fastq_ftp/tests/tags.yml create mode 100644 modules/local/sra_ids_to_runinfo/tests/tags.yml create mode 100644 modules/local/sra_merge_samplesheet/tests/tags.yml create mode 100644 modules/local/sra_runinfo_to_ftp/tests/tags.yml create mode 100644 modules/local/sra_to_samplesheet/tests/tags.yml rename {.github => workflows/sra/tests}/tags.yml (83%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 68e2773c..9273f90e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -30,10 +30,17 @@ jobs: tags: ${{ steps.filter.outputs.changes }} steps: - uses: actions/checkout@v3 + - name: Combine all tags.yml files + id: get_username + uses: mikefarah/yq@master + with: + cmd: find . -name "tags.yml" -type f -exec yq ea '. as $item ireduce ({}; . * $item )' {} + > tags.yml + - name: debug + run: cat tags.yml - uses: dorny/paths-filter@v2 id: filter with: - filters: ".github/tags.yml" + filters: "tags.yml" define_nxf_versions: name: Choose nextflow versions to test against depending on target branch diff --git a/modules/local/multiqc_mappings_config/tests/tags.yml b/modules/local/multiqc_mappings_config/tests/tags.yml new file mode 100644 index 00000000..595e2e31 --- /dev/null +++ b/modules/local/multiqc_mappings_config/tests/tags.yml @@ -0,0 +1,2 @@ +multiqc_mappings_config: + - modules/local/multiqc_mappings_config/** diff --git a/modules/local/sra_fastq_ftp/tests/tags.yml b/modules/local/sra_fastq_ftp/tests/tags.yml new file mode 100644 index 00000000..e7474bef --- /dev/null +++ b/modules/local/sra_fastq_ftp/tests/tags.yml @@ -0,0 +1,2 @@ +sra_fastq_ftp: + - modules/local/sra_fastq_ftp/** diff --git a/modules/local/sra_ids_to_runinfo/tests/tags.yml b/modules/local/sra_ids_to_runinfo/tests/tags.yml new file mode 100644 index 00000000..63ea7db3 --- /dev/null +++ b/modules/local/sra_ids_to_runinfo/tests/tags.yml @@ -0,0 +1,2 @@ +sra_ids_to_runinfo: + - modules/local/sra_ids_to_runinfo/** diff --git a/modules/local/sra_merge_samplesheet/tests/tags.yml b/modules/local/sra_merge_samplesheet/tests/tags.yml new file mode 100644 index 00000000..a4292b70 --- /dev/null +++ b/modules/local/sra_merge_samplesheet/tests/tags.yml @@ -0,0 +1,2 @@ +sra_merge_samplesheet: + - modules/local/sra_merge_samplesheet/** diff --git a/modules/local/sra_runinfo_to_ftp/tests/tags.yml b/modules/local/sra_runinfo_to_ftp/tests/tags.yml new file mode 100644 index 00000000..0987a1e6 --- /dev/null +++ b/modules/local/sra_runinfo_to_ftp/tests/tags.yml @@ -0,0 +1,2 @@ +sra_runinfo_to_ftp: + - modules/local/sra_runinfo_to_ftp/** diff --git a/modules/local/sra_to_samplesheet/tests/tags.yml b/modules/local/sra_to_samplesheet/tests/tags.yml new file mode 100644 index 00000000..2f2d527b --- /dev/null +++ b/modules/local/sra_to_samplesheet/tests/tags.yml @@ -0,0 +1,2 @@ +sra_to_samplesheet: + - modules/local/sra_to_samplesheet/** diff --git a/.github/tags.yml b/workflows/sra/tests/tags.yml similarity index 83% rename from .github/tags.yml rename to workflows/sra/tests/tags.yml index 03569f78..52c3e591 100644 --- a/.github/tags.yml +++ b/workflows/sra/tests/tags.yml @@ -1,18 +1,3 @@ -# local modules -multiqc_mappings_config: - - modules/local/multiqc_mappings_config/** -sra_fastq_ftp: - - modules/local/sra_fastq_ftp/** -sra_ids_to_runinfo: - - modules/local/sra_ids_to_runinfo/** -sra_merge_samplesheet: - - modules/local/sra_merge_samplesheet/** -sra_runinfo_to_ftp: - - modules/local/sra_runinfo_to_ftp/** -sra_to_samplesheet: - - modules/local/sra_to_samplesheet/** - -# workflow: sra sra_custom_ena_metadata_fields: - modules/local/sra_ids_to_runinfo/** - modules/local/sra_runinfo_to_ftp/** From ff7fa147b662aed6949b278271784a8da8478a4b Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Tue, 10 Oct 2023 14:55:34 +0100 Subject: [PATCH 525/852] Escape single quotes --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9273f90e..63dede75 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -34,7 +34,7 @@ jobs: id: get_username uses: mikefarah/yq@master with: - cmd: find . -name "tags.yml" -type f -exec yq ea '. as $item ireduce ({}; . * $item )' {} + > tags.yml + cmd: find . -name "tags.yml" -type f -exec yq ea \'. as $item ireduce ({}; . * $item )\' {} + > tags.yml - name: debug run: cat tags.yml - uses: dorny/paths-filter@v2 From d15e6bec17185b5d9591b8bcab4641fad50df5a7 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Tue, 10 Oct 2023 15:02:54 +0100 Subject: [PATCH 526/852] quote command line --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 63dede75..13b86c93 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -34,7 +34,7 @@ jobs: id: get_username uses: mikefarah/yq@master with: - cmd: find . -name "tags.yml" -type f -exec yq ea \'. as $item ireduce ({}; . * $item )\' {} + > tags.yml + cmd: "find . -name 'tags.yml' -type f -exec yq ea '. as $item ireduce ({}; . * $item )' {} + > tags.yml" - name: debug run: cat tags.yml - uses: dorny/paths-filter@v2 From 264be7a9abe09c6d4862dec05b3126941f2831a6 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Tue, 10 Oct 2023 15:06:33 +0100 Subject: [PATCH 527/852] escape AND quote --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 13b86c93..c1ba3574 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -34,7 +34,7 @@ jobs: id: get_username uses: mikefarah/yq@master with: - cmd: "find . -name 'tags.yml' -type f -exec yq ea '. as $item ireduce ({}; . * $item )' {} + > tags.yml" + cmd: "find . -name 'tags.yml' -type f -exec yq ea '. as $item ireduce (\\{\\}; . * $item )' {} + > tags.yml" - name: debug run: cat tags.yml - uses: dorny/paths-filter@v2 From 4f1e6388983c4674a7b3d28cf4b85fec35e4ac75 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Tue, 10 Oct 2023 15:20:37 +0100 Subject: [PATCH 528/852] Trying to use cat --- .github/workflows/ci.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c1ba3574..85e53716 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -32,15 +32,13 @@ jobs: - uses: actions/checkout@v3 - name: Combine all tags.yml files id: get_username - uses: mikefarah/yq@master - with: - cmd: "find . -name 'tags.yml' -type f -exec yq ea '. as $item ireduce (\\{\\}; . * $item )' {} + > tags.yml" + run: find . -name "tags.yml" -not -path "./.github/*" -exec cat {} + > .github/tags.yml - name: debug run: cat tags.yml - uses: dorny/paths-filter@v2 id: filter with: - filters: "tags.yml" + filters: ".github/tags.yml" define_nxf_versions: name: Choose nextflow versions to test against depending on target branch From 051588c227232ae0a59872eece21b1e4b2e96d3a Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Tue, 10 Oct 2023 15:21:35 +0100 Subject: [PATCH 529/852] fixup --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 85e53716..436b61a5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -34,7 +34,7 @@ jobs: id: get_username run: find . -name "tags.yml" -not -path "./.github/*" -exec cat {} + > .github/tags.yml - name: debug - run: cat tags.yml + run: cat .github/tags.yml - uses: dorny/paths-filter@v2 id: filter with: From f81daf8e922b14ee500619d16da37ad98defe572 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 11 Oct 2023 12:02:14 +0100 Subject: [PATCH 530/852] Remove all files in lib directory --- lib/NfcoreTemplate.groovy | 330 ------------------------------ lib/Utils.groovy | 47 ----- lib/WorkflowMain.groovy | 216 ------------------- lib/nfcore_external_java_deps.jar | Bin 2291171 -> 0 bytes 4 files changed, 593 deletions(-) delete mode 100755 lib/NfcoreTemplate.groovy delete mode 100644 lib/Utils.groovy delete mode 100755 lib/WorkflowMain.groovy delete mode 100644 lib/nfcore_external_java_deps.jar diff --git a/lib/NfcoreTemplate.groovy b/lib/NfcoreTemplate.groovy deleted file mode 100755 index ed58a7ae..00000000 --- a/lib/NfcoreTemplate.groovy +++ /dev/null @@ -1,330 +0,0 @@ -// -// This file holds several functions used within the nf-core pipeline template. -// - -import org.yaml.snakeyaml.Yaml -import groovy.json.JsonOutput - -class NfcoreTemplate { - - // - // Check AWS Batch related parameters have been specified correctly - // - public static void awsBatch(workflow, params) { - if (workflow.profile.contains('awsbatch')) { - // Check params.awsqueue and params.awsregion have been set if running on AWSBatch - assert (params.awsqueue && params.awsregion) : "Specify correct --awsqueue and --awsregion parameters on AWSBatch!" - // Check outdir paths to be S3 buckets if running on AWSBatch - assert params.outdir.startsWith('s3:') : "Outdir not on S3 - specify S3 Bucket to run on AWSBatch!" - } - } - - // - // Warn if a -profile or Nextflow config has not been provided to run the pipeline - // - public static void checkConfigProvided(workflow, log) { - if (workflow.profile == 'standard' && workflow.configFiles.size() <= 1) { - log.warn "[$workflow.manifest.name] You are attempting to run the pipeline without any custom configuration!\n\n" + - "This will be dependent on your local compute environment but can be achieved via one or more of the following:\n" + - " (1) Using an existing pipeline profile e.g. `-profile docker` or `-profile singularity`\n" + - " (2) Using an existing nf-core/configs for your Institution e.g. `-profile crick` or `-profile uppmax`\n" + - " (3) Using your own local custom config e.g. `-c /path/to/your/custom.config`\n\n" + - "Please refer to the quick start section and usage docs for the pipeline.\n " - } - } - - // - // Generate version string - // - public static String version(workflow) { - String version_string = "" - - if (workflow.manifest.version) { - def prefix_v = workflow.manifest.version[0] != 'v' ? 'v' : '' - version_string += "${prefix_v}${workflow.manifest.version}" - } - - if (workflow.commitId) { - def git_shortsha = workflow.commitId.substring(0, 7) - version_string += "-g${git_shortsha}" - } - - return version_string - } - - // - // Construct and send completion email - // - public static void email(workflow, params, summary_params, projectDir, log) { - - // Set up the e-mail variables - def subject = "[$workflow.manifest.name] Successful: $workflow.runName" - if (!workflow.success) { - subject = "[$workflow.manifest.name] FAILED: $workflow.runName" - } - - def summary = [:] - for (group in summary_params.keySet()) { - summary << summary_params[group] - } - - def misc_fields = [:] - misc_fields['Date Started'] = workflow.start - misc_fields['Date Completed'] = workflow.complete - misc_fields['Pipeline script file path'] = workflow.scriptFile - misc_fields['Pipeline script hash ID'] = workflow.scriptId - if (workflow.repository) misc_fields['Pipeline repository Git URL'] = workflow.repository - if (workflow.commitId) misc_fields['Pipeline repository Git Commit'] = workflow.commitId - if (workflow.revision) misc_fields['Pipeline Git branch/tag'] = workflow.revision - misc_fields['Nextflow Version'] = workflow.nextflow.version - misc_fields['Nextflow Build'] = workflow.nextflow.build - misc_fields['Nextflow Compile Timestamp'] = workflow.nextflow.timestamp - - def email_fields = [:] - email_fields['version'] = NfcoreTemplate.version(workflow) - email_fields['runName'] = workflow.runName - email_fields['success'] = workflow.success - email_fields['dateComplete'] = workflow.complete - email_fields['duration'] = workflow.duration - email_fields['exitStatus'] = workflow.exitStatus - email_fields['errorMessage'] = (workflow.errorMessage ?: 'None') - email_fields['errorReport'] = (workflow.errorReport ?: 'None') - email_fields['commandLine'] = workflow.commandLine - email_fields['projectDir'] = workflow.projectDir - email_fields['summary'] = summary << misc_fields - - // Check if we are only sending emails on failure - def email_address = params.email - if (!params.email && params.email_on_fail && !workflow.success) { - email_address = params.email_on_fail - } - - // Render the TXT template - def engine = new groovy.text.GStringTemplateEngine() - def tf = new File("$projectDir/assets/email_template.txt") - def txt_template = engine.createTemplate(tf).make(email_fields) - def email_txt = txt_template.toString() - - // Render the HTML template - def hf = new File("$projectDir/assets/email_template.html") - def html_template = engine.createTemplate(hf).make(email_fields) - def email_html = html_template.toString() - - // Render the sendmail template - def smail_fields = [ email: email_address, subject: subject, email_txt: email_txt, email_html: email_html, projectDir: "$projectDir" ] - def sf = new File("$projectDir/assets/sendmail_template.txt") - def sendmail_template = engine.createTemplate(sf).make(smail_fields) - def sendmail_html = sendmail_template.toString() - - // Send the HTML e-mail - Map colors = logColours(params.monochrome_logs) - if (email_address) { - try { - if (params.plaintext_email) { throw GroovyException('Send plaintext e-mail, not HTML') } - // Try to send HTML e-mail using sendmail - [ 'sendmail', '-t' ].execute() << sendmail_html - log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Sent summary e-mail to $email_address (sendmail)-" - } catch (all) { - // Catch failures and try with plaintext - def mail_cmd = [ 'mail', '-s', subject, '--content-type=text/html', email_address ] - mail_cmd.execute() << email_html - log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Sent summary e-mail to $email_address (mail)-" - } - } - - // Write summary e-mail HTML to a file - def output_d = new File("${params.outdir}/pipeline_info/") - if (!output_d.exists()) { - output_d.mkdirs() - } - def output_hf = new File(output_d, "pipeline_report.html") - output_hf.withWriter { w -> w << email_html } - def output_tf = new File(output_d, "pipeline_report.txt") - output_tf.withWriter { w -> w << email_txt } - } - - // - // Construct and send a notification to a web server as JSON - // e.g. Microsoft Teams and Slack - // - public static void IM_notification(workflow, params, summary_params, projectDir, log) { - def hook_url = params.hook_url - - def summary = [:] - for (group in summary_params.keySet()) { - summary << summary_params[group] - } - - def misc_fields = [:] - misc_fields['start'] = workflow.start - misc_fields['complete'] = workflow.complete - misc_fields['scriptfile'] = workflow.scriptFile - misc_fields['scriptid'] = workflow.scriptId - if (workflow.repository) misc_fields['repository'] = workflow.repository - if (workflow.commitId) misc_fields['commitid'] = workflow.commitId - if (workflow.revision) misc_fields['revision'] = workflow.revision - misc_fields['nxf_version'] = workflow.nextflow.version - misc_fields['nxf_build'] = workflow.nextflow.build - misc_fields['nxf_timestamp'] = workflow.nextflow.timestamp - - def msg_fields = [:] - msg_fields['version'] = NfcoreTemplate.version(workflow) - msg_fields['runName'] = workflow.runName - msg_fields['success'] = workflow.success - msg_fields['dateComplete'] = workflow.complete - msg_fields['duration'] = workflow.duration - msg_fields['exitStatus'] = workflow.exitStatus - msg_fields['errorMessage'] = (workflow.errorMessage ?: 'None') - msg_fields['errorReport'] = (workflow.errorReport ?: 'None') - msg_fields['commandLine'] = workflow.commandLine.replaceFirst(/ +--hook_url +[^ ]+/, "") - msg_fields['projectDir'] = workflow.projectDir - msg_fields['summary'] = summary << misc_fields - - // Render the JSON template - def engine = new groovy.text.GStringTemplateEngine() - // Different JSON depending on the service provider - // Defaults to "Adaptive Cards" (https://adaptivecards.io), except Slack which has its own format - def json_path = hook_url.contains("hooks.slack.com") ? "slackreport.json" : "adaptivecard.json" - def hf = new File("$projectDir/assets/${json_path}") - def json_template = engine.createTemplate(hf).make(msg_fields) - def json_message = json_template.toString() - - // POST - def post = new URL(hook_url).openConnection(); - post.setRequestMethod("POST") - post.setDoOutput(true) - post.setRequestProperty("Content-Type", "application/json") - post.getOutputStream().write(json_message.getBytes("UTF-8")); - def postRC = post.getResponseCode(); - if (! postRC.equals(200)) { - log.warn(post.getErrorStream().getText()); - } - } - - // - // Dump pipeline parameters in a json file - // - public static void dump_parameters(workflow, params) { - def output_d = new File("${params.outdir}/pipeline_info/") - if (!output_d.exists()) { - output_d.mkdirs() - } - - def timestamp = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss') - def output_pf = new File(output_d, "params_${timestamp}.json") - def jsonStr = JsonOutput.toJson(params) - output_pf.text = JsonOutput.prettyPrint(jsonStr) - } - - // - // Print pipeline summary on completion - // - public static void summary(workflow, params, log) { - Map colors = logColours(params.monochrome_logs) - if (workflow.success) { - if (workflow.stats.ignoredCount == 0) { - log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Pipeline completed successfully${colors.reset}-" - } else { - log.info "-${colors.purple}[$workflow.manifest.name]${colors.yellow} Pipeline completed successfully, but with errored process(es) ${colors.reset}-" - } - } else { - log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed with errors${colors.reset}-" - } - } - - // - // ANSII Colours used for terminal logging - // - public static Map logColours(Boolean monochrome_logs) { - Map colorcodes = [:] - - // Reset / Meta - colorcodes['reset'] = monochrome_logs ? '' : "\033[0m" - colorcodes['bold'] = monochrome_logs ? '' : "\033[1m" - colorcodes['dim'] = monochrome_logs ? '' : "\033[2m" - colorcodes['underlined'] = monochrome_logs ? '' : "\033[4m" - colorcodes['blink'] = monochrome_logs ? '' : "\033[5m" - colorcodes['reverse'] = monochrome_logs ? '' : "\033[7m" - colorcodes['hidden'] = monochrome_logs ? '' : "\033[8m" - - // Regular Colors - colorcodes['black'] = monochrome_logs ? '' : "\033[0;30m" - colorcodes['red'] = monochrome_logs ? '' : "\033[0;31m" - colorcodes['green'] = monochrome_logs ? '' : "\033[0;32m" - colorcodes['yellow'] = monochrome_logs ? '' : "\033[0;33m" - colorcodes['blue'] = monochrome_logs ? '' : "\033[0;34m" - colorcodes['purple'] = monochrome_logs ? '' : "\033[0;35m" - colorcodes['cyan'] = monochrome_logs ? '' : "\033[0;36m" - colorcodes['white'] = monochrome_logs ? '' : "\033[0;37m" - - // Bold - colorcodes['bblack'] = monochrome_logs ? '' : "\033[1;30m" - colorcodes['bred'] = monochrome_logs ? '' : "\033[1;31m" - colorcodes['bgreen'] = monochrome_logs ? '' : "\033[1;32m" - colorcodes['byellow'] = monochrome_logs ? '' : "\033[1;33m" - colorcodes['bblue'] = monochrome_logs ? '' : "\033[1;34m" - colorcodes['bpurple'] = monochrome_logs ? '' : "\033[1;35m" - colorcodes['bcyan'] = monochrome_logs ? '' : "\033[1;36m" - colorcodes['bwhite'] = monochrome_logs ? '' : "\033[1;37m" - - // Underline - colorcodes['ublack'] = monochrome_logs ? '' : "\033[4;30m" - colorcodes['ured'] = monochrome_logs ? '' : "\033[4;31m" - colorcodes['ugreen'] = monochrome_logs ? '' : "\033[4;32m" - colorcodes['uyellow'] = monochrome_logs ? '' : "\033[4;33m" - colorcodes['ublue'] = monochrome_logs ? '' : "\033[4;34m" - colorcodes['upurple'] = monochrome_logs ? '' : "\033[4;35m" - colorcodes['ucyan'] = monochrome_logs ? '' : "\033[4;36m" - colorcodes['uwhite'] = monochrome_logs ? '' : "\033[4;37m" - - // High Intensity - colorcodes['iblack'] = monochrome_logs ? '' : "\033[0;90m" - colorcodes['ired'] = monochrome_logs ? '' : "\033[0;91m" - colorcodes['igreen'] = monochrome_logs ? '' : "\033[0;92m" - colorcodes['iyellow'] = monochrome_logs ? '' : "\033[0;93m" - colorcodes['iblue'] = monochrome_logs ? '' : "\033[0;94m" - colorcodes['ipurple'] = monochrome_logs ? '' : "\033[0;95m" - colorcodes['icyan'] = monochrome_logs ? '' : "\033[0;96m" - colorcodes['iwhite'] = monochrome_logs ? '' : "\033[0;97m" - - // Bold High Intensity - colorcodes['biblack'] = monochrome_logs ? '' : "\033[1;90m" - colorcodes['bired'] = monochrome_logs ? '' : "\033[1;91m" - colorcodes['bigreen'] = monochrome_logs ? '' : "\033[1;92m" - colorcodes['biyellow'] = monochrome_logs ? '' : "\033[1;93m" - colorcodes['biblue'] = monochrome_logs ? '' : "\033[1;94m" - colorcodes['bipurple'] = monochrome_logs ? '' : "\033[1;95m" - colorcodes['bicyan'] = monochrome_logs ? '' : "\033[1;96m" - colorcodes['biwhite'] = monochrome_logs ? '' : "\033[1;97m" - - return colorcodes - } - - // - // Does what is says on the tin - // - public static String dashedLine(monochrome_logs) { - Map colors = logColours(monochrome_logs) - return "-${colors.dim}----------------------------------------------------${colors.reset}-" - } - - // - // nf-core logo - // - public static String logo(workflow, monochrome_logs) { - Map colors = logColours(monochrome_logs) - String workflow_version = NfcoreTemplate.version(workflow) - String.format( - """\n - ${dashedLine(monochrome_logs)} - ${colors.green},--.${colors.black}/${colors.green},-.${colors.reset} - ${colors.blue} ___ __ __ __ ___ ${colors.green}/,-._.--~\'${colors.reset} - ${colors.blue} |\\ | |__ __ / ` / \\ |__) |__ ${colors.yellow}} {${colors.reset} - ${colors.blue} | \\| | \\__, \\__/ | \\ |___ ${colors.green}\\`-._,-`-,${colors.reset} - ${colors.green}`._,._,\'${colors.reset} - ${colors.purple} ${workflow.manifest.name} ${workflow_version}${colors.reset} - ${dashedLine(monochrome_logs)} - """.stripIndent() - ) - } -} diff --git a/lib/Utils.groovy b/lib/Utils.groovy deleted file mode 100644 index 8d030f4e..00000000 --- a/lib/Utils.groovy +++ /dev/null @@ -1,47 +0,0 @@ -// -// This file holds several Groovy functions that could be useful for any Nextflow pipeline -// - -import org.yaml.snakeyaml.Yaml - -class Utils { - - // - // When running with -profile conda, warn if channels have not been set-up appropriately - // - public static void checkCondaChannels(log) { - Yaml parser = new Yaml() - def channels = [] - try { - def config = parser.load("conda config --show channels".execute().text) - channels = config.channels - } catch(NullPointerException | IOException e) { - log.warn "Could not verify conda channel configuration." - return - } - - // Check that all channels are present - // This channel list is ordered by required channel priority. - def required_channels_in_order = ['conda-forge', 'bioconda', 'defaults'] - def channels_missing = ((required_channels_in_order as Set) - (channels as Set)) as Boolean - - // Check that they are in the right order - def channel_priority_violation = false - def n = required_channels_in_order.size() - for (int i = 0; i < n - 1; i++) { - channel_priority_violation |= !(channels.indexOf(required_channels_in_order[i]) < channels.indexOf(required_channels_in_order[i+1])) - } - - if (channels_missing | channel_priority_violation) { - log.warn "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + - " There is a problem with your Conda configuration!\n\n" + - " You will need to set-up the conda-forge and bioconda channels correctly.\n" + - " Please refer to https://bioconda.github.io/\n" + - " The observed channel order is \n" + - " ${channels}\n" + - " but the following channel order is required:\n" + - " ${required_channels_in_order}\n" + - "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" - } - } -} diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy deleted file mode 100755 index 4ec4029a..00000000 --- a/lib/WorkflowMain.groovy +++ /dev/null @@ -1,216 +0,0 @@ -// -// This file holds several functions specific to the main.nf workflow in the nf-core/fetchngs pipeline -// - -import nextflow.Nextflow - -class WorkflowMain { - - // - // Citation string for pipeline - // - public static String citation(workflow) { - return "If you use ${workflow.manifest.name} for your analysis please cite:\n\n" + - "* The pipeline\n" + - " https://doi.org/10.5281/zenodo.5070524\n\n" + - "* The nf-core framework\n" + - " https://doi.org/10.1038/s41587-020-0439-x\n\n" + - "* Software dependencies\n" + - " https://github.com/${workflow.manifest.name}/blob/master/CITATIONS.md" - } - - - // - // Validate parameters and print summary to screen - // - public static void initialise(workflow, params, log) { - - // Print workflow version and exit on --version - if (params.version) { - String workflow_version = NfcoreTemplate.version(workflow) - log.info "${workflow.manifest.name} ${workflow_version}" - System.exit(0) - } - - // Check that a -profile or Nextflow config has been provided to run the pipeline - NfcoreTemplate.checkConfigProvided(workflow, log) - - // Check that conda channels are set-up correctly - if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { - Utils.checkCondaChannels(log) - } - - // Check AWS batch settings - NfcoreTemplate.awsBatch(workflow, params) - - // Check input has been provided - if (!params.input) { - Nextflow.error("Please provide an input file containing ids to the pipeline - one per line e.g. '--input ids.csv'") - } - - // Check valid input_type has been provided - def input_types = ['sra', 'synapse'] - if (!input_types.contains(params.input_type)) { - Nextflow.error("Invalid option: '${params.input_type}'. Valid options for '--input_type': ${input_types.join(', ')}.") - } - } - - // Check if input ids are from the SRA - public static Boolean isSraId(input) { - def is_sra = false - def total_ids = 0 - def no_match_ids = [] - def pattern = /^(((SR|ER|DR)[APRSX])|(SAM(N|EA|D))|(PRJ(NA|EB|DB))|(GS[EM]))(\d+)$/ - input.eachLine { line -> - total_ids += 1 - if (!(line =~ pattern)) { - no_match_ids << line - } - } - - def num_match = total_ids - no_match_ids.size() - if (num_match > 0) { - if (num_match == total_ids) { - is_sra = true - } else { - Nextflow.error("Mixture of ids provided via --input: ${no_match_ids.join(', ')}\nPlease provide either SRA / ENA / GEO / DDBJ or Synapse ids!") - } - } - return is_sra - } - - // Check if input ids are from the Synapse platform - public static Boolean isSynapseId(input) { - def is_synapse = false - def total_ids = 0 - def no_match_ids = [] - def pattern = /^syn\d{8}$/ - input.eachLine { line -> - total_ids += 1 - if (!(line =~ pattern)) { - no_match_ids << line - } - } - - def num_match = total_ids - no_match_ids.size() - if (num_match > 0) { - if (num_match == total_ids) { - is_synapse = true - } else { - Nextflow.error("Mixture of ids provided via --input: ${no_match_ids.join(', ')}\nPlease provide either SRA / ENA / GEO / DDBJ or Synapse ids!") - } - } - return is_synapse - } - - // - // Check and validate parameters - // - public static void sraInitialise(params, valid_params) { - // Check minimal ENA fields are provided to download FastQ files - def ena_metadata_fields = params.ena_metadata_fields ? params.ena_metadata_fields.split(',').collect{ it.trim().toLowerCase() } : valid_params['ena_metadata_fields'] - if (!ena_metadata_fields.containsAll(valid_params['ena_metadata_fields'])) { - Nextflow.error("Invalid option: '${params.ena_metadata_fields}'. Minimally required fields for '--ena_metadata_fields': '${valid_params['ena_metadata_fields'].join(',')}'") - } - } - - // - // Print a warning after pipeline has completed - // - public static void sraCurateSamplesheetWarn(log) { - log.warn "=============================================================================\n" + - " Please double-check the samplesheet that has been auto-created by the pipeline.\n\n" + - " Public databases don't reliably hold information such as strandedness\n" + - " information, controls etc\n\n" + - " All of the sample metadata obtained from the ENA has been appended\n" + - " as additional columns to help you manually curate the samplesheet before\n" + - " running nf-core/other pipelines.\n" + - "===================================================================================" - } - - // - // Convert metadata obtained from the 'synapse show' command to a Groovy map - // - public static Map synapseShowToMap(synapse_file) { - def meta = [:] - def category = '' - synapse_file.eachLine { line -> - def entries = [null, null] - if (!line.startsWith(' ') && !line.trim().isEmpty()) { - category = line.tokenize(':')[0] - } else { - entries = line.trim().tokenize('=') - } - meta["${category}|${entries[0]}"] = entries[1] - } - meta.id = meta['properties|id'] - meta.name = meta['properties|name'] - meta.md5 = meta['File|md5'] - return meta.findAll{ it.value != null } - } - - // - // Print a warning after pipeline has completed - // - public static void synapseCurateSamplesheetWarn(log) { - log.warn "=============================================================================\n" + - " Please double-check the samplesheet that has been auto-created by the pipeline.\n\n" + - " Where applicable, default values will be used for sample-specific metadata\n" + - " such as strandedness, controls etc as this information is not provided\n" + - " in a standardised manner when uploading data to Synapse.\n" + - "===================================================================================" - } - - // - // Obtain Sample ID from File Name - // - public static String synapseSampleNameFromFastQ(input_file, pattern) { - - def sampleids = "" - - def filePattern = pattern.toString() - int p = filePattern.lastIndexOf('/') - if( p != -1 ) - filePattern = filePattern.substring(p+1) - - input_file.each { - String fileName = input_file.getFileName().toString() - - String indexOfWildcards = filePattern.findIndexOf { it=='*' || it=='?' } - String indexOfBrackets = filePattern.findIndexOf { it=='{' || it=='[' } - if( indexOfWildcards==-1 && indexOfBrackets==-1 ) { - if( fileName == filePattern ) - return actual.getSimpleName() - throw new IllegalArgumentException("Not a valid file pair globbing pattern: pattern=$filePattern file=$fileName") - } - - int groupCount = 0 - for( int i=0; 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�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

A$B3k~{RycObG@6y| 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 $@vz03z8Z`qI{ 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

=%>>2|D73@_9Fx}<*!s;{SFX;r+XReUC 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 z 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

qm4Wk) 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 z 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�!!ybUdR4n8i&a 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≻pfc-p+kq>A@&EZJ32ii;nzX4TDQYlf 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
gy>fqEPDaO`QF}o` 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%0AO0^D-A)i$ldleqyk}TE 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 z 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

tyv*0yP}nk-pv4zbBt@DbR|3V7ZQ73LXi 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 kF-h#lNtCW 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 From 7a46eb97226099e062c71e1daf74fbeb6270dc29 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 11 Oct 2023 12:02:39 +0100 Subject: [PATCH 531/852] Remove nf-core/initialise subworkflow --- modules.json | 5 - subworkflows/nf-core/initialise/main.nf | 170 ----------------------- subworkflows/nf-core/initialise/meta.yml | 33 ----- 3 files changed, 208 deletions(-) delete mode 100644 subworkflows/nf-core/initialise/main.nf delete mode 100644 subworkflows/nf-core/initialise/meta.yml diff --git a/modules.json b/modules.json index aebf22de..6dd402db 100644 --- a/modules.json +++ b/modules.json @@ -33,11 +33,6 @@ "branch": "master", "git_sha": "dedc0e31087f3306101c38835d051bf49789445a", "installed_by": ["subworkflows"] - }, - "initialise": { - "branch": "master", - "git_sha": "8340fb3779fe3233a455aeee1f60ceb203434ab6", - "installed_by": ["subworkflows"] } } } diff --git a/subworkflows/nf-core/initialise/main.nf b/subworkflows/nf-core/initialise/main.nf deleted file mode 100644 index 31fb1b4c..00000000 --- a/subworkflows/nf-core/initialise/main.nf +++ /dev/null @@ -1,170 +0,0 @@ -// This is a reimplementation of the basic initialise methods in the nf-core template -// The role of this subworkflow is to check the input parameters and print help messages -// Use this to start your nf-core pipeline - -include { paramsHelp; paramsSummaryLog; paramsSummaryMap; validateParameters } from 'plugin/nf-validation' - -workflow INITIALISE { - - take: - version // bool - help // bool - validate_params // bool - logo // bool - - main: - - // Get version string for use with --version or printing to log when creating - String version_string = "" - - if (workflow.manifest.version) { - def prefix_v = workflow.manifest.version[0] != 'v' ? 'v' : '' - version_string += "${prefix_v}${workflow.manifest.version}" - } - - if (workflow.commitId) { - def git_shortsha = workflow.commitId.substring(0, 7) - version_string += "-g${git_shortsha}" - } - - // Print workflow version and exit on --version - if (version) { - log.info "${workflow.manifest.name} ${version_string}" - System.exit(0) - } - - if ( logo ) { - log.info logo(workflow, params.monochrome_logs) - } - log.info "${workflow.manifest.name} ${version_string}" - - // Print citation for nf-core - def citation = "If you use ${workflow.manifest.name} for your analysis please cite:\n\n" + - "* The nf-core framework\n" + - " https://doi.org/10.1038/s41587-020-0439-x\n\n" + - "* Software dependencies\n" + - " ${workflow.manifest.homePage}/blob/master/CITATIONS.md" - log.info citation - - // Print help message if needed - if (params.help) { - def String command = "nextflow run ${workflow.manifest.name} --input samplesheet.csv -profile docker" - log.info paramsHelp(command) - System.exit(0) - } - - if ( params.validate_params != false ){ - validateParameters() - } - - if (workflow.profile == 'standard' && workflow.configFiles.size() <= 1) { - log.warn "[$workflow.manifest.name] You are attempting to run the pipeline without any custom configuration!\n\n" + - "This will be dependent on your local compute environment but can be achieved via one or more of the following:\n" + - " (1) Using an existing pipeline profile e.g. `-profile docker` or `-profile singularity`\n" + - " (2) Using an existing nf-core/configs for your Institution e.g. `-profile crick` or `-profile uppmax`\n" + - " (3) Using your own local custom config e.g. `-c /path/to/your/custom.config`\n\n" + - "Please refer to the quick start section and usage docs for the pipeline.\n " - } - - log.info paramsSummaryLog(workflow) - - summary_params = paramsSummaryMap(workflow) - - emit: - summary_params - -} - -// -// ANSII Colours used for terminal logging -// -def logColours(Boolean monochrome_logs) { - Map colorcodes = [:] - - // Reset / Meta - colorcodes['reset'] = monochrome_logs ? '' : "\033[0m" - colorcodes['bold'] = monochrome_logs ? '' : "\033[1m" - colorcodes['dim'] = monochrome_logs ? '' : "\033[2m" - colorcodes['underlined'] = monochrome_logs ? '' : "\033[4m" - colorcodes['blink'] = monochrome_logs ? '' : "\033[5m" - colorcodes['reverse'] = monochrome_logs ? '' : "\033[7m" - colorcodes['hidden'] = monochrome_logs ? '' : "\033[8m" - - // Regular Colors - colorcodes['black'] = monochrome_logs ? '' : "\033[0;30m" - colorcodes['red'] = monochrome_logs ? '' : "\033[0;31m" - colorcodes['green'] = monochrome_logs ? '' : "\033[0;32m" - colorcodes['yellow'] = monochrome_logs ? '' : "\033[0;33m" - colorcodes['blue'] = monochrome_logs ? '' : "\033[0;34m" - colorcodes['purple'] = monochrome_logs ? '' : "\033[0;35m" - colorcodes['cyan'] = monochrome_logs ? '' : "\033[0;36m" - colorcodes['white'] = monochrome_logs ? '' : "\033[0;37m" - - // Bold - colorcodes['bblack'] = monochrome_logs ? '' : "\033[1;30m" - colorcodes['bred'] = monochrome_logs ? '' : "\033[1;31m" - colorcodes['bgreen'] = monochrome_logs ? '' : "\033[1;32m" - colorcodes['byellow'] = monochrome_logs ? '' : "\033[1;33m" - colorcodes['bblue'] = monochrome_logs ? '' : "\033[1;34m" - colorcodes['bpurple'] = monochrome_logs ? '' : "\033[1;35m" - colorcodes['bcyan'] = monochrome_logs ? '' : "\033[1;36m" - colorcodes['bwhite'] = monochrome_logs ? '' : "\033[1;37m" - - // Underline - colorcodes['ublack'] = monochrome_logs ? '' : "\033[4;30m" - colorcodes['ured'] = monochrome_logs ? '' : "\033[4;31m" - colorcodes['ugreen'] = monochrome_logs ? '' : "\033[4;32m" - colorcodes['uyellow'] = monochrome_logs ? '' : "\033[4;33m" - colorcodes['ublue'] = monochrome_logs ? '' : "\033[4;34m" - colorcodes['upurple'] = monochrome_logs ? '' : "\033[4;35m" - colorcodes['ucyan'] = monochrome_logs ? '' : "\033[4;36m" - colorcodes['uwhite'] = monochrome_logs ? '' : "\033[4;37m" - - // High Intensity - colorcodes['iblack'] = monochrome_logs ? '' : "\033[0;90m" - colorcodes['ired'] = monochrome_logs ? '' : "\033[0;91m" - colorcodes['igreen'] = monochrome_logs ? '' : "\033[0;92m" - colorcodes['iyellow'] = monochrome_logs ? '' : "\033[0;93m" - colorcodes['iblue'] = monochrome_logs ? '' : "\033[0;94m" - colorcodes['ipurple'] = monochrome_logs ? '' : "\033[0;95m" - colorcodes['icyan'] = monochrome_logs ? '' : "\033[0;96m" - colorcodes['iwhite'] = monochrome_logs ? '' : "\033[0;97m" - - // Bold High Intensity - colorcodes['biblack'] = monochrome_logs ? '' : "\033[1;90m" - colorcodes['bired'] = monochrome_logs ? '' : "\033[1;91m" - colorcodes['bigreen'] = monochrome_logs ? '' : "\033[1;92m" - colorcodes['biyellow'] = monochrome_logs ? '' : "\033[1;93m" - colorcodes['biblue'] = monochrome_logs ? '' : "\033[1;94m" - colorcodes['bipurple'] = monochrome_logs ? '' : "\033[1;95m" - colorcodes['bicyan'] = monochrome_logs ? '' : "\033[1;96m" - colorcodes['biwhite'] = monochrome_logs ? '' : "\033[1;97m" - - return colorcodes -} - -// -// Does what is says on the tin -// -def dashedLine(monochrome_logs) { - Map colors = logColours(monochrome_logs) - return "-${colors.dim}----------------------------------------------------${colors.reset}-" -} - -// -// nf-core logo -// -def logo(workflow, monochrome_logs) { - Map colors = logColours(monochrome_logs) - String.format( - """\n - ${dashedLine(monochrome_logs)} - ${colors.green},--.${colors.black}/${colors.green},-.${colors.reset} - ${colors.blue} ___ __ __ __ ___ ${colors.green}/,-._.--~\'${colors.reset} - ${colors.blue} |\\ | |__ __ / ` / \\ |__) |__ ${colors.yellow}} {${colors.reset} - ${colors.blue} | \\| | \\__, \\__/ | \\ |___ ${colors.green}\\`-._,-`-,${colors.reset} - ${colors.green}`._,._,\'${colors.reset} - ${dashedLine(monochrome_logs)} - """.stripIndent() - ) -} diff --git a/subworkflows/nf-core/initialise/meta.yml b/subworkflows/nf-core/initialise/meta.yml deleted file mode 100644 index 1d364847..00000000 --- a/subworkflows/nf-core/initialise/meta.yml +++ /dev/null @@ -1,33 +0,0 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/subworkflows/yaml-schema.json -name: "initialise" -description: Validate input parameters and print help messages -keywords: - - admin - - check - - help - - version -components: [] -input: - - version: - type: boolean - description: | - Structure: val(version) - Boolean to show the pipeline version and exit. - - help: - type: boolean - description: | - Structure: val(help) - Boolean to show the pipeline help message and exit. - - validate_params: - type: boolean - description: | - Structure: val(validate_params) - Whether to validate the parameters prior to starting the pipeline. -output: - - summary_params: - type: value - description: | - Structure: val(summary_params) - A map of the parameters used in the pipeline. -authors: - - "@adamrtalbot" From d88b631acbb86271e66077517a639bea99b432da Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 11 Oct 2023 12:10:36 +0100 Subject: [PATCH 532/852] Update workflow main scripts --- main.nf | 111 ++++++++++++++------------------------ workflows/sra/main.nf | 24 ++++----- workflows/synapse/main.nf | 6 +-- 3 files changed, 53 insertions(+), 88 deletions(-) diff --git a/main.nf b/main.nf index b7445e20..7794d1b9 100644 --- a/main.nf +++ b/main.nf @@ -13,99 +13,42 @@ nextflow.enable.dsl = 2 /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - VALIDATE & PRINT PARAMETER SUMMARY -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ - -// Check if --input file is empty -ch_input = file(params.input, checkIfExists: true) -if (ch_input.isEmpty()) { error("File provided with --input is empty: ${ch_input.getName()}!") } - -// Read in ids from --input file -Channel - .from(file(params.input, checkIfExists: true)) - .splitCsv(header:false, sep:'', strip:true) - .map { it[0] } - .unique() - .set { ch_ids } - -// Auto-detect input id type -def input_type = '' -if (WorkflowMain.isSraId(ch_input)) { - input_type = 'sra' -} else if (WorkflowMain.isSynapseId(ch_input)) { - input_type = 'synapse' -} else { - error('Ids provided via --input not recognised please make sure they are either SRA / ENA / GEO / DDBJ or Synapse ids!') -} - -if (params.input_type != input_type) { - error("Ids auto-detected as ${input_type}. Please provide '--input_type ${input_type}' as a parameter to the pipeline!") -} - -if (params.input_type == 'sra') { - def valid_params = [ - ena_metadata_fields : ['run_accession', 'experiment_accession', 'library_layout', 'fastq_ftp', 'fastq_md5'] - ] - - // Validate input parameters - WorkflowMain.sraInitialise(params, valid_params) -} else if (params.input_type == 'synapse') { - - // Create channel for synapse config - if (params.synapse_config) { - ch_synapse_config = file(params.synapse_config, checkIfExists: true) - } else { - error('Please provide a Synapse config file for download authentication!') - } -} - -/* -======================================================================================== - IMPORT MODULES/SUBWORKFLOWS -======================================================================================== -*/ - -include { CUSTOM_DUMPSOFTWAREVERSIONS } from './modules/nf-core/custom/dumpsoftwareversions' -include { INITIALISE } from './subworkflows/nf-core/initialise/main' - -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - IMPORT WORKFLOWS + NAMED WORKFLOWS FOR PIPELINE ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ if (params.input_type == 'sra') include { SRA } from './workflows/sra' if (params.input_type == 'synapse') include { SYNAPSE } from './workflows/synapse' -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - NAMED WORKFLOWS FOR PIPELINE -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ - // // WORKFLOW: Run main nf-core/fetchngs analysis pipeline depending on type of identifier provided // workflow NFCORE_FETCHNGS { - INITIALISE ( params.version, params.help, params.validate_params, true ) + take: + ids // channel: database ids read in from --input + + main: + ch_versions = Channel.empty() // // WORKFLOW: Download FastQ files for SRA / ENA / GEO / DDBJ ids // if (params.input_type == 'sra') { - SRA ( ch_ids ) - ch_versions = ch_versions.mix(SRA.out.versions) + SRA ( ids ) + ch_versions = SRA.out.versions // // WORKFLOW: Download FastQ files for Synapse ids // } else if (params.input_type == 'synapse') { - SYNAPSE ( ch_ids, ch_synapse_config ) - ch_versions = ch_versions.mix(SYNAPSE.out.versions) + SYNAPSE ( ids ) + ch_versions = SYNAPSE.out.versions } + + emit: + versions = ch_versions } /* @@ -114,12 +57,36 @@ workflow NFCORE_FETCHNGS { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ +include { PIPELINE_INITIALISATION } from './subworkflows/local/nf_core_fetchngs_utils' +include { PIPELINE_COMPLETION } from './subworkflows/local/nf_core_fetchngs_utils' + // // WORKFLOW: Execute a single named workflow for the pipeline -// See: https://github.com/nf-core/rnaseq/issues/619 // workflow { - NFCORE_FETCHNGS () + + // + // SUBWORKFLOW: Run initialisation tasks + // + PIPELINE_INITIALISATION () + + // + // WORKFLOW: Run primary workflows for the pipeline + // + NFCORE_FETCHNGS ( + PIPELINE_INITIALISATION.out.ids + ) + + // + // SUBWORKFLOW: Run completion tasks + // + PIPELINE_COMPLETION ( + NFCORE_FETCHNGS.out.versions, + params.input_type, + params.email, + params.email_on_fail, + PIPELINE_INITIALISATION.out.summary_params + ) } /* diff --git a/workflows/sra/main.nf b/workflows/sra/main.nf index 3fd22f5d..a8f54646 100644 --- a/workflows/sra/main.nf +++ b/workflows/sra/main.nf @@ -62,10 +62,7 @@ workflow SRA { .unique() .set { ch_sra_metadata } - ch_versions = ch_versions.mix(SRA_RUNINFO_TO_FTP.out.versions.first()) - fastq_files = Channel.empty() - if (!params.skip_fastq_download) { ch_sra_metadata @@ -97,18 +94,19 @@ workflow SRA { ch_versions = ch_versions.mix(FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS.out.versions.first()) // Isolate FASTQ channel which will be added to emit block - fastq_files.mix( - SRA_FASTQ_FTP.out.fastq, - FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS.out.reads - ).map { meta, fastq -> - def reads = fastq instanceof List ? fastq.flatten() : [ fastq ] - def meta_clone = meta.clone() + fastq_files + .mix(SRA_FASTQ_FTP.out.fastq, FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS.out.reads) + .map { + meta, fastq -> + def reads = fastq instanceof List ? fastq.flatten() : [ fastq ] + def meta_clone = meta.clone() - meta_clone.fastq_1 = reads[0] ? "${params.outdir}/fastq/${reads[0].getName()}" : '' - meta_clone.fastq_2 = reads[1] && !meta.single_end ? "${params.outdir}/fastq/${reads[1].getName()}" : '' + meta_clone.fastq_1 = reads[0] ? "${params.outdir}/fastq/${reads[0].getName()}" : '' + meta_clone.fastq_2 = reads[1] && !meta.single_end ? "${params.outdir}/fastq/${reads[1].getName()}" : '' - return meta_clone - }.set { ch_sra_metadata } + return meta_clone + } + .set { ch_sra_metadata } } // diff --git a/workflows/synapse/main.nf b/workflows/synapse/main.nf index d2681866..6b5ea02c 100644 --- a/workflows/synapse/main.nf +++ b/workflows/synapse/main.nf @@ -106,9 +106,9 @@ workflow SYNAPSE { ch_versions = ch_versions.mix(SYNAPSE_MERGE_SAMPLESHEET.out.versions) emit: - fastq = ch_fastq - samplesheet = SYNAPSE_MERGE_SAMPLESHEET.out.samplesheet - versions = ch_versions.unique() + fastq = ch_fastq + samplesheet = SYNAPSE_MERGE_SAMPLESHEET.out.samplesheet + versions = ch_versions.unique() } /* From 4328622547fb3a1119f412ded0dd8b752981ec35 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 11 Oct 2023 12:10:57 +0100 Subject: [PATCH 533/852] Add subworkflows to replace files in lib directory --- .../local/nextflow_pipeline_utils/main.nf | 123 +++++++ .../local/nf_core_fetchngs_utils/main.nf | 296 +++++++++++++++++ .../local/nf_core_pipeline_utils/main.nf | 308 ++++++++++++++++++ .../local/nf_validation_plugin_utils/main.nf | 52 +++ 4 files changed, 779 insertions(+) create mode 100644 subworkflows/local/nextflow_pipeline_utils/main.nf create mode 100644 subworkflows/local/nf_core_fetchngs_utils/main.nf create mode 100644 subworkflows/local/nf_core_pipeline_utils/main.nf create mode 100644 subworkflows/local/nf_validation_plugin_utils/main.nf diff --git a/subworkflows/local/nextflow_pipeline_utils/main.nf b/subworkflows/local/nextflow_pipeline_utils/main.nf new file mode 100644 index 00000000..e56394ed --- /dev/null +++ b/subworkflows/local/nextflow_pipeline_utils/main.nf @@ -0,0 +1,123 @@ +// +// Subworkflow with functionality that may be useful for any Nextflow pipeline +// + +import org.yaml.snakeyaml.Yaml +import groovy.json.JsonOutput + +/* +======================================================================================== + SUBWORKFLOW DEFINITION +======================================================================================== +*/ + +workflow NEXTFLOW_PIPELINE_UTILS { + + take: + print_version // bool + dump_parameters // bool + output_directory // path: base directory used to publish pipeline results + check_conda_channels // bool + + main: + + // + // Print workflow version and exit on --version + // + if (print_version) { + log.info "${workflow.manifest.name} ${getWorkflowVersion()}" + System.exit(0) + } + + // + // Dump pipeline parameters to a JSON file + // + if (dump_parameters && output_directory) { + dumpParametersToJSON(output_directory) + } + + // + // When running with Conda, warn if channels have not been set-up appropriately + // + if (check_conda_channels) { + checkCondaChannels() + } +} + +/* +======================================================================================== + FUNCTIONS +======================================================================================== +*/ + +// +// Generate version string +// +def getWorkflowVersion() { + String version_string = "" + if (workflow.manifest.version) { + def prefix_v = workflow.manifest.version[0] != 'v' ? 'v' : '' + version_string += "${prefix_v}${workflow.manifest.version}" + } + + if (workflow.commitId) { + def git_shortsha = workflow.commitId.substring(0, 7) + version_string += "-g${git_shortsha}" + } + + return version_string +} + +// +// Dump pipeline parameters to a JSON file +// +def dumpParametersToJSON(output_directory) { + def output_d = new File("${output_directory}/pipeline_info/") + if (!output_d.exists()) { + output_d.mkdirs() + } + + def timestamp = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss') + def output_pf = new File(output_d, "params_${timestamp}.json") + def jsonStr = JsonOutput.toJson(params) + output_pf.text = JsonOutput.prettyPrint(jsonStr) +} + +// +// When running with -profile conda, warn if channels have not been set-up appropriately +// +def checkCondaChannels() { + Yaml parser = new Yaml() + def channels = [] + try { + def config = parser.load("conda config --show channels".execute().text) + channels = config.channels + } catch(NullPointerException | IOException e) { + log.warn "Could not verify conda channel configuration." + return + } + + // Check that all channels are present + // This channel list is ordered by required channel priority. + def required_channels_in_order = ['conda-forge', 'bioconda', 'defaults'] + def channels_missing = ((required_channels_in_order as Set) - (channels as Set)) as Boolean + + // Check that they are in the right order + def channel_priority_violation = false + def n = required_channels_in_order.size() + for (int i = 0; i < n - 1; i++) { + channel_priority_violation |= !(channels.indexOf(required_channels_in_order[i]) < channels.indexOf(required_channels_in_order[i+1])) + } + + if (channels_missing | channel_priority_violation) { + log.warn "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + + " There is a problem with your Conda configuration!\n\n" + + " You will need to set-up the conda-forge and bioconda channels correctly.\n" + + " Please refer to https://bioconda.github.io/\n" + + " The observed channel order is \n" + + " ${channels}\n" + + " but the following channel order is required:\n" + + " ${required_channels_in_order}\n" + + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + } +} diff --git a/subworkflows/local/nf_core_fetchngs_utils/main.nf b/subworkflows/local/nf_core_fetchngs_utils/main.nf new file mode 100644 index 00000000..129b2e3f --- /dev/null +++ b/subworkflows/local/nf_core_fetchngs_utils/main.nf @@ -0,0 +1,296 @@ +// +// Subworkflow with functionality specific to the nf-core/fetchngs pipeline +// + +/* +======================================================================================== + IMPORT MODULES/SUBWORKFLOWS +======================================================================================== +*/ + +include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../../../modules/nf-core/custom/dumpsoftwareversions' +include { NEXTFLOW_PIPELINE_UTILS; getWorkflowVersion } from '../nextflow_pipeline_utils' +include { NF_VALIDATION_PLUGIN_UTILS } from '../nf_validation_plugin_utils' +include { NF_CORE_PIPELINE_UTILS; workflowCitation; nfCoreLogo; dashedLine; completionEmail; completionSummary } from '../nf_core_pipeline_utils' + +/* +======================================================================================== + SUBWORKFLOW TO INITIALISE PIPELINE +======================================================================================== +*/ + +workflow PIPELINE_INITIALISATION { + + main: + + // + // Print version and exit if required and dump pipeline parameters to JSON file + // + NEXTFLOW_PIPELINE_UTILS ( + params.version, + true, + params.outdir, + workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1 + ) + + // + // Validate parameters and generate parameter summary to stdout + // + def pre_help_text = nfCoreLogo(getWorkflowVersion()) + def post_help_text = '\n' + workflowCitation() + '\n' + dashedLine() + def String workflow_command = "nextflow run ${workflow.manifest.name} -profile --input ids.csv --outdir " + NF_VALIDATION_PLUGIN_UTILS ( + params.help, + workflow_command, + pre_help_text, + post_help_text, + params.validate_params + ) + + // + // Check config provided to the pipeline + // + NF_CORE_PIPELINE_UTILS () + + // + // Auto-detect input id type + // + ch_input = file(params.input) + def input_type = '' + if (isSraId(ch_input)) { + input_type = 'sra' + sraCheckENAMetadataFields() + } else if (isSynapseId(ch_input)) { + input_type = 'synapse' + } else { + error('Ids provided via --input not recognised please make sure they are either SRA / ENA / GEO / DDBJ or Synapse ids!') + } + + if (params.input_type != input_type) { + error("Ids auto-detected as ${input_type}. Please provide '--input_type ${input_type}' as a parameter to the pipeline!") + } + + // Read in ids from --input file + Channel + .from(ch_input) + .splitCsv(header:false, sep:'', strip:true) + .map { it[0] } + .unique() + .set { ch_ids } + + emit: + ids = ch_ids + summary_params = NF_VALIDATION_PLUGIN_UTILS.out.summary_params +} + +/* +======================================================================================== + SUBWORKFLOW FOR PIPELINE COMPLETION +======================================================================================== +*/ + +workflow PIPELINE_COMPLETION { + + take: + versions // channel: software tools versions + input_type // string: 'sra' or 'synapse' + email // string: email address + email_on_fail // string: email address sent on pipeline failure + summary_params // map: Groovy map of the parameters used in the pipeline + + main: + + // + // MODULE: Dump software versions for all tools used in the workflow + // + CUSTOM_DUMPSOFTWAREVERSIONS ( + versions.collectFile(name: 'collated_versions.yml') + ) + + // + // Completion email and summary + // + workflow.onComplete { + if (email || email_on_fail) { + completionEmail(summary_params) + } + + completionSummary() + + if (input_type == 'sra') { + sraCurateSamplesheetWarn() + } else if (input_type == 'synapse') { + synapseCurateSamplesheetWarn() + } + } +} + +/* +======================================================================================== + FUNCTIONS +======================================================================================== +*/ + +// +// Check if input ids are from the SRA +// +def isSraId(input) { + def is_sra = false + def total_ids = 0 + def no_match_ids = [] + def pattern = /^(((SR|ER|DR)[APRSX])|(SAM(N|EA|D))|(PRJ(NA|EB|DB))|(GS[EM]))(\d+)$/ + input.eachLine { line -> + total_ids += 1 + if (!(line =~ pattern)) { + no_match_ids << line + } + } + + def num_match = total_ids - no_match_ids.size() + if (num_match > 0) { + if (num_match == total_ids) { + is_sra = true + } else { + error("Mixture of ids provided via --input: ${no_match_ids.join(', ')}\nPlease provide either SRA / ENA / GEO / DDBJ or Synapse ids!") + } + } + return is_sra +} + +// +// Check if input ids are from the Synapse platform +// +def isSynapseId(input) { + def is_synapse = false + def total_ids = 0 + def no_match_ids = [] + def pattern = /^syn\d{8}$/ + input.eachLine { line -> + total_ids += 1 + if (!(line =~ pattern)) { + no_match_ids << line + } + } + + def num_match = total_ids - no_match_ids.size() + if (num_match > 0) { + if (num_match == total_ids) { + is_synapse = true + } else { + error("Mixture of ids provided via --input: ${no_match_ids.join(', ')}\nPlease provide either SRA / ENA / GEO / DDBJ or Synapse ids!") + } + } + return is_synapse +} + +// +// Check and validate parameters +// +def sraCheckENAMetadataFields() { + // Check minimal ENA fields are provided to download FastQ files + def valid_ena_metadata_fields = ['run_accession', 'experiment_accession', 'library_layout', 'fastq_ftp', 'fastq_md5'] + def ena_metadata_fields = params.ena_metadata_fields ? params.ena_metadata_fields.split(',').collect{ it.trim().toLowerCase() } : valid_ena_metadata_fields + if (!ena_metadata_fields.containsAll(valid_ena_metadata_fields)) { + error("Invalid option: '${params.ena_metadata_fields}'. Minimally required fields for '--ena_metadata_fields': '${valid_ena_metadata_fields.join(',')}'") + } +} + +// +// Print a warning after pipeline has completed +// +def sraCurateSamplesheetWarn() { + log.warn "=============================================================================\n" + + " Please double-check the samplesheet that has been auto-created by the pipeline.\n\n" + + " Public databases don't reliably hold information such as strandedness\n" + + " information, controls etc\n\n" + + " All of the sample metadata obtained from the ENA has been appended\n" + + " as additional columns to help you manually curate the samplesheet before\n" + + " running nf-core/other pipelines.\n" + + "===================================================================================" +} + +// +// Convert metadata obtained from the 'synapse show' command to a Groovy map +// +def synapseShowToMap(synapse_file) { + def meta = [:] + def category = '' + synapse_file.eachLine { line -> + def entries = [null, null] + if (!line.startsWith(' ') && !line.trim().isEmpty()) { + category = line.tokenize(':')[0] + } else { + entries = line.trim().tokenize('=') + } + meta["${category}|${entries[0]}"] = entries[1] + } + meta.id = meta['properties|id'] + meta.name = meta['properties|name'] + meta.md5 = meta['File|md5'] + return meta.findAll{ it.value != null } +} + +// +// Print a warning after pipeline has completed +// +def synapseCurateSamplesheetWarn() { + log.warn "=============================================================================\n" + + " Please double-check the samplesheet that has been auto-created by the pipeline.\n\n" + + " Where applicable, default values will be used for sample-specific metadata\n" + + " such as strandedness, controls etc as this information is not provided\n" + + " in a standardised manner when uploading data to Synapse.\n" + + "===================================================================================" +} + +// +// Obtain Sample ID from File Name +// +def synapseSampleNameFromFastQ(input_file, pattern) { + + def sampleids = "" + + def filePattern = pattern.toString() + int p = filePattern.lastIndexOf('/') + if( p != -1 ) + filePattern = filePattern.substring(p+1) + + input_file.each { + String fileName = input_file.getFileName().toString() + + String indexOfWildcards = filePattern.findIndexOf { it=='*' || it=='?' } + String indexOfBrackets = filePattern.findIndexOf { it=='{' || it=='[' } + if( indexOfWildcards==-1 && indexOfBrackets==-1 ) { + if( fileName == filePattern ) + return actual.getSimpleName() + throw new IllegalArgumentException("Not a valid file pair globbing pattern: pattern=$filePattern file=$fileName") + } + + int groupCount = 0 + for( int i=0; i w << email_html } + def output_tf = new File(output_d, "pipeline_report.txt") + output_tf.withWriter { w -> w << email_txt } +} + +// +// Print pipeline summary on completion +// +def completionSummary() { + Map colors = logColours() + if (workflow.success) { + if (workflow.stats.ignoredCount == 0) { + log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Pipeline completed successfully${colors.reset}-" + } else { + log.info "-${colors.purple}[$workflow.manifest.name]${colors.yellow} Pipeline completed successfully, but with errored process(es) ${colors.reset}-" + } + } else { + log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed with errors${colors.reset}-" + } +} + +// +// Construct and send a notification to a web server as JSON e.g. Microsoft Teams and Slack +// +def imNotification(summary_params) { + def hook_url = params.hook_url + + def summary = [:] + for (group in summary_params.keySet()) { + summary << summary_params[group] + } + + def misc_fields = [:] + misc_fields['start'] = workflow.start + misc_fields['complete'] = workflow.complete + misc_fields['scriptfile'] = workflow.scriptFile + misc_fields['scriptid'] = workflow.scriptId + if (workflow.repository) misc_fields['repository'] = workflow.repository + if (workflow.commitId) misc_fields['commitid'] = workflow.commitId + if (workflow.revision) misc_fields['revision'] = workflow.revision + misc_fields['nxf_version'] = workflow.nextflow.version + misc_fields['nxf_build'] = workflow.nextflow.build + misc_fields['nxf_timestamp'] = workflow.nextflow.timestamp + + def msg_fields = [:] + msg_fields['version'] = NfcoreTemplate.version(workflow) + msg_fields['runName'] = workflow.runName + msg_fields['success'] = workflow.success + msg_fields['dateComplete'] = workflow.complete + msg_fields['duration'] = workflow.duration + msg_fields['exitStatus'] = workflow.exitStatus + msg_fields['errorMessage'] = (workflow.errorMessage ?: 'None') + msg_fields['errorReport'] = (workflow.errorReport ?: 'None') + msg_fields['commandLine'] = workflow.commandLine.replaceFirst(/ +--hook_url +[^ ]+/, "") + msg_fields['projectDir'] = workflow.projectDir + msg_fields['summary'] = summary << misc_fields + + // Render the JSON template + def engine = new groovy.text.GStringTemplateEngine() + // Different JSON depending on the service provider + // Defaults to "Adaptive Cards" (https://adaptivecards.io), except Slack which has its own format + def json_path = hook_url.contains("hooks.slack.com") ? "slackreport.json" : "adaptivecard.json" + def hf = new File("${workflow.projectDir}/assets/${json_path}") + def json_template = engine.createTemplate(hf).make(msg_fields) + def json_message = json_template.toString() + + // POST + def post = new URL(hook_url).openConnection(); + post.setRequestMethod("POST") + post.setDoOutput(true) + post.setRequestProperty("Content-Type", "application/json") + post.getOutputStream().write(json_message.getBytes("UTF-8")); + def postRC = post.getResponseCode(); + if (! postRC.equals(200)) { + log.warn(post.getErrorStream().getText()); + } +} diff --git a/subworkflows/local/nf_validation_plugin_utils/main.nf b/subworkflows/local/nf_validation_plugin_utils/main.nf new file mode 100644 index 00000000..be815a7f --- /dev/null +++ b/subworkflows/local/nf_validation_plugin_utils/main.nf @@ -0,0 +1,52 @@ +// +// Subworkflow that uses the nf-validation plugin to render help text and parameter summary +// + +/* +======================================================================================== + IMPORT NF-VALIDATION PLUGIN +======================================================================================== +*/ + +include { paramsHelp; paramsSummaryLog; paramsSummaryMap; validateParameters } from 'plugin/nf-validation' + +/* +======================================================================================== + SUBWORKFLOW DEFINITION +======================================================================================== +*/ + +workflow NF_VALIDATION_PLUGIN_UTILS { + + take: + print_help // bool + workflow_command // string: default commmand used to run pipeline + pre_help_text // string: string to be printed before help text and summary log + post_help_text // string: string to be printed after help text and summary log + validate_params // bool + + main: + + // + // Print help message if needed + // + if (print_help && workflow_command) { + log.info pre_help_text + paramsHelp(workflow_command) + post_help_text + System.exit(0) + } + + // + // Print parameter summary to stdout + // + log.info pre_help_text + paramsSummaryLog(workflow) + post_help_text + + // + // Validate parameters relative to the parameter JSON schema + // + if (validate_params){ + validateParameters() + } + + emit: + summary_params = paramsSummaryMap(workflow) +} From 2f68d1efa8bfb77b3d2a3088526e4971fb96a346 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 11 Oct 2023 12:26:26 +0100 Subject: [PATCH 534/852] Invoke imNotification in completion subworkflow --- main.nf | 1 + subworkflows/local/nf_core_fetchngs_utils/main.nf | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/main.nf b/main.nf index 7794d1b9..6d3ea228 100644 --- a/main.nf +++ b/main.nf @@ -85,6 +85,7 @@ workflow { params.input_type, params.email, params.email_on_fail, + params.hook_url, PIPELINE_INITIALISATION.out.summary_params ) } diff --git a/subworkflows/local/nf_core_fetchngs_utils/main.nf b/subworkflows/local/nf_core_fetchngs_utils/main.nf index 129b2e3f..5cc2162b 100644 --- a/subworkflows/local/nf_core_fetchngs_utils/main.nf +++ b/subworkflows/local/nf_core_fetchngs_utils/main.nf @@ -11,7 +11,7 @@ include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../../../modules/nf-core/custom/dumpsoftwareversions' include { NEXTFLOW_PIPELINE_UTILS; getWorkflowVersion } from '../nextflow_pipeline_utils' include { NF_VALIDATION_PLUGIN_UTILS } from '../nf_validation_plugin_utils' -include { NF_CORE_PIPELINE_UTILS; workflowCitation; nfCoreLogo; dashedLine; completionEmail; completionSummary } from '../nf_core_pipeline_utils' +include { NF_CORE_PIPELINE_UTILS; workflowCitation; nfCoreLogo; dashedLine; completionEmail; completionSummary; imNotification } from '../nf_core_pipeline_utils' /* ======================================================================================== @@ -96,6 +96,7 @@ workflow PIPELINE_COMPLETION { input_type // string: 'sra' or 'synapse' email // string: email address email_on_fail // string: email address sent on pipeline failure + hook_url // string: hook URL for notifications summary_params // map: Groovy map of the parameters used in the pipeline main: @@ -117,6 +118,10 @@ workflow PIPELINE_COMPLETION { completionSummary() + if (hook_url) { + imNotification(summary_params) + } + if (input_type == 'sra') { sraCurateSamplesheetWarn() } else if (input_type == 'synapse') { From d1e1bc67a12562bb86f01801cf15e06d61f64282 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Wed, 11 Oct 2023 16:16:36 +0200 Subject: [PATCH 535/852] EC lint --- main.nf | 2 +- workflows/sra/main.nf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/main.nf b/main.nf index 6d3ea228..bf39d7ea 100644 --- a/main.nf +++ b/main.nf @@ -29,7 +29,7 @@ workflow NFCORE_FETCHNGS { ids // channel: database ids read in from --input main: - + ch_versions = Channel.empty() // diff --git a/workflows/sra/main.nf b/workflows/sra/main.nf index a8f54646..ddac096d 100644 --- a/workflows/sra/main.nf +++ b/workflows/sra/main.nf @@ -96,7 +96,7 @@ workflow SRA { // Isolate FASTQ channel which will be added to emit block fastq_files .mix(SRA_FASTQ_FTP.out.fastq, FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS.out.reads) - .map { + .map { meta, fastq -> def reads = fastq instanceof List ? fastq.flatten() : [ fastq ] def meta_clone = meta.clone() From 770de1b7404b40a4f86f3198cbad0f9eff9ca6d8 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Wed, 11 Oct 2023 16:17:06 +0200 Subject: [PATCH 536/852] update nf-core modules --- .nf-core.yml | 5 + modules.json | 6 +- .../dumpsoftwareversions/tests/main.nf.test | 38 ++++++ .../tests/main.nf.test.snap | 27 +++++ .../dumpsoftwareversions/tests/tags.yml | 2 + .../sratools/fasterqdump/tests/main.nf.test | 69 +++++++++++ .../fasterqdump/tests/main.nf.test.snap | 70 +++++++++++ .../sratools/fasterqdump/tests/tags.yml | 2 + .../sratools/prefetch/tests/main.nf.test | 53 +++++++++ .../sratools/prefetch/tests/main.nf.test.snap | 110 ++++++++++++++++++ .../nf-core/sratools/prefetch/tests/tags.yml | 2 + workflows/sra/tests/main.nf.test | 6 + .../sra_custom_ena_metadata_fields.nf.test | 6 + .../tests/sra_force_sratools_download.nf.test | 6 + .../sra_nf_core_pipeline_atacseq.nf.test | 6 + .../tests/sra_nf_core_pipeline_rnaseq.nf.test | 6 + .../sra_nf_core_pipeline_taxprofiler.nf.test | 6 + .../sra_nf_core_pipeline_viralrecon.nf.test | 6 + .../sra/tests/sra_skip_fastq_download.nf.test | 6 + workflows/sra/tests/tags.yml | 40 ------- 20 files changed, 429 insertions(+), 43 deletions(-) create mode 100644 modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test create mode 100644 modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap create mode 100644 modules/nf-core/custom/dumpsoftwareversions/tests/tags.yml create mode 100644 modules/nf-core/sratools/fasterqdump/tests/main.nf.test create mode 100644 modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap create mode 100644 modules/nf-core/sratools/fasterqdump/tests/tags.yml create mode 100644 modules/nf-core/sratools/prefetch/tests/main.nf.test create mode 100644 modules/nf-core/sratools/prefetch/tests/main.nf.test.snap create mode 100644 modules/nf-core/sratools/prefetch/tests/tags.yml diff --git a/.nf-core.yml b/.nf-core.yml index bb27a4e9..0e89cae9 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -4,9 +4,14 @@ lint: files_exist: - .github/workflows/awsfulltest.yml - .github/workflows/awstest.yml + - assets/multiqc_config.yml - conf/igenomes.config - conf/modules.config + - lib/NfcoreTemplate.groovy + - lib/Utils.groovy - lib/WorkflowFetchngs.groovy + - lib/WorkflowMain.groovy + - lib/nfcore_external_java_deps.jar files_unchanged: - .gitattributes - .gitignore diff --git a/modules.json b/modules.json index 6dd402db..d629089b 100644 --- a/modules.json +++ b/modules.json @@ -7,7 +7,7 @@ "nf-core": { "custom/dumpsoftwareversions": { "branch": "master", - "git_sha": "05c280924b6c768d484c7c443dad5e605c4ff4b4", + "git_sha": "1526dc37227a1101bdca25339337362e187a6b3b", "installed_by": ["modules"] }, "custom/sratoolsncbisettings": { @@ -17,12 +17,12 @@ }, "sratools/fasterqdump": { "branch": "master", - "git_sha": "4d9951c6c9c4c19ea944bb73149caf9d3cb1f2fc", + "git_sha": "b4d743f1bb8d92eb129a5925a9211beb689be625", "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] }, "sratools/prefetch": { "branch": "master", - "git_sha": "4d9951c6c9c4c19ea944bb73149caf9d3cb1f2fc", + "git_sha": "096ea8a4db569cc680ada4105e1d313cc56329c8", "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] } } diff --git a/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test b/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test new file mode 100644 index 00000000..73027efc --- /dev/null +++ b/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test @@ -0,0 +1,38 @@ +nextflow_process { + + name "Test Process CUSTOM_DUMPSOFTWAREVERSIONS" + script "modules/nf-core/custom/dumpsoftwareversions/main.nf" + process "CUSTOM_DUMPSOFTWAREVERSIONS" + tag "custom" + tag "dumpsoftwareversions" + tag "custom/dumpsoftwareversions" + tag "modules_nfcore" + + test("Should run without failures") { + setup { + run("FASTQC") { + script "modules/nf-core/fastqc/main.nf" + process { + """ + input[0] = Channel.of([ [], file(params.test_data['sarscov2']['illumina']['test_1_fastq_gz'], checkIfExists: true) ]) + """ + } + } + } + + when { + process { + """ + input[0] = FASTQC.out.versions + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap b/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap new file mode 100644 index 00000000..7398cf5c --- /dev/null +++ b/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap @@ -0,0 +1,27 @@ +{ + "Should run without failures": { + "content": [ + { + "0": [ + "software_versions.yml:md5,252b721b2ad1475301c9d778c7ce8db2" + ], + "1": [ + "software_versions_mqc.yml:md5,70324befa5d37dd5317190017d53e6dd" + ], + "2": [ + "versions.yml:md5,f47ebd22aba1dd987b7e5d5247b766c3" + ], + "mqc_yml": [ + "software_versions_mqc.yml:md5,70324befa5d37dd5317190017d53e6dd" + ], + "versions": [ + "versions.yml:md5,f47ebd22aba1dd987b7e5d5247b766c3" + ], + "yml": [ + "software_versions.yml:md5,252b721b2ad1475301c9d778c7ce8db2" + ] + } + ], + "timestamp": "2023-10-11T15:13:35.246649" + } +} diff --git a/modules/nf-core/custom/dumpsoftwareversions/tests/tags.yml b/modules/nf-core/custom/dumpsoftwareversions/tests/tags.yml new file mode 100644 index 00000000..405aa24a --- /dev/null +++ b/modules/nf-core/custom/dumpsoftwareversions/tests/tags.yml @@ -0,0 +1,2 @@ +custom/dumpsoftwareversions: + - modules/nf-core/custom/dumpsoftwareversions/** diff --git a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test new file mode 100644 index 00000000..7da3af20 --- /dev/null +++ b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test @@ -0,0 +1,69 @@ +nextflow_process { + name "Test Process SRATOOLS_FASTERQDUMP" + script "modules/nf-core/sratools/fasterqdump/main.nf" + process "SRATOOLS_FASTERQDUMP" + tag "sratools/fasterqdump" + tag "modules_nfcore" + + test("Single-end") { + + setup { + run("UNTAR") { + script "modules/nf-core/untar/main.nf" + process { + """ + input[0] = Channel.of([ [], file(params.test_data['sarscov2']['illumina']['SRR13255544_tar_gz'], checkIfExists: true) ]) + """ + } + } + } + + when { + process { + """ + input[0] = UNTAR.out.untar.collect{ meta, files -> files }.map{ files -> [ [ id:'test_single_end', single_end:true ], files]} + input[1] = file(params.test_data['generic']['config']['ncbi_user_settings'], checkIfExists: true) + input[2] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("Paired-end") { + + setup { + run("UNTAR") { + script "modules/nf-core/untar/main.nf" + process { + """ + input[0] = Channel.of([ [], file(params.test_data['sarscov2']['illumina']['SRR11140744_tar_gz'], checkIfExists: true) ]) + """ + } + } + } + + when { + process { + """ + input[0] = UNTAR.out.untar.collect{ meta, files -> files }.map{ files -> [ [ id:'test_paired_end', single_end:false ], files]} + input[1] = file(params.test_data['generic']['config']['ncbi_user_settings'], checkIfExists: true) + input[2] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap new file mode 100644 index 00000000..d3bf90f7 --- /dev/null +++ b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap @@ -0,0 +1,70 @@ +{ + "Single-end": { + "content": [ + { + "0": [ + [ + { + "id": "test_single_end", + "single_end": true + }, + "test_single_end.fastq.gz:md5,1054c7b71884acdb5eed8a378f18be82" + ] + ], + "1": [ + "versions.yml:md5,a3d61a9761e1606ef8459f0b68821d7a" + ], + "reads": [ + [ + { + "id": "test_single_end", + "single_end": true + }, + "test_single_end.fastq.gz:md5,1054c7b71884acdb5eed8a378f18be82" + ] + ], + "versions": [ + "versions.yml:md5,a3d61a9761e1606ef8459f0b68821d7a" + ] + } + ], + "timestamp": "2023-10-10T18:11:12.87053" + }, + "Paired-end": { + "content": [ + { + "0": [ + [ + { + "id": "test_paired_end", + "single_end": false + }, + [ + "test_paired_end_1.fastq.gz:md5,193809c784a4ea132ab2a253fa4f55b6", + "test_paired_end_2.fastq.gz:md5,3e3b3af3413f50a1685fd7b3f1456d4e" + ] + ] + ], + "1": [ + "versions.yml:md5,a3d61a9761e1606ef8459f0b68821d7a" + ], + "reads": [ + [ + { + "id": "test_paired_end", + "single_end": false + }, + [ + "test_paired_end_1.fastq.gz:md5,193809c784a4ea132ab2a253fa4f55b6", + "test_paired_end_2.fastq.gz:md5,3e3b3af3413f50a1685fd7b3f1456d4e" + ] + ] + ], + "versions": [ + "versions.yml:md5,a3d61a9761e1606ef8459f0b68821d7a" + ] + } + ], + "timestamp": "2023-10-10T18:11:50.928006" + } +} \ No newline at end of file diff --git a/modules/nf-core/sratools/fasterqdump/tests/tags.yml b/modules/nf-core/sratools/fasterqdump/tests/tags.yml new file mode 100644 index 00000000..5d1ddcb3 --- /dev/null +++ b/modules/nf-core/sratools/fasterqdump/tests/tags.yml @@ -0,0 +1,2 @@ +sratools/fasterqdump: + - modules/nf-core/sratools/fasterqdump/** diff --git a/modules/nf-core/sratools/prefetch/tests/main.nf.test b/modules/nf-core/sratools/prefetch/tests/main.nf.test new file mode 100644 index 00000000..1234a82b --- /dev/null +++ b/modules/nf-core/sratools/prefetch/tests/main.nf.test @@ -0,0 +1,53 @@ +nextflow_process { + name "Test Process SRATOOLS_PREFETCH" + script "modules/nf-core/sratools/prefetch/main.nf" + process "SRATOOLS_PREFETCH" + tag "sratools/prefetch" + tag "modules_nfcore" + + test("sratools/prefetch") { + + when { + params { + outdir = "output" + } + process { + """ + input[0] = Channel.of([ [ id:'test', single_end:false ], 'DRR000774' ]) + input[1] = file(params.test_data['generic']['config']['ncbi_user_settings'], checkIfExists: true) + input[2] = [] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process).match() } + ) + } + } + + test("sratools/prefetch with sralite") { + + when { + params { + outdir = "output" + } + process { + """ + input[0] = Channel.of([ [ id:'test', single_end:false ], 'SRR1170046' ]) + input[1] = file(params.test_data['generic']['config']['ncbi_user_settings'], checkIfExists: true) + input[2] = [] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process).match() } + ) + } + } +} diff --git a/modules/nf-core/sratools/prefetch/tests/main.nf.test.snap b/modules/nf-core/sratools/prefetch/tests/main.nf.test.snap new file mode 100644 index 00000000..95ea067f --- /dev/null +++ b/modules/nf-core/sratools/prefetch/tests/main.nf.test.snap @@ -0,0 +1,110 @@ +{ + "sratools/prefetch with sralite": { + "content": [ + { + "stderr": [ + + ], + "errorReport": null, + "exitStatus": 0, + "out": { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "SRR1170046.sralite:md5,7acfce556ca0951aff49d780899c105b" + ] + ] + ], + "1": [ + "versions.yml:md5,c967dea4135cb75490e1e801c4639efc" + ], + "sra": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "SRR1170046.sralite:md5,7acfce556ca0951aff49d780899c105b" + ] + ] + ], + "versions": [ + "versions.yml:md5,c967dea4135cb75490e1e801c4639efc" + ] + }, + "failed": false, + "stdout": [ + + ], + "errorMessage": null, + "trace": { + "tasksFailed": 0, + "tasksCount": 1, + "tasksSucceeded": 1 + }, + "name": "SRATOOLS_PREFETCH", + "success": true + } + ], + "timestamp": "2023-10-10T15:26:45.715617" + }, + "sratools/prefetch": { + "content": [ + { + "stderr": [ + + ], + "errorReport": null, + "exitStatus": 0, + "out": { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "DRR000774.sra:md5,7647dba20c89c0e3d7ad13842f060eb0" + ] + ] + ], + "1": [ + "versions.yml:md5,c967dea4135cb75490e1e801c4639efc" + ], + "sra": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "DRR000774.sra:md5,7647dba20c89c0e3d7ad13842f060eb0" + ] + ] + ], + "versions": [ + "versions.yml:md5,c967dea4135cb75490e1e801c4639efc" + ] + }, + "failed": false, + "stdout": [ + + ], + "errorMessage": null, + "trace": { + "tasksFailed": 0, + "tasksCount": 1, + "tasksSucceeded": 1 + }, + "name": "SRATOOLS_PREFETCH", + "success": true + } + ], + "timestamp": "2023-10-10T09:58:01.781848" + } +} \ No newline at end of file diff --git a/modules/nf-core/sratools/prefetch/tests/tags.yml b/modules/nf-core/sratools/prefetch/tests/tags.yml new file mode 100644 index 00000000..52110bfd --- /dev/null +++ b/modules/nf-core/sratools/prefetch/tests/tags.yml @@ -0,0 +1,2 @@ +sratools/prefetch: + - modules/nf-core/sratools/prefetch/** diff --git a/workflows/sra/tests/main.nf.test b/workflows/sra/tests/main.nf.test index b525bec5..dcf67105 100644 --- a/workflows/sra/tests/main.nf.test +++ b/workflows/sra/tests/main.nf.test @@ -3,6 +3,12 @@ nextflow_workflow { name "Test workflow: sra/main.nf" script "workflows/sra/main.nf" workflow "SRA" + tag "multiqc_mappings_config" + tag "sra_fastq_ftp" + tag "sra_ids_to_runinfo" + tag "sra_merge_samplesheet" + tag "sra_runinfo_to_ftp" + tag "sra_to_samplesheet" tag "workflows" tag "workflows_sra" tag "sra_default_parameters" diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test index 7c9df9d9..04a60471 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test @@ -3,6 +3,12 @@ nextflow_workflow { name "Test workflow: sra/main.nf" script "workflows/sra/main.nf" workflow "SRA" + tag "multiqc_mappings_config" + tag "sra_fastq_ftp" + tag "sra_ids_to_runinfo" + tag "sra_merge_samplesheet" + tag "sra_runinfo_to_ftp" + tag "sra_to_samplesheet" tag "workflows" tag "workflows_sra" tag "sra_custom_ena_metadata_fields" diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test b/workflows/sra/tests/sra_force_sratools_download.nf.test index 2548689d..c669af8d 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test @@ -3,6 +3,12 @@ nextflow_workflow { name "Test workflow: sra/main.nf" script "workflows/sra/main.nf" workflow "SRA" + tag "multiqc_mappings_config" + tag "sra_fastq_ftp" + tag "sra_ids_to_runinfo" + tag "sra_merge_samplesheet" + tag "sra_runinfo_to_ftp" + tag "sra_to_samplesheet" tag "workflows" tag "workflows_sra" tag "sra_force_sratools_download" diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test index ad60725c..e88e5f63 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test @@ -3,6 +3,12 @@ nextflow_workflow { name "Test workflow: sra/main.nf" script "workflows/sra/main.nf" workflow "SRA" + tag "multiqc_mappings_config" + tag "sra_fastq_ftp" + tag "sra_ids_to_runinfo" + tag "sra_merge_samplesheet" + tag "sra_runinfo_to_ftp" + tag "sra_to_samplesheet" tag "workflows" tag "workflows_sra" tag "sra_nf_core_pipeline_atacseq" diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test index 993590ff..63c871ca 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test @@ -3,6 +3,12 @@ nextflow_workflow { name "Test workflow: sra/main.nf" script "workflows/sra/main.nf" workflow "SRA" + tag "multiqc_mappings_config" + tag "sra_fastq_ftp" + tag "sra_ids_to_runinfo" + tag "sra_merge_samplesheet" + tag "sra_runinfo_to_ftp" + tag "sra_to_samplesheet" tag "workflows" tag "workflows_sra" tag "sra_nf_core_pipeline_rnaseq" diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test index a5e69da1..15a31848 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test @@ -3,6 +3,12 @@ nextflow_workflow { name "Test workflow: sra/main.nf" script "workflows/sra/main.nf" workflow "SRA" + tag "multiqc_mappings_config" + tag "sra_fastq_ftp" + tag "sra_ids_to_runinfo" + tag "sra_merge_samplesheet" + tag "sra_runinfo_to_ftp" + tag "sra_to_samplesheet" tag "workflows" tag "workflows_sra" tag "sra_nf_core_pipeline_taxprofiler" diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test index f64cf92e..4c11d571 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test @@ -3,6 +3,12 @@ nextflow_workflow { name "Test workflow: sra/main.nf" script "workflows/sra/main.nf" workflow "SRA" + tag "multiqc_mappings_config" + tag "sra_fastq_ftp" + tag "sra_ids_to_runinfo" + tag "sra_merge_samplesheet" + tag "sra_runinfo_to_ftp" + tag "sra_to_samplesheet" tag "workflows" tag "workflows_sra" tag "sra_nf_core_pipeline_viralrecon" diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test b/workflows/sra/tests/sra_skip_fastq_download.nf.test index aa290c68..8cb68641 100644 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test @@ -3,6 +3,12 @@ nextflow_workflow { name "Test workflow: sra/main.nf" script "workflows/sra/main.nf" workflow "SRA" + tag "multiqc_mappings_config" + tag "sra_fastq_ftp" + tag "sra_ids_to_runinfo" + tag "sra_merge_samplesheet" + tag "sra_runinfo_to_ftp" + tag "sra_to_samplesheet" tag "workflows" tag "workflows_sra" tag "sra_skip_fastq_download" diff --git a/workflows/sra/tests/tags.yml b/workflows/sra/tests/tags.yml index 52c3e591..ae41e37d 100644 --- a/workflows/sra/tests/tags.yml +++ b/workflows/sra/tests/tags.yml @@ -1,56 +1,16 @@ sra_custom_ena_metadata_fields: - - modules/local/sra_ids_to_runinfo/** - - modules/local/sra_runinfo_to_ftp/** - - modules/local/sra_fastq_ftp/** - - modules/local/sra_to_samplesheet/** - - modules/local/sra_merge_samplesheet/** - workflows/sra/** sra_default_parameters: - - modules/local/sra_ids_to_runinfo/** - - modules/local/sra_runinfo_to_ftp/** - - modules/local/sra_fastq_ftp/** - - modules/local/sra_to_samplesheet/** - - modules/local/sra_merge_samplesheet/** - workflows/sra/** sra_force_sratools_download: - - modules/local/sra_ids_to_runinfo/** - - modules/local/sra_runinfo_to_ftp/** - - modules/local/sra_fastq_ftp/** - - modules/local/sra_to_samplesheet/** - - modules/local/sra_merge_samplesheet/** - workflows/sra/** sra_nf_core_pipeline_atacseq: - - modules/local/sra_ids_to_runinfo/** - - modules/local/sra_runinfo_to_ftp/** - - modules/local/sra_fastq_ftp/** - - modules/local/sra_to_samplesheet/** - - modules/local/sra_merge_samplesheet/** - workflows/sra/** sra_nf_core_pipeline_rnaseq: - - modules/local/sra_ids_to_runinfo/** - - modules/local/sra_runinfo_to_ftp/** - - modules/local/sra_fastq_ftp/** - - modules/local/sra_to_samplesheet/** - - modules/local/sra_merge_samplesheet/** - workflows/sra/** sra_nf_core_pipeline_taxprofiler: - - modules/local/sra_ids_to_runinfo/** - - modules/local/sra_runinfo_to_ftp/** - - modules/local/sra_fastq_ftp/** - - modules/local/sra_to_samplesheet/** - - modules/local/sra_merge_samplesheet/** - workflows/sra/** sra_nf_core_pipeline_viralrecon: - - modules/local/sra_ids_to_runinfo/** - - modules/local/sra_runinfo_to_ftp/** - - modules/local/sra_fastq_ftp/** - - modules/local/sra_to_samplesheet/** - - modules/local/sra_merge_samplesheet/** - workflows/sra/** sra_skip_fastq_download: - - modules/local/sra_ids_to_runinfo/** - - modules/local/sra_runinfo_to_ftp/** - - modules/local/sra_fastq_ftp/** - - modules/local/sra_to_samplesheet/** - - modules/local/sra_merge_samplesheet/** - workflows/sra/** From 6002c61f880b28bfcb817d9833854a141713d595 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Wed, 11 Oct 2023 16:20:27 +0200 Subject: [PATCH 537/852] update nf-test version --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 436b61a5..70f7f815 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,7 +15,7 @@ on: env: NXF_ANSI_LOG: false - NFTEST_VER: "0.8.0" + NFTEST_VER: "0.8.1" concurrency: group: "${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}" From f85e0321d27fa8e759a19ed39d9347883bd2feab Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 12 Oct 2023 11:04:40 +0100 Subject: [PATCH 538/852] Use relative paths for main script location for nf-test --- modules/local/multiqc_mappings_config/tests/main.nf.test | 2 +- modules/local/sra_fastq_ftp/tests/main.nf.test | 2 +- modules/local/sra_ids_to_runinfo/tests/main.nf.test | 2 +- modules/local/sra_merge_samplesheet/tests/main.nf.test | 2 +- modules/local/sra_runinfo_to_ftp/tests/main.nf.test | 2 +- modules/local/sra_to_samplesheet/tests/main.nf.test | 2 +- workflows/sra/tests/main.nf.test | 2 +- workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test | 2 +- workflows/sra/tests/sra_force_sratools_download.nf.test | 2 +- workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test | 2 +- workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test | 2 +- workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test | 2 +- workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test | 2 +- workflows/sra/tests/sra_skip_fastq_download.nf.test | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/modules/local/multiqc_mappings_config/tests/main.nf.test b/modules/local/multiqc_mappings_config/tests/main.nf.test index 3bf79537..75356197 100644 --- a/modules/local/multiqc_mappings_config/tests/main.nf.test +++ b/modules/local/multiqc_mappings_config/tests/main.nf.test @@ -1,7 +1,7 @@ nextflow_process { name "Test process: MULTIQC_MAPPINGS_CONFIG" - script "modules/local/multiqc_mappings_config/main.nf" + script "../main.nf" process "MULTIQC_MAPPINGS_CONFIG" tag "modules" tag "modules_local" diff --git a/modules/local/sra_fastq_ftp/tests/main.nf.test b/modules/local/sra_fastq_ftp/tests/main.nf.test index 7892d156..ab846e5d 100644 --- a/modules/local/sra_fastq_ftp/tests/main.nf.test +++ b/modules/local/sra_fastq_ftp/tests/main.nf.test @@ -1,7 +1,7 @@ nextflow_process { name "Test process: SRA_FASTQ_FTP" - script "modules/local/sra_fastq_ftp/main.nf" + script "../main.nf" process "SRA_FASTQ_FTP" tag "modules" tag "modules_local" diff --git a/modules/local/sra_ids_to_runinfo/tests/main.nf.test b/modules/local/sra_ids_to_runinfo/tests/main.nf.test index f8a44086..087f9069 100644 --- a/modules/local/sra_ids_to_runinfo/tests/main.nf.test +++ b/modules/local/sra_ids_to_runinfo/tests/main.nf.test @@ -1,7 +1,7 @@ nextflow_process { name "Test process: SRA_IDS_TO_RUNINFO" - script "modules/local/sra_ids_to_runinfo/main.nf" + script "../main.nf" process "SRA_IDS_TO_RUNINFO" tag "modules" tag "modules_local" diff --git a/modules/local/sra_merge_samplesheet/tests/main.nf.test b/modules/local/sra_merge_samplesheet/tests/main.nf.test index e37039bd..b7c98622 100644 --- a/modules/local/sra_merge_samplesheet/tests/main.nf.test +++ b/modules/local/sra_merge_samplesheet/tests/main.nf.test @@ -1,7 +1,7 @@ nextflow_process { name "Test process: SRA_MERGE_SAMPLESHEET" - script "modules/local/sra_merge_samplesheet/main.nf" + script "../main.nf" process "SRA_MERGE_SAMPLESHEET" tag "modules" tag "modules_local" diff --git a/modules/local/sra_runinfo_to_ftp/tests/main.nf.test b/modules/local/sra_runinfo_to_ftp/tests/main.nf.test index 1558ff39..3b1405f9 100644 --- a/modules/local/sra_runinfo_to_ftp/tests/main.nf.test +++ b/modules/local/sra_runinfo_to_ftp/tests/main.nf.test @@ -1,7 +1,7 @@ nextflow_process { name "Test process: SRA_RUNINFO_TO_FTP" - script "modules/local/sra_runinfo_to_ftp/main.nf" + script "../main.nf" process "SRA_RUNINFO_TO_FTP" tag "modules" tag "modules_local" diff --git a/modules/local/sra_to_samplesheet/tests/main.nf.test b/modules/local/sra_to_samplesheet/tests/main.nf.test index b2ec5b11..6094717b 100644 --- a/modules/local/sra_to_samplesheet/tests/main.nf.test +++ b/modules/local/sra_to_samplesheet/tests/main.nf.test @@ -1,7 +1,7 @@ nextflow_process { name "Test process: SRA_TO_SAMPLESHEET" - script "modules/local/sra_to_samplesheet/main.nf" + script "../main.nf" process "SRA_TO_SAMPLESHEET" tag "modules" tag "modules_local" diff --git a/workflows/sra/tests/main.nf.test b/workflows/sra/tests/main.nf.test index dcf67105..6b459773 100644 --- a/workflows/sra/tests/main.nf.test +++ b/workflows/sra/tests/main.nf.test @@ -1,7 +1,7 @@ nextflow_workflow { name "Test workflow: sra/main.nf" - script "workflows/sra/main.nf" + script "../main.nf" workflow "SRA" tag "multiqc_mappings_config" tag "sra_fastq_ftp" diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test index 04a60471..0d0b85df 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test @@ -1,7 +1,7 @@ nextflow_workflow { name "Test workflow: sra/main.nf" - script "workflows/sra/main.nf" + script "../main.nf" workflow "SRA" tag "multiqc_mappings_config" tag "sra_fastq_ftp" diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test b/workflows/sra/tests/sra_force_sratools_download.nf.test index c669af8d..5cd54142 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test @@ -1,7 +1,7 @@ nextflow_workflow { name "Test workflow: sra/main.nf" - script "workflows/sra/main.nf" + script "../main.nf" workflow "SRA" tag "multiqc_mappings_config" tag "sra_fastq_ftp" diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test index e88e5f63..ef069674 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test @@ -1,7 +1,7 @@ nextflow_workflow { name "Test workflow: sra/main.nf" - script "workflows/sra/main.nf" + script "../main.nf" workflow "SRA" tag "multiqc_mappings_config" tag "sra_fastq_ftp" diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test index 63c871ca..4eb57027 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test @@ -1,7 +1,7 @@ nextflow_workflow { name "Test workflow: sra/main.nf" - script "workflows/sra/main.nf" + script "../main.nf" workflow "SRA" tag "multiqc_mappings_config" tag "sra_fastq_ftp" diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test index 15a31848..019c9af8 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test @@ -1,7 +1,7 @@ nextflow_workflow { name "Test workflow: sra/main.nf" - script "workflows/sra/main.nf" + script "../main.nf" workflow "SRA" tag "multiqc_mappings_config" tag "sra_fastq_ftp" diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test index 4c11d571..dce26b16 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test @@ -1,7 +1,7 @@ nextflow_workflow { name "Test workflow: sra/main.nf" - script "workflows/sra/main.nf" + script "../main.nf" workflow "SRA" tag "multiqc_mappings_config" tag "sra_fastq_ftp" diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test b/workflows/sra/tests/sra_skip_fastq_download.nf.test index 8cb68641..142e8aff 100644 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test @@ -1,7 +1,7 @@ nextflow_workflow { name "Test workflow: sra/main.nf" - script "workflows/sra/main.nf" + script "../main.nf" workflow "SRA" tag "multiqc_mappings_config" tag "sra_fastq_ftp" From 3776119a8717fc723bd60188124f9a92943713fa Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 12 Oct 2023 11:05:06 +0100 Subject: [PATCH 539/852] Remove nf-test branch from ci.yml --- .github/workflows/ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 70f7f815..ef127625 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,7 +11,6 @@ on: - master - dev - refactor - - nf-test env: NXF_ANSI_LOG: false From c44000154a7232911c081fa1511639c1ce635dc0 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 12 Oct 2023 11:14:23 +0100 Subject: [PATCH 540/852] Update CHANGELOG and author contributions --- CHANGELOG.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c500efcc..9264eb59 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,25 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unpublished Version / DEV] +### Credits + +Special thanks to the following for their contributions to the release: + +- [Adam Talbot](https://github.com/adamrtalbot) +- [Edmund Miller](https://github.com/Emiller88) +- [Esha Joshi](https://github.com/ejseqera) +- [Harshil Patel](https://github.com/drpatelh) +- [James Fellows Yates](https://github.com/jfy133) +- [Maxime Garcia](https://github.com/maxulysse) +- [Rob Syme](https://github.com/robsyme) +- [Sateesh Peri](https://github.com/sateeshperi) + +Thank you to everyone else that has contributed by reporting bugs, enhancements or in any other way, shape or form. + +### Enhancements & fixes + +- [PR #XXX](https://github.com/nf-core/fetchngs/pull/XXX) - Use nf-test for all pipeline testing + ### Enhancements & fixes ## [[1.10.1](https://github.com/nf-core/fetchngs/releases/tag/1.10.1)] - 2023-10-08 @@ -14,8 +33,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 Special thanks to the following for their contributions to the release: - [Adam Talbot](https://github.com/adamrtalbot) +- [Davide Carlson](https://github.com/davidecarlson) - [Harshil Patel](https://github.com/drpatelh) - [Maxime Garcia](https://github.com/maxulysse) +- [MCMandR](https://github.com/MCMandR) - [Rob Syme](https://github.com/robsyme) Thank you to everyone else that has contributed by reporting bugs, enhancements or in any other way, shape or form. From 46f258fd879870aae381e9db9e6a14e443ad3ef7 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 12 Oct 2023 11:17:42 +0100 Subject: [PATCH 541/852] Add nf-test citation --- CITATIONS.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CITATIONS.md b/CITATIONS.md index 570e7e5b..482d5600 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -37,7 +37,7 @@ - [Synapse](https://pubmed.ncbi.nlm.nih.gov/24071850/) > Omberg L, Ellrott K, Yuan Y, Kandoth C, Wong C, Kellen MR, Friend SH, Stuart J, Liang H, Margolin AA. Enabling transparent and collaborative computational analysis of 12 tumor types within The Cancer Genome Atlas. Nat Genet. 2013 Oct;45(10):1121-6. doi: 10.1038/ng.2761. PMID: 24071850; PMCID: PMC3950337. -## Software packaging/containerisation tools +## Software packaging/containerisation/testing tools - [Anaconda](https://anaconda.com) @@ -55,6 +55,8 @@ > Merkel, D. (2014). Docker: lightweight linux containers for consistent development and deployment. Linux Journal, 2014(239), 2. doi: 10.5555/2600239.2600241. +- [nf-test](https://code.askimed.com/nf-test) + - [Singularity](https://pubmed.ncbi.nlm.nih.gov/28494014/) > Kurtzer GM, Sochat V, Bauer MW. Singularity: Scientific containers for mobility of compute. PLoS One. 2017 May 11;12(5):e0177459. doi: 10.1371/journal.pone.0177459. eCollection 2017. PubMed PMID: 28494014; PubMed Central PMCID: PMC5426675. From 025f0ae6bb4807a6c5a688e211845fe6149ee76f Mon Sep 17 00:00:00 2001 From: maxulysse Date: Thu, 12 Oct 2023 12:26:38 +0200 Subject: [PATCH 542/852] update custom/dumpsoftwareversions --- modules.json | 2 +- .../dumpsoftwareversions/tests/main.nf.test | 23 +++++++++---------- .../tests/main.nf.test.snap | 10 ++++---- 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/modules.json b/modules.json index d629089b..87e40abf 100644 --- a/modules.json +++ b/modules.json @@ -7,7 +7,7 @@ "nf-core": { "custom/dumpsoftwareversions": { "branch": "master", - "git_sha": "1526dc37227a1101bdca25339337362e187a6b3b", + "git_sha": "1b372269755a5c4a13c23bc130ebada8cb9d4cd0", "installed_by": ["modules"] }, "custom/sratoolsncbisettings": { diff --git a/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test b/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test index 73027efc..d528d3cb 100644 --- a/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test +++ b/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test @@ -9,21 +9,20 @@ nextflow_process { tag "modules_nfcore" test("Should run without failures") { - setup { - run("FASTQC") { - script "modules/nf-core/fastqc/main.nf" - process { - """ - input[0] = Channel.of([ [], file(params.test_data['sarscov2']['illumina']['test_1_fastq_gz'], checkIfExists: true) ]) - """ - } - } - } - when { process { """ - input[0] = FASTQC.out.versions + def tool1_version = ''' + TOOL1: + tool1: 0.11.9 + '''.stripIndent() + + def tool2_version = ''' + TOOL2: + tool2: 1.9 + '''.stripIndent() + + input[0] = Channel.of(tool1_version, tool2_version).collectFile() """ } } diff --git a/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap b/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap index 7398cf5c..8713b921 100644 --- a/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap +++ b/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap @@ -3,25 +3,25 @@ "content": [ { "0": [ - "software_versions.yml:md5,252b721b2ad1475301c9d778c7ce8db2" + "software_versions.yml:md5,a027f820f30b8191a20ca16465daaf37" ], "1": [ - "software_versions_mqc.yml:md5,70324befa5d37dd5317190017d53e6dd" + "software_versions_mqc.yml:md5,ee4a1d028ad29987f9ac511f4668f17c" ], "2": [ "versions.yml:md5,f47ebd22aba1dd987b7e5d5247b766c3" ], "mqc_yml": [ - "software_versions_mqc.yml:md5,70324befa5d37dd5317190017d53e6dd" + "software_versions_mqc.yml:md5,ee4a1d028ad29987f9ac511f4668f17c" ], "versions": [ "versions.yml:md5,f47ebd22aba1dd987b7e5d5247b766c3" ], "yml": [ - "software_versions.yml:md5,252b721b2ad1475301c9d778c7ce8db2" + "software_versions.yml:md5,a027f820f30b8191a20ca16465daaf37" ] } ], - "timestamp": "2023-10-11T15:13:35.246649" + "timestamp": "2023-10-11T17:10:02.930699" } } From f65a861e36aa2238295219572480f64bc1249554 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 12 Oct 2023 11:38:23 +0100 Subject: [PATCH 543/852] Remove workflows/nextflow.config --- nextflow.config | 17 ++++++++++------- workflows/nextflow.config | 12 ------------ 2 files changed, 10 insertions(+), 19 deletions(-) delete mode 100644 workflows/nextflow.config diff --git a/nextflow.config b/nextflow.config index 5ad350c9..3589e118 100644 --- a/nextflow.config +++ b/nextflow.config @@ -65,6 +65,16 @@ try { System.err.println("WARNING: Could not load nf-core/config profiles: ${params.custom_config_base}/nfcore_custom.config") } +// Module specific configs +includeConfig './modules/nf-core/custom/dumpsoftwareversions/nextflow.config' + +// Workflow specific configs +if (params.input_type == 'sra') { + includeConfig './workflows/sra/nextflow.config' +} else if (params.input_type == 'synapse') { + includeConfig './workflows/synapse/nextflow.config' +} + // Load nf-core/fetchngs custom profiles from different institutions. // Warning: Uncomment only if a pipeline-specific instititutional config already exists on nf-core/configs! // try { @@ -227,13 +237,6 @@ manifest { doi = 'https://doi.org/10.5281/zenodo.5070524' } -// Module specific configs -// Currently just dumpsoftwareversions -includeConfig 'modules/nf-core/custom/dumpsoftwareversions/nextflow.config' - -// Workflow specific configs -includeConfig 'workflows/nextflow.config' - // Function to ensure that resource requirements don't go beyond // a maximum limit def check_max(obj, type) { diff --git a/workflows/nextflow.config b/workflows/nextflow.config deleted file mode 100644 index d27deb3a..00000000 --- a/workflows/nextflow.config +++ /dev/null @@ -1,12 +0,0 @@ -// Read in specific config relating to workflow. - -switch ( params.input_type ) { - case "sra": - includeConfig './sra/nextflow.config' - break - case "synapse": - includeConfig './synapse/nextflow.config' - break - default: - break -} \ No newline at end of file From 67f05771f286f141e15d628d39aede3c08087a59 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Thu, 12 Oct 2023 15:45:39 +0200 Subject: [PATCH 544/852] same install --- .github/workflows/ci.yml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 70f7f815..16f6e1c8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -76,9 +76,19 @@ jobs: with: version: "${{ matrix.NXF_VER }}" + - name: Cache nf-test installation + id: cache-software + uses: actions/cache@v3 + with: + path: | + /usr/local/bin/nf-test + /home/runner/.nf-test/nf-test.jar + key: ${{ runner.os }}-${{ env.NF_TEST_VER }}-nftest + - name: Install nf-test + if: steps.cache-software.outputs.cache-hit != 'true' run: | - wget -qO- https://code.askimed.com/install/nf-test | bash -s $NFTEST_VER + wget -qO- https://code.askimed.com/install/nf-test | bash sudo mv nf-test /usr/local/bin/ - name: Run nf-test From 92e75880697e99fed3df6e1290380c268683e409 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Thu, 12 Oct 2023 15:47:54 +0200 Subject: [PATCH 545/852] fix env --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 16f6e1c8..2dd4d4e7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -83,7 +83,7 @@ jobs: path: | /usr/local/bin/nf-test /home/runner/.nf-test/nf-test.jar - key: ${{ runner.os }}-${{ env.NF_TEST_VER }}-nftest + key: ${{ runner.os }}-${{ env.NFTEST_VER }}-nftest - name: Install nf-test if: steps.cache-software.outputs.cache-hit != 'true' From 803c473e82be0b7f9d46749aee603f2347c528e8 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 12 Oct 2023 18:43:49 +0100 Subject: [PATCH 546/852] Add nf-test authors to credits for release --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9264eb59..9fbb2013 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,10 +13,12 @@ Special thanks to the following for their contributions to the release: - [Edmund Miller](https://github.com/Emiller88) - [Esha Joshi](https://github.com/ejseqera) - [Harshil Patel](https://github.com/drpatelh) +- [Lukas Forer](https://github.com/lukfor) - [James Fellows Yates](https://github.com/jfy133) - [Maxime Garcia](https://github.com/maxulysse) - [Rob Syme](https://github.com/robsyme) - [Sateesh Peri](https://github.com/sateeshperi) +- [Sebastian Schönherr](https://github.com/seppinho) Thank you to everyone else that has contributed by reporting bugs, enhancements or in any other way, shape or form. From 9eebe984d5cf799a5c9361a84f1cad71fc7f4354 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 13 Oct 2023 09:43:49 +0100 Subject: [PATCH 547/852] Re-order tags in workflow nf-test files --- workflows/sra/tests/main.nf.test | 4 ++-- workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test | 4 ++-- workflows/sra/tests/sra_force_sratools_download.nf.test | 4 ++-- workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test | 4 ++-- workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test | 4 ++-- workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test | 4 ++-- workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test | 4 ++-- workflows/sra/tests/sra_skip_fastq_download.nf.test | 4 ++-- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/workflows/sra/tests/main.nf.test b/workflows/sra/tests/main.nf.test index 6b459773..1595f94d 100644 --- a/workflows/sra/tests/main.nf.test +++ b/workflows/sra/tests/main.nf.test @@ -3,14 +3,14 @@ nextflow_workflow { name "Test workflow: sra/main.nf" script "../main.nf" workflow "SRA" + tag "workflows" + tag "workflows_sra" tag "multiqc_mappings_config" tag "sra_fastq_ftp" tag "sra_ids_to_runinfo" tag "sra_merge_samplesheet" tag "sra_runinfo_to_ftp" tag "sra_to_samplesheet" - tag "workflows" - tag "workflows_sra" tag "sra_default_parameters" test("Parameters: default") { diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test index 0d0b85df..ca3d5bd0 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test @@ -3,14 +3,14 @@ nextflow_workflow { name "Test workflow: sra/main.nf" script "../main.nf" workflow "SRA" + tag "workflows" + tag "workflows_sra" tag "multiqc_mappings_config" tag "sra_fastq_ftp" tag "sra_ids_to_runinfo" tag "sra_merge_samplesheet" tag "sra_runinfo_to_ftp" tag "sra_to_samplesheet" - tag "workflows" - tag "workflows_sra" tag "sra_custom_ena_metadata_fields" test("Parameters: --nf_core_pipeline rnaseq --ena_metadata_fields ... --sample_mapping_fields ...") { diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test b/workflows/sra/tests/sra_force_sratools_download.nf.test index 5cd54142..f8f6ff5c 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test @@ -3,14 +3,14 @@ nextflow_workflow { name "Test workflow: sra/main.nf" script "../main.nf" workflow "SRA" + tag "workflows" + tag "workflows_sra" tag "multiqc_mappings_config" tag "sra_fastq_ftp" tag "sra_ids_to_runinfo" tag "sra_merge_samplesheet" tag "sra_runinfo_to_ftp" tag "sra_to_samplesheet" - tag "workflows" - tag "workflows_sra" tag "sra_force_sratools_download" test("Parameters: --force_sratools_download") { diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test index ef069674..5a854533 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test @@ -3,14 +3,14 @@ nextflow_workflow { name "Test workflow: sra/main.nf" script "../main.nf" workflow "SRA" + tag "workflows" + tag "workflows_sra" tag "multiqc_mappings_config" tag "sra_fastq_ftp" tag "sra_ids_to_runinfo" tag "sra_merge_samplesheet" tag "sra_runinfo_to_ftp" tag "sra_to_samplesheet" - tag "workflows" - tag "workflows_sra" tag "sra_nf_core_pipeline_atacseq" test("Parameters: --nf_core_pipeline atacseq") { diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test index 4eb57027..aeb06857 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test @@ -3,14 +3,14 @@ nextflow_workflow { name "Test workflow: sra/main.nf" script "../main.nf" workflow "SRA" + tag "workflows" + tag "workflows_sra" tag "multiqc_mappings_config" tag "sra_fastq_ftp" tag "sra_ids_to_runinfo" tag "sra_merge_samplesheet" tag "sra_runinfo_to_ftp" tag "sra_to_samplesheet" - tag "workflows" - tag "workflows_sra" tag "sra_nf_core_pipeline_rnaseq" test("Parameters: --nf_core_pipeline rnaseq") { diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test index 019c9af8..c460ffbd 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test @@ -3,14 +3,14 @@ nextflow_workflow { name "Test workflow: sra/main.nf" script "../main.nf" workflow "SRA" + tag "workflows" + tag "workflows_sra" tag "multiqc_mappings_config" tag "sra_fastq_ftp" tag "sra_ids_to_runinfo" tag "sra_merge_samplesheet" tag "sra_runinfo_to_ftp" tag "sra_to_samplesheet" - tag "workflows" - tag "workflows_sra" tag "sra_nf_core_pipeline_taxprofiler" test("Parameters: --nf_core_pipeline taxprofiler") { diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test index dce26b16..f90d8958 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test @@ -3,14 +3,14 @@ nextflow_workflow { name "Test workflow: sra/main.nf" script "../main.nf" workflow "SRA" + tag "workflows" + tag "workflows_sra" tag "multiqc_mappings_config" tag "sra_fastq_ftp" tag "sra_ids_to_runinfo" tag "sra_merge_samplesheet" tag "sra_runinfo_to_ftp" tag "sra_to_samplesheet" - tag "workflows" - tag "workflows_sra" tag "sra_nf_core_pipeline_viralrecon" test("Parameters: --nf_core_pipeline viralrecon") { diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test b/workflows/sra/tests/sra_skip_fastq_download.nf.test index 142e8aff..8d21a3d9 100644 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test @@ -3,14 +3,14 @@ nextflow_workflow { name "Test workflow: sra/main.nf" script "../main.nf" workflow "SRA" + tag "workflows" + tag "workflows_sra" tag "multiqc_mappings_config" tag "sra_fastq_ftp" tag "sra_ids_to_runinfo" tag "sra_merge_samplesheet" tag "sra_runinfo_to_ftp" tag "sra_to_samplesheet" - tag "workflows" - tag "workflows_sra" tag "sra_skip_fastq_download" test("Parameters: --skip_fastq_download") { From f06790c3dec3eb4a8aea62b3290361ffae33375b Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 13 Oct 2023 10:45:36 +0200 Subject: [PATCH 548/852] add pipeline level tests --- conf/test.config | 2 +- tests/main.nf.test | 27 +++++++++++++++++++++++++++ tests/sra_ids_test.csv | 7 +++++++ 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 tests/main.nf.test create mode 100644 tests/sra_ids_test.csv diff --git a/conf/test.config b/conf/test.config index cb77f578..67291b47 100644 --- a/conf/test.config +++ b/conf/test.config @@ -20,7 +20,7 @@ params { max_time = '6.h' // Input data - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/fetchngs/sra_ids_test.csv' + input = 'tests/sra_ids_test.csv' validationSchemaIgnoreParams = 'test_data_base,merge_samplesheet_ids,fastq_ftp_ids,test_data' } diff --git a/tests/main.nf.test b/tests/main.nf.test new file mode 100644 index 00000000..7bf19f34 --- /dev/null +++ b/tests/main.nf.test @@ -0,0 +1,27 @@ +nextflow_pipeline { + + name "Test pipeline" + script "../main.nf" + tag "pipeline" + + test("Run with profile test") { + + when { + params { + outdir = "results" + max_cpus = 2 + max_memory = '6.GB' + max_time = '6.h' + input = "$projectDir/tests/sra_ids_test.csv" + validationSchemaIgnoreParams = 'test_data_base,merge_samplesheet_ids,fastq_ftp_ids,test_data' + } + } + + then { + assertAll( + { assert workflow.success } + ) + } + } + +} diff --git a/tests/sra_ids_test.csv b/tests/sra_ids_test.csv new file mode 100644 index 00000000..ec8b5cc9 --- /dev/null +++ b/tests/sra_ids_test.csv @@ -0,0 +1,7 @@ +SRR9984183 +SRR13191702 +ERR1160846 +SRR12848126 +SRR14593545 +SRR14709033 +GSE214215 From 6f94f654f3568a93a4dc319bb8e620cca1c50a9e Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 13 Oct 2023 11:07:14 +0200 Subject: [PATCH 549/852] add tags --- tests/tags.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 tests/tags.yml diff --git a/tests/tags.yml b/tests/tags.yml new file mode 100644 index 00000000..3a1868da --- /dev/null +++ b/tests/tags.yml @@ -0,0 +1,4 @@ +pipeline_fetchngs: + - **.nf + - **.config + - **.nf.test From e9917d81b017d73d7c929ff6fcbadeff3aec018b Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 13 Oct 2023 11:17:19 +0200 Subject: [PATCH 550/852] update tags --- tests/tags.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/tags.yml b/tests/tags.yml index 3a1868da..5b091f8e 100644 --- a/tests/tags.yml +++ b/tests/tags.yml @@ -1,4 +1,4 @@ pipeline_fetchngs: - - **.nf - - **.config - - **.nf.test + - "**.nf" + - "**.config" + - "**.nf.test" From 91d59aa6251cb68a695d48901ee5e6fb4e72acad Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 13 Oct 2023 11:37:48 +0200 Subject: [PATCH 551/852] use proper tag --- tests/main.nf.test | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/main.nf.test b/tests/main.nf.test index 7bf19f34..ac05aea9 100644 --- a/tests/main.nf.test +++ b/tests/main.nf.test @@ -3,6 +3,7 @@ nextflow_pipeline { name "Test pipeline" script "../main.nf" tag "pipeline" + tag "pipeline_fetchngs" test("Run with profile test") { From 796728a52184426ba3c8a5761d16a8b7b321b5ae Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 13 Oct 2023 11:38:44 +0200 Subject: [PATCH 552/852] extends files to trigger test --- tests/tags.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/tags.yml b/tests/tags.yml index 5b091f8e..80e5fd75 100644 --- a/tests/tags.yml +++ b/tests/tags.yml @@ -2,3 +2,4 @@ pipeline_fetchngs: - "**.nf" - "**.config" - "**.nf.test" + - "**.json" From 8b6570b3a1cf7575721f51dead316b591c66d7e5 Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Fri, 13 Oct 2023 12:23:23 +0200 Subject: [PATCH 553/852] Update conf/test.config Co-authored-by: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> --- conf/test.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/test.config b/conf/test.config index 67291b47..c09a571c 100644 --- a/conf/test.config +++ b/conf/test.config @@ -20,7 +20,7 @@ params { max_time = '6.h' // Input data - input = 'tests/sra_ids_test.csv' + input = '${projectDir}/tests/sra_ids_test.csv' validationSchemaIgnoreParams = 'test_data_base,merge_samplesheet_ids,fastq_ftp_ids,test_data' } From 4ec46062e22c5b1acdeea67258ad64d3548f60fc Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 13 Oct 2023 13:36:45 +0200 Subject: [PATCH 554/852] use same IDs as profile test --- workflows/sra/tests/main.nf.test | 2 +- workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test | 2 +- workflows/sra/tests/sra_force_sratools_download.nf.test | 2 +- workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test | 2 +- workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test | 2 +- workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test | 2 +- workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test | 2 +- workflows/sra/tests/sra_skip_fastq_download.nf.test | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/workflows/sra/tests/main.nf.test b/workflows/sra/tests/main.nf.test index dcf67105..af916f4c 100644 --- a/workflows/sra/tests/main.nf.test +++ b/workflows/sra/tests/main.nf.test @@ -18,7 +18,7 @@ nextflow_workflow { when { workflow { """ - input[0] = Channel.from('DRR026872', 'DRR028935', 'ERR1160846', 'GSE214215', 'GSM4907283', 'SRR12848126', 'SRR13191702', 'SRR14593545', 'SRR14709033', 'SRR9984183') + input[0] = Channel.from('ERR1160846', 'GSE214215', 'SRR12848126', 'SRR13191702', 'SRR14593545', 'SRR14709033', 'SRR9984183') """ } params { diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test index 04a60471..0fdb67f3 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test @@ -18,7 +18,7 @@ nextflow_workflow { when { workflow { """ - input[0] = Channel.from('DRR026872', 'DRR028935', 'ERR1160846', 'GSE214215', 'GSM4907283', 'SRR12848126', 'SRR13191702', 'SRR14593545', 'SRR14709033', 'SRR9984183') + input[0] = Channel.from('ERR1160846', 'GSE214215', 'SRR12848126', 'SRR13191702', 'SRR14593545', 'SRR14709033', 'SRR9984183') """ } params { diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test b/workflows/sra/tests/sra_force_sratools_download.nf.test index c669af8d..7958a1ed 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test @@ -18,7 +18,7 @@ nextflow_workflow { when { workflow { """ - input[0] = Channel.from('DRR026872', 'DRR028935', 'ERR1160846', 'GSE214215', 'GSM4907283', 'SRR12848126', 'SRR13191702', 'SRR14593545', 'SRR14709033', 'SRR9984183') + input[0] = Channel.from('ERR1160846', 'GSE214215', 'SRR12848126', 'SRR13191702', 'SRR14593545', 'SRR14709033', 'SRR9984183') """ } params { diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test index e88e5f63..dfccf891 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test @@ -18,7 +18,7 @@ nextflow_workflow { when { workflow { """ - input[0] = Channel.from('DRR026872', 'DRR028935', 'ERR1160846', 'GSE214215', 'GSM4907283', 'SRR12848126', 'SRR13191702', 'SRR14593545', 'SRR14709033', 'SRR9984183') + input[0] = Channel.from('ERR1160846', 'GSE214215', 'SRR12848126', 'SRR13191702', 'SRR14593545', 'SRR14709033', 'SRR9984183') """ } params { diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test index 63c871ca..fd092bcd 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test @@ -18,7 +18,7 @@ nextflow_workflow { when { workflow { """ - input[0] = Channel.from('DRR026872', 'DRR028935', 'ERR1160846', 'GSE214215', 'GSM4907283', 'SRR12848126', 'SRR13191702', 'SRR14593545', 'SRR14709033', 'SRR9984183') + input[0] = Channel.from('ERR1160846', 'GSE214215', 'SRR12848126', 'SRR13191702', 'SRR14593545', 'SRR14709033', 'SRR9984183') """ } params { diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test index 15a31848..a41d2b7a 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test @@ -18,7 +18,7 @@ nextflow_workflow { when { workflow { """ - input[0] = Channel.from('DRR026872', 'DRR028935', 'ERR1160846', 'GSE214215', 'GSM4907283', 'SRR12848126', 'SRR13191702', 'SRR14593545', 'SRR14709033', 'SRR9984183') + input[0] = Channel.from('ERR1160846', 'GSE214215', 'SRR12848126', 'SRR13191702', 'SRR14593545', 'SRR14709033', 'SRR9984183') """ } params { diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test index 4c11d571..c052d915 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test @@ -18,7 +18,7 @@ nextflow_workflow { when { workflow { """ - input[0] = Channel.from('DRR026872', 'DRR028935', 'ERR1160846', 'GSE214215', 'GSM4907283', 'SRR12848126', 'SRR13191702', 'SRR14593545', 'SRR14709033', 'SRR9984183') + input[0] = Channel.from('ERR1160846', 'GSE214215', 'SRR12848126', 'SRR13191702', 'SRR14593545', 'SRR14709033', 'SRR9984183') """ } params { diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test b/workflows/sra/tests/sra_skip_fastq_download.nf.test index 8cb68641..04eb3dd7 100644 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test @@ -18,7 +18,7 @@ nextflow_workflow { when { workflow { """ - input[0] = Channel.from('DRR026872', 'DRR028935', 'ERR1160846', 'GSE214215', 'GSM4907283', 'SRR12848126', 'SRR13191702', 'SRR14593545', 'SRR14709033', 'SRR9984183') + input[0] = Channel.from('ERR1160846', 'GSE214215', 'SRR12848126', 'SRR13191702', 'SRR14593545', 'SRR14709033', 'SRR9984183') """ } params { From c75c1d05dff6a6455de4a1a192bbe2c88825db43 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 13 Oct 2023 13:56:15 +0200 Subject: [PATCH 555/852] update snap --- workflows/sra/tests/main.nf.test.snap | 14 +++++++------- .../sra_custom_ena_metadata_fields.nf.test.snap | 14 +++++++------- .../tests/sra_force_sratools_download.nf.test.snap | 14 +++++++------- .../sra_nf_core_pipeline_atacseq.nf.test.snap | 14 +++++++------- .../tests/sra_nf_core_pipeline_rnaseq.nf.test.snap | 14 +++++++------- .../sra_nf_core_pipeline_taxprofiler.nf.test.snap | 14 +++++++------- .../sra_nf_core_pipeline_viralrecon.nf.test.snap | 14 +++++++------- .../sra/tests/sra_skip_fastq_download.nf.test.snap | 14 +++++++------- 8 files changed, 56 insertions(+), 56 deletions(-) diff --git a/workflows/sra/tests/main.nf.test.snap b/workflows/sra/tests/main.nf.test.snap index d53f3de2..4ba15917 100644 --- a/workflows/sra/tests/main.nf.test.snap +++ b/workflows/sra/tests/main.nf.test.snap @@ -6,14 +6,14 @@ ], "1": [ - "samplesheet.csv:md5,c1104c2edfc663b103f79b0551450192" + "samplesheet.csv:md5,5926f40ded37e0e6ce0b290c445772ac" ], "2": [ - "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" + "id_mappings.csv:md5,57116724ccf0215795b44d4458e6861f" ], "3": [ [ - "multiqc_config.yml:md5,bb99e81ddd360988338c10ecbdbce65a", + "multiqc_config.yml:md5,77050a65c8ad23e5b052b576bff1eeff", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], @@ -29,16 +29,16 @@ ], "mappings": [ - "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" + "id_mappings.csv:md5,57116724ccf0215795b44d4458e6861f" ], "sample_mappings": [ [ - "multiqc_config.yml:md5,bb99e81ddd360988338c10ecbdbce65a", + "multiqc_config.yml:md5,77050a65c8ad23e5b052b576bff1eeff", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], "samplesheet": [ - "samplesheet.csv:md5,c1104c2edfc663b103f79b0551450192" + "samplesheet.csv:md5,5926f40ded37e0e6ce0b290c445772ac" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", @@ -50,6 +50,6 @@ ] } ], - "timestamp": "2023-10-09T11:10:06.701286" + "timestamp": "2023-10-13T13:45:55.621951" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap index 143375ac..5e98f3b1 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap @@ -6,14 +6,14 @@ ], "1": [ - "samplesheet.csv:md5,d161b1a26b415a61064d8c558c9695c5" + "samplesheet.csv:md5,4ea86d2a38bf25d025331afd1925a138" ], "2": [ - "id_mappings.csv:md5,e8a7d8effe4af1d999dc26cf92cf6621" + "id_mappings.csv:md5,e581a9117ed2cc8e98e65c25fe7f34aa" ], "3": [ [ - "multiqc_config.yml:md5,b1c25951b237552448e878f7c9dc4235", + "multiqc_config.yml:md5,0f18d574c7ddfa08cf444a593cb91cde", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], @@ -29,16 +29,16 @@ ], "mappings": [ - "id_mappings.csv:md5,e8a7d8effe4af1d999dc26cf92cf6621" + "id_mappings.csv:md5,e581a9117ed2cc8e98e65c25fe7f34aa" ], "sample_mappings": [ [ - "multiqc_config.yml:md5,b1c25951b237552448e878f7c9dc4235", + "multiqc_config.yml:md5,0f18d574c7ddfa08cf444a593cb91cde", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], "samplesheet": [ - "samplesheet.csv:md5,d161b1a26b415a61064d8c558c9695c5" + "samplesheet.csv:md5,4ea86d2a38bf25d025331afd1925a138" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", @@ -50,6 +50,6 @@ ] } ], - "timestamp": "2023-10-06T12:10:32.762201" + "timestamp": "2023-10-13T13:41:56.570144" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test.snap b/workflows/sra/tests/sra_force_sratools_download.nf.test.snap index a22fad41..1c92c75d 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test.snap +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test.snap @@ -6,14 +6,14 @@ ], "1": [ - "samplesheet.csv:md5,f582a7cf6b4a507e3ccbd2ebd134bd26" + "samplesheet.csv:md5,461dfaa7b95f84210840347ef8cc93c2" ], "2": [ - "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" + "id_mappings.csv:md5,57116724ccf0215795b44d4458e6861f" ], "3": [ [ - "multiqc_config.yml:md5,bb99e81ddd360988338c10ecbdbce65a", + "multiqc_config.yml:md5,77050a65c8ad23e5b052b576bff1eeff", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], @@ -28,16 +28,16 @@ ], "mappings": [ - "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" + "id_mappings.csv:md5,57116724ccf0215795b44d4458e6861f" ], "sample_mappings": [ [ - "multiqc_config.yml:md5,bb99e81ddd360988338c10ecbdbce65a", + "multiqc_config.yml:md5,77050a65c8ad23e5b052b576bff1eeff", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], "samplesheet": [ - "samplesheet.csv:md5,f582a7cf6b4a507e3ccbd2ebd134bd26" + "samplesheet.csv:md5,461dfaa7b95f84210840347ef8cc93c2" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", @@ -48,6 +48,6 @@ ] } ], - "timestamp": "2023-10-09T12:31:35.173406" + "timestamp": "2023-10-13T13:51:26.617172" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap index 3e26ff24..cabe296e 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap @@ -6,14 +6,14 @@ ], "1": [ - "samplesheet.csv:md5,46752dd6abac80b59573910f7ce4babe" + "samplesheet.csv:md5,0deebc93328dcbb63762aa91d4fc9f35" ], "2": [ - "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" + "id_mappings.csv:md5,57116724ccf0215795b44d4458e6861f" ], "3": [ [ - "multiqc_config.yml:md5,bb99e81ddd360988338c10ecbdbce65a", + "multiqc_config.yml:md5,77050a65c8ad23e5b052b576bff1eeff", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], @@ -29,16 +29,16 @@ ], "mappings": [ - "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" + "id_mappings.csv:md5,57116724ccf0215795b44d4458e6861f" ], "sample_mappings": [ [ - "multiqc_config.yml:md5,bb99e81ddd360988338c10ecbdbce65a", + "multiqc_config.yml:md5,77050a65c8ad23e5b052b576bff1eeff", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], "samplesheet": [ - "samplesheet.csv:md5,46752dd6abac80b59573910f7ce4babe" + "samplesheet.csv:md5,0deebc93328dcbb63762aa91d4fc9f35" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", @@ -50,6 +50,6 @@ ] } ], - "timestamp": "2023-10-09T11:48:46.177797" + "timestamp": "2023-10-13T13:37:42.486986" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap index a0c20a40..111fe537 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap @@ -6,14 +6,14 @@ ], "1": [ - "samplesheet.csv:md5,69117245b73776d6e4daecdbfdff9767" + "samplesheet.csv:md5,e20d0858b2ff04a62d50274a2527b913" ], "2": [ - "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" + "id_mappings.csv:md5,57116724ccf0215795b44d4458e6861f" ], "3": [ [ - "multiqc_config.yml:md5,bb99e81ddd360988338c10ecbdbce65a", + "multiqc_config.yml:md5,77050a65c8ad23e5b052b576bff1eeff", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], @@ -29,16 +29,16 @@ ], "mappings": [ - "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" + "id_mappings.csv:md5,57116724ccf0215795b44d4458e6861f" ], "sample_mappings": [ [ - "multiqc_config.yml:md5,bb99e81ddd360988338c10ecbdbce65a", + "multiqc_config.yml:md5,77050a65c8ad23e5b052b576bff1eeff", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], "samplesheet": [ - "samplesheet.csv:md5,69117245b73776d6e4daecdbfdff9767" + "samplesheet.csv:md5,e20d0858b2ff04a62d50274a2527b913" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", @@ -50,6 +50,6 @@ ] } ], - "timestamp": "2023-10-06T12:14:02.500312" + "timestamp": "2023-10-13T13:43:56.980991" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap index d9d6ddee..14c38837 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap @@ -6,14 +6,14 @@ ], "1": [ - "samplesheet.csv:md5,0705e78609390cc464c2fb10051178bc" + "samplesheet.csv:md5,c781b226b9aac812c1d38881145a74d6" ], "2": [ - "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" + "id_mappings.csv:md5,57116724ccf0215795b44d4458e6861f" ], "3": [ [ - "multiqc_config.yml:md5,bb99e81ddd360988338c10ecbdbce65a", + "multiqc_config.yml:md5,77050a65c8ad23e5b052b576bff1eeff", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], @@ -29,16 +29,16 @@ ], "mappings": [ - "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" + "id_mappings.csv:md5,57116724ccf0215795b44d4458e6861f" ], "sample_mappings": [ [ - "multiqc_config.yml:md5,bb99e81ddd360988338c10ecbdbce65a", + "multiqc_config.yml:md5,77050a65c8ad23e5b052b576bff1eeff", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], "samplesheet": [ - "samplesheet.csv:md5,0705e78609390cc464c2fb10051178bc" + "samplesheet.csv:md5,c781b226b9aac812c1d38881145a74d6" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", @@ -50,6 +50,6 @@ ] } ], - "timestamp": "2023-10-06T12:07:01.184728" + "timestamp": "2023-10-13T13:39:55.31037" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap index cacb42cc..d26dd1cc 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap @@ -6,14 +6,14 @@ ], "1": [ - "samplesheet.csv:md5,c1104c2edfc663b103f79b0551450192" + "samplesheet.csv:md5,5926f40ded37e0e6ce0b290c445772ac" ], "2": [ - "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" + "id_mappings.csv:md5,57116724ccf0215795b44d4458e6861f" ], "3": [ [ - "multiqc_config.yml:md5,bb99e81ddd360988338c10ecbdbce65a", + "multiqc_config.yml:md5,77050a65c8ad23e5b052b576bff1eeff", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], @@ -29,16 +29,16 @@ ], "mappings": [ - "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" + "id_mappings.csv:md5,57116724ccf0215795b44d4458e6861f" ], "sample_mappings": [ [ - "multiqc_config.yml:md5,bb99e81ddd360988338c10ecbdbce65a", + "multiqc_config.yml:md5,77050a65c8ad23e5b052b576bff1eeff", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], "samplesheet": [ - "samplesheet.csv:md5,c1104c2edfc663b103f79b0551450192" + "samplesheet.csv:md5,5926f40ded37e0e6ce0b290c445772ac" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", @@ -50,6 +50,6 @@ ] } ], - "timestamp": "2023-10-09T11:44:49.759545" + "timestamp": "2023-10-13T13:35:41.371352" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap b/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap index c137d853..f0bac51f 100644 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap @@ -6,14 +6,14 @@ ], "1": [ - "samplesheet.csv:md5,b1636e896008b96044d352a0757a390b" + "samplesheet.csv:md5,23d39235ed39f69cb8333322de77ed26" ], "2": [ - "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" + "id_mappings.csv:md5,57116724ccf0215795b44d4458e6861f" ], "3": [ [ - "multiqc_config.yml:md5,bb99e81ddd360988338c10ecbdbce65a", + "multiqc_config.yml:md5,77050a65c8ad23e5b052b576bff1eeff", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], @@ -27,16 +27,16 @@ ], "mappings": [ - "id_mappings.csv:md5,a18766d39f6b2239163b4ef00eeaf342" + "id_mappings.csv:md5,57116724ccf0215795b44d4458e6861f" ], "sample_mappings": [ [ - "multiqc_config.yml:md5,bb99e81ddd360988338c10ecbdbce65a", + "multiqc_config.yml:md5,77050a65c8ad23e5b052b576bff1eeff", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], "samplesheet": [ - "samplesheet.csv:md5,b1636e896008b96044d352a0757a390b" + "samplesheet.csv:md5,23d39235ed39f69cb8333322de77ed26" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", @@ -46,6 +46,6 @@ ] } ], - "timestamp": "2023-10-06T12:18:48.477246" + "timestamp": "2023-10-13T13:46:11.136377" } } \ No newline at end of file From 0f6cbd4721c854283562c7f894ea3afe877e2798 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 13 Oct 2023 14:36:20 +0200 Subject: [PATCH 556/852] add file for sratools/prefetch --- conf/test_data.config | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/conf/test_data.config b/conf/test_data.config index 42d3d818..68e84262 100644 --- a/conf/test_data.config +++ b/conf/test_data.config @@ -24,6 +24,11 @@ params { } test_data { + 'generic' { + 'config' { + ncbi_user_settings = "${params.test_data_base}/data/generic/config/ncbi_user_settings.mkfg" + } + } 'modules_local' { multiqc_mappings_config = "${params.test_data_base}/modules/local/multiqc_mappings_config/SRX9626017_SRR13191702.mappings.csv" sra_merge_samplesheet_samplesheets = merge_samplesheet_urls From 1520425356b02d673680a181f64907114c33f333 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 13 Oct 2023 15:00:35 +0200 Subject: [PATCH 557/852] update modules --- modules.json | 10 +- .../dumpsoftwareversions/tests/main.nf.test | 5 +- .../sratoolsncbisettings/tests/main.nf.test | 114 +++++++++++++++ .../tests/main.nf.test.snap | 18 +++ .../tests/nextflow.config | 16 +++ .../sratools/fasterqdump/tests/main.nf.test | 5 +- .../sratools/prefetch/tests/main.nf.test | 9 +- .../sratools/prefetch/tests/main.nf.test.snap | 130 +++++++----------- .../tests/main.nf.test | 37 +++++ .../tests/main.nf.test.snap | 57 ++++++++ 10 files changed, 304 insertions(+), 97 deletions(-) create mode 100644 modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test create mode 100644 modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test.snap create mode 100644 modules/nf-core/custom/sratoolsncbisettings/tests/nextflow.config create mode 100644 subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test create mode 100644 subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap diff --git a/modules.json b/modules.json index 87e40abf..b826fae6 100644 --- a/modules.json +++ b/modules.json @@ -7,22 +7,22 @@ "nf-core": { "custom/dumpsoftwareversions": { "branch": "master", - "git_sha": "1b372269755a5c4a13c23bc130ebada8cb9d4cd0", + "git_sha": "c7494026693ba1a7db683e1520816709db3f05a0", "installed_by": ["modules"] }, "custom/sratoolsncbisettings": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "git_sha": "c7494026693ba1a7db683e1520816709db3f05a0", "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] }, "sratools/fasterqdump": { "branch": "master", - "git_sha": "b4d743f1bb8d92eb129a5925a9211beb689be625", + "git_sha": "c7494026693ba1a7db683e1520816709db3f05a0", "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] }, "sratools/prefetch": { "branch": "master", - "git_sha": "096ea8a4db569cc680ada4105e1d313cc56329c8", + "git_sha": "c7494026693ba1a7db683e1520816709db3f05a0", "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] } } @@ -31,7 +31,7 @@ "nf-core": { "fastq_download_prefetch_fasterqdump_sratools": { "branch": "master", - "git_sha": "dedc0e31087f3306101c38835d051bf49789445a", + "git_sha": "c7494026693ba1a7db683e1520816709db3f05a0", "installed_by": ["subworkflows"] } } diff --git a/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test b/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test index d528d3cb..eec1db10 100644 --- a/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test +++ b/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test @@ -1,12 +1,13 @@ nextflow_process { name "Test Process CUSTOM_DUMPSOFTWAREVERSIONS" - script "modules/nf-core/custom/dumpsoftwareversions/main.nf" + script "../main.nf" process "CUSTOM_DUMPSOFTWAREVERSIONS" + tag "modules" + tag "modules_nfcore" tag "custom" tag "dumpsoftwareversions" tag "custom/dumpsoftwareversions" - tag "modules_nfcore" test("Should run without failures") { when { diff --git a/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test b/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test new file mode 100644 index 00000000..ec4a7797 --- /dev/null +++ b/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test @@ -0,0 +1,114 @@ +nextflow_process { + + name "Test Process CUSTOM_SRATOOLSNCBISETTINGS" + script "../main.nf" + process "CUSTOM_SRATOOLSNCBISETTINGS" + config "modules/nf-core/custom/sratoolsncbisettings/tests/nextflow.config" + tag "modules" + tag "modules_nfcore" + tag "custom" + tag "custom/sratoolsncbisettings" + + test("Should run without failures") { + + when { + params { + settings_path = '/tmp/.ncbi' + settings_file = "${params.settings_path}/user-settings.mkfg" + } + + process { + """ + file(params.settings_path).mkdirs() + def settings = file(params.test_data['generic']['config']['ncbi_user_settings'], checkIfExists: true) + settings.copyTo(params.settings_file) + """ + } + } + + then { + assert process.success + assert snapshot( + process.out.versions + ).match() + + with(process.out.ncbi_settings) { + assert path(get(0)).readLines().any { it.contains('/LIBS/GUID') } + assert path(get(0)).readLines().any { it.contains('/libs/cloud/report_instance_identity') } + } + } + + } + + test("Should fail") { + + when { + params { + settings_path = '/tmp/.ncbi' + settings_file = "${params.settings_path}/user-settings.mkfg" + } + + process { + """ + file(params.settings_path).mkdirs() + def settings = file(params.settings_file) + settings.text = ''' + ## auto-generated configuration file - DO NOT EDIT ## + config/default = "false" + /repository/remote/main/CGI/resolver-cgi = "https://trace.ncbi.nlm.nih.gov/Traces/names/names.fcgi" + /repository/remote/protected/CGI/resolver-cgi = "https://trace.ncbi.nlm.nih.gov/Traces/names/names.fcgi" + /repository/user/ad/public/apps/file/volumes/flatAd = "." + /repository/user/ad/public/apps/refseq/volumes/refseqAd = "." + /repository/user/ad/public/apps/sra/volumes/sraAd = "." + /repository/user/ad/public/apps/sraPileup/volumes/ad = "." + /repository/user/ad/public/apps/sraRealign/volumes/ad = "." + /repository/user/ad/public/apps/wgs/volumes/wgsAd = "." + /repository/user/ad/public/root = "." + /repository/user/default-path = "/root/ncbi" + '''.stripIndent() + """ + } + } + + then { + assert process.failed + assert snapshot( + process.out.versions + ).match() + assert process.stdout.any { it.contains('Command error:') } + assert process.stdout.any { it.contains('missing the required entries') } + assert process.stdout.any { it.contains('/LIBS/GUID') } + assert process.stdout.any { it.contains('/libs/cloud/report_instance_identity') } + } + + } + + test("Should run with nonexisting") { + + when { + params { + settings_path = '/tmp/.ncbi' + settings_file = "${params.settings_path}/user-settings.mkfg" + } + + process { + """ + def settings = file(params.settings_file) + settings.delete() + """ + } + } + + then { + assert process.success + assert snapshot(process.out.versions).match() + + with(process.out.ncbi_settings) { + { assert path(get(0)).readLines().any { it.contains('/LIBS/GUID') } } + { assert path(get(0)).readLines().any { it.contains('/libs/cloud/report_instance_identity') } } + } + } + + } + +} diff --git a/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test.snap b/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test.snap new file mode 100644 index 00000000..edb3b351 --- /dev/null +++ b/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test.snap @@ -0,0 +1,18 @@ +{ + "Should run with nonexisting": { + "content": [ + [ + "versions.yml:md5,fec13b593c3b42ddd38f2fc77df25b70" + ] + ], + "timestamp": "2023-10-12T12:24:24.023849" + }, + "Should run without failures": { + "content": [ + [ + "versions.yml:md5,fec13b593c3b42ddd38f2fc77df25b70" + ] + ], + "timestamp": "2023-10-12T10:40:51.717351" + } +} \ No newline at end of file diff --git a/modules/nf-core/custom/sratoolsncbisettings/tests/nextflow.config b/modules/nf-core/custom/sratoolsncbisettings/tests/nextflow.config new file mode 100644 index 00000000..c4a96e94 --- /dev/null +++ b/modules/nf-core/custom/sratoolsncbisettings/tests/nextflow.config @@ -0,0 +1,16 @@ +params.settings_path = '/tmp/.ncbi' +params.settings_file = "${params.settings_path}/user-settings.mkfg" + +env.NCBI_SETTINGS = params.settings_file + +process { + + publishDir = { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" } + withName: CUSTOM_SRATOOLSNCBISETTINGS { + containerOptions = { + (workflow.containerEngine == 'singularity') ? + "-B ${params.settings_path}:${params.settings_path}" : + "-v ${params.settings_path}:${params.settings_path}" + } + } +} \ No newline at end of file diff --git a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test index 7da3af20..ee4c5844 100644 --- a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test +++ b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test @@ -1,9 +1,10 @@ nextflow_process { name "Test Process SRATOOLS_FASTERQDUMP" - script "modules/nf-core/sratools/fasterqdump/main.nf" + script "../main.nf" process "SRATOOLS_FASTERQDUMP" - tag "sratools/fasterqdump" + tag "modules" tag "modules_nfcore" + tag "sratools/fasterqdump" test("Single-end") { diff --git a/modules/nf-core/sratools/prefetch/tests/main.nf.test b/modules/nf-core/sratools/prefetch/tests/main.nf.test index 1234a82b..fcf4036d 100644 --- a/modules/nf-core/sratools/prefetch/tests/main.nf.test +++ b/modules/nf-core/sratools/prefetch/tests/main.nf.test @@ -1,9 +1,10 @@ nextflow_process { name "Test Process SRATOOLS_PREFETCH" - script "modules/nf-core/sratools/prefetch/main.nf" + script "../main.nf" process "SRATOOLS_PREFETCH" - tag "sratools/prefetch" + tag "modules" tag "modules_nfcore" + tag "sratools/prefetch" test("sratools/prefetch") { @@ -23,7 +24,7 @@ nextflow_process { then { assertAll ( { assert process.success }, - { assert snapshot(process).match() } + { assert snapshot(process.out).match() } ) } } @@ -46,7 +47,7 @@ nextflow_process { then { assertAll ( { assert process.success }, - { assert snapshot(process).match() } + { assert snapshot(process.out).match() } ) } } diff --git a/modules/nf-core/sratools/prefetch/tests/main.nf.test.snap b/modules/nf-core/sratools/prefetch/tests/main.nf.test.snap index 95ea067f..ab1d2088 100644 --- a/modules/nf-core/sratools/prefetch/tests/main.nf.test.snap +++ b/modules/nf-core/sratools/prefetch/tests/main.nf.test.snap @@ -2,109 +2,71 @@ "sratools/prefetch with sralite": { "content": [ { - "stderr": [ - - ], - "errorReport": null, - "exitStatus": 0, - "out": { - "0": [ + "0": [ + [ + { + "id": "test", + "single_end": false + }, [ - { - "id": "test", - "single_end": false - }, - [ - "SRR1170046.sralite:md5,7acfce556ca0951aff49d780899c105b" - ] + "SRR1170046.sralite:md5,7acfce556ca0951aff49d780899c105b" ] - ], - "1": [ - "versions.yml:md5,c967dea4135cb75490e1e801c4639efc" - ], - "sra": [ + ] + ], + "1": [ + "versions.yml:md5,c967dea4135cb75490e1e801c4639efc" + ], + "sra": [ + [ + { + "id": "test", + "single_end": false + }, [ - { - "id": "test", - "single_end": false - }, - [ - "SRR1170046.sralite:md5,7acfce556ca0951aff49d780899c105b" - ] + "SRR1170046.sralite:md5,7acfce556ca0951aff49d780899c105b" ] - ], - "versions": [ - "versions.yml:md5,c967dea4135cb75490e1e801c4639efc" ] - }, - "failed": false, - "stdout": [ - ], - "errorMessage": null, - "trace": { - "tasksFailed": 0, - "tasksCount": 1, - "tasksSucceeded": 1 - }, - "name": "SRATOOLS_PREFETCH", - "success": true + "versions": [ + "versions.yml:md5,c967dea4135cb75490e1e801c4639efc" + ] } ], - "timestamp": "2023-10-10T15:26:45.715617" + "timestamp": "2023-10-13T12:11:24.563510389" }, "sratools/prefetch": { "content": [ { - "stderr": [ - - ], - "errorReport": null, - "exitStatus": 0, - "out": { - "0": [ + "0": [ + [ + { + "id": "test", + "single_end": false + }, [ - { - "id": "test", - "single_end": false - }, - [ - "DRR000774.sra:md5,7647dba20c89c0e3d7ad13842f060eb0" - ] + "DRR000774.sra:md5,7647dba20c89c0e3d7ad13842f060eb0" ] - ], - "1": [ - "versions.yml:md5,c967dea4135cb75490e1e801c4639efc" - ], - "sra": [ + ] + ], + "1": [ + "versions.yml:md5,c967dea4135cb75490e1e801c4639efc" + ], + "sra": [ + [ + { + "id": "test", + "single_end": false + }, [ - { - "id": "test", - "single_end": false - }, - [ - "DRR000774.sra:md5,7647dba20c89c0e3d7ad13842f060eb0" - ] + "DRR000774.sra:md5,7647dba20c89c0e3d7ad13842f060eb0" ] - ], - "versions": [ - "versions.yml:md5,c967dea4135cb75490e1e801c4639efc" ] - }, - "failed": false, - "stdout": [ - ], - "errorMessage": null, - "trace": { - "tasksFailed": 0, - "tasksCount": 1, - "tasksSucceeded": 1 - }, - "name": "SRATOOLS_PREFETCH", - "success": true + "versions": [ + "versions.yml:md5,c967dea4135cb75490e1e801c4639efc" + ] } ], - "timestamp": "2023-10-10T09:58:01.781848" + "timestamp": "2023-10-13T12:11:02.75256571" } } \ No newline at end of file diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test new file mode 100644 index 00000000..be18fc3b --- /dev/null +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test @@ -0,0 +1,37 @@ +nextflow_workflow { + + name "Test workflow: fastq_download_prefetch_fasterqdump_sratools/main.nf" + script "../main.nf" + workflow "FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS" + tag "subworkflow" + tag "subworkflow_nfcore" + tag "custom/sratoolsncbisettings" + tag "sratools/prefetch" + tag "sratools/fasterqdump" + tag "fastq_download_prefetch_fasterqdump_sratools" + + test("Parameters: default") { + + when { + workflow { + """ + input[0] = Channel.of( + [[ id:'test_single_end', single_end:true ], 'DRR000774'], + [[ id:'test_paired_end', single_end:false ], 'SRR11140744'] + ) + input[1] = [] + """ + } + params { + outdir = "output" + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match() } + ) + } + } +} diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap new file mode 100644 index 00000000..a73679e0 --- /dev/null +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap @@ -0,0 +1,57 @@ +{ + "Parameters: default": { + "content": [ + { + "0": [ + [ + { + "id": "test_paired_end", + "single_end": false + }, + [ + "test_paired_end_1.fastq.gz:md5,193809c784a4ea132ab2a253fa4f55b6", + "test_paired_end_2.fastq.gz:md5,3e3b3af3413f50a1685fd7b3f1456d4e" + ] + ], + [ + { + "id": "test_single_end", + "single_end": true + }, + "test_single_end.fastq.gz:md5,19029a1132115b55277a0d79ee089b49" + ] + ], + "1": [ + "versions.yml:md5,98d78bba9f3da39a0b7db6e9c7dcc224", + "versions.yml:md5,9c558ff624585a6eee82a19c8c0136db", + "versions.yml:md5,db0e1352064b53c651661f43f2620765" + ], + "reads": [ + [ + { + "id": "test_paired_end", + "single_end": false + }, + [ + "test_paired_end_1.fastq.gz:md5,193809c784a4ea132ab2a253fa4f55b6", + "test_paired_end_2.fastq.gz:md5,3e3b3af3413f50a1685fd7b3f1456d4e" + ] + ], + [ + { + "id": "test_single_end", + "single_end": true + }, + "test_single_end.fastq.gz:md5,19029a1132115b55277a0d79ee089b49" + ] + ], + "versions": [ + "versions.yml:md5,98d78bba9f3da39a0b7db6e9c7dcc224", + "versions.yml:md5,9c558ff624585a6eee82a19c8c0136db", + "versions.yml:md5,db0e1352064b53c651661f43f2620765" + ] + } + ], + "timestamp": "2023-10-12T20:09:55.255971" + } +} \ No newline at end of file From a38f6410090a56ee395902bb8c0444f9e156ad05 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 13 Oct 2023 15:18:41 +0200 Subject: [PATCH 558/852] use nextflowpipelineutils from nf-core/modules --- modules.json | 5 + .../local/nf_core_fetchngs_utils/main.nf | 4 +- .../nextflowpipelineutils}/main.nf | 3 + .../nf-core/nextflowpipelineutils/meta.yml | 34 ++++++ .../tests/main.functions.nf.test | 70 ++++++++++++ .../tests/main.functions.nf.test.snap | 12 ++ .../tests/main.workflow.nf.test | 104 ++++++++++++++++++ .../tests/main.workflow.nf.test.snap | 44 ++++++++ .../tests/nextflow.config | 9 ++ 9 files changed, 283 insertions(+), 2 deletions(-) rename subworkflows/{local/nextflow_pipeline_utils => nf-core/nextflowpipelineutils}/main.nf (99%) create mode 100644 subworkflows/nf-core/nextflowpipelineutils/meta.yml create mode 100644 subworkflows/nf-core/nextflowpipelineutils/tests/main.functions.nf.test create mode 100644 subworkflows/nf-core/nextflowpipelineutils/tests/main.functions.nf.test.snap create mode 100644 subworkflows/nf-core/nextflowpipelineutils/tests/main.workflow.nf.test create mode 100644 subworkflows/nf-core/nextflowpipelineutils/tests/main.workflow.nf.test.snap create mode 100644 subworkflows/nf-core/nextflowpipelineutils/tests/nextflow.config diff --git a/modules.json b/modules.json index b826fae6..3cc9d6dd 100644 --- a/modules.json +++ b/modules.json @@ -33,6 +33,11 @@ "branch": "master", "git_sha": "c7494026693ba1a7db683e1520816709db3f05a0", "installed_by": ["subworkflows"] + }, + "nextflowpipelineutils": { + "branch": "master", + "git_sha": "76cbb00305f6b045c15c1e202a5bdd516d6f64a3", + "installed_by": ["subworkflows"] } } } diff --git a/subworkflows/local/nf_core_fetchngs_utils/main.nf b/subworkflows/local/nf_core_fetchngs_utils/main.nf index 5cc2162b..fd0e9855 100644 --- a/subworkflows/local/nf_core_fetchngs_utils/main.nf +++ b/subworkflows/local/nf_core_fetchngs_utils/main.nf @@ -9,7 +9,7 @@ */ include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../../../modules/nf-core/custom/dumpsoftwareversions' -include { NEXTFLOW_PIPELINE_UTILS; getWorkflowVersion } from '../nextflow_pipeline_utils' +include { NEXTFLOW_PIPELINE_UTILS; getWorkflowVersion } from '../../nf-core/nextflowpipelineutils/main' include { NF_VALIDATION_PLUGIN_UTILS } from '../nf_validation_plugin_utils' include { NF_CORE_PIPELINE_UTILS; workflowCitation; nfCoreLogo; dashedLine; completionEmail; completionSummary; imNotification } from '../nf_core_pipeline_utils' @@ -49,7 +49,7 @@ workflow PIPELINE_INITIALISATION { // // Check config provided to the pipeline - // + // NF_CORE_PIPELINE_UTILS () // diff --git a/subworkflows/local/nextflow_pipeline_utils/main.nf b/subworkflows/nf-core/nextflowpipelineutils/main.nf similarity index 99% rename from subworkflows/local/nextflow_pipeline_utils/main.nf rename to subworkflows/nf-core/nextflowpipelineutils/main.nf index e56394ed..5cb9af8c 100644 --- a/subworkflows/local/nextflow_pipeline_utils/main.nf +++ b/subworkflows/nf-core/nextflowpipelineutils/main.nf @@ -42,6 +42,9 @@ workflow NEXTFLOW_PIPELINE_UTILS { if (check_conda_channels) { checkCondaChannels() } + + emit: + out = true } /* diff --git a/subworkflows/nf-core/nextflowpipelineutils/meta.yml b/subworkflows/nf-core/nextflowpipelineutils/meta.yml new file mode 100644 index 00000000..f56b827b --- /dev/null +++ b/subworkflows/nf-core/nextflowpipelineutils/meta.yml @@ -0,0 +1,34 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/subworkflows/yaml-schema.json +name: "nextflow_pipeline_utils" +description: Subworkflow with functionality that may be useful for any Nextflow pipeline +keywords: + - utility + - pipeline + - initialise + - version +components: [] +input: + - print_version: + type: boolean + description: | + Print the version of the pipeline and exit + - dump_parameters: + type: boolean + description: | + Dump the parameters of the pipeline to a JSON file + - output_directory: + type: directory + description: Path to output dir to write JSON file to. + pattern: "results/" + - check_conda_channel: + type: boolean + description: | + Check if the conda channel priority is correct. +output: + - out: + type: boolean + description: | + Dummy output for making using in process chaining. +authors: + - "@adamrtalbot" + - "@drpatelh" diff --git a/subworkflows/nf-core/nextflowpipelineutils/tests/main.functions.nf.test b/subworkflows/nf-core/nextflowpipelineutils/tests/main.functions.nf.test new file mode 100644 index 00000000..db757ed1 --- /dev/null +++ b/subworkflows/nf-core/nextflowpipelineutils/tests/main.functions.nf.test @@ -0,0 +1,70 @@ + +nextflow_function { + + name "Test Functions" + script "subworkflows/nf-core/nextflowpipelineutils/main.nf" + tag 'subworkflows' + tag 'nextflowpipelineutils' + tag 'subworkflows/nextflowpipelineutils' + + test("Test Function getWorkflowVersion") { + + function "getWorkflowVersion" + + when { + function { + """ + // no inputs + """ + } + } + + then { + assert function.success + assert snapshot(function.result).match() + } + + } + + + test("Test Function dumpParametersToJSON") { + + function "dumpParametersToJSON" + + when { + function { + """ + // define inputs of the function here. Example: + input[0] = "$outputDir" + """.stripIndent() + } + } + + then { + assert function.success + assert function.result =~ /publish_dir_mode/ + assert function.result =~ /copy/ + } + + } + + test("Test Function checkCondaChannels") { + + function "checkCondaChannels" + + when { + function { + """ + // no inputs + """ + } + } + + then { + assert function.success + assert snapshot(function.result).match() + } + + } + +} \ No newline at end of file diff --git a/subworkflows/nf-core/nextflowpipelineutils/tests/main.functions.nf.test.snap b/subworkflows/nf-core/nextflowpipelineutils/tests/main.functions.nf.test.snap new file mode 100644 index 00000000..956bfac7 --- /dev/null +++ b/subworkflows/nf-core/nextflowpipelineutils/tests/main.functions.nf.test.snap @@ -0,0 +1,12 @@ +{ + "Test Function getWorkflowVersion": { + "content": [ + "" + ], + "timestamp": "2023-10-12T17:09:20.935733" + }, + "Test Function checkCondaChannels": { + "content": null, + "timestamp": "2023-10-12T17:09:24.933468" + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/nextflowpipelineutils/tests/main.workflow.nf.test b/subworkflows/nf-core/nextflowpipelineutils/tests/main.workflow.nf.test new file mode 100644 index 00000000..3cf7f034 --- /dev/null +++ b/subworkflows/nf-core/nextflowpipelineutils/tests/main.workflow.nf.test @@ -0,0 +1,104 @@ +nextflow_workflow { + + name "Test Workflow NEXTFLOW_PIPELINE_UTILS" + script "../main.nf" + config "subworkflows/nf-core/nextflowpipelineutils/tests/nextflow.config" + workflow "NEXTFLOW_PIPELINE_UTILS" + tag 'subworkflows' + tag 'nextflowpipelineutils' + tag 'subworkflows/nextflowpipelineutils' + + test("Should run no inputs") { + + when { + params { + outdir = "tests/results" + } + workflow { + """ + input[0] = false + input[1] = false + input[2] = null + input[3] = false + """ + } + } + + then { + assert workflow.success + assert snapshot(workflow.out).match() + } + + } + + test("Should print version") { + + when { + params { + outdir = "tests/results" + } + workflow { + """ + input[0] = true + input[1] = false + input[2] = null + input[3] = false + """ + } + } + + then { + assert workflow.success + assert workflow.stdout.contains("nextflow_workflow v9.9.9") + } + + } + + + test("Should dump params") { + + when { + params { + outdir = "$outputDir" + } + workflow { + """ + input[0] = false + input[1] = true + input[2] = params.outdir + input[3] = false + """ + } + } + + then { + assert workflow.success + assert snapshot(workflow.out).match() + } + + } + + test("Should not create params JSON if no output directory") { + + when { + params { + outdir = "$outputDir" + } + workflow { + """ + input[0] = false + input[1] = true + input[2] = null + input[3] = false + """ + } + } + + then { + assert workflow.success + assert snapshot(workflow.out, path(params.outdir).list()).match() + } + + } + +} diff --git a/subworkflows/nf-core/nextflowpipelineutils/tests/main.workflow.nf.test.snap b/subworkflows/nf-core/nextflowpipelineutils/tests/main.workflow.nf.test.snap new file mode 100644 index 00000000..08040fd4 --- /dev/null +++ b/subworkflows/nf-core/nextflowpipelineutils/tests/main.workflow.nf.test.snap @@ -0,0 +1,44 @@ +{ + "Should not create params JSON if no output directory": { + "content": [ + { + "0": [ + true + ], + "out": [ + true + ] + }, + [ + + ] + ], + "timestamp": "2023-10-13T11:55:54.576748" + }, + "Should dump params": { + "content": [ + { + "0": [ + true + ], + "out": [ + true + ] + } + ], + "timestamp": "2023-10-13T11:55:52.711329" + }, + "Should run no inputs": { + "content": [ + { + "0": [ + true + ], + "out": [ + true + ] + } + ], + "timestamp": "2023-10-13T11:55:49.048315" + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/nextflowpipelineutils/tests/nextflow.config b/subworkflows/nf-core/nextflowpipelineutils/tests/nextflow.config new file mode 100644 index 00000000..035c0f5d --- /dev/null +++ b/subworkflows/nf-core/nextflowpipelineutils/tests/nextflow.config @@ -0,0 +1,9 @@ +manifest { + name = 'nextflow_workflow' + author = """nf-core""" + homePage = 'https://127.0.0.1' + description = """Dummy pipeline""" + nextflowVersion = '!>=23.04.4' + version = '9.9.9' + doi = 'https://doi.org/10.5281/zenodo.5070524' +} \ No newline at end of file From 135c6447e3b1ada4e84aa03e25beaa8e0b0276fd Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 13 Oct 2023 15:22:32 +0200 Subject: [PATCH 559/852] tags --- .../fastq_download_prefetch_fasterqdump_sratools/tests/tags.yml | 2 ++ subworkflows/nf-core/nextflowpipelineutils/tests/tags.yml | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/tags.yml create mode 100644 subworkflows/nf-core/nextflowpipelineutils/tests/tags.yml diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/tags.yml b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/tags.yml new file mode 100644 index 00000000..ab064503 --- /dev/null +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/tags.yml @@ -0,0 +1,2 @@ +fastq_download_prefetch_fasterqdump_sratools: + - subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/** diff --git a/subworkflows/nf-core/nextflowpipelineutils/tests/tags.yml b/subworkflows/nf-core/nextflowpipelineutils/tests/tags.yml new file mode 100644 index 00000000..57127a2a --- /dev/null +++ b/subworkflows/nf-core/nextflowpipelineutils/tests/tags.yml @@ -0,0 +1,2 @@ +nextflowpipelineutils: + - subworkflows/nf-core/nextflowpipelineutils/** From a12c5a3b2452de4b16fb1d03b91f85ea81eacd0c Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Mon, 16 Oct 2023 15:51:54 +0200 Subject: [PATCH 560/852] Use nf-core nfvalidation subworkflow --- modules.json | 5 + .../local/nf_core_fetchngs_utils/main.nf | 4 +- .../local/nf_validation_plugin_utils/main.nf | 52 ----- .../nf-core/nfvalidation_plugin_utils/main.nf | 62 ++++++ .../nfvalidation_plugin_utils/meta.yml | 49 +++++ .../tests/main.nf.test | 199 ++++++++++++++++++ .../tests/main.nf.test.snap | 26 +++ .../tests/nextflow_schema.json | 96 +++++++++ 8 files changed, 439 insertions(+), 54 deletions(-) delete mode 100644 subworkflows/local/nf_validation_plugin_utils/main.nf create mode 100644 subworkflows/nf-core/nfvalidation_plugin_utils/main.nf create mode 100644 subworkflows/nf-core/nfvalidation_plugin_utils/meta.yml create mode 100644 subworkflows/nf-core/nfvalidation_plugin_utils/tests/main.nf.test create mode 100644 subworkflows/nf-core/nfvalidation_plugin_utils/tests/main.nf.test.snap create mode 100644 subworkflows/nf-core/nfvalidation_plugin_utils/tests/nextflow_schema.json diff --git a/modules.json b/modules.json index 3cc9d6dd..b8801dc6 100644 --- a/modules.json +++ b/modules.json @@ -38,6 +38,11 @@ "branch": "master", "git_sha": "76cbb00305f6b045c15c1e202a5bdd516d6f64a3", "installed_by": ["subworkflows"] + }, + "nfvalidation_plugin_utils": { + "branch": "master", + "git_sha": "a8223a72def6cc46f4652a348feba21845ce68c6", + "installed_by": ["subworkflows"] } } } diff --git a/subworkflows/local/nf_core_fetchngs_utils/main.nf b/subworkflows/local/nf_core_fetchngs_utils/main.nf index fd0e9855..05f9a2ba 100644 --- a/subworkflows/local/nf_core_fetchngs_utils/main.nf +++ b/subworkflows/local/nf_core_fetchngs_utils/main.nf @@ -9,8 +9,8 @@ */ include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../../../modules/nf-core/custom/dumpsoftwareversions' -include { NEXTFLOW_PIPELINE_UTILS; getWorkflowVersion } from '../../nf-core/nextflowpipelineutils/main' -include { NF_VALIDATION_PLUGIN_UTILS } from '../nf_validation_plugin_utils' +include { NEXTFLOW_PIPELINE_UTILS; getWorkflowVersion } from '../../nf-core/nextflowpipelineutils/main' +include { NF_VALIDATION_PLUGIN_UTILS } from '../../nf-core/nfvalidation_plugin_utils/main.nf' include { NF_CORE_PIPELINE_UTILS; workflowCitation; nfCoreLogo; dashedLine; completionEmail; completionSummary; imNotification } from '../nf_core_pipeline_utils' /* diff --git a/subworkflows/local/nf_validation_plugin_utils/main.nf b/subworkflows/local/nf_validation_plugin_utils/main.nf deleted file mode 100644 index be815a7f..00000000 --- a/subworkflows/local/nf_validation_plugin_utils/main.nf +++ /dev/null @@ -1,52 +0,0 @@ -// -// Subworkflow that uses the nf-validation plugin to render help text and parameter summary -// - -/* -======================================================================================== - IMPORT NF-VALIDATION PLUGIN -======================================================================================== -*/ - -include { paramsHelp; paramsSummaryLog; paramsSummaryMap; validateParameters } from 'plugin/nf-validation' - -/* -======================================================================================== - SUBWORKFLOW DEFINITION -======================================================================================== -*/ - -workflow NF_VALIDATION_PLUGIN_UTILS { - - take: - print_help // bool - workflow_command // string: default commmand used to run pipeline - pre_help_text // string: string to be printed before help text and summary log - post_help_text // string: string to be printed after help text and summary log - validate_params // bool - - main: - - // - // Print help message if needed - // - if (print_help && workflow_command) { - log.info pre_help_text + paramsHelp(workflow_command) + post_help_text - System.exit(0) - } - - // - // Print parameter summary to stdout - // - log.info pre_help_text + paramsSummaryLog(workflow) + post_help_text - - // - // Validate parameters relative to the parameter JSON schema - // - if (validate_params){ - validateParameters() - } - - emit: - summary_params = paramsSummaryMap(workflow) -} diff --git a/subworkflows/nf-core/nfvalidation_plugin_utils/main.nf b/subworkflows/nf-core/nfvalidation_plugin_utils/main.nf new file mode 100644 index 00000000..22531719 --- /dev/null +++ b/subworkflows/nf-core/nfvalidation_plugin_utils/main.nf @@ -0,0 +1,62 @@ +// +// Subworkflow that uses the nf-validation plugin to render help text and parameter summary +// + +/* +======================================================================================== + IMPORT NF-VALIDATION PLUGIN +======================================================================================== +*/ + +include { paramsHelp; paramsSummaryLog; paramsSummaryMap; validateParameters } from 'plugin/nf-validation' + +/* +======================================================================================== + SUBWORKFLOW DEFINITION +======================================================================================== +*/ + +workflow NF_VALIDATION_PLUGIN_UTILS { + + take: + print_help // bool + workflow_command // string: default commmand used to run pipeline + pre_help_text // string: string to be printed before help text and summary log + post_help_text // string: string to be printed after help text and summary log + validate_params // bool: Validate parameters + schema_filename // path: JSON schema file, null to use default value + + main: + + log.debug "Using schema file: ${schema_filename}" + + // Default values for strings + pre_help_text = pre_help_text ?: '' + post_help_text = post_help_text ?: '' + workflow_command = workflow_command ?: '' + + // + // Print help message if needed + // + if (print_help) { + log.info pre_help_text + paramsHelp(workflow_command, parameters_schema: schema_filename) + post_help_text + System.exit(0) + } + + // + // Print parameter summary to stdout + // + log.info pre_help_text + paramsSummaryLog(workflow, parameters_schema: schema_filename) + post_help_text + + // + // Validate parameters relative to the parameter JSON schema + // + if (validate_params){ + validateParameters(parameters_schema: schema_filename) + } + + summary_params = paramsSummaryMap(workflow, parameters_schema: schema_filename) + + emit: + summary_params = summary_params +} diff --git a/subworkflows/nf-core/nfvalidation_plugin_utils/meta.yml b/subworkflows/nf-core/nfvalidation_plugin_utils/meta.yml new file mode 100644 index 00000000..6117b455 --- /dev/null +++ b/subworkflows/nf-core/nfvalidation_plugin_utils/meta.yml @@ -0,0 +1,49 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/subworkflows/yaml-schema.json +name: "nfvalidationpluginutils" +## TODO nf-core: Add a description of the subworkflow and list keywords +description: Sort SAM/BAM/CRAM file +keywords: + - sort + - bam + - sam + - cram +## TODO nf-core: Add a list of the modules and/or subworkflows used in the subworkflow +components: + - samtools/sort + - samtools/index +## TODO nf-core: List all of the channels used as input with a description and their structure +input: + - ch_bam: + type: file + description: | + The input channel containing the BAM/CRAM/SAM files + Structure: [ val(meta), path(bam) ] + pattern: "*.{bam/cram/sam}" +## TODO nf-core: List all of the channels used as output with a descriptions and their structure +output: + - bam: + type: file + description: | + Channel containing BAM files + Structure: [ val(meta), path(bam) ] + pattern: "*.bam" + - bai: + type: file + description: | + Channel containing indexed BAM (BAI) files + Structure: [ val(meta), path(bai) ] + pattern: "*.bai" + - csi: + type: file + description: | + Channel containing CSI files + Structure: [ val(meta), path(csi) ] + pattern: "*.csi" + - versions: + type: file + description: | + File containing software versions + Structure: [ path(versions.yml) ] + pattern: "versions.yml" +authors: + - "@adamrtalbot" diff --git a/subworkflows/nf-core/nfvalidation_plugin_utils/tests/main.nf.test b/subworkflows/nf-core/nfvalidation_plugin_utils/tests/main.nf.test new file mode 100644 index 00000000..6a0efd1e --- /dev/null +++ b/subworkflows/nf-core/nfvalidation_plugin_utils/tests/main.nf.test @@ -0,0 +1,199 @@ +nextflow_workflow { + + name "Test Workflow NF_VALIDATION_PLUGIN_UTILS" + script "../main.nf" + workflow "NF_VALIDATION_PLUGIN_UTILS" + tag "subworkflow" + tag "subworkflow_nfcore" + tag "nfvalidationpluginutils" + tag "subworkflows/nfvalidationpluginutils" + + test("Should run nothing") { + + when { + + params { + monochrome_logs = true + test_data = '' + } + + workflow { + """ + help = false + workflow_command = null + pre_help_text = null + post_help_text = null + validate_params = false + schema_filename = "$moduleTestDir/nextflow_schema.json" + + input[0] = help + input[1] = workflow_command + input[2] = pre_help_text + input[3] = post_help_text + input[4] = validate_params + input[5] = schema_filename + """ + } + } + + then { + assert workflow.success + } + + } + + test("Should run help") { + + + when { + + params { + monochrome_logs = true + test_data = '' + } + workflow { + """ + help = true + workflow_command = null + pre_help_text = null + post_help_text = null + validate_params = false + schema_filename = "$moduleTestDir/nextflow_schema.json" + + input[0] = help + input[1] = workflow_command + input[2] = pre_help_text + input[3] = post_help_text + input[4] = validate_params + input[5] = schema_filename + """ + } + } + + then { + assert workflow.success + assert workflow.exitStatus == 0 + assert workflow.stdout.any { it.contains('Input/output options') } + assert workflow.stdout.any { it.contains('--outdir') } + assert workflow.stdout.any { it.contains('--outdir') } + } + + } + + test("Should run help with command") { + + + when { + + params { + monochrome_logs = true + test_data = '' + } + workflow { + """ + help = true + workflow_command = "nextflow run noorg/doesntexist" + pre_help_text = null + post_help_text = null + validate_params = false + schema_filename = "$moduleTestDir/nextflow_schema.json" + + input[0] = help + input[1] = workflow_command + input[2] = pre_help_text + input[3] = post_help_text + input[4] = validate_params + input[5] = schema_filename + """ + } + } + + then { + assert workflow.success + assert workflow.exitStatus == 0 + assert workflow.stdout.any { it.contains('nextflow run noorg/doesntexist') } + assert workflow.stdout.any { it.contains('Input/output options') } + assert workflow.stdout.any { it.contains('--outdir') } + assert workflow.stdout.any { it.contains('--outdir') } + } + + } + + test("Should run help with extra text") { + + + when { + + params { + monochrome_logs = true + test_data = '' + } + workflow { + """ + help = true + workflow_command = "nextflow run noorg/doesntexist" + pre_help_text = "pre-help-text" + post_help_text = "post-help-text" + validate_params = false + schema_filename = "$moduleTestDir/nextflow_schema.json" + + input[0] = help + input[1] = workflow_command + input[2] = pre_help_text + input[3] = post_help_text + input[4] = validate_params + input[5] = schema_filename + """ + } + } + + then { + assert workflow.success + assert workflow.exitStatus == 0 + assert workflow.stdout.any { it.contains('pre-help-text') } + assert workflow.stdout.any { it.contains('nextflow run noorg/doesntexist') } + assert workflow.stdout.any { it.contains('Input/output options') } + assert workflow.stdout.any { it.contains('--outdir') } + assert workflow.stdout.any { it.contains('--outdir') } + assert workflow.stdout.any { it.contains('post-help-text') } + } + + } + + test("Should validate params") { + + + when { + + params { + monochrome_logs = true + test_data = '' + } + workflow { + """ + help = false + workflow_command = null + pre_help_text = null + post_help_text = null + validate_params = true + schema_filename = "$moduleTestDir/nextflow_schema.json" + + input[0] = help + input[1] = workflow_command + input[2] = pre_help_text + input[3] = post_help_text + input[4] = validate_params + input[5] = schema_filename + """ + } + } + + then { + assert workflow.failed + assert workflow.stdout.any { it.contains('ERROR ~ ERROR: Validation of pipeline parameters failed!') } + assert workflow.stdout.any { it.contains('The following invalid input values have been detected:') } + } + + } + +} diff --git a/subworkflows/nf-core/nfvalidation_plugin_utils/tests/main.nf.test.snap b/subworkflows/nf-core/nfvalidation_plugin_utils/tests/main.nf.test.snap new file mode 100644 index 00000000..ae33a930 --- /dev/null +++ b/subworkflows/nf-core/nfvalidation_plugin_utils/tests/main.nf.test.snap @@ -0,0 +1,26 @@ +{ + "Should run help": { + "content": [ + { + "stderr": [ + + ], + "errorReport": "", + "exitStatus": 0, + "failed": false, + "stdout": [ + + ], + "errorMessage": "", + "trace": { + "tasksFailed": 0, + "tasksCount": 0, + "tasksSucceeded": 0 + }, + "name": "workflow", + "success": true + } + ], + "timestamp": "2023-10-13T13:18:16.933251413" + } +} diff --git a/subworkflows/nf-core/nfvalidation_plugin_utils/tests/nextflow_schema.json b/subworkflows/nf-core/nfvalidation_plugin_utils/tests/nextflow_schema.json new file mode 100644 index 00000000..7626c1c9 --- /dev/null +++ b/subworkflows/nf-core/nfvalidation_plugin_utils/tests/nextflow_schema.json @@ -0,0 +1,96 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "https://raw.githubusercontent.com/./master/nextflow_schema.json", + "title": ". pipeline parameters", + "description": "", + "type": "object", + "definitions": { + "input_output_options": { + "title": "Input/output options", + "type": "object", + "fa_icon": "fas fa-terminal", + "description": "Define where the pipeline should find input data and save output data.", + "required": ["outdir"], + "properties": { + "validate_params": { + "type": "boolean", + "description": "Validate parameters?", + "default": true, + "hidden": true + }, + "outdir": { + "type": "string", + "format": "directory-path", + "description": "The output directory where the results will be saved. You have to use absolute paths to storage on Cloud infrastructure.", + "fa_icon": "fas fa-folder-open" + }, + "test_data_base": { + "type": "string", + "default": "https://raw.githubusercontent.com/nf-core/test-datasets/modules", + "description": "Base for test data directory", + "hidden": true + }, + "test_data": { + "type": "string", + "description": "Fake test data param", + "hidden": true + } + } + }, + "generic_options": { + "title": "Generic options", + "type": "object", + "fa_icon": "fas fa-file-import", + "description": "Less common options for the pipeline, typically set in a config file.", + "help_text": "These options are common to all nf-core pipelines and allow you to customise some of the core preferences for how the pipeline runs.\n\nTypically these options would be set in a Nextflow config file loaded for all pipeline runs, such as `~/.nextflow/config`.", + "properties": { + "help": { + "type": "boolean", + "description": "Display help text.", + "fa_icon": "fas fa-question-circle", + "hidden": true + }, + "version": { + "type": "boolean", + "description": "Display version and exit.", + "fa_icon": "fas fa-question-circle", + "hidden": true + }, + "logo": { + "type": "boolean", + "default": true, + "description": "Display nf-core logo in console output.", + "fa_icon": "fas fa-image", + "hidden": true + }, + "singularity_pull_docker_container": { + "type": "boolean", + "description": "Pull Singularity container from Docker?", + "hidden": true + }, + "publish_dir_mode": { + "type": "string", + "default": "copy", + "description": "Method used to save pipeline results to output directory.", + "help_text": "The Nextflow `publishDir` option specifies which intermediate files should be saved to the output directory. This option tells the pipeline what method should be used to move these files. See [Nextflow docs](https://www.nextflow.io/docs/latest/process.html#publishdir) for details.", + "fa_icon": "fas fa-copy", + "enum": ["symlink", "rellink", "link", "copy", "copyNoFollow", "move"], + "hidden": true + }, + "monochrome_logs": { + "type": "boolean", + "description": "Use monochrome_logs", + "hidden": true + } + } + } + }, + "allOf": [ + { + "$ref": "#/definitions/input_output_options" + }, + { + "$ref": "#/definitions/generic_options" + } + ] +} From 94d75cb01b0545a4cc2edf992e073a83707990fb Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Mon, 16 Oct 2023 16:00:54 +0200 Subject: [PATCH 561/852] fix --- subworkflows/local/nf_core_fetchngs_utils/main.nf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/subworkflows/local/nf_core_fetchngs_utils/main.nf b/subworkflows/local/nf_core_fetchngs_utils/main.nf index 05f9a2ba..f20bdbe7 100644 --- a/subworkflows/local/nf_core_fetchngs_utils/main.nf +++ b/subworkflows/local/nf_core_fetchngs_utils/main.nf @@ -44,7 +44,8 @@ workflow PIPELINE_INITIALISATION { workflow_command, pre_help_text, post_help_text, - params.validate_params + params.validate_params, + "nextflow_schema.json" ) // From f372eeb771adfb48cda42d42704e92b7876dc1b7 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Mon, 16 Oct 2023 16:06:50 +0200 Subject: [PATCH 562/852] Use nf-core subworkflow: NFCORE_PIPELINE_UTILS --- modules.json | 5 + .../local/nf_core_fetchngs_utils/main.nf | 14 +- .../nfcore_pipeline_utils}/main.nf | 5 +- .../nf-core/nfcore_pipeline_utils/meta.yml | 17 +++ .../tests/main.function.nf.test | 120 ++++++++++++++++++ .../tests/main.function.nf.test.snap | 78 ++++++++++++ .../tests/main.workflow.nf.test | 33 +++++ .../tests/nextflow.config | 9 ++ 8 files changed, 277 insertions(+), 4 deletions(-) rename subworkflows/{local/nf_core_pipeline_utils => nf-core/nfcore_pipeline_utils}/main.nf (99%) create mode 100644 subworkflows/nf-core/nfcore_pipeline_utils/meta.yml create mode 100644 subworkflows/nf-core/nfcore_pipeline_utils/tests/main.function.nf.test create mode 100644 subworkflows/nf-core/nfcore_pipeline_utils/tests/main.function.nf.test.snap create mode 100644 subworkflows/nf-core/nfcore_pipeline_utils/tests/main.workflow.nf.test create mode 100644 subworkflows/nf-core/nfcore_pipeline_utils/tests/nextflow.config diff --git a/modules.json b/modules.json index 3cc9d6dd..d6f5a884 100644 --- a/modules.json +++ b/modules.json @@ -38,6 +38,11 @@ "branch": "master", "git_sha": "76cbb00305f6b045c15c1e202a5bdd516d6f64a3", "installed_by": ["subworkflows"] + }, + "nfcore_pipeline_utils": { + "branch": "master", + "git_sha": "b1f3d31bbf14fe83959cc03f98db96c6b4f73b37", + "installed_by": ["subworkflows"] } } } diff --git a/subworkflows/local/nf_core_fetchngs_utils/main.nf b/subworkflows/local/nf_core_fetchngs_utils/main.nf index fd0e9855..f3035b58 100644 --- a/subworkflows/local/nf_core_fetchngs_utils/main.nf +++ b/subworkflows/local/nf_core_fetchngs_utils/main.nf @@ -9,9 +9,17 @@ */ include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../../../modules/nf-core/custom/dumpsoftwareversions' -include { NEXTFLOW_PIPELINE_UTILS; getWorkflowVersion } from '../../nf-core/nextflowpipelineutils/main' +include { NEXTFLOW_PIPELINE_UTILS; getWorkflowVersion } from '../../nf-core/nextflowpipelineutils/main' include { NF_VALIDATION_PLUGIN_UTILS } from '../nf_validation_plugin_utils' -include { NF_CORE_PIPELINE_UTILS; workflowCitation; nfCoreLogo; dashedLine; completionEmail; completionSummary; imNotification } from '../nf_core_pipeline_utils' +include { + NFCORE_PIPELINE_UTILS; + workflowCitation; + nfCoreLogo; + dashedLine; + completionEmail; + completionSummary; + imNotification +} from '../../nf-core/nf_core_pipeline_utils' /* ======================================================================================== @@ -50,7 +58,7 @@ workflow PIPELINE_INITIALISATION { // // Check config provided to the pipeline // - NF_CORE_PIPELINE_UTILS () + NFCORE_PIPELINE_UTILS () // // Auto-detect input id type diff --git a/subworkflows/local/nf_core_pipeline_utils/main.nf b/subworkflows/nf-core/nfcore_pipeline_utils/main.nf similarity index 99% rename from subworkflows/local/nf_core_pipeline_utils/main.nf rename to subworkflows/nf-core/nfcore_pipeline_utils/main.nf index 18bf238b..b3b136dc 100644 --- a/subworkflows/local/nf_core_pipeline_utils/main.nf +++ b/subworkflows/nf-core/nfcore_pipeline_utils/main.nf @@ -8,11 +8,14 @@ ======================================================================================== */ -workflow NF_CORE_PIPELINE_UTILS { +workflow NFCORE_PIPELINE_UTILS { main: checkConfigProvided() + emit: + success = true + } /* diff --git a/subworkflows/nf-core/nfcore_pipeline_utils/meta.yml b/subworkflows/nf-core/nfcore_pipeline_utils/meta.yml new file mode 100644 index 00000000..5721b7e3 --- /dev/null +++ b/subworkflows/nf-core/nfcore_pipeline_utils/meta.yml @@ -0,0 +1,17 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/subworkflows/yaml-schema.json +name: "NFCORE_PIPELINE_UTILS" +description: Subworkflow with utility functions specific to the nf-core pipeline template +keywords: + - utility + - pipeline + - initialise + - version +components: [] +input: [] +output: + - success: + type: boolean + description: | + Dummy output to indicate success +authors: + - "@adamrtalbot" diff --git a/subworkflows/nf-core/nfcore_pipeline_utils/tests/main.function.nf.test b/subworkflows/nf-core/nfcore_pipeline_utils/tests/main.function.nf.test new file mode 100644 index 00000000..265ece39 --- /dev/null +++ b/subworkflows/nf-core/nfcore_pipeline_utils/tests/main.function.nf.test @@ -0,0 +1,120 @@ + +nextflow_function { + + name "Test Functions" + script "../main.nf" + config "subworkflows/nf-core/nfcore_pipeline_utils/tests/nextflow.config" + + test("Test Function checkConfigProvided") { + + function "checkConfigProvided" + + when { + function { + """ + // define inputs of the function here. Example: + // input[0] = 1 + """ + } + } + + then { + assertAll ( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + + } + + test("Test Function workflowCitation") { + + function "workflowCitation" + + when { + function { + """ + // define inputs of the function here. Example: + // input[0] = 1 + """ + } + } + + then { + assertAll ( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + + } + + test("Test Function nfCoreLogo") { + + function "nfCoreLogo" + + when { + function { + """ + input[0] = "9.9.9" + """ + } + } + + then { + assertAll ( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + + } + + + + test("Test Function dashedLine") { + + function "dashedLine" + + when { + function { + """ + // define inputs of the function here. Example: + // input[0] = 1 + """ + } + } + + then { + assertAll ( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + + } + + + + test("Test Function logColours") { + + function "logColours" + + when { + function { + """ + // define inputs of the function here. Example: + // input[0] = 1 + """ + } + } + + then { + assertAll ( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/nfcore_pipeline_utils/tests/main.function.nf.test.snap b/subworkflows/nf-core/nfcore_pipeline_utils/tests/main.function.nf.test.snap new file mode 100644 index 00000000..3ea51f68 --- /dev/null +++ b/subworkflows/nf-core/nfcore_pipeline_utils/tests/main.function.nf.test.snap @@ -0,0 +1,78 @@ +{ + "Test Function logColours": { + "content": [ + { + "reset": "\u001b[0m", + "bold": "\u001b[1m", + "dim": "\u001b[2m", + "underlined": "\u001b[4m", + "blink": "\u001b[5m", + "reverse": "\u001b[7m", + "hidden": "\u001b[8m", + "black": "\u001b[0;30m", + "red": "\u001b[0;31m", + "green": "\u001b[0;32m", + "yellow": "\u001b[0;33m", + "blue": "\u001b[0;34m", + "purple": "\u001b[0;35m", + "cyan": "\u001b[0;36m", + "white": "\u001b[0;37m", + "bblack": "\u001b[1;30m", + "bred": "\u001b[1;31m", + "bgreen": "\u001b[1;32m", + "byellow": "\u001b[1;33m", + "bblue": "\u001b[1;34m", + "bpurple": "\u001b[1;35m", + "bcyan": "\u001b[1;36m", + "bwhite": "\u001b[1;37m", + "ublack": "\u001b[4;30m", + "ured": "\u001b[4;31m", + "ugreen": "\u001b[4;32m", + "uyellow": "\u001b[4;33m", + "ublue": "\u001b[4;34m", + "upurple": "\u001b[4;35m", + "ucyan": "\u001b[4;36m", + "uwhite": "\u001b[4;37m", + "iblack": "\u001b[0;90m", + "ired": "\u001b[0;91m", + "igreen": "\u001b[0;92m", + "iyellow": "\u001b[0;93m", + "iblue": "\u001b[0;94m", + "ipurple": "\u001b[0;95m", + "icyan": "\u001b[0;96m", + "iwhite": "\u001b[0;97m", + "biblack": "\u001b[1;90m", + "bired": "\u001b[1;91m", + "bigreen": "\u001b[1;92m", + "biyellow": "\u001b[1;93m", + "biblue": "\u001b[1;94m", + "bipurple": "\u001b[1;95m", + "bicyan": "\u001b[1;96m", + "biwhite": "\u001b[1;97m" + } + ], + "timestamp": "2023-10-16T14:27:09.843064" + }, + "Test Function checkConfigProvided": { + "content": null, + "timestamp": "2023-10-16T14:27:01.415849" + }, + "Test Function nfCoreLogo": { + "content": [ + "\n\n-\u001b[2m----------------------------------------------------\u001b[0m-\n \u001b[0;32m,--.\u001b[0;30m/\u001b[0;32m,-.\u001b[0m\n\u001b[0;34m ___ __ __ __ ___ \u001b[0;32m/,-._.--~'\u001b[0m\n\u001b[0;34m |\\ | |__ __ / ` / \\ |__) |__ \u001b[0;33m} {\u001b[0m\n\u001b[0;34m | \\| | \\__, \\__/ | \\ |___ \u001b[0;32m\\`-._,-`-,\u001b[0m\n \u001b[0;32m`._,._,'\u001b[0m\n\u001b[0;35m nextflow_workflow 9.9.9\u001b[0m\n-\u001b[2m----------------------------------------------------\u001b[0m-\n" + ], + "timestamp": "2023-10-16T14:27:51.566211" + }, + "Test Function workflowCitation": { + "content": [ + "If you use nextflow_workflow for your analysis please cite:\n\n* The pipeline\n https://doi.org/10.5281/zenodo.5070524\n\n* The nf-core framework\n https://doi.org/10.1038/s41587-020-0439-x\n\n* Software dependencies\n https://github.com/nextflow_workflow/blob/master/CITATIONS.md" + ], + "timestamp": "2023-10-16T14:27:03.505737" + }, + "Test Function dashedLine": { + "content": [ + "-\u001b[2m----------------------------------------------------\u001b[0m-" + ], + "timestamp": "2023-10-16T14:27:07.721916" + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/nfcore_pipeline_utils/tests/main.workflow.nf.test b/subworkflows/nf-core/nfcore_pipeline_utils/tests/main.workflow.nf.test new file mode 100644 index 00000000..ad7c73a8 --- /dev/null +++ b/subworkflows/nf-core/nfcore_pipeline_utils/tests/main.workflow.nf.test @@ -0,0 +1,33 @@ +nextflow_workflow { + + name "Test Workflow NFCORE_PIPELINE_UTILS" + script "../main.nf" + config "subworkflows/nf-core/nfcore_pipeline_utils/tests/nextflow.config" + workflow "NFCORE_PIPELINE_UTILS" + tag "subworkflows" + tag "subworkflows_nfcore" + tag "nfcorepipelineutils" + tag "subworkflows/nfcorepipelineutils" + + test("Should run without failures") { + + when { + params { + // define parameters here. Example: + // outdir = "tests/results" + } + workflow { + """ + // define inputs of the workflow here. Example: + // input[0] = file("test-file.txt") + """ + } + } + + then { + assert workflow.success + } + + } + +} diff --git a/subworkflows/nf-core/nfcore_pipeline_utils/tests/nextflow.config b/subworkflows/nf-core/nfcore_pipeline_utils/tests/nextflow.config new file mode 100644 index 00000000..53574ffe --- /dev/null +++ b/subworkflows/nf-core/nfcore_pipeline_utils/tests/nextflow.config @@ -0,0 +1,9 @@ +manifest { + name = 'nextflow_workflow' + author = """nf-core""" + homePage = 'https://127.0.0.1' + description = """Dummy pipeline""" + nextflowVersion = '!>=23.04.0' + version = '9.9.9' + doi = 'https://doi.org/10.5281/zenodo.5070524' +} \ No newline at end of file From 86cfae283941445a1d748a16669032e42cdee7e8 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Mon, 16 Oct 2023 16:12:01 +0200 Subject: [PATCH 563/852] Update nextflowpipelineutils --- modules.json | 2 +- .../nextflowpipelineutils/tests/main.functions.nf.test | 1 + .../nextflowpipelineutils/tests/main.functions.nf.test.snap | 4 ++-- .../nf-core/nextflowpipelineutils/tests/nextflow.config | 2 +- subworkflows/nf-core/nextflowpipelineutils/tests/tags.yml | 2 -- 5 files changed, 5 insertions(+), 6 deletions(-) delete mode 100644 subworkflows/nf-core/nextflowpipelineutils/tests/tags.yml diff --git a/modules.json b/modules.json index 3cc9d6dd..ecd043f9 100644 --- a/modules.json +++ b/modules.json @@ -36,7 +36,7 @@ }, "nextflowpipelineutils": { "branch": "master", - "git_sha": "76cbb00305f6b045c15c1e202a5bdd516d6f64a3", + "git_sha": "1405b3d5078f108f86a2c122846ed2797b4ec8bf", "installed_by": ["subworkflows"] } } diff --git a/subworkflows/nf-core/nextflowpipelineutils/tests/main.functions.nf.test b/subworkflows/nf-core/nextflowpipelineutils/tests/main.functions.nf.test index db757ed1..1a1577eb 100644 --- a/subworkflows/nf-core/nextflowpipelineutils/tests/main.functions.nf.test +++ b/subworkflows/nf-core/nextflowpipelineutils/tests/main.functions.nf.test @@ -3,6 +3,7 @@ nextflow_function { name "Test Functions" script "subworkflows/nf-core/nextflowpipelineutils/main.nf" + config "subworkflows/nf-core/nextflowpipelineutils/tests/nextflow.config" tag 'subworkflows' tag 'nextflowpipelineutils' tag 'subworkflows/nextflowpipelineutils' diff --git a/subworkflows/nf-core/nextflowpipelineutils/tests/main.functions.nf.test.snap b/subworkflows/nf-core/nextflowpipelineutils/tests/main.functions.nf.test.snap index 956bfac7..939dbbad 100644 --- a/subworkflows/nf-core/nextflowpipelineutils/tests/main.functions.nf.test.snap +++ b/subworkflows/nf-core/nextflowpipelineutils/tests/main.functions.nf.test.snap @@ -1,9 +1,9 @@ { "Test Function getWorkflowVersion": { "content": [ - "" + "v9.9.9" ], - "timestamp": "2023-10-12T17:09:20.935733" + "timestamp": "2023-10-15T13:43:55.128868" }, "Test Function checkCondaChannels": { "content": null, diff --git a/subworkflows/nf-core/nextflowpipelineutils/tests/nextflow.config b/subworkflows/nf-core/nextflowpipelineutils/tests/nextflow.config index 035c0f5d..53574ffe 100644 --- a/subworkflows/nf-core/nextflowpipelineutils/tests/nextflow.config +++ b/subworkflows/nf-core/nextflowpipelineutils/tests/nextflow.config @@ -3,7 +3,7 @@ manifest { author = """nf-core""" homePage = 'https://127.0.0.1' description = """Dummy pipeline""" - nextflowVersion = '!>=23.04.4' + nextflowVersion = '!>=23.04.0' version = '9.9.9' doi = 'https://doi.org/10.5281/zenodo.5070524' } \ No newline at end of file diff --git a/subworkflows/nf-core/nextflowpipelineutils/tests/tags.yml b/subworkflows/nf-core/nextflowpipelineutils/tests/tags.yml deleted file mode 100644 index 57127a2a..00000000 --- a/subworkflows/nf-core/nextflowpipelineutils/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -nextflowpipelineutils: - - subworkflows/nf-core/nextflowpipelineutils/** From 4464c07f301ecafea93ae83a624c3730f290daca Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Mon, 16 Oct 2023 16:13:46 +0200 Subject: [PATCH 564/852] path fix --- subworkflows/local/nf_core_fetchngs_utils/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/nf_core_fetchngs_utils/main.nf b/subworkflows/local/nf_core_fetchngs_utils/main.nf index f3035b58..b964ab5b 100644 --- a/subworkflows/local/nf_core_fetchngs_utils/main.nf +++ b/subworkflows/local/nf_core_fetchngs_utils/main.nf @@ -19,7 +19,7 @@ include { completionEmail; completionSummary; imNotification -} from '../../nf-core/nf_core_pipeline_utils' +} from '../../nf-core/nfcore_pipeline_utils' /* ======================================================================================== From 52c4100dbc5ddb0d0950a8f68ff3a4a78cd2e847 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Mon, 16 Oct 2023 16:19:52 +0200 Subject: [PATCH 565/852] Update subworkflows/local/nf_core_fetchngs_utils/main.nf Co-authored-by: Maxime U Garcia --- subworkflows/local/nf_core_fetchngs_utils/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/nf_core_fetchngs_utils/main.nf b/subworkflows/local/nf_core_fetchngs_utils/main.nf index b964ab5b..376f999e 100644 --- a/subworkflows/local/nf_core_fetchngs_utils/main.nf +++ b/subworkflows/local/nf_core_fetchngs_utils/main.nf @@ -9,7 +9,7 @@ */ include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../../../modules/nf-core/custom/dumpsoftwareversions' -include { NEXTFLOW_PIPELINE_UTILS; getWorkflowVersion } from '../../nf-core/nextflowpipelineutils/main' +include { NEXTFLOW_PIPELINE_UTILS; getWorkflowVersion } from '../../nf-core/nextflowpipelineutils/main' include { NF_VALIDATION_PLUGIN_UTILS } from '../nf_validation_plugin_utils' include { NFCORE_PIPELINE_UTILS; From 16ce425f0afad8b0bb7f957704284fbfee0449b1 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Tue, 17 Oct 2023 16:15:35 +0200 Subject: [PATCH 566/852] update modules --- modules.json | 23 ++++--- .../sratoolsncbisettings/tests/tags.yml | 2 + modules/nf-core/untar/main.nf | 63 +++++++++++++++++++ modules/nf-core/untar/meta.yml | 41 ++++++++++++ 4 files changed, 120 insertions(+), 9 deletions(-) create mode 100644 modules/nf-core/custom/sratoolsncbisettings/tests/tags.yml create mode 100644 modules/nf-core/untar/main.nf create mode 100644 modules/nf-core/untar/meta.yml diff --git a/modules.json b/modules.json index 7bf618ff..e5e6bbc6 100644 --- a/modules.json +++ b/modules.json @@ -7,23 +7,28 @@ "nf-core": { "custom/dumpsoftwareversions": { "branch": "master", - "git_sha": "c7494026693ba1a7db683e1520816709db3f05a0", + "git_sha": "4125fb0c2152efbcec8d9ed71a756c9274b2f7f5", "installed_by": ["modules"] }, "custom/sratoolsncbisettings": { "branch": "master", - "git_sha": "c7494026693ba1a7db683e1520816709db3f05a0", + "git_sha": "4125fb0c2152efbcec8d9ed71a756c9274b2f7f5", "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] }, "sratools/fasterqdump": { "branch": "master", - "git_sha": "c7494026693ba1a7db683e1520816709db3f05a0", + "git_sha": "4125fb0c2152efbcec8d9ed71a756c9274b2f7f5", "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] }, "sratools/prefetch": { "branch": "master", - "git_sha": "c7494026693ba1a7db683e1520816709db3f05a0", + "git_sha": "4125fb0c2152efbcec8d9ed71a756c9274b2f7f5", "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] + }, + "untar": { + "branch": "master", + "git_sha": "d0b4fc03af52a1cc8c6fb4493b921b57352b1dd8", + "installed_by": ["modules"] } } }, @@ -31,7 +36,7 @@ "nf-core": { "fastq_download_prefetch_fasterqdump_sratools": { "branch": "master", - "git_sha": "c7494026693ba1a7db683e1520816709db3f05a0", + "git_sha": "4125fb0c2152efbcec8d9ed71a756c9274b2f7f5", "installed_by": ["subworkflows"] }, "nextflowpipelineutils": { @@ -39,14 +44,14 @@ "git_sha": "1405b3d5078f108f86a2c122846ed2797b4ec8bf", "installed_by": ["subworkflows"] }, - "nfvalidation_plugin_utils": { + "nfcore_pipeline_utils": { "branch": "master", - "git_sha": "a8223a72def6cc46f4652a348feba21845ce68c6", + "git_sha": "b1f3d31bbf14fe83959cc03f98db96c6b4f73b37", "installed_by": ["subworkflows"] }, - "nfcore_pipeline_utils": { + "nfvalidation_plugin_utils": { "branch": "master", - "git_sha": "b1f3d31bbf14fe83959cc03f98db96c6b4f73b37", + "git_sha": "a8223a72def6cc46f4652a348feba21845ce68c6", "installed_by": ["subworkflows"] } } diff --git a/modules/nf-core/custom/sratoolsncbisettings/tests/tags.yml b/modules/nf-core/custom/sratoolsncbisettings/tests/tags.yml new file mode 100644 index 00000000..fb4a08a7 --- /dev/null +++ b/modules/nf-core/custom/sratoolsncbisettings/tests/tags.yml @@ -0,0 +1,2 @@ +custom/sratoolsncbisettings: + - modules/nf-core/custom/sratoolsncbisettings/** diff --git a/modules/nf-core/untar/main.nf b/modules/nf-core/untar/main.nf new file mode 100644 index 00000000..61461c39 --- /dev/null +++ b/modules/nf-core/untar/main.nf @@ -0,0 +1,63 @@ +process UNTAR { + tag "$archive" + label 'process_single' + + conda "conda-forge::sed=4.7 conda-forge::grep=3.11 conda-forge::tar=1.34" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/ubuntu:20.04' : + 'nf-core/ubuntu:20.04' }" + + input: + tuple val(meta), path(archive) + + output: + tuple val(meta), path("$prefix"), emit: untar + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' + prefix = task.ext.prefix ?: ( meta.id ? "${meta.id}" : archive.baseName.toString().replaceFirst(/\.tar$/, "")) + + """ + mkdir $prefix + + ## Ensures --strip-components only applied when top level of tar contents is a directory + ## If just files or multiple directories, place all in prefix + if [[ \$(tar -taf ${archive} | grep -o -P "^.*?\\/" | uniq | wc -l) -eq 1 ]]; then + tar \\ + -C $prefix --strip-components 1 \\ + -xavf \\ + $args \\ + $archive \\ + $args2 + else + tar \\ + -C $prefix \\ + -xavf \\ + $args \\ + $archive \\ + $args2 + fi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + untar: \$(echo \$(tar --version 2>&1) | sed 's/^.*(GNU tar) //; s/ Copyright.*\$//') + END_VERSIONS + """ + + stub: + prefix = task.ext.prefix ?: ( meta.id ? "${meta.id}" : archive.toString().replaceFirst(/\.[^\.]+(.gz)?$/, "")) + """ + mkdir $prefix + touch ${prefix}/file.txt + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + untar: \$(echo \$(tar --version 2>&1) | sed 's/^.*(GNU tar) //; s/ Copyright.*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/untar/meta.yml b/modules/nf-core/untar/meta.yml new file mode 100644 index 00000000..db241a6e --- /dev/null +++ b/modules/nf-core/untar/meta.yml @@ -0,0 +1,41 @@ +name: untar +description: Extract files. +keywords: + - untar + - uncompress + - extract +tools: + - untar: + description: | + Extract tar.gz files. + documentation: https://www.gnu.org/software/tar/manual/ + licence: ["GPL-3.0-or-later"] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - archive: + type: file + description: File to be untar + pattern: "*.{tar}.{gz}" +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - untar: + type: directory + description: Directory containing contents of archive + pattern: "*/" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@joseespinosa" + - "@drpatelh" + - "@matthdsm" + - "@jfy133" From 5875c57588cafd1f9f3389be3a2842bbf33c0f00 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Tue, 17 Oct 2023 16:18:55 +0200 Subject: [PATCH 567/852] patch custom-dumpsoftwareversions snap --- .../custom-dumpsoftwareversions.diff | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 modules/nf-core/custom/dumpsoftwareversions/custom-dumpsoftwareversions.diff diff --git a/modules/nf-core/custom/dumpsoftwareversions/custom-dumpsoftwareversions.diff b/modules/nf-core/custom/dumpsoftwareversions/custom-dumpsoftwareversions.diff new file mode 100644 index 00000000..307c06ea --- /dev/null +++ b/modules/nf-core/custom/dumpsoftwareversions/custom-dumpsoftwareversions.diff @@ -0,0 +1,49 @@ +Changes in module 'nf-core/custom/dumpsoftwareversions' +--- /dev/null ++++ modules/nf-core/custom/dumpsoftwareversions/nextflow.config +@@ -0,0 +1,10 @@ ++process { ++ withName: CUSTOM_DUMPSOFTWAREVERSIONS { ++ cache = false ++ publishDir = [ ++ path: { "${params.outdir}/pipeline_info" }, ++ mode: params.publish_dir_mode, ++ pattern: '*_versions.yml' ++ ] ++ } ++} +--- modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap ++++ modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap +@@ -3,25 +3,25 @@ + "content": [ + { + "0": [ +- "software_versions.yml:md5,a027f820f30b8191a20ca16465daaf37" ++ "software_versions.yml:md5,45e271267967cd582c53d2cc609f8e02" + ], + "1": [ +- "software_versions_mqc.yml:md5,ee4a1d028ad29987f9ac511f4668f17c" ++ "software_versions_mqc.yml:md5,2b6b639f9edde0b032afcd9d2fcf6877" + ], + "2": [ + "versions.yml:md5,f47ebd22aba1dd987b7e5d5247b766c3" + ], + "mqc_yml": [ +- "software_versions_mqc.yml:md5,ee4a1d028ad29987f9ac511f4668f17c" ++ "software_versions_mqc.yml:md5,2b6b639f9edde0b032afcd9d2fcf6877" + ], + "versions": [ + "versions.yml:md5,f47ebd22aba1dd987b7e5d5247b766c3" + ], + "yml": [ +- "software_versions.yml:md5,a027f820f30b8191a20ca16465daaf37" ++ "software_versions.yml:md5,45e271267967cd582c53d2cc609f8e02" + ] + } + ], +- "timestamp": "2023-10-11T17:10:02.930699" ++ "timestamp": "2023-10-17T16:16:58.324012" + } +-} ++} +************************************************************ From 4312b74fface24c1069826c402ac343719a991d6 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Tue, 17 Oct 2023 16:33:44 +0200 Subject: [PATCH 568/852] update snaps --- .../custom/dumpsoftwareversions/tests/main.nf.test.snap | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap b/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap index 8713b921..c4e7a6d3 100644 --- a/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap +++ b/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap @@ -22,6 +22,6 @@ ] } ], - "timestamp": "2023-10-11T17:10:02.930699" + "timestamp": "2023-10-17T16:16:58.324012" } -} +} \ No newline at end of file From 2f47befc1d66324ecbddd06bf184a5e2b645b1ae Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Tue, 17 Oct 2023 16:43:48 +0200 Subject: [PATCH 569/852] Replace CUSTOM_DUMPSOFTWAREVERSIONS with collectFile operator --- modules.json | 13 +-- .../custom/dumpsoftwareversions/main.nf | 24 ----- .../custom/dumpsoftwareversions/meta.yml | 36 ------- .../dumpsoftwareversions/nextflow.config | 10 -- .../templates/dumpsoftwareversions.py | 101 ------------------ .../dumpsoftwareversions/tests/main.nf.test | 38 ------- .../tests/main.nf.test.snap | 27 ----- .../dumpsoftwareversions/tests/tags.yml | 2 - .../local/nf_core_fetchngs_utils/main.nf | 12 ++- 9 files changed, 12 insertions(+), 251 deletions(-) delete mode 100644 modules/nf-core/custom/dumpsoftwareversions/main.nf delete mode 100644 modules/nf-core/custom/dumpsoftwareversions/meta.yml delete mode 100644 modules/nf-core/custom/dumpsoftwareversions/nextflow.config delete mode 100755 modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py delete mode 100644 modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test delete mode 100644 modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap delete mode 100644 modules/nf-core/custom/dumpsoftwareversions/tests/tags.yml diff --git a/modules.json b/modules.json index 7bf618ff..81b6b318 100644 --- a/modules.json +++ b/modules.json @@ -5,11 +5,6 @@ "https://github.com/nf-core/modules.git": { "modules": { "nf-core": { - "custom/dumpsoftwareversions": { - "branch": "master", - "git_sha": "c7494026693ba1a7db683e1520816709db3f05a0", - "installed_by": ["modules"] - }, "custom/sratoolsncbisettings": { "branch": "master", "git_sha": "c7494026693ba1a7db683e1520816709db3f05a0", @@ -39,14 +34,14 @@ "git_sha": "1405b3d5078f108f86a2c122846ed2797b4ec8bf", "installed_by": ["subworkflows"] }, - "nfvalidation_plugin_utils": { + "nfcore_pipeline_utils": { "branch": "master", - "git_sha": "a8223a72def6cc46f4652a348feba21845ce68c6", + "git_sha": "b1f3d31bbf14fe83959cc03f98db96c6b4f73b37", "installed_by": ["subworkflows"] }, - "nfcore_pipeline_utils": { + "nfvalidation_plugin_utils": { "branch": "master", - "git_sha": "b1f3d31bbf14fe83959cc03f98db96c6b4f73b37", + "git_sha": "a8223a72def6cc46f4652a348feba21845ce68c6", "installed_by": ["subworkflows"] } } diff --git a/modules/nf-core/custom/dumpsoftwareversions/main.nf b/modules/nf-core/custom/dumpsoftwareversions/main.nf deleted file mode 100644 index c9d014b1..00000000 --- a/modules/nf-core/custom/dumpsoftwareversions/main.nf +++ /dev/null @@ -1,24 +0,0 @@ -process CUSTOM_DUMPSOFTWAREVERSIONS { - label 'process_single' - - // Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container - conda "bioconda::multiqc=1.15" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.15--pyhdfd78af_0' : - 'biocontainers/multiqc:1.15--pyhdfd78af_0' }" - - input: - path versions - - output: - path "software_versions.yml" , emit: yml - path "software_versions_mqc.yml", emit: mqc_yml - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - template 'dumpsoftwareversions.py' -} diff --git a/modules/nf-core/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/custom/dumpsoftwareversions/meta.yml deleted file mode 100644 index c32657de..00000000 --- a/modules/nf-core/custom/dumpsoftwareversions/meta.yml +++ /dev/null @@ -1,36 +0,0 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/yaml-schema.json -name: custom_dumpsoftwareversions -description: Custom module used to dump software versions within the nf-core pipeline template -keywords: - - custom - - dump - - version -tools: - - custom: - description: Custom module used to dump software versions within the nf-core pipeline template - homepage: https://github.com/nf-core/tools - documentation: https://github.com/nf-core/tools - licence: ["MIT"] -input: - - versions: - type: file - description: YML file containing software versions - pattern: "*.yml" - -output: - - yml: - type: file - description: Standard YML file containing software versions - pattern: "software_versions.yml" - - mqc_yml: - type: file - description: MultiQC custom content YML file containing software versions - pattern: "software_versions_mqc.yml" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - -authors: - - "@drpatelh" - - "@grst" diff --git a/modules/nf-core/custom/dumpsoftwareversions/nextflow.config b/modules/nf-core/custom/dumpsoftwareversions/nextflow.config deleted file mode 100644 index 241654e7..00000000 --- a/modules/nf-core/custom/dumpsoftwareversions/nextflow.config +++ /dev/null @@ -1,10 +0,0 @@ -process { - withName: CUSTOM_DUMPSOFTWAREVERSIONS { - cache = false - publishDir = [ - path: { "${params.outdir}/pipeline_info" }, - mode: params.publish_dir_mode, - pattern: '*_versions.yml' - ] - } -} \ No newline at end of file diff --git a/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py deleted file mode 100755 index da033408..00000000 --- a/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py +++ /dev/null @@ -1,101 +0,0 @@ -#!/usr/bin/env python - - -"""Provide functions to merge multiple versions.yml files.""" - - -import yaml -import platform -from textwrap import dedent - - -def _make_versions_html(versions): - """Generate a tabular HTML output of all versions for MultiQC.""" - html = [ - dedent( - """\\ - - - - - - - - - - """ - ) - ] - for process, tmp_versions in sorted(versions.items()): - html.append("") - for i, (tool, version) in enumerate(sorted(tmp_versions.items())): - html.append( - dedent( - f"""\\ - - - - - - """ - ) - ) - html.append("") - html.append("
Process Name Software Version
{process if (i == 0) else ''}{tool}{version}
") - return "\\n".join(html) - - -def main(): - """Load all version files and generate merged output.""" - versions_this_module = {} - versions_this_module["${task.process}"] = { - "python": platform.python_version(), - "yaml": yaml.__version__, - } - - with open("$versions") as f: - versions_by_process = yaml.load(f, Loader=yaml.BaseLoader) | versions_this_module - - # aggregate versions by the module name (derived from fully-qualified process name) - versions_by_module = {} - for process, process_versions in versions_by_process.items(): - module = process.split(":")[-1] - try: - if versions_by_module[module] != process_versions: - raise AssertionError( - "We assume that software versions are the same between all modules. " - "If you see this error-message it means you discovered an edge-case " - "and should open an issue in nf-core/tools. " - ) - except KeyError: - versions_by_module[module] = process_versions - - versions_by_module["Workflow"] = { - "Nextflow": "$workflow.nextflow.version", - "$workflow.manifest.name": "$workflow.manifest.version", - } - - versions_mqc = { - "id": "software_versions", - "section_name": "${workflow.manifest.name} Software Versions", - "section_href": "https://github.com/${workflow.manifest.name}", - "plot_type": "html", - "description": "are collected at run time from the software output.", - "data": _make_versions_html(versions_by_module), - } - - with open("software_versions.yml", "w") as f: - yaml.dump(versions_by_module, f, default_flow_style=False) - with open("software_versions_mqc.yml", "w") as f: - yaml.dump(versions_mqc, f, default_flow_style=False) - - with open("versions.yml", "w") as f: - yaml.dump(versions_this_module, f, default_flow_style=False) - - -if __name__ == "__main__": - main() diff --git a/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test b/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test deleted file mode 100644 index eec1db10..00000000 --- a/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test +++ /dev/null @@ -1,38 +0,0 @@ -nextflow_process { - - name "Test Process CUSTOM_DUMPSOFTWAREVERSIONS" - script "../main.nf" - process "CUSTOM_DUMPSOFTWAREVERSIONS" - tag "modules" - tag "modules_nfcore" - tag "custom" - tag "dumpsoftwareversions" - tag "custom/dumpsoftwareversions" - - test("Should run without failures") { - when { - process { - """ - def tool1_version = ''' - TOOL1: - tool1: 0.11.9 - '''.stripIndent() - - def tool2_version = ''' - TOOL2: - tool2: 1.9 - '''.stripIndent() - - input[0] = Channel.of(tool1_version, tool2_version).collectFile() - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } - ) - } - } -} diff --git a/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap b/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap deleted file mode 100644 index 8713b921..00000000 --- a/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap +++ /dev/null @@ -1,27 +0,0 @@ -{ - "Should run without failures": { - "content": [ - { - "0": [ - "software_versions.yml:md5,a027f820f30b8191a20ca16465daaf37" - ], - "1": [ - "software_versions_mqc.yml:md5,ee4a1d028ad29987f9ac511f4668f17c" - ], - "2": [ - "versions.yml:md5,f47ebd22aba1dd987b7e5d5247b766c3" - ], - "mqc_yml": [ - "software_versions_mqc.yml:md5,ee4a1d028ad29987f9ac511f4668f17c" - ], - "versions": [ - "versions.yml:md5,f47ebd22aba1dd987b7e5d5247b766c3" - ], - "yml": [ - "software_versions.yml:md5,a027f820f30b8191a20ca16465daaf37" - ] - } - ], - "timestamp": "2023-10-11T17:10:02.930699" - } -} diff --git a/modules/nf-core/custom/dumpsoftwareversions/tests/tags.yml b/modules/nf-core/custom/dumpsoftwareversions/tests/tags.yml deleted file mode 100644 index 405aa24a..00000000 --- a/modules/nf-core/custom/dumpsoftwareversions/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -custom/dumpsoftwareversions: - - modules/nf-core/custom/dumpsoftwareversions/** diff --git a/subworkflows/local/nf_core_fetchngs_utils/main.nf b/subworkflows/local/nf_core_fetchngs_utils/main.nf index eecc62e1..287ed0db 100644 --- a/subworkflows/local/nf_core_fetchngs_utils/main.nf +++ b/subworkflows/local/nf_core_fetchngs_utils/main.nf @@ -8,7 +8,6 @@ ======================================================================================== */ -include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../../../modules/nf-core/custom/dumpsoftwareversions' include { NEXTFLOW_PIPELINE_UTILS; getWorkflowVersion } from '../../nf-core/nextflowpipelineutils/main' include { NF_VALIDATION_PLUGIN_UTILS } from '../../nf-core/nfvalidation_plugin_utils/main.nf' include { @@ -113,9 +112,14 @@ workflow PIPELINE_COMPLETION { // // MODULE: Dump software versions for all tools used in the workflow // - CUSTOM_DUMPSOFTWAREVERSIONS ( - versions.collectFile(name: 'collated_versions.yml') - ) + pipeline_version_info = Channel.of(""" + "Workflow": + "Nextflow": ${workflow.nextflow.version}, + "${workflow.manifest.name}": ${workflow.manifest.version}, + """.stripIndent()) + + versions = versions.mix(pipeline_version_info) + versions.collectFile(name: 'versions.yml', storeDir: "${params.outdir}/pipeline_info") // // Completion email and summary From f941c4db34d66547ce2bcafd90638138ba3388d4 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Tue, 17 Oct 2023 16:46:28 +0200 Subject: [PATCH 570/852] fixup --- nextflow.config | 3 --- 1 file changed, 3 deletions(-) diff --git a/nextflow.config b/nextflow.config index 3589e118..f7674569 100644 --- a/nextflow.config +++ b/nextflow.config @@ -65,9 +65,6 @@ try { System.err.println("WARNING: Could not load nf-core/config profiles: ${params.custom_config_base}/nfcore_custom.config") } -// Module specific configs -includeConfig './modules/nf-core/custom/dumpsoftwareversions/nextflow.config' - // Workflow specific configs if (params.input_type == 'sra') { includeConfig './workflows/sra/nextflow.config' From ba1924327a061d594fed190b610ef2307a11f3d0 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Tue, 17 Oct 2023 17:10:23 +0200 Subject: [PATCH 571/852] gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index ff233cdb..ef809d7c 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ .nf-test.log data/ nf-test +.nf-test* results/ test.xml testing* From 364e6baf05fdcc3f60f963361cfcb9a999c8707a Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Tue, 17 Oct 2023 17:16:08 +0200 Subject: [PATCH 572/852] Use software versions file that matches MultiQC input --- subworkflows/local/nf_core_fetchngs_utils/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/nf_core_fetchngs_utils/main.nf b/subworkflows/local/nf_core_fetchngs_utils/main.nf index 287ed0db..f07e7997 100644 --- a/subworkflows/local/nf_core_fetchngs_utils/main.nf +++ b/subworkflows/local/nf_core_fetchngs_utils/main.nf @@ -119,7 +119,7 @@ workflow PIPELINE_COMPLETION { """.stripIndent()) versions = versions.mix(pipeline_version_info) - versions.collectFile(name: 'versions.yml', storeDir: "${params.outdir}/pipeline_info") + versions.collectFile(name: 'fetchngs_mqc_versions.yml', storeDir: "${params.outdir}/pipeline_info") // // Completion email and summary From e6c79c557ab1ce39533c4fe063abcebf20a3b31e Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Tue, 17 Oct 2023 17:29:21 +0200 Subject: [PATCH 573/852] tidy --- subworkflows/local/nf_core_fetchngs_utils/main.nf | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/subworkflows/local/nf_core_fetchngs_utils/main.nf b/subworkflows/local/nf_core_fetchngs_utils/main.nf index f07e7997..509a4473 100644 --- a/subworkflows/local/nf_core_fetchngs_utils/main.nf +++ b/subworkflows/local/nf_core_fetchngs_utils/main.nf @@ -112,10 +112,9 @@ workflow PIPELINE_COMPLETION { // // MODULE: Dump software versions for all tools used in the workflow // - pipeline_version_info = Channel.of(""" - "Workflow": - "Nextflow": ${workflow.nextflow.version}, - "${workflow.manifest.name}": ${workflow.manifest.version}, + pipeline_version_info = Channel.of("""\"workflow\": + nextflow: ${workflow.nextflow.version} + ${workflow.manifest.name}: ${workflow.manifest.version} """.stripIndent()) versions = versions.mix(pipeline_version_info) From a9d8ae875c5797c137ca80eb6f8833299aff2ab9 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Tue, 17 Oct 2023 17:50:16 +0200 Subject: [PATCH 574/852] forgot patch --- modules.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules.json b/modules.json index e5e6bbc6..4966f053 100644 --- a/modules.json +++ b/modules.json @@ -8,7 +8,8 @@ "custom/dumpsoftwareversions": { "branch": "master", "git_sha": "4125fb0c2152efbcec8d9ed71a756c9274b2f7f5", - "installed_by": ["modules"] + "installed_by": ["modules"], + "patch": "modules/nf-core/custom/dumpsoftwareversions/custom-dumpsoftwareversions.diff" }, "custom/sratoolsncbisettings": { "branch": "master", From cedd600b2e8de83a5671d8b3c0fd803571039063 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Tue, 17 Oct 2023 17:57:37 +0200 Subject: [PATCH 575/852] add data --- conf/test_data.config | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/conf/test_data.config b/conf/test_data.config index 68e84262..670115a8 100644 --- a/conf/test_data.config +++ b/conf/test_data.config @@ -24,6 +24,12 @@ params { } test_data { + 'sarscov2'{ + 'illumina' { + SRR11140744_tar_gz = "${params.test_data_base}/data/genomics/sarscov2/illumina/sra/SRR11140744.tar.gz" + SRR13255544_tar_gz = "${params.test_data_base}/data/genomics/sarscov2/illumina/sra/SRR13255544.tar.gz" + } + } 'generic' { 'config' { ncbi_user_settings = "${params.test_data_base}/data/generic/config/ncbi_user_settings.mkfg" From 5884bba8db03ffb58fc6e2fb00e33d602e13fb1b Mon Sep 17 00:00:00 2001 From: maxulysse Date: Wed, 18 Oct 2023 10:32:07 +0200 Subject: [PATCH 576/852] tinier tests + patch fasterdump --- modules.json | 3 ++- .../nf-core/sratools/fasterqdump/tests/main.nf.test.snap | 4 ++-- tests/sra_ids_test.csv | 6 +----- workflows/sra/tests/main.nf.test | 2 +- workflows/sra/tests/sra_force_sratools_download.nf.test | 2 +- workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test | 2 +- workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test | 2 +- .../sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test | 2 +- workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test | 2 +- workflows/sra/tests/sra_skip_fastq_download.nf.test | 2 +- 10 files changed, 12 insertions(+), 15 deletions(-) diff --git a/modules.json b/modules.json index 7fa9eaf0..81312b77 100644 --- a/modules.json +++ b/modules.json @@ -13,7 +13,8 @@ "sratools/fasterqdump": { "branch": "master", "git_sha": "4125fb0c2152efbcec8d9ed71a756c9274b2f7f5", - "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] + "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"], + "patch": "modules/nf-core/sratools/fasterqdump/sratools-fasterqdump.diff" }, "sratools/prefetch": { "branch": "master", diff --git a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap index d3bf90f7..77fd6c79 100644 --- a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap +++ b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap @@ -8,7 +8,7 @@ "id": "test_single_end", "single_end": true }, - "test_single_end.fastq.gz:md5,1054c7b71884acdb5eed8a378f18be82" + "test_single_end_1.fastq.gz:md5,1054c7b71884acdb5eed8a378f18be82" ] ], "1": [ @@ -20,7 +20,7 @@ "id": "test_single_end", "single_end": true }, - "test_single_end.fastq.gz:md5,1054c7b71884acdb5eed8a378f18be82" + "test_single_end_1.fastq.gz:md5,1054c7b71884acdb5eed8a378f18be82" ] ], "versions": [ diff --git a/tests/sra_ids_test.csv b/tests/sra_ids_test.csv index ec8b5cc9..d9a20c22 100644 --- a/tests/sra_ids_test.csv +++ b/tests/sra_ids_test.csv @@ -1,7 +1,3 @@ -SRR9984183 -SRR13191702 ERR1160846 -SRR12848126 -SRR14593545 -SRR14709033 GSE214215 +SRR12848126 diff --git a/workflows/sra/tests/main.nf.test b/workflows/sra/tests/main.nf.test index c234e98f..ef5b7c9d 100644 --- a/workflows/sra/tests/main.nf.test +++ b/workflows/sra/tests/main.nf.test @@ -18,7 +18,7 @@ nextflow_workflow { when { workflow { """ - input[0] = Channel.from('ERR1160846', 'GSE214215', 'SRR12848126', 'SRR13191702', 'SRR14593545', 'SRR14709033', 'SRR9984183') + input[0] = Channel.from('ERR1160846', 'GSE214215', 'SRR12848126') """ } params { diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test b/workflows/sra/tests/sra_force_sratools_download.nf.test index e2d4f54f..df751a6b 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test @@ -18,7 +18,7 @@ nextflow_workflow { when { workflow { """ - input[0] = Channel.from('ERR1160846', 'GSE214215', 'SRR12848126', 'SRR13191702', 'SRR14593545', 'SRR14709033', 'SRR9984183') + input[0] = Channel.from('ERR1160846', 'GSE214215', 'SRR12848126') """ } params { diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test index 0e2fcac3..f4837f76 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test @@ -18,7 +18,7 @@ nextflow_workflow { when { workflow { """ - input[0] = Channel.from('ERR1160846', 'GSE214215', 'SRR12848126', 'SRR13191702', 'SRR14593545', 'SRR14709033', 'SRR9984183') + input[0] = Channel.from('ERR1160846', 'GSE214215', 'SRR12848126') """ } params { diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test index 5f8d37a2..871207ab 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test @@ -18,7 +18,7 @@ nextflow_workflow { when { workflow { """ - input[0] = Channel.from('ERR1160846', 'GSE214215', 'SRR12848126', 'SRR13191702', 'SRR14593545', 'SRR14709033', 'SRR9984183') + input[0] = Channel.from('ERR1160846', 'GSE214215', 'SRR12848126') """ } params { diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test index 95bbe2c8..995301dd 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test @@ -18,7 +18,7 @@ nextflow_workflow { when { workflow { """ - input[0] = Channel.from('ERR1160846', 'GSE214215', 'SRR12848126', 'SRR13191702', 'SRR14593545', 'SRR14709033', 'SRR9984183') + input[0] = Channel.from('ERR1160846', 'GSE214215', 'SRR12848126') """ } params { diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test index 21c78ae7..4bf6a3f0 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test @@ -18,7 +18,7 @@ nextflow_workflow { when { workflow { """ - input[0] = Channel.from('ERR1160846', 'GSE214215', 'SRR12848126', 'SRR13191702', 'SRR14593545', 'SRR14709033', 'SRR9984183') + input[0] = Channel.from('ERR1160846', 'GSE214215', 'SRR12848126') """ } params { diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test b/workflows/sra/tests/sra_skip_fastq_download.nf.test index bcc4b697..705facbb 100644 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test @@ -18,7 +18,7 @@ nextflow_workflow { when { workflow { """ - input[0] = Channel.from('ERR1160846', 'GSE214215', 'SRR12848126', 'SRR13191702', 'SRR14593545', 'SRR14709033', 'SRR9984183') + input[0] = Channel.from('ERR1160846', 'GSE214215', 'SRR12848126') """ } params { From b9a8609be309ce629073775baaf92a9de02457c5 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Wed, 18 Oct 2023 10:33:13 +0200 Subject: [PATCH 577/852] diff file --- .../fasterqdump/sratools-fasterqdump.diff | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 modules/nf-core/sratools/fasterqdump/sratools-fasterqdump.diff diff --git a/modules/nf-core/sratools/fasterqdump/sratools-fasterqdump.diff b/modules/nf-core/sratools/fasterqdump/sratools-fasterqdump.diff new file mode 100644 index 00000000..5275d3e4 --- /dev/null +++ b/modules/nf-core/sratools/fasterqdump/sratools-fasterqdump.diff @@ -0,0 +1,36 @@ +Changes in module 'nf-core/sratools/fasterqdump' +--- /dev/null ++++ modules/nf-core/sratools/fasterqdump/nextflow.config +@@ -0,0 +1,10 @@ ++process { ++ withName: SRATOOLS_FASTERQDUMP { ++ ext.args = '--split-files --include-technical' ++ publishDir = [ ++ path: { "${params.outdir}/fastq" }, ++ mode: params.publish_dir_mode, ++ pattern: "*.fastq.gz" ++ ] ++ } ++} +--- modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap ++++ modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap +@@ -8,7 +8,7 @@ + "id": "test_single_end", + "single_end": true + }, +- "test_single_end.fastq.gz:md5,1054c7b71884acdb5eed8a378f18be82" ++ "test_single_end_1.fastq.gz:md5,1054c7b71884acdb5eed8a378f18be82" + ] + ], + "1": [ +@@ -20,7 +20,7 @@ + "id": "test_single_end", + "single_end": true + }, +- "test_single_end.fastq.gz:md5,1054c7b71884acdb5eed8a378f18be82" ++ "test_single_end_1.fastq.gz:md5,1054c7b71884acdb5eed8a378f18be82" + ] + ], + "versions": [ + +************************************************************ From 0d5f1d00097695baaae733f9930532b7374a52a0 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Wed, 18 Oct 2023 10:33:27 +0200 Subject: [PATCH 578/852] one last test --- workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test index 62bb1999..62cabb7b 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test @@ -18,7 +18,7 @@ nextflow_workflow { when { workflow { """ - input[0] = Channel.from('ERR1160846', 'GSE214215', 'SRR12848126', 'SRR13191702', 'SRR14593545', 'SRR14709033', 'SRR9984183') + input[0] = Channel.from('ERR1160846', 'GSE214215', 'SRR12848126') """ } params { From b885d5252b5f0b30bde28615d58c82e666fbf2db Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Wed, 18 Oct 2023 11:35:25 +0200 Subject: [PATCH 579/852] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9fbb2013..8a9459c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,7 +24,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements ### Enhancements & fixes -- [PR #XXX](https://github.com/nf-core/fetchngs/pull/XXX) - Use nf-test for all pipeline testing +- [PR #188](https://github.com/nf-core/fetchngs/pull/188) - Use nf-test for all pipeline testing ### Enhancements & fixes From 79487642f2ecd8ef058f1104e59af9f184971960 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Wed, 18 Oct 2023 11:36:56 +0200 Subject: [PATCH 580/852] Prepare 1.11.0 RC --- CHANGELOG.md | 2 +- assets/multiqc_config.yml | 4 ++-- nextflow.config | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c500efcc..4247dde3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unpublished Version / DEV] +## [[1.11.0](https://github.com/nf-core/fetchngs/releases/tag/1.11.0)] - 2023-10-18 ### Enhancements & fixes diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index a8974f98..21e8296b 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -1,7 +1,7 @@ report_comment: > - This report has been generated by the
nf-core/fetchngs + This report has been generated by the nf-core/fetchngs analysis pipeline. For information about how to interpret these results, please see the - documentation. + documentation. report_section_order: "nf-core-fetchngs-methods-description": order: -1000 diff --git a/nextflow.config b/nextflow.config index 912ce43c..c7d78f99 100644 --- a/nextflow.config +++ b/nextflow.config @@ -220,7 +220,7 @@ manifest { description = """Pipeline to fetch metadata and raw FastQ files from public databases""" mainScript = 'main.nf' nextflowVersion = '!>=23.04.0' - version = '1.11.0dev' + version = '1.11.0' doi = 'https://doi.org/10.5281/zenodo.5070524' } From 833ad7eb79a67801d536c767f6c6272cc7fd566f Mon Sep 17 00:00:00 2001 From: Adam Talbot Date: Wed, 18 Oct 2023 09:51:04 +0000 Subject: [PATCH 581/852] qwqUpdate snaps --- workflows/sra/tests/main.nf.test.snap | 14 +++++++------- .../sra_custom_ena_metadata_fields.nf.test.snap | 14 +++++++------- .../tests/sra_force_sratools_download.nf.test.snap | 14 +++++++------- .../sra_nf_core_pipeline_atacseq.nf.test.snap | 14 +++++++------- .../tests/sra_nf_core_pipeline_rnaseq.nf.test.snap | 14 +++++++------- .../sra_nf_core_pipeline_taxprofiler.nf.test.snap | 14 +++++++------- .../sra_nf_core_pipeline_viralrecon.nf.test.snap | 14 +++++++------- .../sra/tests/sra_skip_fastq_download.nf.test.snap | 14 +++++++------- 8 files changed, 56 insertions(+), 56 deletions(-) diff --git a/workflows/sra/tests/main.nf.test.snap b/workflows/sra/tests/main.nf.test.snap index 4ba15917..885b7d6a 100644 --- a/workflows/sra/tests/main.nf.test.snap +++ b/workflows/sra/tests/main.nf.test.snap @@ -6,14 +6,14 @@ ], "1": [ - "samplesheet.csv:md5,5926f40ded37e0e6ce0b290c445772ac" + "samplesheet.csv:md5,eda595eca3cb5ed450641565c38390c2" ], "2": [ - "id_mappings.csv:md5,57116724ccf0215795b44d4458e6861f" + "id_mappings.csv:md5,3e70c965568c59f8c8fbb8e99e7a8b79" ], "3": [ [ - "multiqc_config.yml:md5,77050a65c8ad23e5b052b576bff1eeff", + "multiqc_config.yml:md5,6d4c3e5137704358474330207f5f2b5c", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], @@ -29,16 +29,16 @@ ], "mappings": [ - "id_mappings.csv:md5,57116724ccf0215795b44d4458e6861f" + "id_mappings.csv:md5,3e70c965568c59f8c8fbb8e99e7a8b79" ], "sample_mappings": [ [ - "multiqc_config.yml:md5,77050a65c8ad23e5b052b576bff1eeff", + "multiqc_config.yml:md5,6d4c3e5137704358474330207f5f2b5c", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], "samplesheet": [ - "samplesheet.csv:md5,5926f40ded37e0e6ce0b290c445772ac" + "samplesheet.csv:md5,eda595eca3cb5ed450641565c38390c2" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", @@ -50,6 +50,6 @@ ] } ], - "timestamp": "2023-10-13T13:45:55.621951" + "timestamp": "2023-10-18T09:49:19.020482551" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap index 5e98f3b1..45e007d0 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap @@ -6,14 +6,14 @@ ], "1": [ - "samplesheet.csv:md5,4ea86d2a38bf25d025331afd1925a138" + "samplesheet.csv:md5,a9e9da506288c364af14d46b86dafeb1" ], "2": [ - "id_mappings.csv:md5,e581a9117ed2cc8e98e65c25fe7f34aa" + "id_mappings.csv:md5,8ed2bd72d432eff4a8ed7d909af6f60c" ], "3": [ [ - "multiqc_config.yml:md5,0f18d574c7ddfa08cf444a593cb91cde", + "multiqc_config.yml:md5,3bc981f0de28023083cdf13691d249d5", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], @@ -29,16 +29,16 @@ ], "mappings": [ - "id_mappings.csv:md5,e581a9117ed2cc8e98e65c25fe7f34aa" + "id_mappings.csv:md5,8ed2bd72d432eff4a8ed7d909af6f60c" ], "sample_mappings": [ [ - "multiqc_config.yml:md5,0f18d574c7ddfa08cf444a593cb91cde", + "multiqc_config.yml:md5,3bc981f0de28023083cdf13691d249d5", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], "samplesheet": [ - "samplesheet.csv:md5,4ea86d2a38bf25d025331afd1925a138" + "samplesheet.csv:md5,a9e9da506288c364af14d46b86dafeb1" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", @@ -50,6 +50,6 @@ ] } ], - "timestamp": "2023-10-13T13:41:56.570144" + "timestamp": "2023-10-18T09:36:57.154883885" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test.snap b/workflows/sra/tests/sra_force_sratools_download.nf.test.snap index 1c92c75d..f445296a 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test.snap +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test.snap @@ -6,14 +6,14 @@ ], "1": [ - "samplesheet.csv:md5,461dfaa7b95f84210840347ef8cc93c2" + "samplesheet.csv:md5,7e6a65057fe000f562132ae9e608e87b" ], "2": [ - "id_mappings.csv:md5,57116724ccf0215795b44d4458e6861f" + "id_mappings.csv:md5,3e70c965568c59f8c8fbb8e99e7a8b79" ], "3": [ [ - "multiqc_config.yml:md5,77050a65c8ad23e5b052b576bff1eeff", + "multiqc_config.yml:md5,6d4c3e5137704358474330207f5f2b5c", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], @@ -28,16 +28,16 @@ ], "mappings": [ - "id_mappings.csv:md5,57116724ccf0215795b44d4458e6861f" + "id_mappings.csv:md5,3e70c965568c59f8c8fbb8e99e7a8b79" ], "sample_mappings": [ [ - "multiqc_config.yml:md5,77050a65c8ad23e5b052b576bff1eeff", + "multiqc_config.yml:md5,6d4c3e5137704358474330207f5f2b5c", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], "samplesheet": [ - "samplesheet.csv:md5,461dfaa7b95f84210840347ef8cc93c2" + "samplesheet.csv:md5,7e6a65057fe000f562132ae9e608e87b" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", @@ -48,6 +48,6 @@ ] } ], - "timestamp": "2023-10-13T13:51:26.617172" + "timestamp": "2023-10-18T09:43:16.468494798" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap index cabe296e..3e9e7f31 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap @@ -6,14 +6,14 @@ ], "1": [ - "samplesheet.csv:md5,0deebc93328dcbb63762aa91d4fc9f35" + "samplesheet.csv:md5,35292d2bea78b087d75c3333f6319b6b" ], "2": [ - "id_mappings.csv:md5,57116724ccf0215795b44d4458e6861f" + "id_mappings.csv:md5,3e70c965568c59f8c8fbb8e99e7a8b79" ], "3": [ [ - "multiqc_config.yml:md5,77050a65c8ad23e5b052b576bff1eeff", + "multiqc_config.yml:md5,6d4c3e5137704358474330207f5f2b5c", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], @@ -29,16 +29,16 @@ ], "mappings": [ - "id_mappings.csv:md5,57116724ccf0215795b44d4458e6861f" + "id_mappings.csv:md5,3e70c965568c59f8c8fbb8e99e7a8b79" ], "sample_mappings": [ [ - "multiqc_config.yml:md5,77050a65c8ad23e5b052b576bff1eeff", + "multiqc_config.yml:md5,6d4c3e5137704358474330207f5f2b5c", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], "samplesheet": [ - "samplesheet.csv:md5,0deebc93328dcbb63762aa91d4fc9f35" + "samplesheet.csv:md5,35292d2bea78b087d75c3333f6319b6b" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", @@ -50,6 +50,6 @@ ] } ], - "timestamp": "2023-10-13T13:37:42.486986" + "timestamp": "2023-10-18T09:47:56.240260295" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap index 111fe537..8805d3ac 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap @@ -6,14 +6,14 @@ ], "1": [ - "samplesheet.csv:md5,e20d0858b2ff04a62d50274a2527b913" + "samplesheet.csv:md5,b7ac0ff84f5031daaa9405c736a37125" ], "2": [ - "id_mappings.csv:md5,57116724ccf0215795b44d4458e6861f" + "id_mappings.csv:md5,3e70c965568c59f8c8fbb8e99e7a8b79" ], "3": [ [ - "multiqc_config.yml:md5,77050a65c8ad23e5b052b576bff1eeff", + "multiqc_config.yml:md5,6d4c3e5137704358474330207f5f2b5c", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], @@ -29,16 +29,16 @@ ], "mappings": [ - "id_mappings.csv:md5,57116724ccf0215795b44d4458e6861f" + "id_mappings.csv:md5,3e70c965568c59f8c8fbb8e99e7a8b79" ], "sample_mappings": [ [ - "multiqc_config.yml:md5,77050a65c8ad23e5b052b576bff1eeff", + "multiqc_config.yml:md5,6d4c3e5137704358474330207f5f2b5c", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], "samplesheet": [ - "samplesheet.csv:md5,e20d0858b2ff04a62d50274a2527b913" + "samplesheet.csv:md5,b7ac0ff84f5031daaa9405c736a37125" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", @@ -50,6 +50,6 @@ ] } ], - "timestamp": "2023-10-13T13:43:56.980991" + "timestamp": "2023-10-18T09:40:15.590249346" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap index 14c38837..0853eef8 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap @@ -6,14 +6,14 @@ ], "1": [ - "samplesheet.csv:md5,c781b226b9aac812c1d38881145a74d6" + "samplesheet.csv:md5,296836917bbdf34bda106a313424fa95" ], "2": [ - "id_mappings.csv:md5,57116724ccf0215795b44d4458e6861f" + "id_mappings.csv:md5,3e70c965568c59f8c8fbb8e99e7a8b79" ], "3": [ [ - "multiqc_config.yml:md5,77050a65c8ad23e5b052b576bff1eeff", + "multiqc_config.yml:md5,6d4c3e5137704358474330207f5f2b5c", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], @@ -29,16 +29,16 @@ ], "mappings": [ - "id_mappings.csv:md5,57116724ccf0215795b44d4458e6861f" + "id_mappings.csv:md5,3e70c965568c59f8c8fbb8e99e7a8b79" ], "sample_mappings": [ [ - "multiqc_config.yml:md5,77050a65c8ad23e5b052b576bff1eeff", + "multiqc_config.yml:md5,6d4c3e5137704358474330207f5f2b5c", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], "samplesheet": [ - "samplesheet.csv:md5,c781b226b9aac812c1d38881145a74d6" + "samplesheet.csv:md5,296836917bbdf34bda106a313424fa95" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", @@ -50,6 +50,6 @@ ] } ], - "timestamp": "2023-10-13T13:39:55.31037" + "timestamp": "2023-10-18T09:49:51.04235046" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap index d26dd1cc..e364b3a9 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap @@ -6,14 +6,14 @@ ], "1": [ - "samplesheet.csv:md5,5926f40ded37e0e6ce0b290c445772ac" + "samplesheet.csv:md5,eda595eca3cb5ed450641565c38390c2" ], "2": [ - "id_mappings.csv:md5,57116724ccf0215795b44d4458e6861f" + "id_mappings.csv:md5,3e70c965568c59f8c8fbb8e99e7a8b79" ], "3": [ [ - "multiqc_config.yml:md5,77050a65c8ad23e5b052b576bff1eeff", + "multiqc_config.yml:md5,6d4c3e5137704358474330207f5f2b5c", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], @@ -29,16 +29,16 @@ ], "mappings": [ - "id_mappings.csv:md5,57116724ccf0215795b44d4458e6861f" + "id_mappings.csv:md5,3e70c965568c59f8c8fbb8e99e7a8b79" ], "sample_mappings": [ [ - "multiqc_config.yml:md5,77050a65c8ad23e5b052b576bff1eeff", + "multiqc_config.yml:md5,6d4c3e5137704358474330207f5f2b5c", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], "samplesheet": [ - "samplesheet.csv:md5,5926f40ded37e0e6ce0b290c445772ac" + "samplesheet.csv:md5,eda595eca3cb5ed450641565c38390c2" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", @@ -50,6 +50,6 @@ ] } ], - "timestamp": "2023-10-13T13:35:41.371352" + "timestamp": "2023-10-18T09:48:46.587502263" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap b/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap index f0bac51f..cdb0965c 100644 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap @@ -6,14 +6,14 @@ ], "1": [ - "samplesheet.csv:md5,23d39235ed39f69cb8333322de77ed26" + "samplesheet.csv:md5,0a9b99509bcc64ca245408b6bb634f15" ], "2": [ - "id_mappings.csv:md5,57116724ccf0215795b44d4458e6861f" + "id_mappings.csv:md5,3e70c965568c59f8c8fbb8e99e7a8b79" ], "3": [ [ - "multiqc_config.yml:md5,77050a65c8ad23e5b052b576bff1eeff", + "multiqc_config.yml:md5,6d4c3e5137704358474330207f5f2b5c", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], @@ -27,16 +27,16 @@ ], "mappings": [ - "id_mappings.csv:md5,57116724ccf0215795b44d4458e6861f" + "id_mappings.csv:md5,3e70c965568c59f8c8fbb8e99e7a8b79" ], "sample_mappings": [ [ - "multiqc_config.yml:md5,77050a65c8ad23e5b052b576bff1eeff", + "multiqc_config.yml:md5,6d4c3e5137704358474330207f5f2b5c", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], "samplesheet": [ - "samplesheet.csv:md5,23d39235ed39f69cb8333322de77ed26" + "samplesheet.csv:md5,0a9b99509bcc64ca245408b6bb634f15" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", @@ -46,6 +46,6 @@ ] } ], - "timestamp": "2023-10-13T13:46:11.136377" + "timestamp": "2023-10-18T09:50:04.300075498" } } \ No newline at end of file From 4d13a4470639a9ae6a84610f900f9d97e276ce03 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Wed, 18 Oct 2023 11:56:39 +0200 Subject: [PATCH 582/852] Update .github/workflows/ci.yml Co-authored-by: Maxime U Garcia --- .github/workflows/ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2268c794..53480a37 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,7 +10,6 @@ on: branches: - master - dev - - refactor env: NXF_ANSI_LOG: false From bf2ab3ad270476558c21ba459748f0d265b03f42 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 27 Oct 2023 11:24:09 +0200 Subject: [PATCH 583/852] remove duplicate tests --- workflows/sra/tests/main.nf.test | 5 ----- workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test | 5 ----- workflows/sra/tests/sra_force_sratools_download.nf.test | 5 ----- workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test | 5 ----- workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test | 5 ----- workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test | 5 ----- workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test | 5 ----- workflows/sra/tests/sra_skip_fastq_download.nf.test | 5 ----- 8 files changed, 40 deletions(-) diff --git a/workflows/sra/tests/main.nf.test b/workflows/sra/tests/main.nf.test index ef5b7c9d..c8dce3c7 100644 --- a/workflows/sra/tests/main.nf.test +++ b/workflows/sra/tests/main.nf.test @@ -6,11 +6,6 @@ nextflow_workflow { tag "workflows" tag "workflows_sra" tag "multiqc_mappings_config" - tag "sra_fastq_ftp" - tag "sra_ids_to_runinfo" - tag "sra_merge_samplesheet" - tag "sra_runinfo_to_ftp" - tag "sra_to_samplesheet" tag "sra_default_parameters" test("Parameters: default") { diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test index 62cabb7b..d4dd4141 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test @@ -6,11 +6,6 @@ nextflow_workflow { tag "workflows" tag "workflows_sra" tag "multiqc_mappings_config" - tag "sra_fastq_ftp" - tag "sra_ids_to_runinfo" - tag "sra_merge_samplesheet" - tag "sra_runinfo_to_ftp" - tag "sra_to_samplesheet" tag "sra_custom_ena_metadata_fields" test("Parameters: --nf_core_pipeline rnaseq --ena_metadata_fields ... --sample_mapping_fields ...") { diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test b/workflows/sra/tests/sra_force_sratools_download.nf.test index df751a6b..62adb9af 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test @@ -6,11 +6,6 @@ nextflow_workflow { tag "workflows" tag "workflows_sra" tag "multiqc_mappings_config" - tag "sra_fastq_ftp" - tag "sra_ids_to_runinfo" - tag "sra_merge_samplesheet" - tag "sra_runinfo_to_ftp" - tag "sra_to_samplesheet" tag "sra_force_sratools_download" test("Parameters: --force_sratools_download") { diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test index f4837f76..00f545b5 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test @@ -6,11 +6,6 @@ nextflow_workflow { tag "workflows" tag "workflows_sra" tag "multiqc_mappings_config" - tag "sra_fastq_ftp" - tag "sra_ids_to_runinfo" - tag "sra_merge_samplesheet" - tag "sra_runinfo_to_ftp" - tag "sra_to_samplesheet" tag "sra_nf_core_pipeline_atacseq" test("Parameters: --nf_core_pipeline atacseq") { diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test index 871207ab..62bd6380 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test @@ -6,11 +6,6 @@ nextflow_workflow { tag "workflows" tag "workflows_sra" tag "multiqc_mappings_config" - tag "sra_fastq_ftp" - tag "sra_ids_to_runinfo" - tag "sra_merge_samplesheet" - tag "sra_runinfo_to_ftp" - tag "sra_to_samplesheet" tag "sra_nf_core_pipeline_rnaseq" test("Parameters: --nf_core_pipeline rnaseq") { diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test index 995301dd..c5e2865f 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test @@ -6,11 +6,6 @@ nextflow_workflow { tag "workflows" tag "workflows_sra" tag "multiqc_mappings_config" - tag "sra_fastq_ftp" - tag "sra_ids_to_runinfo" - tag "sra_merge_samplesheet" - tag "sra_runinfo_to_ftp" - tag "sra_to_samplesheet" tag "sra_nf_core_pipeline_taxprofiler" test("Parameters: --nf_core_pipeline taxprofiler") { diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test index 4bf6a3f0..04485010 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test @@ -6,11 +6,6 @@ nextflow_workflow { tag "workflows" tag "workflows_sra" tag "multiqc_mappings_config" - tag "sra_fastq_ftp" - tag "sra_ids_to_runinfo" - tag "sra_merge_samplesheet" - tag "sra_runinfo_to_ftp" - tag "sra_to_samplesheet" tag "sra_nf_core_pipeline_viralrecon" test("Parameters: --nf_core_pipeline viralrecon") { diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test b/workflows/sra/tests/sra_skip_fastq_download.nf.test index 705facbb..dd846643 100644 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test @@ -6,11 +6,6 @@ nextflow_workflow { tag "workflows" tag "workflows_sra" tag "multiqc_mappings_config" - tag "sra_fastq_ftp" - tag "sra_ids_to_runinfo" - tag "sra_merge_samplesheet" - tag "sra_runinfo_to_ftp" - tag "sra_to_samplesheet" tag "sra_skip_fastq_download" test("Parameters: --skip_fastq_download") { From ef9f1e71b5b0b22f70d220b3d90ce529983dd8fa Mon Sep 17 00:00:00 2001 From: "Blaessle,Dr.,Alexander (GCBDS) BIP-DE-B" Date: Tue, 7 Nov 2023 11:55:35 +0100 Subject: [PATCH 584/852] Resolved bug when prefetching large studies Prefetching large studies resulted in error stated in issue https://github.com/nf-core/fetchngs/issues/236 Resolved this by handing over text file with filepaths instead of list of filepaths. Rewrote sra_merge_samplesheet accordingly. Tested with study with ~25k samples. --- modules/local/sra_merge_samplesheet/main.nf | 24 +++++++++++---------- workflows/sra/main.nf | 14 ++++++++++-- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/modules/local/sra_merge_samplesheet/main.nf b/modules/local/sra_merge_samplesheet/main.nf index 1c2ee7df..3c4a076d 100644 --- a/modules/local/sra_merge_samplesheet/main.nf +++ b/modules/local/sra_merge_samplesheet/main.nf @@ -6,9 +6,11 @@ process SRA_MERGE_SAMPLESHEET { 'nf-core/ubuntu:20.04' }" input: - path ('samplesheets/*') - path ('mappings/*') - + // path ('samplesheets/*') + // path ('mappings/*') + path 'samplesheets.txt' + path 'mappings.txt' + output: path "samplesheet.csv", emit: samplesheet path "id_mappings.csv", emit: mappings @@ -16,16 +18,16 @@ process SRA_MERGE_SAMPLESHEET { script: """ - head -n 1 `ls ./samplesheets/* | head -n 1` > samplesheet.csv - for fileid in `ls ./samplesheets/*`; do + head -n 1 `head -n 1 samplesheets.txt` > samplesheet.csv + while read fileid; do awk 'NR>1' \$fileid >> samplesheet.csv - done - - head -n 1 `ls ./mappings/* | head -n 1` > id_mappings.csv - for fileid in `ls ./mappings/*`; do + done < samplesheets.txt + + head -n 1 `head -n 1 mappings.txt` > id_mappings.csv + while read fileid; do awk 'NR>1' \$fileid >> id_mappings.csv - done - + done < mappings.txt + cat <<-END_VERSIONS > versions.yml "${task.process}": sed: \$(echo \$(sed --version 2>&1) | sed 's/^.*GNU sed) //; s/ .*\$//') diff --git a/workflows/sra/main.nf b/workflows/sra/main.nf index ddac096d..143e1f8f 100644 --- a/workflows/sra/main.nf +++ b/workflows/sra/main.nf @@ -118,14 +118,24 @@ workflow SRA { params.nf_core_rnaseq_strandedness ?: 'auto', params.sample_mapping_fields ) + + + // Combine all sample sheet/mapping paths into two files + ch_samplesheets=SRA_TO_SAMPLESHEET.out.samplesheet.map{it[1].toString()}.collectFile(name: 'samplesheets.txt', newLine: true) + ch_mappings=SRA_TO_SAMPLESHEET.out.mappings.map{it[1].toString()}.collectFile(name: 'mappings.txt', newLine: true) // // MODULE: Create a merged samplesheet across all samples for the pipeline // + // SRA_MERGE_SAMPLESHEET ( + // SRA_TO_SAMPLESHEET.out.samplesheet.collect{it[1]}, + // SRA_TO_SAMPLESHEET.out.mappings.collect{it[1]} + // ) SRA_MERGE_SAMPLESHEET ( - SRA_TO_SAMPLESHEET.out.samplesheet.collect{it[1]}, - SRA_TO_SAMPLESHEET.out.mappings.collect{it[1]} + ch_samplesheets, + ch_mappings ) + ch_versions = ch_versions.mix(SRA_MERGE_SAMPLESHEET.out.versions) // From 5651ab5d689eaaa8d3d5a34d45d74fddc591aaac Mon Sep 17 00:00:00 2001 From: "Blaessle,Dr.,Alexander (GCBDS) BIP-DE-B" Date: Tue, 7 Nov 2023 12:19:13 +0100 Subject: [PATCH 585/852] Removed whitespaces/old code --- modules/local/sra_merge_samplesheet/main.nf | 8 +++----- workflows/sra/main.nf | 7 ++----- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/modules/local/sra_merge_samplesheet/main.nf b/modules/local/sra_merge_samplesheet/main.nf index 3c4a076d..c5704d81 100644 --- a/modules/local/sra_merge_samplesheet/main.nf +++ b/modules/local/sra_merge_samplesheet/main.nf @@ -6,11 +6,9 @@ process SRA_MERGE_SAMPLESHEET { 'nf-core/ubuntu:20.04' }" input: - // path ('samplesheets/*') - // path ('mappings/*') path 'samplesheets.txt' path 'mappings.txt' - + output: path "samplesheet.csv", emit: samplesheet path "id_mappings.csv", emit: mappings @@ -22,12 +20,12 @@ process SRA_MERGE_SAMPLESHEET { while read fileid; do awk 'NR>1' \$fileid >> samplesheet.csv done < samplesheets.txt - + head -n 1 `head -n 1 mappings.txt` > id_mappings.csv while read fileid; do awk 'NR>1' \$fileid >> id_mappings.csv done < mappings.txt - + cat <<-END_VERSIONS > versions.yml "${task.process}": sed: \$(echo \$(sed --version 2>&1) | sed 's/^.*GNU sed) //; s/ .*\$//') diff --git a/workflows/sra/main.nf b/workflows/sra/main.nf index 143e1f8f..9605c217 100644 --- a/workflows/sra/main.nf +++ b/workflows/sra/main.nf @@ -118,7 +118,7 @@ workflow SRA { params.nf_core_rnaseq_strandedness ?: 'auto', params.sample_mapping_fields ) - + // Combine all sample sheet/mapping paths into two files ch_samplesheets=SRA_TO_SAMPLESHEET.out.samplesheet.map{it[1].toString()}.collectFile(name: 'samplesheets.txt', newLine: true) @@ -127,10 +127,7 @@ workflow SRA { // // MODULE: Create a merged samplesheet across all samples for the pipeline // - // SRA_MERGE_SAMPLESHEET ( - // SRA_TO_SAMPLESHEET.out.samplesheet.collect{it[1]}, - // SRA_TO_SAMPLESHEET.out.mappings.collect{it[1]} - // ) + SRA_MERGE_SAMPLESHEET ( ch_samplesheets, ch_mappings From 87c94c0d309e6c48d003f5f146313b23e9ad9237 Mon Sep 17 00:00:00 2001 From: "Blaessle,Dr.,Alexander (GCBDS) BIP-DE-B" Date: Mon, 13 Nov 2023 11:14:40 +0100 Subject: [PATCH 586/852] Substituted sra_merge_samplesheet module with collectFile statement --- modules/local/sra_merge_samplesheet/main.nf | 34 ------------------- .../sra_merge_samplesheet/nextflow.config | 9 ----- .../sra_merge_samplesheet/tests/main.nf.test | 32 ----------------- .../tests/main.nf.test.snap | 27 --------------- .../sra_merge_samplesheet/tests/tags.yml | 2 -- workflows/sra/main.nf | 22 +++--------- workflows/sra/nextflow.config | 1 - 7 files changed, 5 insertions(+), 122 deletions(-) delete mode 100644 modules/local/sra_merge_samplesheet/main.nf delete mode 100644 modules/local/sra_merge_samplesheet/nextflow.config delete mode 100644 modules/local/sra_merge_samplesheet/tests/main.nf.test delete mode 100644 modules/local/sra_merge_samplesheet/tests/main.nf.test.snap delete mode 100644 modules/local/sra_merge_samplesheet/tests/tags.yml diff --git a/modules/local/sra_merge_samplesheet/main.nf b/modules/local/sra_merge_samplesheet/main.nf deleted file mode 100644 index c5704d81..00000000 --- a/modules/local/sra_merge_samplesheet/main.nf +++ /dev/null @@ -1,34 +0,0 @@ -process SRA_MERGE_SAMPLESHEET { - - conda "conda-forge::sed=4.7" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/ubuntu:20.04' : - 'nf-core/ubuntu:20.04' }" - - input: - path 'samplesheets.txt' - path 'mappings.txt' - - output: - path "samplesheet.csv", emit: samplesheet - path "id_mappings.csv", emit: mappings - path "versions.yml" , emit: versions - - script: - """ - head -n 1 `head -n 1 samplesheets.txt` > samplesheet.csv - while read fileid; do - awk 'NR>1' \$fileid >> samplesheet.csv - done < samplesheets.txt - - head -n 1 `head -n 1 mappings.txt` > id_mappings.csv - while read fileid; do - awk 'NR>1' \$fileid >> id_mappings.csv - done < mappings.txt - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - sed: \$(echo \$(sed --version 2>&1) | sed 's/^.*GNU sed) //; s/ .*\$//') - END_VERSIONS - """ -} diff --git a/modules/local/sra_merge_samplesheet/nextflow.config b/modules/local/sra_merge_samplesheet/nextflow.config deleted file mode 100644 index f2926529..00000000 --- a/modules/local/sra_merge_samplesheet/nextflow.config +++ /dev/null @@ -1,9 +0,0 @@ -process { - withName: 'SRA_MERGE_SAMPLESHEET' { - publishDir = [ - path: { "${params.outdir}/samplesheet" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } -} \ No newline at end of file diff --git a/modules/local/sra_merge_samplesheet/tests/main.nf.test b/modules/local/sra_merge_samplesheet/tests/main.nf.test deleted file mode 100644 index b7c98622..00000000 --- a/modules/local/sra_merge_samplesheet/tests/main.nf.test +++ /dev/null @@ -1,32 +0,0 @@ -nextflow_process { - - name "Test process: SRA_MERGE_SAMPLESHEET" - script "../main.nf" - process "SRA_MERGE_SAMPLESHEET" - tag "modules" - tag "modules_local" - tag "sra_merge_samplesheet" - - test("Should run without failures") { - - when { - params { - outdir = "$outputDir" - } - - process { - """ - input[0] = params.test_data['modules_local']['sra_merge_samplesheet_samplesheets'].collect { file(it, checkIfExists: true) } - input[1] = params.test_data['modules_local']['sra_merge_samplesheet_mappings'].collect { file(it, checkIfExists: true) } - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } - ) - } - } -} diff --git a/modules/local/sra_merge_samplesheet/tests/main.nf.test.snap b/modules/local/sra_merge_samplesheet/tests/main.nf.test.snap deleted file mode 100644 index 203395ae..00000000 --- a/modules/local/sra_merge_samplesheet/tests/main.nf.test.snap +++ /dev/null @@ -1,27 +0,0 @@ -{ - "Should run without failures": { - "content": [ - { - "0": [ - "samplesheet.csv:md5,ef756557b0735becd2574c2a3f5840b2" - ], - "1": [ - "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253" - ], - "2": [ - "versions.yml:md5,410006679d5e496d8c55e58e78ca6b34" - ], - "mappings": [ - "id_mappings.csv:md5,07262807636ce4b50102308eabdcf253" - ], - "samplesheet": [ - "samplesheet.csv:md5,ef756557b0735becd2574c2a3f5840b2" - ], - "versions": [ - "versions.yml:md5,410006679d5e496d8c55e58e78ca6b34" - ] - } - ], - "timestamp": "2023-09-22T10:59:14.022116" - } -} \ No newline at end of file diff --git a/modules/local/sra_merge_samplesheet/tests/tags.yml b/modules/local/sra_merge_samplesheet/tests/tags.yml deleted file mode 100644 index a4292b70..00000000 --- a/modules/local/sra_merge_samplesheet/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -sra_merge_samplesheet: - - modules/local/sra_merge_samplesheet/** diff --git a/workflows/sra/main.nf b/workflows/sra/main.nf index 9605c217..16408496 100644 --- a/workflows/sra/main.nf +++ b/workflows/sra/main.nf @@ -7,7 +7,6 @@ include { MULTIQC_MAPPINGS_CONFIG } from '../../modules/local/multiqc_mappings_config' include { SRA_FASTQ_FTP } from '../../modules/local/sra_fastq_ftp' include { SRA_IDS_TO_RUNINFO } from '../../modules/local/sra_ids_to_runinfo' -include { SRA_MERGE_SAMPLESHEET } from '../../modules/local/sra_merge_samplesheet' include { SRA_RUNINFO_TO_FTP } from '../../modules/local/sra_runinfo_to_ftp' include { SRA_TO_SAMPLESHEET } from '../../modules/local/sra_to_samplesheet' @@ -121,19 +120,8 @@ workflow SRA { // Combine all sample sheet/mapping paths into two files - ch_samplesheets=SRA_TO_SAMPLESHEET.out.samplesheet.map{it[1].toString()}.collectFile(name: 'samplesheets.txt', newLine: true) - ch_mappings=SRA_TO_SAMPLESHEET.out.mappings.map{it[1].toString()}.collectFile(name: 'mappings.txt', newLine: true) - - // - // MODULE: Create a merged samplesheet across all samples for the pipeline - // - - SRA_MERGE_SAMPLESHEET ( - ch_samplesheets, - ch_mappings - ) - - ch_versions = ch_versions.mix(SRA_MERGE_SAMPLESHEET.out.versions) + ch_samplesheet=SRA_TO_SAMPLESHEET.out.samplesheet.map{it[1]}.collectFile(name:'samplesheets.csv', newLine: true, keepHeader: true, storeDir:params.outdir) + ch_mappings=SRA_TO_SAMPLESHEET.out.samplesheet.map{it[1]}.collectFile(name:'id_mappings.csv', newLine: true, keepHeader: true, storeDir:params.outdir) // // MODULE: Create a MutiQC config file with sample name mappings @@ -141,7 +129,7 @@ workflow SRA { ch_sample_mappings_yml = Channel.empty() if (params.sample_mapping_fields) { MULTIQC_MAPPINGS_CONFIG ( - SRA_MERGE_SAMPLESHEET.out.mappings + ch_mappings ) ch_versions = ch_versions.mix(MULTIQC_MAPPINGS_CONFIG.out.versions) ch_sample_mappings_yml = MULTIQC_MAPPINGS_CONFIG.out.yml @@ -149,8 +137,8 @@ workflow SRA { emit: fastq = fastq_files - samplesheet = SRA_MERGE_SAMPLESHEET.out.samplesheet - mappings = SRA_MERGE_SAMPLESHEET.out.mappings + samplesheet = ch_samplesheet + mappings = ch_mappings sample_mappings = ch_sample_mappings_yml versions = ch_versions.unique() } diff --git a/workflows/sra/nextflow.config b/workflows/sra/nextflow.config index 6b66fcd5..21b374c5 100644 --- a/workflows/sra/nextflow.config +++ b/workflows/sra/nextflow.config @@ -1,7 +1,6 @@ includeConfig "../../modules/local/multiqc_mappings_config/nextflow.config" includeConfig "../../modules/local/sra_fastq_ftp/nextflow.config" includeConfig "../../modules/local/sra_ids_to_runinfo/nextflow.config" -includeConfig "../../modules/local/sra_merge_samplesheet/nextflow.config" includeConfig "../../modules/local/sra_runinfo_to_ftp/nextflow.config" includeConfig "../../modules/local/sra_to_samplesheet/nextflow.config" includeConfig "../../modules/nf-core/sratools/prefetch/nextflow.config" From 69f5bb9ac59d4de276e0fcc3cde40033453cbef2 Mon Sep 17 00:00:00 2001 From: nicolae06 Date: Wed, 13 Dec 2023 23:00:08 +0200 Subject: [PATCH 587/852] merge fixed --- CHANGELOG.md | 15 ++- conf/modules.config | 171 ++++++++++++++++++++++++++++ modules/local/sra_fastq_ftp/main.nf | 28 ++--- 3 files changed, 199 insertions(+), 15 deletions(-) create mode 100644 conf/modules.config diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e484a7a..b99805c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [[1.11.0](https://github.com/nf-core/fetchngs/releases/tag/1.11.0)] - 2023-10-18 +## [Unpublished Version / DEV] ### Credits @@ -19,14 +20,26 @@ Special thanks to the following for their contributions to the release: - [Rob Syme](https://github.com/robsyme) - [Sateesh Peri](https://github.com/sateeshperi) - [Sebastian Schönherr](https://github.com/seppinho) +- [Sebastian Uhrig](https://github.com/suhrig) Thank you to everyone else that has contributed by reporting bugs, enhancements or in any other way, shape or form. ### Enhancements & fixes - [PR #188](https://github.com/nf-core/fetchngs/pull/188) - Use nf-test for all pipeline testing +- [#169](https://github.com/nf-core/fetchngs/issues/173) - download of big files time out and don't resume -### Enhancements & fixes +### Software dependencies + +| Dependency | Old version | New version | +| ---------- | ----------- | ----------- | +| `wget` | | 1.20.1 | + +> **NB:** Dependency has been **updated** if both old and new version information is present. +> +> **NB:** Dependency has been **added** if just the new version information is present. +> +> **NB:** Dependency has been **removed** if new version information isn't present. ## [[1.10.1](https://github.com/nf-core/fetchngs/releases/tag/1.10.1)] - 2023-10-08 diff --git a/conf/modules.config b/conf/modules.config new file mode 100644 index 00000000..1e8a4ca2 --- /dev/null +++ b/conf/modules.config @@ -0,0 +1,171 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Config file for defining DSL2 per module options and publishing paths +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Available keys to override module options: + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. +---------------------------------------------------------------------------------------- +*/ + +// +// Generic process options for all workflows +// +process { + + publishDir = [ + path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + + withName: CUSTOM_DUMPSOFTWAREVERSIONS { + publishDir = [ + path: { "${params.outdir}/pipeline_info" }, + mode: params.publish_dir_mode, + pattern: '*_versions.yml' + ] + } + +} + +// +// Process options for the SRA workflow +// +if (params.input_type == 'sra') { + + process { + + withName: SRA_IDS_TO_RUNINFO { + publishDir = [ + path: { "${params.outdir}/metadata" }, + enabled: false + ] + } + + withName: SRA_RUNINFO_TO_FTP { + publishDir = [ + path: { "${params.outdir}/metadata" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: SRA_FASTQ_FTP { + ext.args = '-t 5 -nv -c -T 60' + publishDir = [ + [ + path: { "${params.outdir}/fastq" }, + mode: params.publish_dir_mode, + pattern: "*.fastq.gz" + ], + [ + path: { "${params.outdir}/fastq/md5" }, + mode: params.publish_dir_mode, + pattern: "*.md5" + ] + ] + } + + withName: SRATOOLS_PREFETCH { + publishDir = [ + path: { "${params.outdir}/sra" }, + enabled: false + ] + } + + withName: SRATOOLS_FASTERQDUMP { + ext.args = '--split-files --include-technical' + publishDir = [ + path: { "${params.outdir}/fastq" }, + mode: params.publish_dir_mode, + pattern: "*.fastq.gz" + ] + } + + withName: SRA_TO_SAMPLESHEET { + publishDir = [ + path: { "${params.outdir}/samplesheet" }, + enabled: false + ] + } + + withName: SRA_MERGE_SAMPLESHEET { + publishDir = [ + path: { "${params.outdir}/samplesheet" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: MULTIQC_MAPPINGS_CONFIG { + publishDir = [ + path: { "${params.outdir}/samplesheet" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + } + +} + +// +// Process options for the Synapse workflow +// +if (params.input_type == 'synapse') { + + process { + + withName: SYNAPSE_LIST { + ext.args = '--long' + publishDir = [ + path: { "${params.outdir}/metadata" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: SYNAPSE_GET { + publishDir = [ + [ + path: { "${params.outdir}/fastq" }, + mode: params.publish_dir_mode, + pattern: "*.fastq.gz" + ], + [ + path: { "${params.outdir}/fastq/md5" }, + mode: params.publish_dir_mode, + pattern: "*.md5" + ] + ] + } + + withName: SYNAPSE_SHOW { + publishDir = [ + path: { "${params.outdir}/metadata" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: SYNAPSE_TO_SAMPLESHEET { + publishDir = [ + path: { "${params.outdir}/samplesheet" }, + enabled: false + ] + } + + withName: SYNAPSE_MERGE_SAMPLESHEET { + publishDir = [ + path: { "${params.outdir}/samplesheet" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + } + +} diff --git a/modules/local/sra_fastq_ftp/main.nf b/modules/local/sra_fastq_ftp/main.nf index 2b7769ff..e2274d46 100644 --- a/modules/local/sra_fastq_ftp/main.nf +++ b/modules/local/sra_fastq_ftp/main.nf @@ -4,10 +4,10 @@ process SRA_FASTQ_FTP { label 'process_low' label 'error_retry' - conda "bioconda::sra-tools=2.11.0" + conda "conda-forge::wget=1.20.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/sra-tools:2.11.0--pl5321ha49a11a_3' : - 'biocontainers/sra-tools:2.11.0--pl5321ha49a11a_3' }" + 'https://depot.galaxyproject.org/singularity/wget:1.20.1' : + 'biocontainers/wget:1.20.1' }" input: tuple val(meta), val(fastq) @@ -21,40 +21,40 @@ process SRA_FASTQ_FTP { def args = task.ext.args ?: '' if (meta.single_end) { """ - curl \\ + wget \\ $args \\ - -L ${fastq[0]} \\ - -o ${meta.id}.fastq.gz + -O ${meta.id}.fastq.gz \\ + ${fastq[0]} echo "${meta.md5_1} ${meta.id}.fastq.gz" > ${meta.id}.fastq.gz.md5 md5sum -c ${meta.id}.fastq.gz.md5 cat <<-END_VERSIONS > versions.yml "${task.process}": - curl: \$(echo \$(curl --version | head -n 1 | sed 's/^curl //; s/ .*\$//')) + wget: \$(echo \$(wget --version | head -n 1 | sed 's/^GNU Wget //; s/ .*\$//')) END_VERSIONS """ } else { """ - curl \\ + wget \\ $args \\ - -L ${fastq[0]} \\ - -o ${meta.id}_1.fastq.gz + -O ${meta.id}_1.fastq.gz \\ + ${fastq[0]} echo "${meta.md5_1} ${meta.id}_1.fastq.gz" > ${meta.id}_1.fastq.gz.md5 md5sum -c ${meta.id}_1.fastq.gz.md5 - curl \\ + wget \\ $args \\ - -L ${fastq[1]} \\ - -o ${meta.id}_2.fastq.gz + -O ${meta.id}_2.fastq.gz \\ + ${fastq[1]} echo "${meta.md5_2} ${meta.id}_2.fastq.gz" > ${meta.id}_2.fastq.gz.md5 md5sum -c ${meta.id}_2.fastq.gz.md5 cat <<-END_VERSIONS > versions.yml "${task.process}": - curl: \$(echo \$(curl --version | head -n 1 | sed 's/^curl //; s/ .*\$//')) + wget: \$(echo \$(wget --version | head -n 1 | sed 's/^GNU Wget //; s/ .*\$//')) END_VERSIONS """ } From 508b7109119ab21bfbaf21ec9fe097794383a009 Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Tue, 19 Dec 2023 10:56:52 +0100 Subject: [PATCH 588/852] Update CHANGELOG.md --- CHANGELOG.md | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b99805c9..73a22661 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,31 +3,19 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [[1.11.0](https://github.com/nf-core/fetchngs/releases/tag/1.11.0)] - 2023-10-18 ## [Unpublished Version / DEV] ### Credits Special thanks to the following for their contributions to the release: -- [Adam Talbot](https://github.com/adamrtalbot) -- [Edmund Miller](https://github.com/Emiller88) -- [Esha Joshi](https://github.com/ejseqera) -- [Harshil Patel](https://github.com/drpatelh) -- [Lukas Forer](https://github.com/lukfor) -- [James Fellows Yates](https://github.com/jfy133) -- [Maxime Garcia](https://github.com/maxulysse) -- [Rob Syme](https://github.com/robsyme) -- [Sateesh Peri](https://github.com/sateeshperi) -- [Sebastian Schönherr](https://github.com/seppinho) - [Sebastian Uhrig](https://github.com/suhrig) -Thank you to everyone else that has contributed by reporting bugs, enhancements or in any other way, shape or form. - ### Enhancements & fixes -- [PR #188](https://github.com/nf-core/fetchngs/pull/188) - Use nf-test for all pipeline testing -- [#169](https://github.com/nf-core/fetchngs/issues/173) - download of big files time out and don't resume +- [PR #241](https://github.com/nf-core/fetchngs/pull/241) - download of big files time out and don't resume + +## [[1.11.0](https://github.com/nf-core/fetchngs/releases/tag/1.11.0)] - 2023-10-18 ### Software dependencies @@ -41,6 +29,27 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements > > **NB:** Dependency has been **removed** if new version information isn't present. +### Credits + +Special thanks to the following for their contributions to the release: + +- [Adam Talbot](https://github.com/adamrtalbot) +- [Edmund Miller](https://github.com/Emiller88) +- [Esha Joshi](https://github.com/ejseqera) +- [Harshil Patel](https://github.com/drpatelh) +- [Lukas Forer](https://github.com/lukfor) +- [James Fellows Yates](https://github.com/jfy133) +- [Maxime Garcia](https://github.com/maxulysse) +- [Rob Syme](https://github.com/robsyme) +- [Sateesh Peri](https://github.com/sateeshperi) +- [Sebastian Schönherr](https://github.com/seppinho) + +Thank you to everyone else that has contributed by reporting bugs, enhancements or in any other way, shape or form. + +### Enhancements & fixes + +- [PR #188](https://github.com/nf-core/fetchngs/pull/188) - Use nf-test for all pipeline testing + ## [[1.10.1](https://github.com/nf-core/fetchngs/releases/tag/1.10.1)] - 2023-10-08 ### Credits From 14fe71de3be87cb50416ba97ae5c70ddeb1ddba8 Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Tue, 19 Dec 2023 10:57:19 +0100 Subject: [PATCH 589/852] Update CHANGELOG.md --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 73a22661..5f2a1de5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,8 +15,6 @@ Special thanks to the following for their contributions to the release: - [PR #241](https://github.com/nf-core/fetchngs/pull/241) - download of big files time out and don't resume -## [[1.11.0](https://github.com/nf-core/fetchngs/releases/tag/1.11.0)] - 2023-10-18 - ### Software dependencies | Dependency | Old version | New version | @@ -29,6 +27,8 @@ Special thanks to the following for their contributions to the release: > > **NB:** Dependency has been **removed** if new version information isn't present. +## [[1.11.0](https://github.com/nf-core/fetchngs/releases/tag/1.11.0)] - 2023-10-18 + ### Credits Special thanks to the following for their contributions to the release: From 4c40784196c0f380d45cdaa73d9a01a44d171acc Mon Sep 17 00:00:00 2001 From: nicolae06 Date: Tue, 19 Dec 2023 23:46:09 +0200 Subject: [PATCH 590/852] snapshot file updated --- .../sra_fastq_ftp/tests/main.nf.test.snap | 58 +++---------------- 1 file changed, 7 insertions(+), 51 deletions(-) diff --git a/modules/local/sra_fastq_ftp/tests/main.nf.test.snap b/modules/local/sra_fastq_ftp/tests/main.nf.test.snap index fb815455..a2d24d65 100644 --- a/modules/local/sra_fastq_ftp/tests/main.nf.test.snap +++ b/modules/local/sra_fastq_ftp/tests/main.nf.test.snap @@ -3,69 +3,25 @@ "content": [ { "0": [ - [ - { - "id": "SRX9626017_SRR13191702", - "single_end": false, - "md5_1": "89c5be920021a035084d8aeb74f32df7", - "md5_2": "56271be38a80db78ef3bdfc5d9909b98" - }, - [ - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" - ] - ] + ], "1": [ - [ - { - "id": "SRX9626017_SRR13191702", - "single_end": false, - "md5_1": "89c5be920021a035084d8aeb74f32df7", - "md5_2": "56271be38a80db78ef3bdfc5d9909b98" - }, - [ - "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", - "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" - ] - ] + ], "2": [ - "versions.yml:md5,6b9d69dea1c1305f74a65197ee871f1b" + ], "fastq": [ - [ - { - "id": "SRX9626017_SRR13191702", - "single_end": false, - "md5_1": "89c5be920021a035084d8aeb74f32df7", - "md5_2": "56271be38a80db78ef3bdfc5d9909b98" - }, - [ - "SRX9626017_SRR13191702_1.fastq.gz:md5,89c5be920021a035084d8aeb74f32df7", - "SRX9626017_SRR13191702_2.fastq.gz:md5,56271be38a80db78ef3bdfc5d9909b98" - ] - ] + ], "md5": [ - [ - { - "id": "SRX9626017_SRR13191702", - "single_end": false, - "md5_1": "89c5be920021a035084d8aeb74f32df7", - "md5_2": "56271be38a80db78ef3bdfc5d9909b98" - }, - [ - "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", - "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" - ] - ] + ], "versions": [ - "versions.yml:md5,6b9d69dea1c1305f74a65197ee871f1b" + ] } ], - "timestamp": "2023-09-22T10:58:46.998421" + "timestamp": "2023-12-19T21:44:01.92664" } } \ No newline at end of file From e192e49d8567c1a80f3705b94aa94a06297e157b Mon Sep 17 00:00:00 2001 From: nicolae06 Date: Wed, 20 Dec 2023 23:38:56 +0200 Subject: [PATCH 591/852] nextflow.config these arguments are not compatible with wget. --- modules/local/sra_fastq_ftp/nextflow.config | 2 +- .../sra_fastq_ftp/tests/main.nf.test.snap | 58 ++++++++++++++++--- 2 files changed, 52 insertions(+), 8 deletions(-) diff --git a/modules/local/sra_fastq_ftp/nextflow.config b/modules/local/sra_fastq_ftp/nextflow.config index 7b5ebf70..b73c3729 100644 --- a/modules/local/sra_fastq_ftp/nextflow.config +++ b/modules/local/sra_fastq_ftp/nextflow.config @@ -1,6 +1,6 @@ process { withName: 'SRA_FASTQ_FTP' { - ext.args = '--retry 5 --continue-at - --max-time 1200' + publishDir = [ [ path: { "${params.outdir}/fastq" }, diff --git a/modules/local/sra_fastq_ftp/tests/main.nf.test.snap b/modules/local/sra_fastq_ftp/tests/main.nf.test.snap index a2d24d65..531a5ec3 100644 --- a/modules/local/sra_fastq_ftp/tests/main.nf.test.snap +++ b/modules/local/sra_fastq_ftp/tests/main.nf.test.snap @@ -3,25 +3,69 @@ "content": [ { "0": [ - + [ + { + "id": "SRX9626017_SRR13191702", + "single_end": false, + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98" + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,baaaea61cba4294ec696fdfea1610848", + "SRX9626017_SRR13191702_2.fastq.gz:md5,8e43ad99049fabb6526a4b846da01c32" + ] + ] ], "1": [ - + [ + { + "id": "SRX9626017_SRR13191702", + "single_end": false, + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98" + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", + "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" + ] + ] ], "2": [ - + "versions.yml:md5,6b60ed6d5805271a1b97798e29c0635c" ], "fastq": [ - + [ + { + "id": "SRX9626017_SRR13191702", + "single_end": false, + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98" + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,baaaea61cba4294ec696fdfea1610848", + "SRX9626017_SRR13191702_2.fastq.gz:md5,8e43ad99049fabb6526a4b846da01c32" + ] + ] ], "md5": [ - + [ + { + "id": "SRX9626017_SRR13191702", + "single_end": false, + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98" + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", + "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" + ] + ] ], "versions": [ - + "versions.yml:md5,6b60ed6d5805271a1b97798e29c0635c" ] } ], - "timestamp": "2023-12-19T21:44:01.92664" + "timestamp": "2023-12-20T23:33:35.159073" } } \ No newline at end of file From ecd957b9858d37ad85d7dc05f5b43c18d8cc823b Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 4 Jan 2024 15:44:12 +0100 Subject: [PATCH 592/852] Update CHANGELOG.md --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f2a1de5..2bfacdc2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,11 +9,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 Special thanks to the following for their contributions to the release: +- [Alexandru Mizeranschi](https://github.com/nicolae06) - [Sebastian Uhrig](https://github.com/suhrig) +Thank you to everyone else that has contributed by reporting bugs, enhancements or in any other way, shape or form. + ### Enhancements & fixes -- [PR #241](https://github.com/nf-core/fetchngs/pull/241) - download of big files time out and don't resume +- [PR #241](https://github.com/nf-core/fetchngs/pull/241) - Download of big files time out and don't resume ([#169](https://github.com/nf-core/fetchngs/issues/169)) ### Software dependencies From b138070974849bd6524f063e50102f29c84a72b5 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 4 Jan 2024 15:45:25 +0100 Subject: [PATCH 593/852] Delete conf/modules.config --- conf/modules.config | 171 -------------------------------------------- 1 file changed, 171 deletions(-) delete mode 100644 conf/modules.config diff --git a/conf/modules.config b/conf/modules.config deleted file mode 100644 index 1e8a4ca2..00000000 --- a/conf/modules.config +++ /dev/null @@ -1,171 +0,0 @@ -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Config file for defining DSL2 per module options and publishing paths -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Available keys to override module options: - ext.args = Additional arguments appended to command in module. - ext.args2 = Second set of arguments appended to command in module (multi-tool modules). - ext.args3 = Third set of arguments appended to command in module (multi-tool modules). - ext.prefix = File name prefix for output files. ----------------------------------------------------------------------------------------- -*/ - -// -// Generic process options for all workflows -// -process { - - publishDir = [ - path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - - withName: CUSTOM_DUMPSOFTWAREVERSIONS { - publishDir = [ - path: { "${params.outdir}/pipeline_info" }, - mode: params.publish_dir_mode, - pattern: '*_versions.yml' - ] - } - -} - -// -// Process options for the SRA workflow -// -if (params.input_type == 'sra') { - - process { - - withName: SRA_IDS_TO_RUNINFO { - publishDir = [ - path: { "${params.outdir}/metadata" }, - enabled: false - ] - } - - withName: SRA_RUNINFO_TO_FTP { - publishDir = [ - path: { "${params.outdir}/metadata" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: SRA_FASTQ_FTP { - ext.args = '-t 5 -nv -c -T 60' - publishDir = [ - [ - path: { "${params.outdir}/fastq" }, - mode: params.publish_dir_mode, - pattern: "*.fastq.gz" - ], - [ - path: { "${params.outdir}/fastq/md5" }, - mode: params.publish_dir_mode, - pattern: "*.md5" - ] - ] - } - - withName: SRATOOLS_PREFETCH { - publishDir = [ - path: { "${params.outdir}/sra" }, - enabled: false - ] - } - - withName: SRATOOLS_FASTERQDUMP { - ext.args = '--split-files --include-technical' - publishDir = [ - path: { "${params.outdir}/fastq" }, - mode: params.publish_dir_mode, - pattern: "*.fastq.gz" - ] - } - - withName: SRA_TO_SAMPLESHEET { - publishDir = [ - path: { "${params.outdir}/samplesheet" }, - enabled: false - ] - } - - withName: SRA_MERGE_SAMPLESHEET { - publishDir = [ - path: { "${params.outdir}/samplesheet" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: MULTIQC_MAPPINGS_CONFIG { - publishDir = [ - path: { "${params.outdir}/samplesheet" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - } - -} - -// -// Process options for the Synapse workflow -// -if (params.input_type == 'synapse') { - - process { - - withName: SYNAPSE_LIST { - ext.args = '--long' - publishDir = [ - path: { "${params.outdir}/metadata" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: SYNAPSE_GET { - publishDir = [ - [ - path: { "${params.outdir}/fastq" }, - mode: params.publish_dir_mode, - pattern: "*.fastq.gz" - ], - [ - path: { "${params.outdir}/fastq/md5" }, - mode: params.publish_dir_mode, - pattern: "*.md5" - ] - ] - } - - withName: SYNAPSE_SHOW { - publishDir = [ - path: { "${params.outdir}/metadata" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: SYNAPSE_TO_SAMPLESHEET { - publishDir = [ - path: { "${params.outdir}/samplesheet" }, - enabled: false - ] - } - - withName: SYNAPSE_MERGE_SAMPLESHEET { - publishDir = [ - path: { "${params.outdir}/samplesheet" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - } - -} From 9c3a086597af22e2008c06a79517d607257c588e Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 4 Jan 2024 15:48:03 +0100 Subject: [PATCH 594/852] Update nextflow.config --- modules/local/sra_fastq_ftp/nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/sra_fastq_ftp/nextflow.config b/modules/local/sra_fastq_ftp/nextflow.config index b73c3729..56e43959 100644 --- a/modules/local/sra_fastq_ftp/nextflow.config +++ b/modules/local/sra_fastq_ftp/nextflow.config @@ -1,6 +1,6 @@ process { withName: 'SRA_FASTQ_FTP' { - + ext.args = '-t 5 -nv -c -T 60' publishDir = [ [ path: { "${params.outdir}/fastq" }, From 47a54919ed0690e41cb3716dd38029d3aab9186c Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 4 Jan 2024 18:02:22 +0000 Subject: [PATCH 595/852] Use double quotes for closure around projectDir --- conf/test.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/test.config b/conf/test.config index c09a571c..9bfd2adc 100644 --- a/conf/test.config +++ b/conf/test.config @@ -20,7 +20,7 @@ params { max_time = '6.h' // Input data - input = '${projectDir}/tests/sra_ids_test.csv' + input = "${projectDir}/tests/sra_ids_test.csv" validationSchemaIgnoreParams = 'test_data_base,merge_samplesheet_ids,fastq_ftp_ids,test_data' } From 7afee7689ab0a75a8554b0a298d368b7e70419bc Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 4 Jan 2024 18:02:40 +0000 Subject: [PATCH 596/852] Remove test data for sra_merge_samplesheet process --- conf/test_data.config | 30 ++++++++---------------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/conf/test_data.config b/conf/test_data.config index 670115a8..167dff83 100644 --- a/conf/test_data.config +++ b/conf/test_data.config @@ -2,19 +2,7 @@ params { // Base directory for test data test_data_base = "https://raw.githubusercontent.com/nf-core/test-datasets/fetchngs" - merge_samplesheet_ids = [ "DRX024467_DRR026872", "SRX11047067_SRR14709033", "SRX9504942_SRR13055517", "DRX026011_DRR028935", "SRX17709227_SRR21711856", "SRX9504942_SRR13055518", "ERX1188904_ERR1109373", "SRX17709228_SRR21711855", "SRX9504942_SRR13055519", "ERX1234253_ERR1160846", "SRX6725035_SRR9984183", "SRX9504942_SRR13055520", "SRX10940790_SRR14593545", "SRX9315476_SRR12848126", "SRX9626017_SRR13191702" ] - - def merge_samplesheet_url = "${params.test_data_base}/modules/local/sra_merge_samplesheet/samplesheets/" - def merge_mappings_url = "${params.test_data_base}/modules/local/sra_merge_samplesheet/mappings/" - def merge_samplesheet_urls = [] - def merge_mappings_urls = [] - - merge_samplesheet_ids.each { id -> - merge_samplesheet_urls += "${merge_samplesheet_url}${id}.samplesheet.csv" - merge_mappings_urls += "${merge_mappings_url}/${id}.mappings.csv" - } - - fastq_ftp_ids = ["SRR13191702"] + fastq_ftp_ids = ["SRR13191702"] def fastq_ftp_url = "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/" def fastq_ftp_urls = [] @@ -26,22 +14,20 @@ params { test_data { 'sarscov2'{ 'illumina' { - SRR11140744_tar_gz = "${params.test_data_base}/data/genomics/sarscov2/illumina/sra/SRR11140744.tar.gz" - SRR13255544_tar_gz = "${params.test_data_base}/data/genomics/sarscov2/illumina/sra/SRR13255544.tar.gz" + SRR11140744_tar_gz = "${params.test_data_base}/data/genomics/sarscov2/illumina/sra/SRR11140744.tar.gz" + SRR13255544_tar_gz = "${params.test_data_base}/data/genomics/sarscov2/illumina/sra/SRR13255544.tar.gz" } } 'generic' { 'config' { - ncbi_user_settings = "${params.test_data_base}/data/generic/config/ncbi_user_settings.mkfg" + ncbi_user_settings = "${params.test_data_base}/data/generic/config/ncbi_user_settings.mkfg" } } 'modules_local' { - multiqc_mappings_config = "${params.test_data_base}/modules/local/multiqc_mappings_config/SRX9626017_SRR13191702.mappings.csv" - sra_merge_samplesheet_samplesheets = merge_samplesheet_urls - sra_merge_samplesheet_mappings = merge_mappings_urls - sra_to_samplesheet = "${params.test_data_base}/modules/local/sra_to_samplesheet/SRX9626017_SRR13191702.mappings.csv" - sra_fastq_ftp = fastq_ftp_urls - sra_runinfo_to_ftp = "${params.test_data_base}/modules/local/sra_runinfo_to_ftp/SRR13191702.runinfo.tsv" + multiqc_mappings_config = "${params.test_data_base}/modules/local/multiqc_mappings_config/SRX9626017_SRR13191702.mappings.csv" + sra_to_samplesheet = "${params.test_data_base}/modules/local/sra_to_samplesheet/SRX9626017_SRR13191702.mappings.csv" + sra_fastq_ftp = fastq_ftp_urls + sra_runinfo_to_ftp = "${params.test_data_base}/modules/local/sra_runinfo_to_ftp/SRR13191702.runinfo.tsv" } } } From 209a7a4cc81c99e98dc4cf13c5158653d2b962a7 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 4 Jan 2024 18:03:56 +0000 Subject: [PATCH 597/852] Fix bugs with samplesheet merging from PR #238 --- workflows/sra/main.nf | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/workflows/sra/main.nf b/workflows/sra/main.nf index 16408496..de2d4d5d 100644 --- a/workflows/sra/main.nf +++ b/workflows/sra/main.nf @@ -118,10 +118,24 @@ workflow SRA { params.sample_mapping_fields ) - - // Combine all sample sheet/mapping paths into two files - ch_samplesheet=SRA_TO_SAMPLESHEET.out.samplesheet.map{it[1]}.collectFile(name:'samplesheets.csv', newLine: true, keepHeader: true, storeDir:params.outdir) - ch_mappings=SRA_TO_SAMPLESHEET.out.samplesheet.map{it[1]}.collectFile(name:'id_mappings.csv', newLine: true, keepHeader: true, storeDir:params.outdir) + // Merge samplesheets and mapping files across all samples + SRA_TO_SAMPLESHEET + .out + .samplesheet + .map { it[1] } + .collectFile(name:'tmp_samplesheet.csv', newLine: true, keepHeader: true) + .map { it.text.tokenize('\n').join('\n') } + .collectFile(name:'samplesheet.csv', storeDir: "${params.outdir}/samplesheet") + .set { ch_samplesheet } + + SRA_TO_SAMPLESHEET + .out + .mappings + .map { it[1] } + .collectFile(name:'tmp_id_mappings.csv', newLine: true, keepHeader: true) + .map { it.text.tokenize('\n').join('\n') } + .collectFile(name:'id_mappings.csv', storeDir: "${params.outdir}/samplesheet") + .set { ch_mappings } // // MODULE: Create a MutiQC config file with sample name mappings From ec8585c7256c41db61b52f20f7fbb89136c2222e Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 4 Jan 2024 18:07:13 +0000 Subject: [PATCH 598/852] Update CHANGELOG --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2bfacdc2..8ade0c4c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,13 +10,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 Special thanks to the following for their contributions to the release: - [Alexandru Mizeranschi](https://github.com/nicolae06) +- [Alexander Blaessle](https://github.com/alexblaessle) - [Sebastian Uhrig](https://github.com/suhrig) Thank you to everyone else that has contributed by reporting bugs, enhancements or in any other way, shape or form. ### Enhancements & fixes +- [PR #238](https://github.com/nf-core/fetchngs/pull/238) - Resolved bug when prefetching large studies ([#236](https://github.com/nf-core/fetchngs/issues/236)) - [PR #241](https://github.com/nf-core/fetchngs/pull/241) - Download of big files time out and don't resume ([#169](https://github.com/nf-core/fetchngs/issues/169)) +- [PR #243](https://github.com/nf-core/fetchngs/pull/243) - Fixes for [PR #238](https://github.com/nf-core/fetchngs/pull/238) ### Software dependencies From da88dc6a32ef82098031ace5a8e01c056b8b5066 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 4 Jan 2024 18:10:23 +0000 Subject: [PATCH 599/852] Fix nf-core lint until template updates are merged in --- .nf-core.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.nf-core.yml b/.nf-core.yml index 0e89cae9..2a36eda4 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -17,3 +17,6 @@ lint: - .gitignore - assets/sendmail_template.txt - lib/NfcoreTemplate.groovy + - .github/CONTRIBUTING.md + - .github/PULL_REQUEST_TEMPLATE.md │ + - .github/workflows/linting.yml \ No newline at end of file From 05b993e8ca0388e5ad34030cb359e50830dc6d1c Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 4 Jan 2024 18:12:34 +0000 Subject: [PATCH 600/852] Fix prettier --- .nf-core.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.nf-core.yml b/.nf-core.yml index 2a36eda4..cc0541e3 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -19,4 +19,4 @@ lint: - lib/NfcoreTemplate.groovy - .github/CONTRIBUTING.md - .github/PULL_REQUEST_TEMPLATE.md │ - - .github/workflows/linting.yml \ No newline at end of file + - .github/workflows/linting.yml From 8fc57d909dcd185017d8920afe38a61b9321de19 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 4 Jan 2024 18:13:28 +0000 Subject: [PATCH 601/852] Fix prettier --- .nf-core.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.nf-core.yml b/.nf-core.yml index cc0541e3..47379ac6 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -18,5 +18,5 @@ lint: - assets/sendmail_template.txt - lib/NfcoreTemplate.groovy - .github/CONTRIBUTING.md - - .github/PULL_REQUEST_TEMPLATE.md │ + - .github/PULL_REQUEST_TEMPLATE.md - .github/workflows/linting.yml From fb07b32552c552147686799f2b6832aca886944e Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 4 Jan 2024 19:59:54 +0000 Subject: [PATCH 602/852] Fix nf-test for sra_skip_fastq_download --- bin/multiqc_mappings_config.py | 5 +++-- .../sra/tests/sra_skip_fastq_download.nf.test.snap | 12 +++++------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/bin/multiqc_mappings_config.py b/bin/multiqc_mappings_config.py index 2fcdb49a..5b60f2e0 100755 --- a/bin/multiqc_mappings_config.py +++ b/bin/multiqc_mappings_config.py @@ -7,6 +7,7 @@ config = "sample_names_rename_buttons:\n" config += "\n".join([" - " + x.strip('"') for x in header]) config += "sample_names_rename:\n" + rename = [] for line in fin: - config += f" - [{', '.join(line.strip().split(','))}]\n" - fout.write(config) + rename.append(f" - [{', '.join(line.strip().split(','))}]") + fout.write(config + '\n'.join(sorted(rename)) + '\n') diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap b/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap index cdb0965c..c7835acb 100644 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap @@ -6,10 +6,10 @@ ], "1": [ - "samplesheet.csv:md5,0a9b99509bcc64ca245408b6bb634f15" + "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], "2": [ - "id_mappings.csv:md5,3e70c965568c59f8c8fbb8e99e7a8b79" + "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" ], "3": [ [ @@ -20,14 +20,13 @@ "4": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd", "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" ], "fastq": [ ], "mappings": [ - "id_mappings.csv:md5,3e70c965568c59f8c8fbb8e99e7a8b79" + "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" ], "sample_mappings": [ [ @@ -36,16 +35,15 @@ ] ], "samplesheet": [ - "samplesheet.csv:md5,0a9b99509bcc64ca245408b6bb634f15" + "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd", "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" ] } ], - "timestamp": "2023-10-18T09:50:04.300075498" + "timestamp": "2024-01-04T19:59:06.257582" } } \ No newline at end of file From 7e5687a6b4e7c48fcc1e897cb5975bb79a390194 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 5 Jan 2024 10:23:24 +0000 Subject: [PATCH 603/852] Change workDir to .nf-test --- nf-test.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nf-test.config b/nf-test.config index cb656b94..0799cb40 100644 --- a/nf-test.config +++ b/nf-test.config @@ -3,7 +3,7 @@ config { testsDir "." // nf-test directory including temporary files for each test - workDir "/tmp" + workDir ".nf-test" // location of library folder that is added automatically to the classpath libDir "lib/" From 0193bce55205fb453be5d8a22edb878591e8c64d Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 5 Jan 2024 10:40:57 +0000 Subject: [PATCH 604/852] Fix Black lint --- bin/multiqc_mappings_config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/multiqc_mappings_config.py b/bin/multiqc_mappings_config.py index 5b60f2e0..3ffe35ec 100755 --- a/bin/multiqc_mappings_config.py +++ b/bin/multiqc_mappings_config.py @@ -10,4 +10,4 @@ rename = [] for line in fin: rename.append(f" - [{', '.join(line.strip().split(','))}]") - fout.write(config + '\n'.join(sorted(rename)) + '\n') + fout.write(config + "\n".join(sorted(rename)) + "\n") From c642adf8bf4d0701dd3ecd8a6bede8af0153d61f Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 5 Jan 2024 10:53:04 +0000 Subject: [PATCH 605/852] Update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2bfacdc2..7307bdd8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements ### Enhancements & fixes - [PR #241](https://github.com/nf-core/fetchngs/pull/241) - Download of big files time out and don't resume ([#169](https://github.com/nf-core/fetchngs/issues/169)) +- [PR #242](https://github.com/nf-core/fetchngs/pull/242) - Template update for nf-core/tools v2.11 ### Software dependencies From 06cfcc8ffd54a8207ec8ecdada29f4359ef48d33 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 5 Jan 2024 12:20:22 +0000 Subject: [PATCH 606/852] Update snapshots and remove dot from nf-test workDir --- nf-test.config | 2 +- workflows/sra/tests/main.nf.test.snap | 20 +++++++++---------- ...ra_custom_ena_metadata_fields.nf.test.snap | 20 +++++++++---------- .../sra_force_sratools_download.nf.test.snap | 12 +++++------ .../sra_nf_core_pipeline_atacseq.nf.test.snap | 20 +++++++++---------- .../sra_nf_core_pipeline_rnaseq.nf.test.snap | 20 +++++++++---------- ..._nf_core_pipeline_taxprofiler.nf.test.snap | 20 +++++++++---------- ...a_nf_core_pipeline_viralrecon.nf.test.snap | 20 +++++++++---------- 8 files changed, 60 insertions(+), 74 deletions(-) diff --git a/nf-test.config b/nf-test.config index 0799cb40..76aab204 100644 --- a/nf-test.config +++ b/nf-test.config @@ -3,7 +3,7 @@ config { testsDir "." // nf-test directory including temporary files for each test - workDir ".nf-test" + workDir "nf-test" // location of library folder that is added automatically to the classpath libDir "lib/" diff --git a/workflows/sra/tests/main.nf.test.snap b/workflows/sra/tests/main.nf.test.snap index 885b7d6a..ce70041b 100644 --- a/workflows/sra/tests/main.nf.test.snap +++ b/workflows/sra/tests/main.nf.test.snap @@ -6,10 +6,10 @@ ], "1": [ - "samplesheet.csv:md5,eda595eca3cb5ed450641565c38390c2" + "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], "2": [ - "id_mappings.csv:md5,3e70c965568c59f8c8fbb8e99e7a8b79" + "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" ], "3": [ [ @@ -20,16 +20,15 @@ "4": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,98a3ee9aa3bcc3b080247bccde481bbb", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", - "versions.yml:md5,e977678bd13a54fc9c31addf135be15e" + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" ], "fastq": [ ], "mappings": [ - "id_mappings.csv:md5,3e70c965568c59f8c8fbb8e99e7a8b79" + "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" ], "sample_mappings": [ [ @@ -38,18 +37,17 @@ ] ], "samplesheet": [ - "samplesheet.csv:md5,eda595eca3cb5ed450641565c38390c2" + "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,98a3ee9aa3bcc3b080247bccde481bbb", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", - "versions.yml:md5,e977678bd13a54fc9c31addf135be15e" + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" ] } ], - "timestamp": "2023-10-18T09:49:19.020482551" + "timestamp": "2024-01-05T11:53:53.509361" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap index 45e007d0..294a7951 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap @@ -6,10 +6,10 @@ ], "1": [ - "samplesheet.csv:md5,a9e9da506288c364af14d46b86dafeb1" + "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], "2": [ - "id_mappings.csv:md5,8ed2bd72d432eff4a8ed7d909af6f60c" + "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" ], "3": [ [ @@ -20,16 +20,15 @@ "4": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,98a3ee9aa3bcc3b080247bccde481bbb", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", - "versions.yml:md5,e977678bd13a54fc9c31addf135be15e" + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" ], "fastq": [ ], "mappings": [ - "id_mappings.csv:md5,8ed2bd72d432eff4a8ed7d909af6f60c" + "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" ], "sample_mappings": [ [ @@ -38,18 +37,17 @@ ] ], "samplesheet": [ - "samplesheet.csv:md5,a9e9da506288c364af14d46b86dafeb1" + "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,98a3ee9aa3bcc3b080247bccde481bbb", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", - "versions.yml:md5,e977678bd13a54fc9c31addf135be15e" + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" ] } ], - "timestamp": "2023-10-18T09:36:57.154883885" + "timestamp": "2024-01-05T12:00:54.018925" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test.snap b/workflows/sra/tests/sra_force_sratools_download.nf.test.snap index f445296a..b2df7434 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test.snap +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test.snap @@ -6,10 +6,10 @@ ], "1": [ - "samplesheet.csv:md5,7e6a65057fe000f562132ae9e608e87b" + "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], "2": [ - "id_mappings.csv:md5,3e70c965568c59f8c8fbb8e99e7a8b79" + "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" ], "3": [ [ @@ -21,14 +21,13 @@ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd", "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" ], "fastq": [ ], "mappings": [ - "id_mappings.csv:md5,3e70c965568c59f8c8fbb8e99e7a8b79" + "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" ], "sample_mappings": [ [ @@ -37,17 +36,16 @@ ] ], "samplesheet": [ - "samplesheet.csv:md5,7e6a65057fe000f562132ae9e608e87b" + "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd", "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" ] } ], - "timestamp": "2023-10-18T09:43:16.468494798" + "timestamp": "2024-01-05T11:57:59.429567" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap index 3e9e7f31..687d857d 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap @@ -6,10 +6,10 @@ ], "1": [ - "samplesheet.csv:md5,35292d2bea78b087d75c3333f6319b6b" + "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], "2": [ - "id_mappings.csv:md5,3e70c965568c59f8c8fbb8e99e7a8b79" + "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" ], "3": [ [ @@ -20,16 +20,15 @@ "4": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,98a3ee9aa3bcc3b080247bccde481bbb", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", - "versions.yml:md5,e977678bd13a54fc9c31addf135be15e" + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" ], "fastq": [ ], "mappings": [ - "id_mappings.csv:md5,3e70c965568c59f8c8fbb8e99e7a8b79" + "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" ], "sample_mappings": [ [ @@ -38,18 +37,17 @@ ] ], "samplesheet": [ - "samplesheet.csv:md5,35292d2bea78b087d75c3333f6319b6b" + "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,98a3ee9aa3bcc3b080247bccde481bbb", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", - "versions.yml:md5,e977678bd13a54fc9c31addf135be15e" + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" ] } ], - "timestamp": "2023-10-18T09:47:56.240260295" + "timestamp": "2024-01-05T12:11:46.580901" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap index 8805d3ac..fc41c497 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap @@ -6,10 +6,10 @@ ], "1": [ - "samplesheet.csv:md5,b7ac0ff84f5031daaa9405c736a37125" + "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], "2": [ - "id_mappings.csv:md5,3e70c965568c59f8c8fbb8e99e7a8b79" + "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" ], "3": [ [ @@ -20,16 +20,15 @@ "4": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,98a3ee9aa3bcc3b080247bccde481bbb", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", - "versions.yml:md5,e977678bd13a54fc9c31addf135be15e" + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" ], "fastq": [ ], "mappings": [ - "id_mappings.csv:md5,3e70c965568c59f8c8fbb8e99e7a8b79" + "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" ], "sample_mappings": [ [ @@ -38,18 +37,17 @@ ] ], "samplesheet": [ - "samplesheet.csv:md5,b7ac0ff84f5031daaa9405c736a37125" + "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,98a3ee9aa3bcc3b080247bccde481bbb", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", - "versions.yml:md5,e977678bd13a54fc9c31addf135be15e" + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" ] } ], - "timestamp": "2023-10-18T09:40:15.590249346" + "timestamp": "2024-01-05T12:14:34.129435" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap index 0853eef8..8a83465f 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap @@ -6,10 +6,10 @@ ], "1": [ - "samplesheet.csv:md5,296836917bbdf34bda106a313424fa95" + "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], "2": [ - "id_mappings.csv:md5,3e70c965568c59f8c8fbb8e99e7a8b79" + "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" ], "3": [ [ @@ -20,16 +20,15 @@ "4": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,98a3ee9aa3bcc3b080247bccde481bbb", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", - "versions.yml:md5,e977678bd13a54fc9c31addf135be15e" + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" ], "fastq": [ ], "mappings": [ - "id_mappings.csv:md5,3e70c965568c59f8c8fbb8e99e7a8b79" + "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" ], "sample_mappings": [ [ @@ -38,18 +37,17 @@ ] ], "samplesheet": [ - "samplesheet.csv:md5,296836917bbdf34bda106a313424fa95" + "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,98a3ee9aa3bcc3b080247bccde481bbb", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", - "versions.yml:md5,e977678bd13a54fc9c31addf135be15e" + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" ] } ], - "timestamp": "2023-10-18T09:49:51.04235046" + "timestamp": "2024-01-05T12:19:15.913569" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap index e364b3a9..1c946943 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap @@ -6,10 +6,10 @@ ], "1": [ - "samplesheet.csv:md5,eda595eca3cb5ed450641565c38390c2" + "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], "2": [ - "id_mappings.csv:md5,3e70c965568c59f8c8fbb8e99e7a8b79" + "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" ], "3": [ [ @@ -20,16 +20,15 @@ "4": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,98a3ee9aa3bcc3b080247bccde481bbb", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", - "versions.yml:md5,e977678bd13a54fc9c31addf135be15e" + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" ], "fastq": [ ], "mappings": [ - "id_mappings.csv:md5,3e70c965568c59f8c8fbb8e99e7a8b79" + "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" ], "sample_mappings": [ [ @@ -38,18 +37,17 @@ ] ], "samplesheet": [ - "samplesheet.csv:md5,eda595eca3cb5ed450641565c38390c2" + "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", + "versions.yml:md5,98a3ee9aa3bcc3b080247bccde481bbb", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,b21338b74b9a8fe0c7a114f7686c07cd", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47", - "versions.yml:md5,e977678bd13a54fc9c31addf135be15e" + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" ] } ], - "timestamp": "2023-10-18T09:48:46.587502263" + "timestamp": "2024-01-05T12:06:14.563473" } } \ No newline at end of file From 39f40e9e1a1f7c148f9823dff2b1a24c4167b1d2 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 5 Jan 2024 13:59:27 +0000 Subject: [PATCH 607/852] Update files ignored from lintint --- .nf-core.yml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index 0e89cae9..51a92309 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -2,18 +2,11 @@ repository_type: pipeline lint: actions_ci: false files_exist: - - .github/workflows/awsfulltest.yml - - .github/workflows/awstest.yml - - assets/multiqc_config.yml - - conf/igenomes.config - conf/modules.config - lib/NfcoreTemplate.groovy - lib/Utils.groovy - - lib/WorkflowFetchngs.groovy - lib/WorkflowMain.groovy - lib/nfcore_external_java_deps.jar files_unchanged: - - .gitattributes - .gitignore - assets/sendmail_template.txt - - lib/NfcoreTemplate.groovy From a4f7a4ac0333509b25ec7a8566b329c6f4db6eae Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 5 Jan 2024 13:59:44 +0000 Subject: [PATCH 608/852] Use double quotes for closure around projectDir --- conf/test.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/test.config b/conf/test.config index c09a571c..05b58689 100644 --- a/conf/test.config +++ b/conf/test.config @@ -20,7 +20,7 @@ params { max_time = '6.h' // Input data - input = '${projectDir}/tests/sra_ids_test.csv' + input = "${projectDir}/tests/sra_ids_test.csv" validationSchemaIgnoreParams = 'test_data_base,merge_samplesheet_ids,fastq_ftp_ids,test_data' } From 5fbe7f045823ed21ff020f759914279e40693a0b Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 5 Jan 2024 14:00:14 +0000 Subject: [PATCH 609/852] Bump pipeline version to 1.12.0dev --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 0f867a95..e81dac71 100644 --- a/nextflow.config +++ b/nextflow.config @@ -234,7 +234,7 @@ manifest { description = """Pipeline to fetch metadata and raw FastQ files from public databases""" mainScript = 'main.nf' nextflowVersion = '!>=23.04.0' - version = '1.11.0' + version = '1.12.0dev' doi = 'https://doi.org/10.5281/zenodo.5070524' } From 1544d3fc65c99e7e296fb0f71efd13bd97a5d1b4 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 5 Jan 2024 15:24:33 +0000 Subject: [PATCH 610/852] Use @adamrtalbot Docker runOptions fix to get nf-test running --- nf-test.config | 2 +- tests/nextflow.config | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 tests/nextflow.config diff --git a/nf-test.config b/nf-test.config index 76aab204..c880f88a 100644 --- a/nf-test.config +++ b/nf-test.config @@ -9,7 +9,7 @@ config { libDir "lib/" // location of an optional nextflow.config file specific for executing tests - configFile "nextflow.config" + configFile "tests/nextflow.config" // run all test with the defined docker profile from the main nextflow.config profile "" diff --git a/tests/nextflow.config b/tests/nextflow.config new file mode 100644 index 00000000..c9ea8473 --- /dev/null +++ b/tests/nextflow.config @@ -0,0 +1 @@ +docker.runOptions = '-u $(id -u):$(id -g) --platform=linux/amd64 -v $HOME:$HOME' \ No newline at end of file From e94ed03c49711ca425a93928b75c718954231a81 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 5 Jan 2024 16:16:53 +0000 Subject: [PATCH 611/852] Bump nf-test version to 0.8.2 in CI tests --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1a5fe7f7..5c06c5ce 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,7 +13,7 @@ on: env: NXF_ANSI_LOG: false - NFTEST_VER: "0.8.1" + NFTEST_VER: "0.8.2" concurrency: group: "${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}" From 0b738edc859864c59f49590e27d653b35e22e0d3 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 5 Jan 2024 16:27:20 +0000 Subject: [PATCH 612/852] Test adding docker.runOptions to pipeline nextflow.config --- nextflow.config | 2 +- nf-test.config | 2 +- tests/nextflow.config | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) delete mode 100644 tests/nextflow.config diff --git a/nextflow.config b/nextflow.config index 0f867a95..76ca8a36 100644 --- a/nextflow.config +++ b/nextflow.config @@ -114,7 +114,7 @@ profiles { shifter.enabled = false charliecloud.enabled = false apptainer.enabled = false - runOptions = '-u $(id -u):$(id -g)' + runOptions = '-u $(id -u):$(id -g) -v $HOME:$HOME' } arm { docker.runOptions = '-u $(id -u):$(id -g) --platform=linux/amd64' diff --git a/nf-test.config b/nf-test.config index c880f88a..76aab204 100644 --- a/nf-test.config +++ b/nf-test.config @@ -9,7 +9,7 @@ config { libDir "lib/" // location of an optional nextflow.config file specific for executing tests - configFile "tests/nextflow.config" + configFile "nextflow.config" // run all test with the defined docker profile from the main nextflow.config profile "" diff --git a/tests/nextflow.config b/tests/nextflow.config deleted file mode 100644 index c9ea8473..00000000 --- a/tests/nextflow.config +++ /dev/null @@ -1 +0,0 @@ -docker.runOptions = '-u $(id -u):$(id -g) --platform=linux/amd64 -v $HOME:$HOME' \ No newline at end of file From 0a89ccbe93b687de06cfca9dbaebdd2cb22607b9 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 5 Jan 2024 16:38:33 +0000 Subject: [PATCH 613/852] Idiot...add docker in front of runOptions --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 76ca8a36..c849b9b8 100644 --- a/nextflow.config +++ b/nextflow.config @@ -114,7 +114,7 @@ profiles { shifter.enabled = false charliecloud.enabled = false apptainer.enabled = false - runOptions = '-u $(id -u):$(id -g) -v $HOME:$HOME' + docker.runOptions = '-u $(id -u):$(id -g) -v $HOME:$HOME' } arm { docker.runOptions = '-u $(id -u):$(id -g) --platform=linux/amd64' From 1f70b27de019c14ec1581f5c243a8a5756cdc1a6 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 5 Jan 2024 17:10:22 +0000 Subject: [PATCH 614/852] Add sort logic to collectFile operator --- workflows/sra/main.nf | 4 ++-- workflows/sra/tests/sra_skip_fastq_download.nf.test | 2 +- .../sra/tests/sra_skip_fastq_download.nf.test.snap | 10 +++++----- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/workflows/sra/main.nf b/workflows/sra/main.nf index de2d4d5d..106041a4 100644 --- a/workflows/sra/main.nf +++ b/workflows/sra/main.nf @@ -123,7 +123,7 @@ workflow SRA { .out .samplesheet .map { it[1] } - .collectFile(name:'tmp_samplesheet.csv', newLine: true, keepHeader: true) + .collectFile(name:'tmp_samplesheet.csv', newLine: true, keepHeader: true, sort: { it.baseName }) .map { it.text.tokenize('\n').join('\n') } .collectFile(name:'samplesheet.csv', storeDir: "${params.outdir}/samplesheet") .set { ch_samplesheet } @@ -132,7 +132,7 @@ workflow SRA { .out .mappings .map { it[1] } - .collectFile(name:'tmp_id_mappings.csv', newLine: true, keepHeader: true) + .collectFile(name:'tmp_id_mappings.csv', newLine: true, keepHeader: true, sort: { it.baseName }) .map { it.text.tokenize('\n').join('\n') } .collectFile(name:'id_mappings.csv', storeDir: "${params.outdir}/samplesheet") .set { ch_mappings } diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test b/workflows/sra/tests/sra_skip_fastq_download.nf.test index dd846643..c9217606 100644 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test @@ -17,7 +17,7 @@ nextflow_workflow { """ } params { - outdir = "results" + outdir = "$outputDir" skip_fastq_download = true } } diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap b/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap index c7835acb..3631113e 100644 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap @@ -6,10 +6,10 @@ ], "1": [ - "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" + "samplesheet.csv:md5,eb18025bb1cb97a4fe399ca16757d2db" ], "2": [ - "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" + "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" ], "3": [ [ @@ -26,7 +26,7 @@ ], "mappings": [ - "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" + "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" ], "sample_mappings": [ [ @@ -35,7 +35,7 @@ ] ], "samplesheet": [ - "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" + "samplesheet.csv:md5,eb18025bb1cb97a4fe399ca16757d2db" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", @@ -44,6 +44,6 @@ ] } ], - "timestamp": "2024-01-04T19:59:06.257582" + "timestamp": "2024-01-05T17:08:15.42871" } } \ No newline at end of file From 12597f1796d0c594f1f2b530b1306ea486a7b024 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 5 Jan 2024 17:48:20 +0000 Subject: [PATCH 615/852] Update all workflow snapshots and use outputDir by default --- workflows/sra/tests/main.nf.test | 2 +- workflows/sra/tests/main.nf.test.snap | 10 +++++----- .../sra/tests/sra_custom_ena_metadata_fields.nf.test | 2 +- .../tests/sra_custom_ena_metadata_fields.nf.test.snap | 10 +++++----- .../sra/tests/sra_force_sratools_download.nf.test | 2 +- .../sra/tests/sra_force_sratools_download.nf.test.snap | 10 +++++----- .../sra/tests/sra_nf_core_pipeline_atacseq.nf.test | 2 +- .../tests/sra_nf_core_pipeline_atacseq.nf.test.snap | 10 +++++----- .../sra/tests/sra_nf_core_pipeline_rnaseq.nf.test | 2 +- .../sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap | 10 +++++----- .../sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test | 2 +- .../sra_nf_core_pipeline_taxprofiler.nf.test.snap | 10 +++++----- .../sra/tests/sra_nf_core_pipeline_viralrecon.nf.test | 2 +- .../tests/sra_nf_core_pipeline_viralrecon.nf.test.snap | 10 +++++----- 14 files changed, 42 insertions(+), 42 deletions(-) diff --git a/workflows/sra/tests/main.nf.test b/workflows/sra/tests/main.nf.test index c8dce3c7..072c2ebb 100644 --- a/workflows/sra/tests/main.nf.test +++ b/workflows/sra/tests/main.nf.test @@ -17,7 +17,7 @@ nextflow_workflow { """ } params { - outdir = "results" + outdir = "$outputDir" } } diff --git a/workflows/sra/tests/main.nf.test.snap b/workflows/sra/tests/main.nf.test.snap index ce70041b..ffdf20cc 100644 --- a/workflows/sra/tests/main.nf.test.snap +++ b/workflows/sra/tests/main.nf.test.snap @@ -6,10 +6,10 @@ ], "1": [ - "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" + "samplesheet.csv:md5,d252b222b8ef94670117780d43498b86" ], "2": [ - "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" + "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" ], "3": [ [ @@ -28,7 +28,7 @@ ], "mappings": [ - "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" + "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" ], "sample_mappings": [ [ @@ -37,7 +37,7 @@ ] ], "samplesheet": [ - "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" + "samplesheet.csv:md5,d252b222b8ef94670117780d43498b86" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", @@ -48,6 +48,6 @@ ] } ], - "timestamp": "2024-01-05T11:53:53.509361" + "timestamp": "2024-01-05T17:31:06.996066" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test index d4dd4141..262cedef 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test @@ -17,7 +17,7 @@ nextflow_workflow { """ } params { - outdir = "results" + outdir = "$outputDir" nf_core_pipeline = "rnaseq" ena_metadata_fields = "run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5" sample_mapping_fields = "run_accession,library_layout" diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap index 294a7951..56c0505c 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap @@ -6,10 +6,10 @@ ], "1": [ - "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" + "samplesheet.csv:md5,7cc8031f595157c6ac13ba5067e4bcfb" ], "2": [ - "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" + "id_mappings.csv:md5,7ee50def039a942e0ac8ca63292c8368" ], "3": [ [ @@ -28,7 +28,7 @@ ], "mappings": [ - "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" + "id_mappings.csv:md5,7ee50def039a942e0ac8ca63292c8368" ], "sample_mappings": [ [ @@ -37,7 +37,7 @@ ] ], "samplesheet": [ - "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" + "samplesheet.csv:md5,7cc8031f595157c6ac13ba5067e4bcfb" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", @@ -48,6 +48,6 @@ ] } ], - "timestamp": "2024-01-05T12:00:54.018925" + "timestamp": "2024-01-05T17:27:38.720872" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test b/workflows/sra/tests/sra_force_sratools_download.nf.test index 62adb9af..453ab328 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test @@ -17,7 +17,7 @@ nextflow_workflow { """ } params { - outdir = "results" + outdir = "$outputDir" force_sratools_download = true } } diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test.snap b/workflows/sra/tests/sra_force_sratools_download.nf.test.snap index b2df7434..895d79b1 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test.snap +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test.snap @@ -6,10 +6,10 @@ ], "1": [ - "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" + "samplesheet.csv:md5,0f2c0516990774b5d7d76a7ddf763f55" ], "2": [ - "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" + "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" ], "3": [ [ @@ -27,7 +27,7 @@ ], "mappings": [ - "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" + "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" ], "sample_mappings": [ [ @@ -36,7 +36,7 @@ ] ], "samplesheet": [ - "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" + "samplesheet.csv:md5,0f2c0516990774b5d7d76a7ddf763f55" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", @@ -46,6 +46,6 @@ ] } ], - "timestamp": "2024-01-05T11:57:59.429567" + "timestamp": "2024-01-05T17:19:30.088408" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test index 00f545b5..3bb70fe6 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test @@ -17,7 +17,7 @@ nextflow_workflow { """ } params { - outdir = "results" + outdir = "$outputDir" nf_core_pipeline = "atacseq" } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap index 687d857d..30de9de2 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap @@ -6,10 +6,10 @@ ], "1": [ - "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" + "samplesheet.csv:md5,8f985e9dd993b9c826ea095bd377d34a" ], "2": [ - "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" + "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" ], "3": [ [ @@ -28,7 +28,7 @@ ], "mappings": [ - "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" + "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" ], "sample_mappings": [ [ @@ -37,7 +37,7 @@ ] ], "samplesheet": [ - "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" + "samplesheet.csv:md5,8f985e9dd993b9c826ea095bd377d34a" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", @@ -48,6 +48,6 @@ ] } ], - "timestamp": "2024-01-05T12:11:46.580901" + "timestamp": "2024-01-05T17:42:19.033613" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test index 62bd6380..a64d4348 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test @@ -17,7 +17,7 @@ nextflow_workflow { """ } params { - outdir = "results" + outdir = "$outputDir" nf_core_pipeline = "rnaseq" } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap index fc41c497..97772a53 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap @@ -6,10 +6,10 @@ ], "1": [ - "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" + "samplesheet.csv:md5,c0f7d7b70e884c78f90630c695703d7b" ], "2": [ - "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" + "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" ], "3": [ [ @@ -28,7 +28,7 @@ ], "mappings": [ - "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" + "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" ], "sample_mappings": [ [ @@ -37,7 +37,7 @@ ] ], "samplesheet": [ - "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" + "samplesheet.csv:md5,c0f7d7b70e884c78f90630c695703d7b" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", @@ -48,6 +48,6 @@ ] } ], - "timestamp": "2024-01-05T12:14:34.129435" + "timestamp": "2024-01-05T17:45:04.403125" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test index c5e2865f..1befdba2 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test @@ -17,7 +17,7 @@ nextflow_workflow { """ } params { - outdir = "results" + outdir = "$outputDir" nf_core_pipeline = "taxprofiler" } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap index 8a83465f..1d882f8e 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap @@ -6,10 +6,10 @@ ], "1": [ - "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" + "samplesheet.csv:md5,fe3c7ba9e7b7debe07291d6125f9edc7" ], "2": [ - "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" + "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" ], "3": [ [ @@ -28,7 +28,7 @@ ], "mappings": [ - "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" + "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" ], "sample_mappings": [ [ @@ -37,7 +37,7 @@ ] ], "samplesheet": [ - "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" + "samplesheet.csv:md5,fe3c7ba9e7b7debe07291d6125f9edc7" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", @@ -48,6 +48,6 @@ ] } ], - "timestamp": "2024-01-05T12:19:15.913569" + "timestamp": "2024-01-05T17:47:55.191319" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test index 04485010..ba185097 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test @@ -17,7 +17,7 @@ nextflow_workflow { """ } params { - outdir = "results" + outdir = "$outputDir" nf_core_pipeline = "viralrecon" } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap index 1c946943..0b63f33d 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap @@ -6,10 +6,10 @@ ], "1": [ - "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" + "samplesheet.csv:md5,99a3fd9fe3c7cad8184b1bbeadd89c45" ], "2": [ - "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" + "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" ], "3": [ [ @@ -28,7 +28,7 @@ ], "mappings": [ - "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" + "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" ], "sample_mappings": [ [ @@ -37,7 +37,7 @@ ] ], "samplesheet": [ - "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" + "samplesheet.csv:md5,99a3fd9fe3c7cad8184b1bbeadd89c45" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", @@ -48,6 +48,6 @@ ] } ], - "timestamp": "2024-01-05T12:06:14.563473" + "timestamp": "2024-01-05T17:35:26.463757" } } \ No newline at end of file From dd67624668b3ec89da299664e019235d554c208b Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 5 Jan 2024 18:07:18 +0000 Subject: [PATCH 616/852] Use icdiff tool to show nf-test snapshot diff in Github Actions output --- .github/workflows/ci.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5c06c5ce..861dd018 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,6 +14,8 @@ on: env: NXF_ANSI_LOG: false NFTEST_VER: "0.8.2" + NFT_DIFF: "icdiff" + NFT_DIFF_ARGS: "-N --cols 200 -L expected -L observed -t" concurrency: group: "${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}" @@ -88,6 +90,10 @@ jobs: run: | wget -qO- https://code.askimed.com/install/nf-test | bash sudo mv nf-test /usr/local/bin/ + + - name: Install icdiff for nf-test diff viewing + run: | + sudo apt install icdiff - name: Run nf-test run: | From b8d43bee4f8fed9876643c514e1bf834d34b697c Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 5 Jan 2024 18:08:26 +0000 Subject: [PATCH 617/852] Fix prettier --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 861dd018..074b577d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -90,7 +90,7 @@ jobs: run: | wget -qO- https://code.askimed.com/install/nf-test | bash sudo mv nf-test /usr/local/bin/ - + - name: Install icdiff for nf-test diff viewing run: | sudo apt install icdiff From 300cb2e6a27fcb5e83a9c09389325ab19d0d3f99 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sat, 6 Jan 2024 20:03:54 +0000 Subject: [PATCH 618/852] Bump nf-test version to 0.8.3 and remove Docker home mounts --- .github/workflows/ci.yml | 2 +- nextflow.config | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 074b577d..b89823fc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,7 +13,7 @@ on: env: NXF_ANSI_LOG: false - NFTEST_VER: "0.8.2" + NFTEST_VER: "0.8.3" NFT_DIFF: "icdiff" NFT_DIFF_ARGS: "-N --cols 200 -L expected -L observed -t" diff --git a/nextflow.config b/nextflow.config index c849b9b8..ad11a3fc 100644 --- a/nextflow.config +++ b/nextflow.config @@ -114,7 +114,7 @@ profiles { shifter.enabled = false charliecloud.enabled = false apptainer.enabled = false - docker.runOptions = '-u $(id -u):$(id -g) -v $HOME:$HOME' + docker.runOptions = '-u $(id -u):$(id -g)' } arm { docker.runOptions = '-u $(id -u):$(id -g) --platform=linux/amd64' From db9d949982f7edc64a705da5efb2445bb58cf92c Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sat, 6 Jan 2024 20:11:45 +0000 Subject: [PATCH 619/852] Add ch_ prefix to fastq_files channel --- workflows/sra/main.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/workflows/sra/main.nf b/workflows/sra/main.nf index 106041a4..d6fc8ce4 100644 --- a/workflows/sra/main.nf +++ b/workflows/sra/main.nf @@ -61,7 +61,7 @@ workflow SRA { .unique() .set { ch_sra_metadata } - fastq_files = Channel.empty() + ch_fastq_files = Channel.empty() if (!params.skip_fastq_download) { ch_sra_metadata @@ -93,7 +93,7 @@ workflow SRA { ch_versions = ch_versions.mix(FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS.out.versions.first()) // Isolate FASTQ channel which will be added to emit block - fastq_files + ch_fastq_files .mix(SRA_FASTQ_FTP.out.fastq, FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS.out.reads) .map { meta, fastq -> @@ -150,7 +150,7 @@ workflow SRA { } emit: - fastq = fastq_files + fastq = ch_fastq_files samplesheet = ch_samplesheet mappings = ch_mappings sample_mappings = ch_sample_mappings_yml From 44aa79c5e21375a729dd9eea427b5fda84db1fef Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sat, 6 Jan 2024 20:34:30 +0000 Subject: [PATCH 620/852] Use --verbose parameter by default with nf-test --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b89823fc..8917a345 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -97,7 +97,7 @@ jobs: - name: Run nf-test run: | - nf-test test --tag ${{ matrix.tags }} --profile "test,${{ matrix.profile }}" --junitxml=test.xml + nf-test test --verbose --tag ${{ matrix.tags }} --profile "test,${{ matrix.profile }}" --junitxml=test.xml - name: Output log on failure if: failure() From 584fb2d44d7040ad62c02b2739b89c27e3b21c6c Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sat, 6 Jan 2024 20:35:30 +0000 Subject: [PATCH 621/852] Use relative path for --outdir because outputDir will be unique path --- .../sra/tests/sra_custom_ena_metadata_fields.nf.test | 2 +- .../sra/tests/sra_force_sratools_download.nf.test | 2 +- .../sra/tests/sra_force_sratools_download.nf.test.snap | 10 +++++----- .../sra/tests/sra_nf_core_pipeline_atacseq.nf.test | 2 +- .../sra/tests/sra_nf_core_pipeline_rnaseq.nf.test | 2 +- .../sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test | 2 +- .../sra/tests/sra_nf_core_pipeline_viralrecon.nf.test | 2 +- workflows/sra/tests/sra_skip_fastq_download.nf.test | 2 +- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test index 262cedef..d4dd4141 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test @@ -17,7 +17,7 @@ nextflow_workflow { """ } params { - outdir = "$outputDir" + outdir = "results" nf_core_pipeline = "rnaseq" ena_metadata_fields = "run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5" sample_mapping_fields = "run_accession,library_layout" diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test b/workflows/sra/tests/sra_force_sratools_download.nf.test index 453ab328..62adb9af 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test @@ -17,7 +17,7 @@ nextflow_workflow { """ } params { - outdir = "$outputDir" + outdir = "results" force_sratools_download = true } } diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test.snap b/workflows/sra/tests/sra_force_sratools_download.nf.test.snap index 895d79b1..07cf1871 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test.snap +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test.snap @@ -6,10 +6,10 @@ ], "1": [ - "samplesheet.csv:md5,0f2c0516990774b5d7d76a7ddf763f55" + "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], "2": [ - "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" + "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" ], "3": [ [ @@ -27,7 +27,7 @@ ], "mappings": [ - "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" + "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" ], "sample_mappings": [ [ @@ -36,7 +36,7 @@ ] ], "samplesheet": [ - "samplesheet.csv:md5,0f2c0516990774b5d7d76a7ddf763f55" + "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", @@ -46,6 +46,6 @@ ] } ], - "timestamp": "2024-01-05T17:19:30.088408" + "timestamp": "2024-01-06T20:32:48.107479" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test index 3bb70fe6..00f545b5 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test @@ -17,7 +17,7 @@ nextflow_workflow { """ } params { - outdir = "$outputDir" + outdir = "results" nf_core_pipeline = "atacseq" } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test index a64d4348..62bd6380 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test @@ -17,7 +17,7 @@ nextflow_workflow { """ } params { - outdir = "$outputDir" + outdir = "results" nf_core_pipeline = "rnaseq" } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test index 1befdba2..c5e2865f 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test @@ -17,7 +17,7 @@ nextflow_workflow { """ } params { - outdir = "$outputDir" + outdir = "results" nf_core_pipeline = "taxprofiler" } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test index ba185097..04485010 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test @@ -17,7 +17,7 @@ nextflow_workflow { """ } params { - outdir = "$outputDir" + outdir = "results" nf_core_pipeline = "viralrecon" } } diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test b/workflows/sra/tests/sra_skip_fastq_download.nf.test index c9217606..dd846643 100644 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test @@ -17,7 +17,7 @@ nextflow_workflow { """ } params { - outdir = "$outputDir" + outdir = "results" skip_fastq_download = true } } From 18a7c272f07e1c1b414c2ea3df11f51d4f01554f Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sat, 6 Jan 2024 20:50:03 +0000 Subject: [PATCH 622/852] Update snapshots --- .../tests/sra_custom_ena_metadata_fields.nf.test.snap | 10 +++++----- .../tests/sra_nf_core_pipeline_atacseq.nf.test.snap | 10 +++++----- .../sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap | 10 +++++----- .../sra_nf_core_pipeline_taxprofiler.nf.test.snap | 10 +++++----- .../tests/sra_nf_core_pipeline_viralrecon.nf.test.snap | 10 +++++----- .../sra/tests/sra_skip_fastq_download.nf.test.snap | 10 +++++----- 6 files changed, 30 insertions(+), 30 deletions(-) diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap index 56c0505c..ad611ee2 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap @@ -6,10 +6,10 @@ ], "1": [ - "samplesheet.csv:md5,7cc8031f595157c6ac13ba5067e4bcfb" + "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], "2": [ - "id_mappings.csv:md5,7ee50def039a942e0ac8ca63292c8368" + "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" ], "3": [ [ @@ -28,7 +28,7 @@ ], "mappings": [ - "id_mappings.csv:md5,7ee50def039a942e0ac8ca63292c8368" + "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" ], "sample_mappings": [ [ @@ -37,7 +37,7 @@ ] ], "samplesheet": [ - "samplesheet.csv:md5,7cc8031f595157c6ac13ba5067e4bcfb" + "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", @@ -48,6 +48,6 @@ ] } ], - "timestamp": "2024-01-05T17:27:38.720872" + "timestamp": "2024-01-06T20:36:14.475733" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap index 30de9de2..3c616c12 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap @@ -6,10 +6,10 @@ ], "1": [ - "samplesheet.csv:md5,8f985e9dd993b9c826ea095bd377d34a" + "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], "2": [ - "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" + "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" ], "3": [ [ @@ -28,7 +28,7 @@ ], "mappings": [ - "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" + "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" ], "sample_mappings": [ [ @@ -37,7 +37,7 @@ ] ], "samplesheet": [ - "samplesheet.csv:md5,8f985e9dd993b9c826ea095bd377d34a" + "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", @@ -48,6 +48,6 @@ ] } ], - "timestamp": "2024-01-05T17:42:19.033613" + "timestamp": "2024-01-06T20:45:29.760739" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap index 97772a53..2ad3280d 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap @@ -6,10 +6,10 @@ ], "1": [ - "samplesheet.csv:md5,c0f7d7b70e884c78f90630c695703d7b" + "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], "2": [ - "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" + "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" ], "3": [ [ @@ -28,7 +28,7 @@ ], "mappings": [ - "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" + "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" ], "sample_mappings": [ [ @@ -37,7 +37,7 @@ ] ], "samplesheet": [ - "samplesheet.csv:md5,c0f7d7b70e884c78f90630c695703d7b" + "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", @@ -48,6 +48,6 @@ ] } ], - "timestamp": "2024-01-05T17:45:04.403125" + "timestamp": "2024-01-06T20:47:23.837927" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap index 1d882f8e..031014c4 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap @@ -6,10 +6,10 @@ ], "1": [ - "samplesheet.csv:md5,fe3c7ba9e7b7debe07291d6125f9edc7" + "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], "2": [ - "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" + "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" ], "3": [ [ @@ -28,7 +28,7 @@ ], "mappings": [ - "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" + "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" ], "sample_mappings": [ [ @@ -37,7 +37,7 @@ ] ], "samplesheet": [ - "samplesheet.csv:md5,fe3c7ba9e7b7debe07291d6125f9edc7" + "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", @@ -48,6 +48,6 @@ ] } ], - "timestamp": "2024-01-05T17:47:55.191319" + "timestamp": "2024-01-06T20:49:22.636476" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap index 0b63f33d..15043ffd 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap @@ -6,10 +6,10 @@ ], "1": [ - "samplesheet.csv:md5,99a3fd9fe3c7cad8184b1bbeadd89c45" + "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], "2": [ - "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" + "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" ], "3": [ [ @@ -28,7 +28,7 @@ ], "mappings": [ - "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" + "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" ], "sample_mappings": [ [ @@ -37,7 +37,7 @@ ] ], "samplesheet": [ - "samplesheet.csv:md5,99a3fd9fe3c7cad8184b1bbeadd89c45" + "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", @@ -48,6 +48,6 @@ ] } ], - "timestamp": "2024-01-05T17:35:26.463757" + "timestamp": "2024-01-06T20:40:07.74118" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap b/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap index 3631113e..a402abdf 100644 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap @@ -6,10 +6,10 @@ ], "1": [ - "samplesheet.csv:md5,eb18025bb1cb97a4fe399ca16757d2db" + "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], "2": [ - "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" + "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" ], "3": [ [ @@ -26,7 +26,7 @@ ], "mappings": [ - "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" + "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" ], "sample_mappings": [ [ @@ -35,7 +35,7 @@ ] ], "samplesheet": [ - "samplesheet.csv:md5,eb18025bb1cb97a4fe399ca16757d2db" + "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", @@ -44,6 +44,6 @@ ] } ], - "timestamp": "2024-01-05T17:08:15.42871" + "timestamp": "2024-01-06T20:43:31.440219" } } \ No newline at end of file From 95b30a62b2822fef37ad67dbfe47e0d3fdd84d5d Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 7 Jan 2024 14:13:14 +0000 Subject: [PATCH 623/852] Update snapshots and replace with explicit tests --- workflows/sra/main.nf | 9 +- workflows/sra/tests/main.nf.test.snap | 328 +++++++++++++++++- .../sra_custom_ena_metadata_fields.nf.test | 28 +- ...ra_custom_ena_metadata_fields.nf.test.snap | 120 ++++++- .../tests/sra_force_sratools_download.nf.test | 28 +- .../sra_force_sratools_download.nf.test.snap | 328 +++++++++++++++++- .../sra_nf_core_pipeline_atacseq.nf.test | 28 +- .../sra_nf_core_pipeline_atacseq.nf.test.snap | 328 +++++++++++++++++- .../tests/sra_nf_core_pipeline_rnaseq.nf.test | 28 +- .../sra_nf_core_pipeline_rnaseq.nf.test.snap | 328 +++++++++++++++++- .../sra_nf_core_pipeline_taxprofiler.nf.test | 28 +- ..._nf_core_pipeline_taxprofiler.nf.test.snap | 328 +++++++++++++++++- .../sra_nf_core_pipeline_viralrecon.nf.test | 28 +- ...a_nf_core_pipeline_viralrecon.nf.test.snap | 328 +++++++++++++++++- .../sra/tests/sra_skip_fastq_download.nf.test | 28 +- .../sra_skip_fastq_download.nf.test.snap | 328 +++++++++++++++++- 16 files changed, 2517 insertions(+), 104 deletions(-) diff --git a/workflows/sra/main.nf b/workflows/sra/main.nf index d6fc8ce4..3d487431 100644 --- a/workflows/sra/main.nf +++ b/workflows/sra/main.nf @@ -61,7 +61,6 @@ workflow SRA { .unique() .set { ch_sra_metadata } - ch_fastq_files = Channel.empty() if (!params.skip_fastq_download) { ch_sra_metadata @@ -93,8 +92,10 @@ workflow SRA { ch_versions = ch_versions.mix(FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS.out.versions.first()) // Isolate FASTQ channel which will be added to emit block - ch_fastq_files - .mix(SRA_FASTQ_FTP.out.fastq, FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS.out.reads) + SRA_FASTQ_FTP + .out + .fastq + .mix(FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS.out.reads) .map { meta, fastq -> def reads = fastq instanceof List ? fastq.flatten() : [ fastq ] @@ -150,10 +151,10 @@ workflow SRA { } emit: - fastq = ch_fastq_files samplesheet = ch_samplesheet mappings = ch_mappings sample_mappings = ch_sample_mappings_yml + sra_metadata = ch_sra_metadata versions = ch_versions.unique() } diff --git a/workflows/sra/tests/main.nf.test.snap b/workflows/sra/tests/main.nf.test.snap index ffdf20cc..f525d55d 100644 --- a/workflows/sra/tests/main.nf.test.snap +++ b/workflows/sra/tests/main.nf.test.snap @@ -3,29 +3,181 @@ "content": [ { "0": [ - - ], - "1": [ "samplesheet.csv:md5,d252b222b8ef94670117780d43498b86" ], - "2": [ + "1": [ "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" ], - "3": [ + "2": [ [ "multiqc_config.yml:md5,6d4c3e5137704358474330207f5f2b5c", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], + "3": [ + { + "base_count": "35658", + "experiment_accession": "ERX1234253", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "fastq_1": "ERX1234253_ERR1160846.fastq.gz:md5,b1de59f829fbd2d60a1ed4bc3da55709", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "id": "ERX1234253_ERR1160846", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "10317.BLANK.93.3E.r22", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "read_count": "283", + "run_accession": "ERR1160846", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "sample_accession": "SAMEA3687214", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "sample_description": "American Gut control", + "sample_title": "10317.BLANK.93.3E.r22", + "scientific_name": "metagenome", + "secondary_sample_accession": "ERS994363", + "secondary_study_accession": "ERP012803", + "single_end": true, + "study_accession": "PRJEB11419", + "study_alias": "qiita_sid_10317", + "study_title": "American Gut Project", + "submission_accession": "ERA541392", + "tax_id": "256318" + }, + { + "base_count": "431758", + "experiment_accession": "SRX9315476", + "experiment_alias": "F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "fastq_1": "SRX9315476_SRR12848126_1.fastq.gz:md5,e4e86261d46fc31146e8809e605fd381", + "fastq_2": "SRX9315476_SRR12848126_2.fastq.gz:md5,b154211da872f5a99697097628aa3afb", + "fastq_aspera": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_md5": "", + "id": "SRX9315476_SRR12848126", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "library_layout": "PAIRED", + "library_name": "F11-N1-05", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "md5_1": "", + "md5_2": "", + "read_count": "2954", + "run_accession": "SRR12848126", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "sample_accession": "SAMN16455283", + "sample_alias": "F11-N1-05", + "sample_description": "F11-N1-05", + "sample_title": "Longshanks_F11-N1-05", + "scientific_name": "Mus musculus domesticus", + "secondary_sample_accession": "SRS7540262", + "secondary_study_accession": "SRP287769", + "single_end": false, + "study_accession": "PRJNA670070", + "study_alias": "PRJNA670070", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "submission_accession": "SRA1145417", + "tax_id": "10092" + }, + { + "base_count": "573417800", + "experiment_accession": "SRX17709227", + "experiment_alias": "GSM6601460_r1", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "fastq_1": "SRX17709227_SRR21711856.fastq.gz:md5,1fe5e87cc11c2af1584da9a75e49c4d2", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "id": "SRX17709227_SRR21711856", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "GSM6601460", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "read_count": "11468356", + "run_accession": "SRR21711856", + "run_alias": "GSM6601460_r1", + "sample_accession": "SAMN31021823", + "sample_alias": "GSM6601460", + "sample_description": "sham-treated worms in day 5", + "sample_title": "sham-treated worms in day 5", + "scientific_name": "Caenorhabditis elegans", + "secondary_sample_accession": "SRS15239723", + "secondary_study_accession": "SRP399678", + "single_end": true, + "study_accession": "PRJNA884373", + "study_alias": "GSE214215", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "submission_accession": "SRA1507236", + "tax_id": "6239" + }, + { + "base_count": "677912850", + "experiment_accession": "SRX17709228", + "experiment_alias": "GSM6601461_r1", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "fastq_1": "SRX17709228_SRR21711855.fastq.gz:md5,3a4b64f005eba3923da57a5e61131c2a", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "id": "SRX17709228_SRR21711855", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "GSM6601461", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "read_count": "13558257", + "run_accession": "SRR21711855", + "run_alias": "GSM6601461_r1", + "sample_accession": "SAMN31021822", + "sample_alias": "GSM6601461", + "sample_description": "PM2.5-treated worms in day 5", + "sample_title": "PM2.5-treated worms in day 5", + "scientific_name": "Caenorhabditis elegans", + "secondary_sample_accession": "SRS15239724", + "secondary_study_accession": "SRP399678", + "single_end": true, + "study_accession": "PRJNA884373", + "study_alias": "GSE214215", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "submission_accession": "SRA1507236", + "tax_id": "6239" + } + ], "4": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", "versions.yml:md5,98a3ee9aa3bcc3b080247bccde481bbb", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" - ], - "fastq": [ - ], "mappings": [ "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" @@ -39,6 +191,164 @@ "samplesheet": [ "samplesheet.csv:md5,d252b222b8ef94670117780d43498b86" ], + "sra_metadata": [ + { + "base_count": "35658", + "experiment_accession": "ERX1234253", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "fastq_1": "ERX1234253_ERR1160846.fastq.gz:md5,b1de59f829fbd2d60a1ed4bc3da55709", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "id": "ERX1234253_ERR1160846", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "10317.BLANK.93.3E.r22", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "read_count": "283", + "run_accession": "ERR1160846", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "sample_accession": "SAMEA3687214", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "sample_description": "American Gut control", + "sample_title": "10317.BLANK.93.3E.r22", + "scientific_name": "metagenome", + "secondary_sample_accession": "ERS994363", + "secondary_study_accession": "ERP012803", + "single_end": true, + "study_accession": "PRJEB11419", + "study_alias": "qiita_sid_10317", + "study_title": "American Gut Project", + "submission_accession": "ERA541392", + "tax_id": "256318" + }, + { + "base_count": "431758", + "experiment_accession": "SRX9315476", + "experiment_alias": "F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "fastq_1": "SRX9315476_SRR12848126_1.fastq.gz:md5,e4e86261d46fc31146e8809e605fd381", + "fastq_2": "SRX9315476_SRR12848126_2.fastq.gz:md5,b154211da872f5a99697097628aa3afb", + "fastq_aspera": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_md5": "", + "id": "SRX9315476_SRR12848126", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "library_layout": "PAIRED", + "library_name": "F11-N1-05", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "md5_1": "", + "md5_2": "", + "read_count": "2954", + "run_accession": "SRR12848126", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "sample_accession": "SAMN16455283", + "sample_alias": "F11-N1-05", + "sample_description": "F11-N1-05", + "sample_title": "Longshanks_F11-N1-05", + "scientific_name": "Mus musculus domesticus", + "secondary_sample_accession": "SRS7540262", + "secondary_study_accession": "SRP287769", + "single_end": false, + "study_accession": "PRJNA670070", + "study_alias": "PRJNA670070", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "submission_accession": "SRA1145417", + "tax_id": "10092" + }, + { + "base_count": "573417800", + "experiment_accession": "SRX17709227", + "experiment_alias": "GSM6601460_r1", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "fastq_1": "SRX17709227_SRR21711856.fastq.gz:md5,1fe5e87cc11c2af1584da9a75e49c4d2", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "id": "SRX17709227_SRR21711856", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "GSM6601460", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "read_count": "11468356", + "run_accession": "SRR21711856", + "run_alias": "GSM6601460_r1", + "sample_accession": "SAMN31021823", + "sample_alias": "GSM6601460", + "sample_description": "sham-treated worms in day 5", + "sample_title": "sham-treated worms in day 5", + "scientific_name": "Caenorhabditis elegans", + "secondary_sample_accession": "SRS15239723", + "secondary_study_accession": "SRP399678", + "single_end": true, + "study_accession": "PRJNA884373", + "study_alias": "GSE214215", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "submission_accession": "SRA1507236", + "tax_id": "6239" + }, + { + "base_count": "677912850", + "experiment_accession": "SRX17709228", + "experiment_alias": "GSM6601461_r1", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "fastq_1": "SRX17709228_SRR21711855.fastq.gz:md5,3a4b64f005eba3923da57a5e61131c2a", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "id": "SRX17709228_SRR21711855", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "GSM6601461", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "read_count": "13558257", + "run_accession": "SRR21711855", + "run_alias": "GSM6601461_r1", + "sample_accession": "SAMN31021822", + "sample_alias": "GSM6601461", + "sample_description": "PM2.5-treated worms in day 5", + "sample_title": "PM2.5-treated worms in day 5", + "scientific_name": "Caenorhabditis elegans", + "secondary_sample_accession": "SRS15239724", + "secondary_study_accession": "SRP399678", + "single_end": true, + "study_accession": "PRJNA884373", + "study_alias": "GSE214215", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "submission_accession": "SRA1507236", + "tax_id": "6239" + } + ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", @@ -48,6 +358,6 @@ ] } ], - "timestamp": "2024-01-05T17:31:06.996066" + "timestamp": "2024-01-07T13:27:35.094044" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test index d4dd4141..356128c6 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test @@ -25,10 +25,30 @@ nextflow_workflow { } then { - assertAll( - { assert workflow.success }, - { assert snapshot(workflow.out).match() } - ) + assert workflow.success + + with(workflow.out.samplesheet) { + assert path(get(0)).readLines().size() == 5 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"SRX17709227"', '"SRX17709228"', '"ERX1234253"', '"SRX9315476"'] + assert path(get(0)).text.contains('Illumina HiSeq 4000') + } + + with(workflow.out.mappings) { + assert path(get(0)).readLines().size() == 5 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"SRX17709227"', '"SRX17709228"', '"ERX1234253"', '"SRX9315476"'] + assert path(get(0)).text.contains('Illumina HiSeq 4000') + } + + with(workflow.out.sample_mappings) { + assert path(get(0)[0]).md5 == "3bc981f0de28023083cdf13691d249d5" + } + + with(workflow.out.sra_metadata) { + assert get(0).get('experiment_accession') == 'ERX1234253' + assert get(1).get('experiment_accession') == 'SRX17709227' + assert get(2).get('experiment_accession') == 'SRX17709228' + assert get(3).get('experiment_accession') == 'SRX9315476' + } } } } diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap index ad611ee2..f182f555 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap @@ -3,29 +3,77 @@ "content": [ { "0": [ - - ], - "1": [ "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], - "2": [ + "1": [ "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" ], - "3": [ + "2": [ [ "multiqc_config.yml:md5,3bc981f0de28023083cdf13691d249d5", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], + "3": [ + { + "experiment_accession": "ERX1234253", + "fastq_1": "ERX1234253_ERR1160846.fastq.gz:md5,b1de59f829fbd2d60a1ed4bc3da55709", + "fastq_2": "", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "id": "ERX1234253_ERR1160846", + "library_layout": "SINGLE", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "run_accession": "ERR1160846", + "single_end": true + }, + { + "experiment_accession": "SRX17709227", + "fastq_1": "SRX17709227_SRR21711856.fastq.gz:md5,1fe5e87cc11c2af1584da9a75e49c4d2", + "fastq_2": "", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "id": "SRX17709227_SRR21711856", + "library_layout": "SINGLE", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "run_accession": "SRR21711856", + "single_end": true + }, + { + "experiment_accession": "SRX17709228", + "fastq_1": "SRX17709228_SRR21711855.fastq.gz:md5,3a4b64f005eba3923da57a5e61131c2a", + "fastq_2": "", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "id": "SRX17709228_SRR21711855", + "library_layout": "SINGLE", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "run_accession": "SRR21711855", + "single_end": true + }, + { + "experiment_accession": "SRX9315476", + "fastq_1": "SRX9315476_SRR12848126_1.fastq.gz:md5,e4e86261d46fc31146e8809e605fd381", + "fastq_2": "SRX9315476_SRR12848126_2.fastq.gz:md5,b154211da872f5a99697097628aa3afb", + "fastq_ftp": "", + "fastq_md5": "", + "id": "SRX9315476_SRR12848126", + "library_layout": "PAIRED", + "md5_1": "", + "md5_2": "", + "run_accession": "SRR12848126", + "single_end": false + } + ], "4": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", "versions.yml:md5,98a3ee9aa3bcc3b080247bccde481bbb", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" - ], - "fastq": [ - ], "mappings": [ "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" @@ -39,6 +87,60 @@ "samplesheet": [ "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], + "sra_metadata": [ + { + "experiment_accession": "ERX1234253", + "fastq_1": "ERX1234253_ERR1160846.fastq.gz:md5,b1de59f829fbd2d60a1ed4bc3da55709", + "fastq_2": "", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "id": "ERX1234253_ERR1160846", + "library_layout": "SINGLE", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "run_accession": "ERR1160846", + "single_end": true + }, + { + "experiment_accession": "SRX17709227", + "fastq_1": "SRX17709227_SRR21711856.fastq.gz:md5,1fe5e87cc11c2af1584da9a75e49c4d2", + "fastq_2": "", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "id": "SRX17709227_SRR21711856", + "library_layout": "SINGLE", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "run_accession": "SRR21711856", + "single_end": true + }, + { + "experiment_accession": "SRX17709228", + "fastq_1": "SRX17709228_SRR21711855.fastq.gz:md5,3a4b64f005eba3923da57a5e61131c2a", + "fastq_2": "", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "id": "SRX17709228_SRR21711855", + "library_layout": "SINGLE", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "run_accession": "SRR21711855", + "single_end": true + }, + { + "experiment_accession": "SRX9315476", + "fastq_1": "SRX9315476_SRR12848126_1.fastq.gz:md5,e4e86261d46fc31146e8809e605fd381", + "fastq_2": "SRX9315476_SRR12848126_2.fastq.gz:md5,b154211da872f5a99697097628aa3afb", + "fastq_ftp": "", + "fastq_md5": "", + "id": "SRX9315476_SRR12848126", + "library_layout": "PAIRED", + "md5_1": "", + "md5_2": "", + "run_accession": "SRR12848126", + "single_end": false + } + ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", @@ -48,6 +150,6 @@ ] } ], - "timestamp": "2024-01-06T20:36:14.475733" + "timestamp": "2024-01-07T13:22:50.246795" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test b/workflows/sra/tests/sra_force_sratools_download.nf.test index 62adb9af..3180d720 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test @@ -23,10 +23,30 @@ nextflow_workflow { } then { - assertAll( - { assert workflow.success }, - { assert snapshot(workflow.out).match() } - ) + assert workflow.success + + with(workflow.out.samplesheet) { + assert path(get(0)).readLines().size() == 5 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"SRX17709227"', '"SRX17709228"', '"ERX1234253"', '"SRX9315476"'] + assert path(get(0)).text.contains('Illumina HiSeq 4000') + } + + with(workflow.out.mappings) { + assert path(get(0)).readLines().size() == 5 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"SRX17709227"', '"SRX17709228"', '"ERX1234253"', '"SRX9315476"'] + assert path(get(0)).text.contains('Illumina HiSeq 4000') + } + + with(workflow.out.sample_mappings) { + assert path(get(0)[0]).md5 == "6d4c3e5137704358474330207f5f2b5c" + } + + with(workflow.out.sra_metadata) { + assert get(0).get('experiment_accession') == 'ERX1234253' + assert get(1).get('experiment_accession') == 'SRX17709227' + assert get(2).get('experiment_accession') == 'SRX17709228' + assert get(3).get('experiment_accession') == 'SRX9315476' + } } } } diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test.snap b/workflows/sra/tests/sra_force_sratools_download.nf.test.snap index 07cf1871..2dcf052c 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test.snap +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test.snap @@ -3,28 +3,180 @@ "content": [ { "0": [ - - ], - "1": [ "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], - "2": [ + "1": [ "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" ], - "3": [ + "2": [ [ "multiqc_config.yml:md5,6d4c3e5137704358474330207f5f2b5c", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], + "3": [ + { + "base_count": "35658", + "experiment_accession": "ERX1234253", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "fastq_1": "ERX1234253_ERR1160846.fastq.gz:md5,b1de59f829fbd2d60a1ed4bc3da55709", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "id": "ERX1234253_ERR1160846", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "10317.BLANK.93.3E.r22", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "read_count": "283", + "run_accession": "ERR1160846", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "sample_accession": "SAMEA3687214", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "sample_description": "American Gut control", + "sample_title": "10317.BLANK.93.3E.r22", + "scientific_name": "metagenome", + "secondary_sample_accession": "ERS994363", + "secondary_study_accession": "ERP012803", + "single_end": true, + "study_accession": "PRJEB11419", + "study_alias": "qiita_sid_10317", + "study_title": "American Gut Project", + "submission_accession": "ERA541392", + "tax_id": "256318" + }, + { + "base_count": "431758", + "experiment_accession": "SRX9315476", + "experiment_alias": "F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "fastq_1": "SRX9315476_SRR12848126_1.fastq.gz:md5,e4e86261d46fc31146e8809e605fd381", + "fastq_2": "SRX9315476_SRR12848126_2.fastq.gz:md5,b154211da872f5a99697097628aa3afb", + "fastq_aspera": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_md5": "", + "id": "SRX9315476_SRR12848126", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "library_layout": "PAIRED", + "library_name": "F11-N1-05", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "md5_1": "", + "md5_2": "", + "read_count": "2954", + "run_accession": "SRR12848126", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "sample_accession": "SAMN16455283", + "sample_alias": "F11-N1-05", + "sample_description": "F11-N1-05", + "sample_title": "Longshanks_F11-N1-05", + "scientific_name": "Mus musculus domesticus", + "secondary_sample_accession": "SRS7540262", + "secondary_study_accession": "SRP287769", + "single_end": false, + "study_accession": "PRJNA670070", + "study_alias": "PRJNA670070", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "submission_accession": "SRA1145417", + "tax_id": "10092" + }, + { + "base_count": "573417800", + "experiment_accession": "SRX17709227", + "experiment_alias": "GSM6601460_r1", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "fastq_1": "results/fastq/SRX17709227_SRR21711856_1.fastq.gz", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "id": "SRX17709227_SRR21711856", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "GSM6601460", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "read_count": "11468356", + "run_accession": "SRR21711856", + "run_alias": "GSM6601460_r1", + "sample_accession": "SAMN31021823", + "sample_alias": "GSM6601460", + "sample_description": "sham-treated worms in day 5", + "sample_title": "sham-treated worms in day 5", + "scientific_name": "Caenorhabditis elegans", + "secondary_sample_accession": "SRS15239723", + "secondary_study_accession": "SRP399678", + "single_end": true, + "study_accession": "PRJNA884373", + "study_alias": "GSE214215", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "submission_accession": "SRA1507236", + "tax_id": "6239" + }, + { + "base_count": "677912850", + "experiment_accession": "SRX17709228", + "experiment_alias": "GSM6601461_r1", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "fastq_1": "results/fastq/SRX17709228_SRR21711855_1.fastq.gz", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "id": "SRX17709228_SRR21711855", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "GSM6601461", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "read_count": "13558257", + "run_accession": "SRR21711855", + "run_alias": "GSM6601461_r1", + "sample_accession": "SAMN31021822", + "sample_alias": "GSM6601461", + "sample_description": "PM2.5-treated worms in day 5", + "sample_title": "PM2.5-treated worms in day 5", + "scientific_name": "Caenorhabditis elegans", + "secondary_sample_accession": "SRS15239724", + "secondary_study_accession": "SRP399678", + "single_end": true, + "study_accession": "PRJNA884373", + "study_alias": "GSE214215", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "submission_accession": "SRA1507236", + "tax_id": "6239" + } + ], "4": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" - ], - "fastq": [ - ], "mappings": [ "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" @@ -38,6 +190,164 @@ "samplesheet": [ "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], + "sra_metadata": [ + { + "base_count": "35658", + "experiment_accession": "ERX1234253", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "fastq_1": "ERX1234253_ERR1160846.fastq.gz:md5,b1de59f829fbd2d60a1ed4bc3da55709", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "id": "ERX1234253_ERR1160846", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "10317.BLANK.93.3E.r22", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "read_count": "283", + "run_accession": "ERR1160846", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "sample_accession": "SAMEA3687214", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "sample_description": "American Gut control", + "sample_title": "10317.BLANK.93.3E.r22", + "scientific_name": "metagenome", + "secondary_sample_accession": "ERS994363", + "secondary_study_accession": "ERP012803", + "single_end": true, + "study_accession": "PRJEB11419", + "study_alias": "qiita_sid_10317", + "study_title": "American Gut Project", + "submission_accession": "ERA541392", + "tax_id": "256318" + }, + { + "base_count": "431758", + "experiment_accession": "SRX9315476", + "experiment_alias": "F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "fastq_1": "SRX9315476_SRR12848126_1.fastq.gz:md5,e4e86261d46fc31146e8809e605fd381", + "fastq_2": "SRX9315476_SRR12848126_2.fastq.gz:md5,b154211da872f5a99697097628aa3afb", + "fastq_aspera": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_md5": "", + "id": "SRX9315476_SRR12848126", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "library_layout": "PAIRED", + "library_name": "F11-N1-05", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "md5_1": "", + "md5_2": "", + "read_count": "2954", + "run_accession": "SRR12848126", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "sample_accession": "SAMN16455283", + "sample_alias": "F11-N1-05", + "sample_description": "F11-N1-05", + "sample_title": "Longshanks_F11-N1-05", + "scientific_name": "Mus musculus domesticus", + "secondary_sample_accession": "SRS7540262", + "secondary_study_accession": "SRP287769", + "single_end": false, + "study_accession": "PRJNA670070", + "study_alias": "PRJNA670070", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "submission_accession": "SRA1145417", + "tax_id": "10092" + }, + { + "base_count": "573417800", + "experiment_accession": "SRX17709227", + "experiment_alias": "GSM6601460_r1", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "fastq_1": "results/fastq/SRX17709227_SRR21711856_1.fastq.gz", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "id": "SRX17709227_SRR21711856", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "GSM6601460", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "read_count": "11468356", + "run_accession": "SRR21711856", + "run_alias": "GSM6601460_r1", + "sample_accession": "SAMN31021823", + "sample_alias": "GSM6601460", + "sample_description": "sham-treated worms in day 5", + "sample_title": "sham-treated worms in day 5", + "scientific_name": "Caenorhabditis elegans", + "secondary_sample_accession": "SRS15239723", + "secondary_study_accession": "SRP399678", + "single_end": true, + "study_accession": "PRJNA884373", + "study_alias": "GSE214215", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "submission_accession": "SRA1507236", + "tax_id": "6239" + }, + { + "base_count": "677912850", + "experiment_accession": "SRX17709228", + "experiment_alias": "GSM6601461_r1", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "fastq_1": "results/fastq/SRX17709228_SRR21711855_1.fastq.gz", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "id": "SRX17709228_SRR21711855", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "GSM6601461", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "read_count": "13558257", + "run_accession": "SRR21711855", + "run_alias": "GSM6601461_r1", + "sample_accession": "SAMN31021822", + "sample_alias": "GSM6601461", + "sample_description": "PM2.5-treated worms in day 5", + "sample_title": "PM2.5-treated worms in day 5", + "scientific_name": "Caenorhabditis elegans", + "secondary_sample_accession": "SRS15239724", + "secondary_study_accession": "SRP399678", + "single_end": true, + "study_accession": "PRJNA884373", + "study_alias": "GSE214215", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "submission_accession": "SRA1507236", + "tax_id": "6239" + } + ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", @@ -46,6 +356,6 @@ ] } ], - "timestamp": "2024-01-06T20:32:48.107479" + "timestamp": "2024-01-07T13:36:22.094035" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test index 00f545b5..1bcbbf72 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test @@ -23,10 +23,30 @@ nextflow_workflow { } then { - assertAll( - { assert workflow.success }, - { assert snapshot(workflow.out).match() } - ) + assert workflow.success + + with(workflow.out.samplesheet) { + assert path(get(0)).readLines().size() == 5 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"SRX17709227"', '"SRX17709228"', '"ERX1234253"', '"SRX9315476"'] + assert path(get(0)).text.contains('Illumina HiSeq 4000') + } + + with(workflow.out.mappings) { + assert path(get(0)).readLines().size() == 5 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"SRX17709227"', '"SRX17709228"', '"ERX1234253"', '"SRX9315476"'] + assert path(get(0)).text.contains('Illumina HiSeq 4000') + } + + with(workflow.out.sample_mappings) { + assert path(get(0)[0]).md5 == "6d4c3e5137704358474330207f5f2b5c" + } + + with(workflow.out.sra_metadata) { + assert get(0).get('experiment_accession') == 'ERX1234253' + assert get(1).get('experiment_accession') == 'SRX17709227' + assert get(2).get('experiment_accession') == 'SRX17709228' + assert get(3).get('experiment_accession') == 'SRX9315476' + } } } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap index 3c616c12..5dd675d3 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap @@ -3,29 +3,181 @@ "content": [ { "0": [ - - ], - "1": [ "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], - "2": [ + "1": [ "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" ], - "3": [ + "2": [ [ "multiqc_config.yml:md5,6d4c3e5137704358474330207f5f2b5c", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], + "3": [ + { + "base_count": "35658", + "experiment_accession": "ERX1234253", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "fastq_1": "ERX1234253_ERR1160846.fastq.gz:md5,b1de59f829fbd2d60a1ed4bc3da55709", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "id": "ERX1234253_ERR1160846", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "10317.BLANK.93.3E.r22", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "read_count": "283", + "run_accession": "ERR1160846", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "sample_accession": "SAMEA3687214", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "sample_description": "American Gut control", + "sample_title": "10317.BLANK.93.3E.r22", + "scientific_name": "metagenome", + "secondary_sample_accession": "ERS994363", + "secondary_study_accession": "ERP012803", + "single_end": true, + "study_accession": "PRJEB11419", + "study_alias": "qiita_sid_10317", + "study_title": "American Gut Project", + "submission_accession": "ERA541392", + "tax_id": "256318" + }, + { + "base_count": "431758", + "experiment_accession": "SRX9315476", + "experiment_alias": "F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "fastq_1": "SRX9315476_SRR12848126_1.fastq.gz:md5,e4e86261d46fc31146e8809e605fd381", + "fastq_2": "SRX9315476_SRR12848126_2.fastq.gz:md5,b154211da872f5a99697097628aa3afb", + "fastq_aspera": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_md5": "", + "id": "SRX9315476_SRR12848126", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "library_layout": "PAIRED", + "library_name": "F11-N1-05", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "md5_1": "", + "md5_2": "", + "read_count": "2954", + "run_accession": "SRR12848126", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "sample_accession": "SAMN16455283", + "sample_alias": "F11-N1-05", + "sample_description": "F11-N1-05", + "sample_title": "Longshanks_F11-N1-05", + "scientific_name": "Mus musculus domesticus", + "secondary_sample_accession": "SRS7540262", + "secondary_study_accession": "SRP287769", + "single_end": false, + "study_accession": "PRJNA670070", + "study_alias": "PRJNA670070", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "submission_accession": "SRA1145417", + "tax_id": "10092" + }, + { + "base_count": "573417800", + "experiment_accession": "SRX17709227", + "experiment_alias": "GSM6601460_r1", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "fastq_1": "SRX17709227_SRR21711856.fastq.gz:md5,1fe5e87cc11c2af1584da9a75e49c4d2", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "id": "SRX17709227_SRR21711856", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "GSM6601460", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "read_count": "11468356", + "run_accession": "SRR21711856", + "run_alias": "GSM6601460_r1", + "sample_accession": "SAMN31021823", + "sample_alias": "GSM6601460", + "sample_description": "sham-treated worms in day 5", + "sample_title": "sham-treated worms in day 5", + "scientific_name": "Caenorhabditis elegans", + "secondary_sample_accession": "SRS15239723", + "secondary_study_accession": "SRP399678", + "single_end": true, + "study_accession": "PRJNA884373", + "study_alias": "GSE214215", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "submission_accession": "SRA1507236", + "tax_id": "6239" + }, + { + "base_count": "677912850", + "experiment_accession": "SRX17709228", + "experiment_alias": "GSM6601461_r1", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "fastq_1": "SRX17709228_SRR21711855.fastq.gz:md5,3a4b64f005eba3923da57a5e61131c2a", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "id": "SRX17709228_SRR21711855", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "GSM6601461", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "read_count": "13558257", + "run_accession": "SRR21711855", + "run_alias": "GSM6601461_r1", + "sample_accession": "SAMN31021822", + "sample_alias": "GSM6601461", + "sample_description": "PM2.5-treated worms in day 5", + "sample_title": "PM2.5-treated worms in day 5", + "scientific_name": "Caenorhabditis elegans", + "secondary_sample_accession": "SRS15239724", + "secondary_study_accession": "SRP399678", + "single_end": true, + "study_accession": "PRJNA884373", + "study_alias": "GSE214215", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "submission_accession": "SRA1507236", + "tax_id": "6239" + } + ], "4": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", "versions.yml:md5,98a3ee9aa3bcc3b080247bccde481bbb", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" - ], - "fastq": [ - ], "mappings": [ "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" @@ -39,6 +191,164 @@ "samplesheet": [ "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], + "sra_metadata": [ + { + "base_count": "35658", + "experiment_accession": "ERX1234253", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "fastq_1": "ERX1234253_ERR1160846.fastq.gz:md5,b1de59f829fbd2d60a1ed4bc3da55709", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "id": "ERX1234253_ERR1160846", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "10317.BLANK.93.3E.r22", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "read_count": "283", + "run_accession": "ERR1160846", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "sample_accession": "SAMEA3687214", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "sample_description": "American Gut control", + "sample_title": "10317.BLANK.93.3E.r22", + "scientific_name": "metagenome", + "secondary_sample_accession": "ERS994363", + "secondary_study_accession": "ERP012803", + "single_end": true, + "study_accession": "PRJEB11419", + "study_alias": "qiita_sid_10317", + "study_title": "American Gut Project", + "submission_accession": "ERA541392", + "tax_id": "256318" + }, + { + "base_count": "431758", + "experiment_accession": "SRX9315476", + "experiment_alias": "F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "fastq_1": "SRX9315476_SRR12848126_1.fastq.gz:md5,e4e86261d46fc31146e8809e605fd381", + "fastq_2": "SRX9315476_SRR12848126_2.fastq.gz:md5,b154211da872f5a99697097628aa3afb", + "fastq_aspera": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_md5": "", + "id": "SRX9315476_SRR12848126", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "library_layout": "PAIRED", + "library_name": "F11-N1-05", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "md5_1": "", + "md5_2": "", + "read_count": "2954", + "run_accession": "SRR12848126", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "sample_accession": "SAMN16455283", + "sample_alias": "F11-N1-05", + "sample_description": "F11-N1-05", + "sample_title": "Longshanks_F11-N1-05", + "scientific_name": "Mus musculus domesticus", + "secondary_sample_accession": "SRS7540262", + "secondary_study_accession": "SRP287769", + "single_end": false, + "study_accession": "PRJNA670070", + "study_alias": "PRJNA670070", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "submission_accession": "SRA1145417", + "tax_id": "10092" + }, + { + "base_count": "573417800", + "experiment_accession": "SRX17709227", + "experiment_alias": "GSM6601460_r1", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "fastq_1": "SRX17709227_SRR21711856.fastq.gz:md5,1fe5e87cc11c2af1584da9a75e49c4d2", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "id": "SRX17709227_SRR21711856", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "GSM6601460", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "read_count": "11468356", + "run_accession": "SRR21711856", + "run_alias": "GSM6601460_r1", + "sample_accession": "SAMN31021823", + "sample_alias": "GSM6601460", + "sample_description": "sham-treated worms in day 5", + "sample_title": "sham-treated worms in day 5", + "scientific_name": "Caenorhabditis elegans", + "secondary_sample_accession": "SRS15239723", + "secondary_study_accession": "SRP399678", + "single_end": true, + "study_accession": "PRJNA884373", + "study_alias": "GSE214215", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "submission_accession": "SRA1507236", + "tax_id": "6239" + }, + { + "base_count": "677912850", + "experiment_accession": "SRX17709228", + "experiment_alias": "GSM6601461_r1", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "fastq_1": "SRX17709228_SRR21711855.fastq.gz:md5,3a4b64f005eba3923da57a5e61131c2a", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "id": "SRX17709228_SRR21711855", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "GSM6601461", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "read_count": "13558257", + "run_accession": "SRR21711855", + "run_alias": "GSM6601461_r1", + "sample_accession": "SAMN31021822", + "sample_alias": "GSM6601461", + "sample_description": "PM2.5-treated worms in day 5", + "sample_title": "PM2.5-treated worms in day 5", + "scientific_name": "Caenorhabditis elegans", + "secondary_sample_accession": "SRS15239724", + "secondary_study_accession": "SRP399678", + "single_end": true, + "study_accession": "PRJNA884373", + "study_alias": "GSE214215", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "submission_accession": "SRA1507236", + "tax_id": "6239" + } + ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", @@ -48,6 +358,6 @@ ] } ], - "timestamp": "2024-01-06T20:45:29.760739" + "timestamp": "2024-01-07T13:38:47.906835" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test index 62bd6380..c8be765b 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test @@ -23,10 +23,30 @@ nextflow_workflow { } then { - assertAll( - { assert workflow.success }, - { assert snapshot(workflow.out).match() } - ) + assert workflow.success + + with(workflow.out.samplesheet) { + assert path(get(0)).readLines().size() == 5 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"SRX17709227"', '"SRX17709228"', '"ERX1234253"', '"SRX9315476"'] + assert path(get(0)).text.contains('Illumina HiSeq 4000') + } + + with(workflow.out.mappings) { + assert path(get(0)).readLines().size() == 5 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"SRX17709227"', '"SRX17709228"', '"ERX1234253"', '"SRX9315476"'] + assert path(get(0)).text.contains('Illumina HiSeq 4000') + } + + with(workflow.out.sample_mappings) { + assert path(get(0)[0]).md5 == "6d4c3e5137704358474330207f5f2b5c" + } + + with(workflow.out.sra_metadata) { + assert get(0).get('experiment_accession') == 'ERX1234253' + assert get(1).get('experiment_accession') == 'SRX17709227' + assert get(2).get('experiment_accession') == 'SRX17709228' + assert get(3).get('experiment_accession') == 'SRX9315476' + } } } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap index 2ad3280d..b831fe54 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap @@ -3,29 +3,181 @@ "content": [ { "0": [ - - ], - "1": [ "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], - "2": [ + "1": [ "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" ], - "3": [ + "2": [ [ "multiqc_config.yml:md5,6d4c3e5137704358474330207f5f2b5c", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], + "3": [ + { + "base_count": "35658", + "experiment_accession": "ERX1234253", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "fastq_1": "ERX1234253_ERR1160846.fastq.gz:md5,b1de59f829fbd2d60a1ed4bc3da55709", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "id": "ERX1234253_ERR1160846", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "10317.BLANK.93.3E.r22", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "read_count": "283", + "run_accession": "ERR1160846", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "sample_accession": "SAMEA3687214", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "sample_description": "American Gut control", + "sample_title": "10317.BLANK.93.3E.r22", + "scientific_name": "metagenome", + "secondary_sample_accession": "ERS994363", + "secondary_study_accession": "ERP012803", + "single_end": true, + "study_accession": "PRJEB11419", + "study_alias": "qiita_sid_10317", + "study_title": "American Gut Project", + "submission_accession": "ERA541392", + "tax_id": "256318" + }, + { + "base_count": "431758", + "experiment_accession": "SRX9315476", + "experiment_alias": "F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "fastq_1": "SRX9315476_SRR12848126_1.fastq.gz:md5,e4e86261d46fc31146e8809e605fd381", + "fastq_2": "SRX9315476_SRR12848126_2.fastq.gz:md5,b154211da872f5a99697097628aa3afb", + "fastq_aspera": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_md5": "", + "id": "SRX9315476_SRR12848126", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "library_layout": "PAIRED", + "library_name": "F11-N1-05", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "md5_1": "", + "md5_2": "", + "read_count": "2954", + "run_accession": "SRR12848126", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "sample_accession": "SAMN16455283", + "sample_alias": "F11-N1-05", + "sample_description": "F11-N1-05", + "sample_title": "Longshanks_F11-N1-05", + "scientific_name": "Mus musculus domesticus", + "secondary_sample_accession": "SRS7540262", + "secondary_study_accession": "SRP287769", + "single_end": false, + "study_accession": "PRJNA670070", + "study_alias": "PRJNA670070", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "submission_accession": "SRA1145417", + "tax_id": "10092" + }, + { + "base_count": "573417800", + "experiment_accession": "SRX17709227", + "experiment_alias": "GSM6601460_r1", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "fastq_1": "SRX17709227_SRR21711856.fastq.gz:md5,1fe5e87cc11c2af1584da9a75e49c4d2", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "id": "SRX17709227_SRR21711856", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "GSM6601460", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "read_count": "11468356", + "run_accession": "SRR21711856", + "run_alias": "GSM6601460_r1", + "sample_accession": "SAMN31021823", + "sample_alias": "GSM6601460", + "sample_description": "sham-treated worms in day 5", + "sample_title": "sham-treated worms in day 5", + "scientific_name": "Caenorhabditis elegans", + "secondary_sample_accession": "SRS15239723", + "secondary_study_accession": "SRP399678", + "single_end": true, + "study_accession": "PRJNA884373", + "study_alias": "GSE214215", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "submission_accession": "SRA1507236", + "tax_id": "6239" + }, + { + "base_count": "677912850", + "experiment_accession": "SRX17709228", + "experiment_alias": "GSM6601461_r1", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "fastq_1": "SRX17709228_SRR21711855.fastq.gz:md5,3a4b64f005eba3923da57a5e61131c2a", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "id": "SRX17709228_SRR21711855", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "GSM6601461", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "read_count": "13558257", + "run_accession": "SRR21711855", + "run_alias": "GSM6601461_r1", + "sample_accession": "SAMN31021822", + "sample_alias": "GSM6601461", + "sample_description": "PM2.5-treated worms in day 5", + "sample_title": "PM2.5-treated worms in day 5", + "scientific_name": "Caenorhabditis elegans", + "secondary_sample_accession": "SRS15239724", + "secondary_study_accession": "SRP399678", + "single_end": true, + "study_accession": "PRJNA884373", + "study_alias": "GSE214215", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "submission_accession": "SRA1507236", + "tax_id": "6239" + } + ], "4": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", "versions.yml:md5,98a3ee9aa3bcc3b080247bccde481bbb", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" - ], - "fastq": [ - ], "mappings": [ "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" @@ -39,6 +191,164 @@ "samplesheet": [ "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], + "sra_metadata": [ + { + "base_count": "35658", + "experiment_accession": "ERX1234253", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "fastq_1": "ERX1234253_ERR1160846.fastq.gz:md5,b1de59f829fbd2d60a1ed4bc3da55709", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "id": "ERX1234253_ERR1160846", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "10317.BLANK.93.3E.r22", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "read_count": "283", + "run_accession": "ERR1160846", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "sample_accession": "SAMEA3687214", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "sample_description": "American Gut control", + "sample_title": "10317.BLANK.93.3E.r22", + "scientific_name": "metagenome", + "secondary_sample_accession": "ERS994363", + "secondary_study_accession": "ERP012803", + "single_end": true, + "study_accession": "PRJEB11419", + "study_alias": "qiita_sid_10317", + "study_title": "American Gut Project", + "submission_accession": "ERA541392", + "tax_id": "256318" + }, + { + "base_count": "431758", + "experiment_accession": "SRX9315476", + "experiment_alias": "F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "fastq_1": "SRX9315476_SRR12848126_1.fastq.gz:md5,e4e86261d46fc31146e8809e605fd381", + "fastq_2": "SRX9315476_SRR12848126_2.fastq.gz:md5,b154211da872f5a99697097628aa3afb", + "fastq_aspera": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_md5": "", + "id": "SRX9315476_SRR12848126", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "library_layout": "PAIRED", + "library_name": "F11-N1-05", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "md5_1": "", + "md5_2": "", + "read_count": "2954", + "run_accession": "SRR12848126", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "sample_accession": "SAMN16455283", + "sample_alias": "F11-N1-05", + "sample_description": "F11-N1-05", + "sample_title": "Longshanks_F11-N1-05", + "scientific_name": "Mus musculus domesticus", + "secondary_sample_accession": "SRS7540262", + "secondary_study_accession": "SRP287769", + "single_end": false, + "study_accession": "PRJNA670070", + "study_alias": "PRJNA670070", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "submission_accession": "SRA1145417", + "tax_id": "10092" + }, + { + "base_count": "573417800", + "experiment_accession": "SRX17709227", + "experiment_alias": "GSM6601460_r1", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "fastq_1": "SRX17709227_SRR21711856.fastq.gz:md5,1fe5e87cc11c2af1584da9a75e49c4d2", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "id": "SRX17709227_SRR21711856", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "GSM6601460", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "read_count": "11468356", + "run_accession": "SRR21711856", + "run_alias": "GSM6601460_r1", + "sample_accession": "SAMN31021823", + "sample_alias": "GSM6601460", + "sample_description": "sham-treated worms in day 5", + "sample_title": "sham-treated worms in day 5", + "scientific_name": "Caenorhabditis elegans", + "secondary_sample_accession": "SRS15239723", + "secondary_study_accession": "SRP399678", + "single_end": true, + "study_accession": "PRJNA884373", + "study_alias": "GSE214215", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "submission_accession": "SRA1507236", + "tax_id": "6239" + }, + { + "base_count": "677912850", + "experiment_accession": "SRX17709228", + "experiment_alias": "GSM6601461_r1", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "fastq_1": "SRX17709228_SRR21711855.fastq.gz:md5,3a4b64f005eba3923da57a5e61131c2a", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "id": "SRX17709228_SRR21711855", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "GSM6601461", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "read_count": "13558257", + "run_accession": "SRR21711855", + "run_alias": "GSM6601461_r1", + "sample_accession": "SAMN31021822", + "sample_alias": "GSM6601461", + "sample_description": "PM2.5-treated worms in day 5", + "sample_title": "PM2.5-treated worms in day 5", + "scientific_name": "Caenorhabditis elegans", + "secondary_sample_accession": "SRS15239724", + "secondary_study_accession": "SRP399678", + "single_end": true, + "study_accession": "PRJNA884373", + "study_alias": "GSE214215", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "submission_accession": "SRA1507236", + "tax_id": "6239" + } + ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", @@ -48,6 +358,6 @@ ] } ], - "timestamp": "2024-01-06T20:47:23.837927" + "timestamp": "2024-01-07T13:42:36.795022" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test index c5e2865f..17ec98da 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test @@ -23,10 +23,30 @@ nextflow_workflow { } then { - assertAll( - { assert workflow.success }, - { assert snapshot(workflow.out).match() } - ) + assert workflow.success + + with(workflow.out.samplesheet) { + assert path(get(0)).readLines().size() == 5 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"SRX17709227"', '"SRX17709228"', '"ERX1234253"', '"SRX9315476"'] + assert path(get(0)).text.contains('Illumina HiSeq 4000') + } + + with(workflow.out.mappings) { + assert path(get(0)).readLines().size() == 5 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"SRX17709227"', '"SRX17709228"', '"ERX1234253"', '"SRX9315476"'] + assert path(get(0)).text.contains('Illumina HiSeq 4000') + } + + with(workflow.out.sample_mappings) { + assert path(get(0)[0]).md5 == "6d4c3e5137704358474330207f5f2b5c" + } + + with(workflow.out.sra_metadata) { + assert get(0).get('experiment_accession') == 'ERX1234253' + assert get(1).get('experiment_accession') == 'SRX17709227' + assert get(2).get('experiment_accession') == 'SRX17709228' + assert get(3).get('experiment_accession') == 'SRX9315476' + } } } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap index 031014c4..d7463e04 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap @@ -3,29 +3,181 @@ "content": [ { "0": [ - - ], - "1": [ "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], - "2": [ + "1": [ "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" ], - "3": [ + "2": [ [ "multiqc_config.yml:md5,6d4c3e5137704358474330207f5f2b5c", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], + "3": [ + { + "base_count": "35658", + "experiment_accession": "ERX1234253", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "fastq_1": "ERX1234253_ERR1160846.fastq.gz:md5,b1de59f829fbd2d60a1ed4bc3da55709", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "id": "ERX1234253_ERR1160846", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "10317.BLANK.93.3E.r22", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "read_count": "283", + "run_accession": "ERR1160846", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "sample_accession": "SAMEA3687214", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "sample_description": "American Gut control", + "sample_title": "10317.BLANK.93.3E.r22", + "scientific_name": "metagenome", + "secondary_sample_accession": "ERS994363", + "secondary_study_accession": "ERP012803", + "single_end": true, + "study_accession": "PRJEB11419", + "study_alias": "qiita_sid_10317", + "study_title": "American Gut Project", + "submission_accession": "ERA541392", + "tax_id": "256318" + }, + { + "base_count": "431758", + "experiment_accession": "SRX9315476", + "experiment_alias": "F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "fastq_1": "SRX9315476_SRR12848126_1.fastq.gz:md5,e4e86261d46fc31146e8809e605fd381", + "fastq_2": "SRX9315476_SRR12848126_2.fastq.gz:md5,b154211da872f5a99697097628aa3afb", + "fastq_aspera": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_md5": "", + "id": "SRX9315476_SRR12848126", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "library_layout": "PAIRED", + "library_name": "F11-N1-05", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "md5_1": "", + "md5_2": "", + "read_count": "2954", + "run_accession": "SRR12848126", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "sample_accession": "SAMN16455283", + "sample_alias": "F11-N1-05", + "sample_description": "F11-N1-05", + "sample_title": "Longshanks_F11-N1-05", + "scientific_name": "Mus musculus domesticus", + "secondary_sample_accession": "SRS7540262", + "secondary_study_accession": "SRP287769", + "single_end": false, + "study_accession": "PRJNA670070", + "study_alias": "PRJNA670070", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "submission_accession": "SRA1145417", + "tax_id": "10092" + }, + { + "base_count": "573417800", + "experiment_accession": "SRX17709227", + "experiment_alias": "GSM6601460_r1", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "fastq_1": "SRX17709227_SRR21711856.fastq.gz:md5,1fe5e87cc11c2af1584da9a75e49c4d2", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "id": "SRX17709227_SRR21711856", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "GSM6601460", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "read_count": "11468356", + "run_accession": "SRR21711856", + "run_alias": "GSM6601460_r1", + "sample_accession": "SAMN31021823", + "sample_alias": "GSM6601460", + "sample_description": "sham-treated worms in day 5", + "sample_title": "sham-treated worms in day 5", + "scientific_name": "Caenorhabditis elegans", + "secondary_sample_accession": "SRS15239723", + "secondary_study_accession": "SRP399678", + "single_end": true, + "study_accession": "PRJNA884373", + "study_alias": "GSE214215", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "submission_accession": "SRA1507236", + "tax_id": "6239" + }, + { + "base_count": "677912850", + "experiment_accession": "SRX17709228", + "experiment_alias": "GSM6601461_r1", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "fastq_1": "SRX17709228_SRR21711855.fastq.gz:md5,3a4b64f005eba3923da57a5e61131c2a", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "id": "SRX17709228_SRR21711855", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "GSM6601461", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "read_count": "13558257", + "run_accession": "SRR21711855", + "run_alias": "GSM6601461_r1", + "sample_accession": "SAMN31021822", + "sample_alias": "GSM6601461", + "sample_description": "PM2.5-treated worms in day 5", + "sample_title": "PM2.5-treated worms in day 5", + "scientific_name": "Caenorhabditis elegans", + "secondary_sample_accession": "SRS15239724", + "secondary_study_accession": "SRP399678", + "single_end": true, + "study_accession": "PRJNA884373", + "study_alias": "GSE214215", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "submission_accession": "SRA1507236", + "tax_id": "6239" + } + ], "4": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", "versions.yml:md5,98a3ee9aa3bcc3b080247bccde481bbb", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" - ], - "fastq": [ - ], "mappings": [ "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" @@ -39,6 +191,164 @@ "samplesheet": [ "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], + "sra_metadata": [ + { + "base_count": "35658", + "experiment_accession": "ERX1234253", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "fastq_1": "ERX1234253_ERR1160846.fastq.gz:md5,b1de59f829fbd2d60a1ed4bc3da55709", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "id": "ERX1234253_ERR1160846", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "10317.BLANK.93.3E.r22", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "read_count": "283", + "run_accession": "ERR1160846", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "sample_accession": "SAMEA3687214", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "sample_description": "American Gut control", + "sample_title": "10317.BLANK.93.3E.r22", + "scientific_name": "metagenome", + "secondary_sample_accession": "ERS994363", + "secondary_study_accession": "ERP012803", + "single_end": true, + "study_accession": "PRJEB11419", + "study_alias": "qiita_sid_10317", + "study_title": "American Gut Project", + "submission_accession": "ERA541392", + "tax_id": "256318" + }, + { + "base_count": "431758", + "experiment_accession": "SRX9315476", + "experiment_alias": "F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "fastq_1": "SRX9315476_SRR12848126_1.fastq.gz:md5,e4e86261d46fc31146e8809e605fd381", + "fastq_2": "SRX9315476_SRR12848126_2.fastq.gz:md5,b154211da872f5a99697097628aa3afb", + "fastq_aspera": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_md5": "", + "id": "SRX9315476_SRR12848126", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "library_layout": "PAIRED", + "library_name": "F11-N1-05", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "md5_1": "", + "md5_2": "", + "read_count": "2954", + "run_accession": "SRR12848126", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "sample_accession": "SAMN16455283", + "sample_alias": "F11-N1-05", + "sample_description": "F11-N1-05", + "sample_title": "Longshanks_F11-N1-05", + "scientific_name": "Mus musculus domesticus", + "secondary_sample_accession": "SRS7540262", + "secondary_study_accession": "SRP287769", + "single_end": false, + "study_accession": "PRJNA670070", + "study_alias": "PRJNA670070", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "submission_accession": "SRA1145417", + "tax_id": "10092" + }, + { + "base_count": "573417800", + "experiment_accession": "SRX17709227", + "experiment_alias": "GSM6601460_r1", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "fastq_1": "SRX17709227_SRR21711856.fastq.gz:md5,1fe5e87cc11c2af1584da9a75e49c4d2", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "id": "SRX17709227_SRR21711856", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "GSM6601460", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "read_count": "11468356", + "run_accession": "SRR21711856", + "run_alias": "GSM6601460_r1", + "sample_accession": "SAMN31021823", + "sample_alias": "GSM6601460", + "sample_description": "sham-treated worms in day 5", + "sample_title": "sham-treated worms in day 5", + "scientific_name": "Caenorhabditis elegans", + "secondary_sample_accession": "SRS15239723", + "secondary_study_accession": "SRP399678", + "single_end": true, + "study_accession": "PRJNA884373", + "study_alias": "GSE214215", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "submission_accession": "SRA1507236", + "tax_id": "6239" + }, + { + "base_count": "677912850", + "experiment_accession": "SRX17709228", + "experiment_alias": "GSM6601461_r1", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "fastq_1": "SRX17709228_SRR21711855.fastq.gz:md5,3a4b64f005eba3923da57a5e61131c2a", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "id": "SRX17709228_SRR21711855", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "GSM6601461", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "read_count": "13558257", + "run_accession": "SRR21711855", + "run_alias": "GSM6601461_r1", + "sample_accession": "SAMN31021822", + "sample_alias": "GSM6601461", + "sample_description": "PM2.5-treated worms in day 5", + "sample_title": "PM2.5-treated worms in day 5", + "scientific_name": "Caenorhabditis elegans", + "secondary_sample_accession": "SRS15239724", + "secondary_study_accession": "SRP399678", + "single_end": true, + "study_accession": "PRJNA884373", + "study_alias": "GSE214215", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "submission_accession": "SRA1507236", + "tax_id": "6239" + } + ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", @@ -48,6 +358,6 @@ ] } ], - "timestamp": "2024-01-06T20:49:22.636476" + "timestamp": "2024-01-07T13:46:25.989024" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test index 04485010..09f2a9d1 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test @@ -23,10 +23,30 @@ nextflow_workflow { } then { - assertAll( - { assert workflow.success }, - { assert snapshot(workflow.out).match() } - ) + assert workflow.success + + with(workflow.out.samplesheet) { + assert path(get(0)).readLines().size() == 5 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"SRX17709227"', '"SRX17709228"', '"ERX1234253"', '"SRX9315476"'] + assert path(get(0)).text.contains('Illumina HiSeq 4000') + } + + with(workflow.out.mappings) { + assert path(get(0)).readLines().size() == 5 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"SRX17709227"', '"SRX17709228"', '"ERX1234253"', '"SRX9315476"'] + assert path(get(0)).text.contains('Illumina HiSeq 4000') + } + + with(workflow.out.sample_mappings) { + assert path(get(0)[0]).md5 == "6d4c3e5137704358474330207f5f2b5c" + } + + with(workflow.out.sra_metadata) { + assert get(0).get('experiment_accession') == 'ERX1234253' + assert get(1).get('experiment_accession') == 'SRX17709227' + assert get(2).get('experiment_accession') == 'SRX17709228' + assert get(3).get('experiment_accession') == 'SRX9315476' + } } } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap index 15043ffd..a8f29a95 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap @@ -3,29 +3,181 @@ "content": [ { "0": [ - - ], - "1": [ "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], - "2": [ + "1": [ "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" ], - "3": [ + "2": [ [ "multiqc_config.yml:md5,6d4c3e5137704358474330207f5f2b5c", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], + "3": [ + { + "base_count": "35658", + "experiment_accession": "ERX1234253", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "fastq_1": "ERX1234253_ERR1160846.fastq.gz:md5,b1de59f829fbd2d60a1ed4bc3da55709", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "id": "ERX1234253_ERR1160846", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "10317.BLANK.93.3E.r22", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "read_count": "283", + "run_accession": "ERR1160846", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "sample_accession": "SAMEA3687214", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "sample_description": "American Gut control", + "sample_title": "10317.BLANK.93.3E.r22", + "scientific_name": "metagenome", + "secondary_sample_accession": "ERS994363", + "secondary_study_accession": "ERP012803", + "single_end": true, + "study_accession": "PRJEB11419", + "study_alias": "qiita_sid_10317", + "study_title": "American Gut Project", + "submission_accession": "ERA541392", + "tax_id": "256318" + }, + { + "base_count": "431758", + "experiment_accession": "SRX9315476", + "experiment_alias": "F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "fastq_1": "SRX9315476_SRR12848126_1.fastq.gz:md5,e4e86261d46fc31146e8809e605fd381", + "fastq_2": "SRX9315476_SRR12848126_2.fastq.gz:md5,b154211da872f5a99697097628aa3afb", + "fastq_aspera": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_md5": "", + "id": "SRX9315476_SRR12848126", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "library_layout": "PAIRED", + "library_name": "F11-N1-05", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "md5_1": "", + "md5_2": "", + "read_count": "2954", + "run_accession": "SRR12848126", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "sample_accession": "SAMN16455283", + "sample_alias": "F11-N1-05", + "sample_description": "F11-N1-05", + "sample_title": "Longshanks_F11-N1-05", + "scientific_name": "Mus musculus domesticus", + "secondary_sample_accession": "SRS7540262", + "secondary_study_accession": "SRP287769", + "single_end": false, + "study_accession": "PRJNA670070", + "study_alias": "PRJNA670070", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "submission_accession": "SRA1145417", + "tax_id": "10092" + }, + { + "base_count": "573417800", + "experiment_accession": "SRX17709227", + "experiment_alias": "GSM6601460_r1", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "fastq_1": "SRX17709227_SRR21711856.fastq.gz:md5,1fe5e87cc11c2af1584da9a75e49c4d2", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "id": "SRX17709227_SRR21711856", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "GSM6601460", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "read_count": "11468356", + "run_accession": "SRR21711856", + "run_alias": "GSM6601460_r1", + "sample_accession": "SAMN31021823", + "sample_alias": "GSM6601460", + "sample_description": "sham-treated worms in day 5", + "sample_title": "sham-treated worms in day 5", + "scientific_name": "Caenorhabditis elegans", + "secondary_sample_accession": "SRS15239723", + "secondary_study_accession": "SRP399678", + "single_end": true, + "study_accession": "PRJNA884373", + "study_alias": "GSE214215", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "submission_accession": "SRA1507236", + "tax_id": "6239" + }, + { + "base_count": "677912850", + "experiment_accession": "SRX17709228", + "experiment_alias": "GSM6601461_r1", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "fastq_1": "SRX17709228_SRR21711855.fastq.gz:md5,3a4b64f005eba3923da57a5e61131c2a", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "id": "SRX17709228_SRR21711855", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "GSM6601461", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "read_count": "13558257", + "run_accession": "SRR21711855", + "run_alias": "GSM6601461_r1", + "sample_accession": "SAMN31021822", + "sample_alias": "GSM6601461", + "sample_description": "PM2.5-treated worms in day 5", + "sample_title": "PM2.5-treated worms in day 5", + "scientific_name": "Caenorhabditis elegans", + "secondary_sample_accession": "SRS15239724", + "secondary_study_accession": "SRP399678", + "single_end": true, + "study_accession": "PRJNA884373", + "study_alias": "GSE214215", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "submission_accession": "SRA1507236", + "tax_id": "6239" + } + ], "4": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", "versions.yml:md5,98a3ee9aa3bcc3b080247bccde481bbb", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" - ], - "fastq": [ - ], "mappings": [ "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" @@ -39,6 +191,164 @@ "samplesheet": [ "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], + "sra_metadata": [ + { + "base_count": "35658", + "experiment_accession": "ERX1234253", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "fastq_1": "ERX1234253_ERR1160846.fastq.gz:md5,b1de59f829fbd2d60a1ed4bc3da55709", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "id": "ERX1234253_ERR1160846", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "10317.BLANK.93.3E.r22", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "read_count": "283", + "run_accession": "ERR1160846", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "sample_accession": "SAMEA3687214", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "sample_description": "American Gut control", + "sample_title": "10317.BLANK.93.3E.r22", + "scientific_name": "metagenome", + "secondary_sample_accession": "ERS994363", + "secondary_study_accession": "ERP012803", + "single_end": true, + "study_accession": "PRJEB11419", + "study_alias": "qiita_sid_10317", + "study_title": "American Gut Project", + "submission_accession": "ERA541392", + "tax_id": "256318" + }, + { + "base_count": "431758", + "experiment_accession": "SRX9315476", + "experiment_alias": "F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "fastq_1": "SRX9315476_SRR12848126_1.fastq.gz:md5,e4e86261d46fc31146e8809e605fd381", + "fastq_2": "SRX9315476_SRR12848126_2.fastq.gz:md5,b154211da872f5a99697097628aa3afb", + "fastq_aspera": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_md5": "", + "id": "SRX9315476_SRR12848126", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "library_layout": "PAIRED", + "library_name": "F11-N1-05", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "md5_1": "", + "md5_2": "", + "read_count": "2954", + "run_accession": "SRR12848126", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "sample_accession": "SAMN16455283", + "sample_alias": "F11-N1-05", + "sample_description": "F11-N1-05", + "sample_title": "Longshanks_F11-N1-05", + "scientific_name": "Mus musculus domesticus", + "secondary_sample_accession": "SRS7540262", + "secondary_study_accession": "SRP287769", + "single_end": false, + "study_accession": "PRJNA670070", + "study_alias": "PRJNA670070", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "submission_accession": "SRA1145417", + "tax_id": "10092" + }, + { + "base_count": "573417800", + "experiment_accession": "SRX17709227", + "experiment_alias": "GSM6601460_r1", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "fastq_1": "SRX17709227_SRR21711856.fastq.gz:md5,1fe5e87cc11c2af1584da9a75e49c4d2", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "id": "SRX17709227_SRR21711856", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "GSM6601460", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "read_count": "11468356", + "run_accession": "SRR21711856", + "run_alias": "GSM6601460_r1", + "sample_accession": "SAMN31021823", + "sample_alias": "GSM6601460", + "sample_description": "sham-treated worms in day 5", + "sample_title": "sham-treated worms in day 5", + "scientific_name": "Caenorhabditis elegans", + "secondary_sample_accession": "SRS15239723", + "secondary_study_accession": "SRP399678", + "single_end": true, + "study_accession": "PRJNA884373", + "study_alias": "GSE214215", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "submission_accession": "SRA1507236", + "tax_id": "6239" + }, + { + "base_count": "677912850", + "experiment_accession": "SRX17709228", + "experiment_alias": "GSM6601461_r1", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "fastq_1": "SRX17709228_SRR21711855.fastq.gz:md5,3a4b64f005eba3923da57a5e61131c2a", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "id": "SRX17709228_SRR21711855", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "GSM6601461", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "read_count": "13558257", + "run_accession": "SRR21711855", + "run_alias": "GSM6601461_r1", + "sample_accession": "SAMN31021822", + "sample_alias": "GSM6601461", + "sample_description": "PM2.5-treated worms in day 5", + "sample_title": "PM2.5-treated worms in day 5", + "scientific_name": "Caenorhabditis elegans", + "secondary_sample_accession": "SRS15239724", + "secondary_study_accession": "SRP399678", + "single_end": true, + "study_accession": "PRJNA884373", + "study_alias": "GSE214215", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "submission_accession": "SRA1507236", + "tax_id": "6239" + } + ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", @@ -48,6 +358,6 @@ ] } ], - "timestamp": "2024-01-06T20:40:07.74118" + "timestamp": "2024-01-07T13:31:16.501443" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test b/workflows/sra/tests/sra_skip_fastq_download.nf.test index dd846643..363e246c 100644 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test @@ -23,10 +23,30 @@ nextflow_workflow { } then { - assertAll( - { assert workflow.success }, - { assert snapshot(workflow.out).match() } - ) + assert workflow.success + + with(workflow.out.samplesheet) { + assert path(get(0)).readLines().size() == 5 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"SRX17709227"', '"SRX17709228"', '"ERX1234253"', '"SRX9315476"'] + assert path(get(0)).text.contains('Illumina HiSeq 4000') + } + + with(workflow.out.mappings) { + assert path(get(0)).readLines().size() == 5 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"SRX17709227"', '"SRX17709228"', '"ERX1234253"', '"SRX9315476"'] + assert path(get(0)).text.contains('Illumina HiSeq 4000') + } + + with(workflow.out.sample_mappings) { + assert path(get(0)[0]).md5 == "6d4c3e5137704358474330207f5f2b5c" + } + + with(workflow.out.sra_metadata) { + assert get(0).get('experiment_accession') == 'ERX1234253' + assert get(1).get('experiment_accession') == 'SRX17709227' + assert get(2).get('experiment_accession') == 'SRX17709228' + assert get(3).get('experiment_accession') == 'SRX9315476' + } } } } diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap b/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap index a402abdf..22e9fefc 100644 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap @@ -3,27 +3,179 @@ "content": [ { "0": [ - - ], - "1": [ "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], - "2": [ + "1": [ "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" ], - "3": [ + "2": [ [ "multiqc_config.yml:md5,6d4c3e5137704358474330207f5f2b5c", "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" ] ], + "3": [ + { + "base_count": "35658", + "experiment_accession": "ERX1234253", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "id": "ERX1234253_ERR1160846", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "10317.BLANK.93.3E.r22", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "read_count": "283", + "run_accession": "ERR1160846", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "sample_accession": "SAMEA3687214", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "sample_description": "American Gut control", + "sample_title": "10317.BLANK.93.3E.r22", + "scientific_name": "metagenome", + "secondary_sample_accession": "ERS994363", + "secondary_study_accession": "ERP012803", + "single_end": true, + "study_accession": "PRJEB11419", + "study_alias": "qiita_sid_10317", + "study_title": "American Gut Project", + "submission_accession": "ERA541392", + "tax_id": "256318" + }, + { + "base_count": "431758", + "experiment_accession": "SRX9315476", + "experiment_alias": "F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "fastq_1": "", + "fastq_2": "", + "fastq_aspera": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_md5": "", + "id": "SRX9315476_SRR12848126", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "library_layout": "PAIRED", + "library_name": "F11-N1-05", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "md5_1": "", + "md5_2": "", + "read_count": "2954", + "run_accession": "SRR12848126", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "sample_accession": "SAMN16455283", + "sample_alias": "F11-N1-05", + "sample_description": "F11-N1-05", + "sample_title": "Longshanks_F11-N1-05", + "scientific_name": "Mus musculus domesticus", + "secondary_sample_accession": "SRS7540262", + "secondary_study_accession": "SRP287769", + "single_end": false, + "study_accession": "PRJNA670070", + "study_alias": "PRJNA670070", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "submission_accession": "SRA1145417", + "tax_id": "10092" + }, + { + "base_count": "573417800", + "experiment_accession": "SRX17709227", + "experiment_alias": "GSM6601460_r1", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "id": "SRX17709227_SRR21711856", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "GSM6601460", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "read_count": "11468356", + "run_accession": "SRR21711856", + "run_alias": "GSM6601460_r1", + "sample_accession": "SAMN31021823", + "sample_alias": "GSM6601460", + "sample_description": "sham-treated worms in day 5", + "sample_title": "sham-treated worms in day 5", + "scientific_name": "Caenorhabditis elegans", + "secondary_sample_accession": "SRS15239723", + "secondary_study_accession": "SRP399678", + "single_end": true, + "study_accession": "PRJNA884373", + "study_alias": "GSE214215", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "submission_accession": "SRA1507236", + "tax_id": "6239" + }, + { + "base_count": "677912850", + "experiment_accession": "SRX17709228", + "experiment_alias": "GSM6601461_r1", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "id": "SRX17709228_SRR21711855", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "GSM6601461", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "read_count": "13558257", + "run_accession": "SRR21711855", + "run_alias": "GSM6601461_r1", + "sample_accession": "SAMN31021822", + "sample_alias": "GSM6601461", + "sample_description": "PM2.5-treated worms in day 5", + "sample_title": "PM2.5-treated worms in day 5", + "scientific_name": "Caenorhabditis elegans", + "secondary_sample_accession": "SRS15239724", + "secondary_study_accession": "SRP399678", + "single_end": true, + "study_accession": "PRJNA884373", + "study_alias": "GSE214215", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "submission_accession": "SRA1507236", + "tax_id": "6239" + } + ], "4": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" - ], - "fastq": [ - ], "mappings": [ "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" @@ -37,6 +189,164 @@ "samplesheet": [ "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" ], + "sra_metadata": [ + { + "base_count": "35658", + "experiment_accession": "ERX1234253", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "id": "ERX1234253_ERR1160846", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "10317.BLANK.93.3E.r22", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "read_count": "283", + "run_accession": "ERR1160846", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "sample_accession": "SAMEA3687214", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "sample_description": "American Gut control", + "sample_title": "10317.BLANK.93.3E.r22", + "scientific_name": "metagenome", + "secondary_sample_accession": "ERS994363", + "secondary_study_accession": "ERP012803", + "single_end": true, + "study_accession": "PRJEB11419", + "study_alias": "qiita_sid_10317", + "study_title": "American Gut Project", + "submission_accession": "ERA541392", + "tax_id": "256318" + }, + { + "base_count": "431758", + "experiment_accession": "SRX9315476", + "experiment_alias": "F11-N1-05", + "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "fastq_1": "", + "fastq_2": "", + "fastq_aspera": "", + "fastq_bytes": "", + "fastq_ftp": "", + "fastq_galaxy": "", + "fastq_md5": "", + "id": "SRX9315476_SRR12848126", + "instrument_model": "Illumina HiSeq 3000", + "instrument_platform": "ILLUMINA", + "library_layout": "PAIRED", + "library_name": "F11-N1-05", + "library_selection": "RANDOM PCR", + "library_source": "GENOMIC", + "library_strategy": "Synthetic-Long-Read", + "md5_1": "", + "md5_2": "", + "read_count": "2954", + "run_accession": "SRR12848126", + "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", + "sample_accession": "SAMN16455283", + "sample_alias": "F11-N1-05", + "sample_description": "F11-N1-05", + "sample_title": "Longshanks_F11-N1-05", + "scientific_name": "Mus musculus domesticus", + "secondary_sample_accession": "SRS7540262", + "secondary_study_accession": "SRP287769", + "single_end": false, + "study_accession": "PRJNA670070", + "study_alias": "PRJNA670070", + "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", + "submission_accession": "SRA1145417", + "tax_id": "10092" + }, + { + "base_count": "573417800", + "experiment_accession": "SRX17709227", + "experiment_alias": "GSM6601460_r1", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_bytes": "447377777", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", + "fastq_md5": "7cd1402155befc87be338132d1f31f64", + "id": "SRX17709227_SRR21711856", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "GSM6601460", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "md5_1": "7cd1402155befc87be338132d1f31f64", + "md5_2": "", + "read_count": "11468356", + "run_accession": "SRR21711856", + "run_alias": "GSM6601460_r1", + "sample_accession": "SAMN31021823", + "sample_alias": "GSM6601460", + "sample_description": "sham-treated worms in day 5", + "sample_title": "sham-treated worms in day 5", + "scientific_name": "Caenorhabditis elegans", + "secondary_sample_accession": "SRS15239723", + "secondary_study_accession": "SRP399678", + "single_end": true, + "study_accession": "PRJNA884373", + "study_alias": "GSE214215", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "submission_accession": "SRA1507236", + "tax_id": "6239" + }, + { + "base_count": "677912850", + "experiment_accession": "SRX17709228", + "experiment_alias": "GSM6601461_r1", + "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", + "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_bytes": "529798447", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", + "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", + "id": "SRX17709228_SRR21711855", + "instrument_model": "Illumina HiSeq 4000", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "GSM6601461", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", + "md5_2": "", + "read_count": "13558257", + "run_accession": "SRR21711855", + "run_alias": "GSM6601461_r1", + "sample_accession": "SAMN31021822", + "sample_alias": "GSM6601461", + "sample_description": "PM2.5-treated worms in day 5", + "sample_title": "PM2.5-treated worms in day 5", + "scientific_name": "Caenorhabditis elegans", + "secondary_sample_accession": "SRS15239724", + "secondary_study_accession": "SRP399678", + "single_end": true, + "study_accession": "PRJNA884373", + "study_alias": "GSE214215", + "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", + "submission_accession": "SRA1507236", + "tax_id": "6239" + } + ], "versions": [ "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", @@ -44,6 +354,6 @@ ] } ], - "timestamp": "2024-01-06T20:43:31.440219" + "timestamp": "2024-01-07T13:51:43.062641" } } \ No newline at end of file From 7cc221dc8f8e3761f6c1c28fd0a8f0f56b8fc65d Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 7 Jan 2024 14:16:51 +0000 Subject: [PATCH 624/852] Fix snapshot for sra_skip_fastq_download --- workflows/sra/tests/sra_skip_fastq_download.nf.test | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test b/workflows/sra/tests/sra_skip_fastq_download.nf.test index 363e246c..a08c9afe 100644 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test @@ -43,9 +43,9 @@ nextflow_workflow { with(workflow.out.sra_metadata) { assert get(0).get('experiment_accession') == 'ERX1234253' - assert get(1).get('experiment_accession') == 'SRX17709227' - assert get(2).get('experiment_accession') == 'SRX17709228' - assert get(3).get('experiment_accession') == 'SRX9315476' + assert get(1).get('experiment_accession') == 'SRX9315476' + assert get(2).get('experiment_accession') == 'SRX17709227' + assert get(3).get('experiment_accession') == 'SRX17709228' } } } From f08543d165ad646e477dbea03655bf90bf076695 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 7 Jan 2024 14:26:06 +0000 Subject: [PATCH 625/852] Replace results with outputDir --- workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test | 2 +- workflows/sra/tests/sra_force_sratools_download.nf.test | 2 +- workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test | 2 +- workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test | 2 +- workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test | 2 +- workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test | 2 +- workflows/sra/tests/sra_skip_fastq_download.nf.test | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test index 356128c6..6f6cc260 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test @@ -17,7 +17,7 @@ nextflow_workflow { """ } params { - outdir = "results" + outdir = "$outputDir" nf_core_pipeline = "rnaseq" ena_metadata_fields = "run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5" sample_mapping_fields = "run_accession,library_layout" diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test b/workflows/sra/tests/sra_force_sratools_download.nf.test index 3180d720..f535223c 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test @@ -17,7 +17,7 @@ nextflow_workflow { """ } params { - outdir = "results" + outdir = "$outputDir" force_sratools_download = true } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test index 1bcbbf72..af74f32c 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test @@ -17,7 +17,7 @@ nextflow_workflow { """ } params { - outdir = "results" + outdir = "$outputDir" nf_core_pipeline = "atacseq" } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test index c8be765b..e7367134 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test @@ -17,7 +17,7 @@ nextflow_workflow { """ } params { - outdir = "results" + outdir = "$outputDir" nf_core_pipeline = "rnaseq" } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test index 17ec98da..8d44a6a6 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test @@ -17,7 +17,7 @@ nextflow_workflow { """ } params { - outdir = "results" + outdir = "$outputDir" nf_core_pipeline = "taxprofiler" } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test index 09f2a9d1..592ac0e1 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test @@ -17,7 +17,7 @@ nextflow_workflow { """ } params { - outdir = "results" + outdir = "$outputDir" nf_core_pipeline = "viralrecon" } } diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test b/workflows/sra/tests/sra_skip_fastq_download.nf.test index a08c9afe..857ee78b 100644 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test @@ -17,7 +17,7 @@ nextflow_workflow { """ } params { - outdir = "results" + outdir = "$outputDir" skip_fastq_download = true } } From b0d4905d86d838827a59ec1a959e4888d78311c2 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 7 Jan 2024 14:35:55 +0000 Subject: [PATCH 626/852] Reorder samples in first column of samplesheet and mappings --- workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test | 4 ++-- workflows/sra/tests/sra_force_sratools_download.nf.test | 4 ++-- workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test | 4 ++-- workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test | 4 ++-- workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test | 4 ++-- workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test | 4 ++-- workflows/sra/tests/sra_skip_fastq_download.nf.test | 4 ++-- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test index 6f6cc260..7ac84d16 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test @@ -29,13 +29,13 @@ nextflow_workflow { with(workflow.out.samplesheet) { assert path(get(0)).readLines().size() == 5 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"SRX17709227"', '"SRX17709228"', '"ERX1234253"', '"SRX9315476"'] + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"ERX1234253"', '"SRX17709227"', '"SRX17709228"', '"SRX9315476"'] assert path(get(0)).text.contains('Illumina HiSeq 4000') } with(workflow.out.mappings) { assert path(get(0)).readLines().size() == 5 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"SRX17709227"', '"SRX17709228"', '"ERX1234253"', '"SRX9315476"'] + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"ERX1234253"', '"SRX17709227"', '"SRX17709228"', '"SRX9315476"'] assert path(get(0)).text.contains('Illumina HiSeq 4000') } diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test b/workflows/sra/tests/sra_force_sratools_download.nf.test index f535223c..ed72d48c 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test @@ -27,13 +27,13 @@ nextflow_workflow { with(workflow.out.samplesheet) { assert path(get(0)).readLines().size() == 5 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"SRX17709227"', '"SRX17709228"', '"ERX1234253"', '"SRX9315476"'] + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"ERX1234253"', '"SRX17709227"', '"SRX17709228"', '"SRX9315476"'] assert path(get(0)).text.contains('Illumina HiSeq 4000') } with(workflow.out.mappings) { assert path(get(0)).readLines().size() == 5 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"SRX17709227"', '"SRX17709228"', '"ERX1234253"', '"SRX9315476"'] + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"ERX1234253"', '"SRX17709227"', '"SRX17709228"', '"SRX9315476"'] assert path(get(0)).text.contains('Illumina HiSeq 4000') } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test index af74f32c..7b316778 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test @@ -27,13 +27,13 @@ nextflow_workflow { with(workflow.out.samplesheet) { assert path(get(0)).readLines().size() == 5 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"SRX17709227"', '"SRX17709228"', '"ERX1234253"', '"SRX9315476"'] + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"ERX1234253"', '"SRX17709227"', '"SRX17709228"', '"SRX9315476"'] assert path(get(0)).text.contains('Illumina HiSeq 4000') } with(workflow.out.mappings) { assert path(get(0)).readLines().size() == 5 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"SRX17709227"', '"SRX17709228"', '"ERX1234253"', '"SRX9315476"'] + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"ERX1234253"', '"SRX17709227"', '"SRX17709228"', '"SRX9315476"'] assert path(get(0)).text.contains('Illumina HiSeq 4000') } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test index e7367134..53fcdc91 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test @@ -27,13 +27,13 @@ nextflow_workflow { with(workflow.out.samplesheet) { assert path(get(0)).readLines().size() == 5 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"SRX17709227"', '"SRX17709228"', '"ERX1234253"', '"SRX9315476"'] + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"ERX1234253"', '"SRX17709227"', '"SRX17709228"', '"SRX9315476"'] assert path(get(0)).text.contains('Illumina HiSeq 4000') } with(workflow.out.mappings) { assert path(get(0)).readLines().size() == 5 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"SRX17709227"', '"SRX17709228"', '"ERX1234253"', '"SRX9315476"'] + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"ERX1234253"', '"SRX17709227"', '"SRX17709228"', '"SRX9315476"'] assert path(get(0)).text.contains('Illumina HiSeq 4000') } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test index 8d44a6a6..71605edf 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test @@ -27,13 +27,13 @@ nextflow_workflow { with(workflow.out.samplesheet) { assert path(get(0)).readLines().size() == 5 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"SRX17709227"', '"SRX17709228"', '"ERX1234253"', '"SRX9315476"'] + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"ERX1234253"', '"SRX17709227"', '"SRX17709228"', '"SRX9315476"'] assert path(get(0)).text.contains('Illumina HiSeq 4000') } with(workflow.out.mappings) { assert path(get(0)).readLines().size() == 5 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"SRX17709227"', '"SRX17709228"', '"ERX1234253"', '"SRX9315476"'] + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"ERX1234253"', '"SRX17709227"', '"SRX17709228"', '"SRX9315476"'] assert path(get(0)).text.contains('Illumina HiSeq 4000') } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test index 592ac0e1..3678d9dc 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test @@ -27,13 +27,13 @@ nextflow_workflow { with(workflow.out.samplesheet) { assert path(get(0)).readLines().size() == 5 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"SRX17709227"', '"SRX17709228"', '"ERX1234253"', '"SRX9315476"'] + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"ERX1234253"', '"SRX17709227"', '"SRX17709228"', '"SRX9315476"'] assert path(get(0)).text.contains('Illumina HiSeq 4000') } with(workflow.out.mappings) { assert path(get(0)).readLines().size() == 5 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"SRX17709227"', '"SRX17709228"', '"ERX1234253"', '"SRX9315476"'] + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"ERX1234253"', '"SRX17709227"', '"SRX17709228"', '"SRX9315476"'] assert path(get(0)).text.contains('Illumina HiSeq 4000') } diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test b/workflows/sra/tests/sra_skip_fastq_download.nf.test index 857ee78b..73208ae4 100644 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test @@ -27,13 +27,13 @@ nextflow_workflow { with(workflow.out.samplesheet) { assert path(get(0)).readLines().size() == 5 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"SRX17709227"', '"SRX17709228"', '"ERX1234253"', '"SRX9315476"'] + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"ERX1234253"', '"SRX17709227"', '"SRX17709228"', '"SRX9315476"'] assert path(get(0)).text.contains('Illumina HiSeq 4000') } with(workflow.out.mappings) { assert path(get(0)).readLines().size() == 5 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"SRX17709227"', '"SRX17709228"', '"ERX1234253"', '"SRX9315476"'] + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"ERX1234253"', '"SRX17709227"', '"SRX17709228"', '"SRX9315476"'] assert path(get(0)).text.contains('Illumina HiSeq 4000') } From b7cfca7d9f5f812a12d5084fcb956533c47b7ad4 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 7 Jan 2024 15:47:19 +0000 Subject: [PATCH 627/852] Regenerate snapshots and remove metadata test --- workflows/sra/tests/main.nf.test | 21 ++++++++++++++---- workflows/sra/tests/main.nf.test.snap | 2 +- .../sra_custom_ena_metadata_fields.nf.test | 11 ++-------- ...ra_custom_ena_metadata_fields.nf.test.snap | 10 ++++----- .../tests/sra_force_sratools_download.nf.test | 7 ------ .../sra_force_sratools_download.nf.test.snap | 22 +++++++++---------- .../sra_nf_core_pipeline_atacseq.nf.test | 7 ------ .../sra_nf_core_pipeline_atacseq.nf.test.snap | 10 ++++----- .../tests/sra_nf_core_pipeline_rnaseq.nf.test | 7 ------ .../sra_nf_core_pipeline_rnaseq.nf.test.snap | 10 ++++----- .../sra_nf_core_pipeline_taxprofiler.nf.test | 7 ------ ..._nf_core_pipeline_taxprofiler.nf.test.snap | 10 ++++----- .../sra_nf_core_pipeline_viralrecon.nf.test | 7 ------ ...a_nf_core_pipeline_viralrecon.nf.test.snap | 10 ++++----- .../sra/tests/sra_skip_fastq_download.nf.test | 7 ------ .../sra_skip_fastq_download.nf.test.snap | 10 ++++----- 16 files changed, 61 insertions(+), 97 deletions(-) diff --git a/workflows/sra/tests/main.nf.test b/workflows/sra/tests/main.nf.test index 072c2ebb..a57187b1 100644 --- a/workflows/sra/tests/main.nf.test +++ b/workflows/sra/tests/main.nf.test @@ -22,10 +22,23 @@ nextflow_workflow { } then { - assertAll( - { assert workflow.success }, - { assert snapshot(workflow.out).match() } - ) + assert workflow.success + + with(workflow.out.samplesheet) { + assert path(get(0)).readLines().size() == 5 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"ERX1234253"', '"SRX17709227"', '"SRX17709228"', '"SRX9315476"'] + assert path(get(0)).text.contains('Illumina HiSeq 4000') + } + + with(workflow.out.mappings) { + assert path(get(0)).readLines().size() == 5 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"ERX1234253"', '"SRX17709227"', '"SRX17709228"', '"SRX9315476"'] + assert path(get(0)).text.contains('Illumina HiSeq 4000') + } + + with(workflow.out.sample_mappings) { + assert path(get(0)[0]).md5 == "3bc981f0de28023083cdf13691d249d5" + } } } } diff --git a/workflows/sra/tests/main.nf.test.snap b/workflows/sra/tests/main.nf.test.snap index f525d55d..a7b49740 100644 --- a/workflows/sra/tests/main.nf.test.snap +++ b/workflows/sra/tests/main.nf.test.snap @@ -358,6 +358,6 @@ ] } ], - "timestamp": "2024-01-07T13:27:35.094044" + "timestamp": "2024-01-07T15:01:05.175326" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test index 7ac84d16..008cc258 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test @@ -30,25 +30,18 @@ nextflow_workflow { with(workflow.out.samplesheet) { assert path(get(0)).readLines().size() == 5 assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"ERX1234253"', '"SRX17709227"', '"SRX17709228"', '"SRX9315476"'] - assert path(get(0)).text.contains('Illumina HiSeq 4000') + assert path(get(0)).text.contains('SINGLE') } with(workflow.out.mappings) { assert path(get(0)).readLines().size() == 5 assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"ERX1234253"', '"SRX17709227"', '"SRX17709228"', '"SRX9315476"'] - assert path(get(0)).text.contains('Illumina HiSeq 4000') + assert path(get(0)).text.contains('SINGLE') } with(workflow.out.sample_mappings) { assert path(get(0)[0]).md5 == "3bc981f0de28023083cdf13691d249d5" } - - with(workflow.out.sra_metadata) { - assert get(0).get('experiment_accession') == 'ERX1234253' - assert get(1).get('experiment_accession') == 'SRX17709227' - assert get(2).get('experiment_accession') == 'SRX17709228' - assert get(3).get('experiment_accession') == 'SRX9315476' - } } } } diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap index f182f555..b508d313 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap @@ -3,10 +3,10 @@ "content": [ { "0": [ - "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" + "samplesheet.csv:md5,7cc8031f595157c6ac13ba5067e4bcfb" ], "1": [ - "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" + "id_mappings.csv:md5,7ee50def039a942e0ac8ca63292c8368" ], "2": [ [ @@ -76,7 +76,7 @@ "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" ], "mappings": [ - "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" + "id_mappings.csv:md5,7ee50def039a942e0ac8ca63292c8368" ], "sample_mappings": [ [ @@ -85,7 +85,7 @@ ] ], "samplesheet": [ - "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" + "samplesheet.csv:md5,7cc8031f595157c6ac13ba5067e4bcfb" ], "sra_metadata": [ { @@ -150,6 +150,6 @@ ] } ], - "timestamp": "2024-01-07T13:22:50.246795" + "timestamp": "2024-01-07T14:50:20.141785" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test b/workflows/sra/tests/sra_force_sratools_download.nf.test index ed72d48c..bfb7dfba 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test @@ -40,13 +40,6 @@ nextflow_workflow { with(workflow.out.sample_mappings) { assert path(get(0)[0]).md5 == "6d4c3e5137704358474330207f5f2b5c" } - - with(workflow.out.sra_metadata) { - assert get(0).get('experiment_accession') == 'ERX1234253' - assert get(1).get('experiment_accession') == 'SRX17709227' - assert get(2).get('experiment_accession') == 'SRX17709228' - assert get(3).get('experiment_accession') == 'SRX9315476' - } } } } diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test.snap b/workflows/sra/tests/sra_force_sratools_download.nf.test.snap index 2dcf052c..b0879235 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test.snap +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test.snap @@ -3,10 +3,10 @@ "content": [ { "0": [ - "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" + "samplesheet.csv:md5,0f2c0516990774b5d7d76a7ddf763f55" ], "1": [ - "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" + "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" ], "2": [ [ @@ -20,7 +20,7 @@ "experiment_accession": "ERX1234253", "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", - "fastq_1": "ERX1234253_ERR1160846.fastq.gz:md5,b1de59f829fbd2d60a1ed4bc3da55709", + "fastq_1": "ERX1234253_ERR1160846.fastq.gz:md5,98515d664854f1c96f55ac836fb671b9", "fastq_2": "", "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", "fastq_bytes": "18077", @@ -98,7 +98,7 @@ "experiment_accession": "SRX17709227", "experiment_alias": "GSM6601460_r1", "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "fastq_1": "results/fastq/SRX17709227_SRR21711856_1.fastq.gz", + "fastq_1": "SRX17709227_SRR21711856_1.fastq.gz:md5,5f8db5a1966e244aad03f5bd9ca45b3d", "fastq_2": "", "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", "fastq_bytes": "447377777", @@ -137,7 +137,7 @@ "experiment_accession": "SRX17709228", "experiment_alias": "GSM6601461_r1", "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "fastq_1": "results/fastq/SRX17709228_SRR21711855_1.fastq.gz", + "fastq_1": "SRX17709228_SRR21711855_1.fastq.gz:md5,bb3026b15647a3fc82a62ecb58641924", "fastq_2": "", "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", "fastq_bytes": "529798447", @@ -179,7 +179,7 @@ "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" ], "mappings": [ - "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" + "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" ], "sample_mappings": [ [ @@ -188,7 +188,7 @@ ] ], "samplesheet": [ - "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" + "samplesheet.csv:md5,0f2c0516990774b5d7d76a7ddf763f55" ], "sra_metadata": [ { @@ -196,7 +196,7 @@ "experiment_accession": "ERX1234253", "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", - "fastq_1": "ERX1234253_ERR1160846.fastq.gz:md5,b1de59f829fbd2d60a1ed4bc3da55709", + "fastq_1": "ERX1234253_ERR1160846.fastq.gz:md5,98515d664854f1c96f55ac836fb671b9", "fastq_2": "", "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", "fastq_bytes": "18077", @@ -274,7 +274,7 @@ "experiment_accession": "SRX17709227", "experiment_alias": "GSM6601460_r1", "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "fastq_1": "results/fastq/SRX17709227_SRR21711856_1.fastq.gz", + "fastq_1": "SRX17709227_SRR21711856_1.fastq.gz:md5,5f8db5a1966e244aad03f5bd9ca45b3d", "fastq_2": "", "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", "fastq_bytes": "447377777", @@ -313,7 +313,7 @@ "experiment_accession": "SRX17709228", "experiment_alias": "GSM6601461_r1", "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "fastq_1": "results/fastq/SRX17709228_SRR21711855_1.fastq.gz", + "fastq_1": "SRX17709228_SRR21711855_1.fastq.gz:md5,bb3026b15647a3fc82a62ecb58641924", "fastq_2": "", "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", "fastq_bytes": "529798447", @@ -356,6 +356,6 @@ ] } ], - "timestamp": "2024-01-07T13:36:22.094035" + "timestamp": "2024-01-07T15:09:34.563421" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test index 7b316778..770915a3 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test @@ -40,13 +40,6 @@ nextflow_workflow { with(workflow.out.sample_mappings) { assert path(get(0)[0]).md5 == "6d4c3e5137704358474330207f5f2b5c" } - - with(workflow.out.sra_metadata) { - assert get(0).get('experiment_accession') == 'ERX1234253' - assert get(1).get('experiment_accession') == 'SRX17709227' - assert get(2).get('experiment_accession') == 'SRX17709228' - assert get(3).get('experiment_accession') == 'SRX9315476' - } } } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap index 5dd675d3..9d162743 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap @@ -3,10 +3,10 @@ "content": [ { "0": [ - "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" + "samplesheet.csv:md5,8f985e9dd993b9c826ea095bd377d34a" ], "1": [ - "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" + "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" ], "2": [ [ @@ -180,7 +180,7 @@ "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" ], "mappings": [ - "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" + "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" ], "sample_mappings": [ [ @@ -189,7 +189,7 @@ ] ], "samplesheet": [ - "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" + "samplesheet.csv:md5,8f985e9dd993b9c826ea095bd377d34a" ], "sra_metadata": [ { @@ -358,6 +358,6 @@ ] } ], - "timestamp": "2024-01-07T13:38:47.906835" + "timestamp": "2024-01-07T15:13:47.475783" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test index 53fcdc91..cbf42a53 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test @@ -40,13 +40,6 @@ nextflow_workflow { with(workflow.out.sample_mappings) { assert path(get(0)[0]).md5 == "6d4c3e5137704358474330207f5f2b5c" } - - with(workflow.out.sra_metadata) { - assert get(0).get('experiment_accession') == 'ERX1234253' - assert get(1).get('experiment_accession') == 'SRX17709227' - assert get(2).get('experiment_accession') == 'SRX17709228' - assert get(3).get('experiment_accession') == 'SRX9315476' - } } } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap index b831fe54..93c66f55 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap @@ -3,10 +3,10 @@ "content": [ { "0": [ - "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" + "samplesheet.csv:md5,c0f7d7b70e884c78f90630c695703d7b" ], "1": [ - "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" + "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" ], "2": [ [ @@ -180,7 +180,7 @@ "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" ], "mappings": [ - "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" + "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" ], "sample_mappings": [ [ @@ -189,7 +189,7 @@ ] ], "samplesheet": [ - "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" + "samplesheet.csv:md5,c0f7d7b70e884c78f90630c695703d7b" ], "sra_metadata": [ { @@ -358,6 +358,6 @@ ] } ], - "timestamp": "2024-01-07T13:42:36.795022" + "timestamp": "2024-01-07T15:17:19.511222" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test index 71605edf..db0400c1 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test @@ -40,13 +40,6 @@ nextflow_workflow { with(workflow.out.sample_mappings) { assert path(get(0)[0]).md5 == "6d4c3e5137704358474330207f5f2b5c" } - - with(workflow.out.sra_metadata) { - assert get(0).get('experiment_accession') == 'ERX1234253' - assert get(1).get('experiment_accession') == 'SRX17709227' - assert get(2).get('experiment_accession') == 'SRX17709228' - assert get(3).get('experiment_accession') == 'SRX9315476' - } } } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap index d7463e04..27e12abd 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap @@ -3,10 +3,10 @@ "content": [ { "0": [ - "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" + "samplesheet.csv:md5,fe3c7ba9e7b7debe07291d6125f9edc7" ], "1": [ - "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" + "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" ], "2": [ [ @@ -180,7 +180,7 @@ "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" ], "mappings": [ - "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" + "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" ], "sample_mappings": [ [ @@ -189,7 +189,7 @@ ] ], "samplesheet": [ - "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" + "samplesheet.csv:md5,fe3c7ba9e7b7debe07291d6125f9edc7" ], "sra_metadata": [ { @@ -358,6 +358,6 @@ ] } ], - "timestamp": "2024-01-07T13:46:25.989024" + "timestamp": "2024-01-07T15:21:54.519934" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test index 3678d9dc..e13f83b3 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test @@ -40,13 +40,6 @@ nextflow_workflow { with(workflow.out.sample_mappings) { assert path(get(0)[0]).md5 == "6d4c3e5137704358474330207f5f2b5c" } - - with(workflow.out.sra_metadata) { - assert get(0).get('experiment_accession') == 'ERX1234253' - assert get(1).get('experiment_accession') == 'SRX17709227' - assert get(2).get('experiment_accession') == 'SRX17709228' - assert get(3).get('experiment_accession') == 'SRX9315476' - } } } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap index a8f29a95..60708a54 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap @@ -3,10 +3,10 @@ "content": [ { "0": [ - "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" + "samplesheet.csv:md5,99a3fd9fe3c7cad8184b1bbeadd89c45" ], "1": [ - "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" + "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" ], "2": [ [ @@ -180,7 +180,7 @@ "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" ], "mappings": [ - "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" + "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" ], "sample_mappings": [ [ @@ -189,7 +189,7 @@ ] ], "samplesheet": [ - "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" + "samplesheet.csv:md5,99a3fd9fe3c7cad8184b1bbeadd89c45" ], "sra_metadata": [ { @@ -358,6 +358,6 @@ ] } ], - "timestamp": "2024-01-07T13:31:16.501443" + "timestamp": "2024-01-07T15:04:57.029889" } } \ No newline at end of file diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test b/workflows/sra/tests/sra_skip_fastq_download.nf.test index 73208ae4..f5805367 100644 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test @@ -40,13 +40,6 @@ nextflow_workflow { with(workflow.out.sample_mappings) { assert path(get(0)[0]).md5 == "6d4c3e5137704358474330207f5f2b5c" } - - with(workflow.out.sra_metadata) { - assert get(0).get('experiment_accession') == 'ERX1234253' - assert get(1).get('experiment_accession') == 'SRX9315476' - assert get(2).get('experiment_accession') == 'SRX17709227' - assert get(3).get('experiment_accession') == 'SRX17709228' - } } } } diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap b/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap index 22e9fefc..252392d7 100644 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap @@ -3,10 +3,10 @@ "content": [ { "0": [ - "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" + "samplesheet.csv:md5,eb18025bb1cb97a4fe399ca16757d2db" ], "1": [ - "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" + "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" ], "2": [ [ @@ -178,7 +178,7 @@ "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" ], "mappings": [ - "id_mappings.csv:md5,ca34293cf91a004ea52627dd8b58a43a" + "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" ], "sample_mappings": [ [ @@ -187,7 +187,7 @@ ] ], "samplesheet": [ - "samplesheet.csv:md5,81856795ac19f44aeb72ae5b3042e609" + "samplesheet.csv:md5,eb18025bb1cb97a4fe399ca16757d2db" ], "sra_metadata": [ { @@ -354,6 +354,6 @@ ] } ], - "timestamp": "2024-01-07T13:51:43.062641" + "timestamp": "2024-01-07T15:11:52.542678" } } \ No newline at end of file From f705af88bcb6fe2b8cda1de9a619ded8c2f0609e Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 7 Jan 2024 22:37:54 +0000 Subject: [PATCH 628/852] Remove all workflow snapshots --- workflows/sra/tests/main.nf.test.snap | 363 ------------------ ...ra_custom_ena_metadata_fields.nf.test.snap | 155 -------- .../sra_force_sratools_download.nf.test.snap | 361 ----------------- .../sra_nf_core_pipeline_atacseq.nf.test.snap | 363 ------------------ .../sra_nf_core_pipeline_rnaseq.nf.test.snap | 363 ------------------ ..._nf_core_pipeline_taxprofiler.nf.test.snap | 363 ------------------ ...a_nf_core_pipeline_viralrecon.nf.test.snap | 363 ------------------ .../sra_skip_fastq_download.nf.test.snap | 359 ----------------- 8 files changed, 2690 deletions(-) delete mode 100644 workflows/sra/tests/main.nf.test.snap delete mode 100644 workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap delete mode 100644 workflows/sra/tests/sra_force_sratools_download.nf.test.snap delete mode 100644 workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap delete mode 100644 workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap delete mode 100644 workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap delete mode 100644 workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap delete mode 100644 workflows/sra/tests/sra_skip_fastq_download.nf.test.snap diff --git a/workflows/sra/tests/main.nf.test.snap b/workflows/sra/tests/main.nf.test.snap deleted file mode 100644 index a7b49740..00000000 --- a/workflows/sra/tests/main.nf.test.snap +++ /dev/null @@ -1,363 +0,0 @@ -{ - "Parameters: default": { - "content": [ - { - "0": [ - "samplesheet.csv:md5,d252b222b8ef94670117780d43498b86" - ], - "1": [ - "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" - ], - "2": [ - [ - "multiqc_config.yml:md5,6d4c3e5137704358474330207f5f2b5c", - "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" - ] - ], - "3": [ - { - "base_count": "35658", - "experiment_accession": "ERX1234253", - "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", - "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", - "fastq_1": "ERX1234253_ERR1160846.fastq.gz:md5,b1de59f829fbd2d60a1ed4bc3da55709", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_bytes": "18077", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", - "id": "ERX1234253_ERR1160846", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "10317.BLANK.93.3E.r22", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", - "md5_2": "", - "read_count": "283", - "run_accession": "ERR1160846", - "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", - "sample_accession": "SAMEA3687214", - "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", - "sample_description": "American Gut control", - "sample_title": "10317.BLANK.93.3E.r22", - "scientific_name": "metagenome", - "secondary_sample_accession": "ERS994363", - "secondary_study_accession": "ERP012803", - "single_end": true, - "study_accession": "PRJEB11419", - "study_alias": "qiita_sid_10317", - "study_title": "American Gut Project", - "submission_accession": "ERA541392", - "tax_id": "256318" - }, - { - "base_count": "431758", - "experiment_accession": "SRX9315476", - "experiment_alias": "F11-N1-05", - "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "fastq_1": "SRX9315476_SRR12848126_1.fastq.gz:md5,e4e86261d46fc31146e8809e605fd381", - "fastq_2": "SRX9315476_SRR12848126_2.fastq.gz:md5,b154211da872f5a99697097628aa3afb", - "fastq_aspera": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_md5": "", - "id": "SRX9315476_SRR12848126", - "instrument_model": "Illumina HiSeq 3000", - "instrument_platform": "ILLUMINA", - "library_layout": "PAIRED", - "library_name": "F11-N1-05", - "library_selection": "RANDOM PCR", - "library_source": "GENOMIC", - "library_strategy": "Synthetic-Long-Read", - "md5_1": "", - "md5_2": "", - "read_count": "2954", - "run_accession": "SRR12848126", - "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", - "sample_accession": "SAMN16455283", - "sample_alias": "F11-N1-05", - "sample_description": "F11-N1-05", - "sample_title": "Longshanks_F11-N1-05", - "scientific_name": "Mus musculus domesticus", - "secondary_sample_accession": "SRS7540262", - "secondary_study_accession": "SRP287769", - "single_end": false, - "study_accession": "PRJNA670070", - "study_alias": "PRJNA670070", - "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "submission_accession": "SRA1145417", - "tax_id": "10092" - }, - { - "base_count": "573417800", - "experiment_accession": "SRX17709227", - "experiment_alias": "GSM6601460_r1", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "fastq_1": "SRX17709227_SRR21711856.fastq.gz:md5,1fe5e87cc11c2af1584da9a75e49c4d2", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_bytes": "447377777", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_md5": "7cd1402155befc87be338132d1f31f64", - "id": "SRX17709227_SRR21711856", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "GSM6601460", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "md5_1": "7cd1402155befc87be338132d1f31f64", - "md5_2": "", - "read_count": "11468356", - "run_accession": "SRR21711856", - "run_alias": "GSM6601460_r1", - "sample_accession": "SAMN31021823", - "sample_alias": "GSM6601460", - "sample_description": "sham-treated worms in day 5", - "sample_title": "sham-treated worms in day 5", - "scientific_name": "Caenorhabditis elegans", - "secondary_sample_accession": "SRS15239723", - "secondary_study_accession": "SRP399678", - "single_end": true, - "study_accession": "PRJNA884373", - "study_alias": "GSE214215", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "submission_accession": "SRA1507236", - "tax_id": "6239" - }, - { - "base_count": "677912850", - "experiment_accession": "SRX17709228", - "experiment_alias": "GSM6601461_r1", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "fastq_1": "SRX17709228_SRR21711855.fastq.gz:md5,3a4b64f005eba3923da57a5e61131c2a", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_bytes": "529798447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", - "id": "SRX17709228_SRR21711855", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "GSM6601461", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", - "md5_2": "", - "read_count": "13558257", - "run_accession": "SRR21711855", - "run_alias": "GSM6601461_r1", - "sample_accession": "SAMN31021822", - "sample_alias": "GSM6601461", - "sample_description": "PM2.5-treated worms in day 5", - "sample_title": "PM2.5-treated worms in day 5", - "scientific_name": "Caenorhabditis elegans", - "secondary_sample_accession": "SRS15239724", - "secondary_study_accession": "SRP399678", - "single_end": true, - "study_accession": "PRJNA884373", - "study_alias": "GSE214215", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "submission_accession": "SRA1507236", - "tax_id": "6239" - } - ], - "4": [ - "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", - "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", - "versions.yml:md5,98a3ee9aa3bcc3b080247bccde481bbb", - "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" - ], - "mappings": [ - "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" - ], - "sample_mappings": [ - [ - "multiqc_config.yml:md5,6d4c3e5137704358474330207f5f2b5c", - "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" - ] - ], - "samplesheet": [ - "samplesheet.csv:md5,d252b222b8ef94670117780d43498b86" - ], - "sra_metadata": [ - { - "base_count": "35658", - "experiment_accession": "ERX1234253", - "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", - "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", - "fastq_1": "ERX1234253_ERR1160846.fastq.gz:md5,b1de59f829fbd2d60a1ed4bc3da55709", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_bytes": "18077", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", - "id": "ERX1234253_ERR1160846", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "10317.BLANK.93.3E.r22", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", - "md5_2": "", - "read_count": "283", - "run_accession": "ERR1160846", - "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", - "sample_accession": "SAMEA3687214", - "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", - "sample_description": "American Gut control", - "sample_title": "10317.BLANK.93.3E.r22", - "scientific_name": "metagenome", - "secondary_sample_accession": "ERS994363", - "secondary_study_accession": "ERP012803", - "single_end": true, - "study_accession": "PRJEB11419", - "study_alias": "qiita_sid_10317", - "study_title": "American Gut Project", - "submission_accession": "ERA541392", - "tax_id": "256318" - }, - { - "base_count": "431758", - "experiment_accession": "SRX9315476", - "experiment_alias": "F11-N1-05", - "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "fastq_1": "SRX9315476_SRR12848126_1.fastq.gz:md5,e4e86261d46fc31146e8809e605fd381", - "fastq_2": "SRX9315476_SRR12848126_2.fastq.gz:md5,b154211da872f5a99697097628aa3afb", - "fastq_aspera": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_md5": "", - "id": "SRX9315476_SRR12848126", - "instrument_model": "Illumina HiSeq 3000", - "instrument_platform": "ILLUMINA", - "library_layout": "PAIRED", - "library_name": "F11-N1-05", - "library_selection": "RANDOM PCR", - "library_source": "GENOMIC", - "library_strategy": "Synthetic-Long-Read", - "md5_1": "", - "md5_2": "", - "read_count": "2954", - "run_accession": "SRR12848126", - "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", - "sample_accession": "SAMN16455283", - "sample_alias": "F11-N1-05", - "sample_description": "F11-N1-05", - "sample_title": "Longshanks_F11-N1-05", - "scientific_name": "Mus musculus domesticus", - "secondary_sample_accession": "SRS7540262", - "secondary_study_accession": "SRP287769", - "single_end": false, - "study_accession": "PRJNA670070", - "study_alias": "PRJNA670070", - "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "submission_accession": "SRA1145417", - "tax_id": "10092" - }, - { - "base_count": "573417800", - "experiment_accession": "SRX17709227", - "experiment_alias": "GSM6601460_r1", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "fastq_1": "SRX17709227_SRR21711856.fastq.gz:md5,1fe5e87cc11c2af1584da9a75e49c4d2", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_bytes": "447377777", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_md5": "7cd1402155befc87be338132d1f31f64", - "id": "SRX17709227_SRR21711856", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "GSM6601460", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "md5_1": "7cd1402155befc87be338132d1f31f64", - "md5_2": "", - "read_count": "11468356", - "run_accession": "SRR21711856", - "run_alias": "GSM6601460_r1", - "sample_accession": "SAMN31021823", - "sample_alias": "GSM6601460", - "sample_description": "sham-treated worms in day 5", - "sample_title": "sham-treated worms in day 5", - "scientific_name": "Caenorhabditis elegans", - "secondary_sample_accession": "SRS15239723", - "secondary_study_accession": "SRP399678", - "single_end": true, - "study_accession": "PRJNA884373", - "study_alias": "GSE214215", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "submission_accession": "SRA1507236", - "tax_id": "6239" - }, - { - "base_count": "677912850", - "experiment_accession": "SRX17709228", - "experiment_alias": "GSM6601461_r1", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "fastq_1": "SRX17709228_SRR21711855.fastq.gz:md5,3a4b64f005eba3923da57a5e61131c2a", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_bytes": "529798447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", - "id": "SRX17709228_SRR21711855", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "GSM6601461", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", - "md5_2": "", - "read_count": "13558257", - "run_accession": "SRR21711855", - "run_alias": "GSM6601461_r1", - "sample_accession": "SAMN31021822", - "sample_alias": "GSM6601461", - "sample_description": "PM2.5-treated worms in day 5", - "sample_title": "PM2.5-treated worms in day 5", - "scientific_name": "Caenorhabditis elegans", - "secondary_sample_accession": "SRS15239724", - "secondary_study_accession": "SRP399678", - "single_end": true, - "study_accession": "PRJNA884373", - "study_alias": "GSE214215", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "submission_accession": "SRA1507236", - "tax_id": "6239" - } - ], - "versions": [ - "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", - "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", - "versions.yml:md5,98a3ee9aa3bcc3b080247bccde481bbb", - "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" - ] - } - ], - "timestamp": "2024-01-07T15:01:05.175326" - } -} \ No newline at end of file diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap deleted file mode 100644 index b508d313..00000000 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test.snap +++ /dev/null @@ -1,155 +0,0 @@ -{ - "Parameters: --nf_core_pipeline rnaseq --ena_metadata_fields ... --sample_mapping_fields ...": { - "content": [ - { - "0": [ - "samplesheet.csv:md5,7cc8031f595157c6ac13ba5067e4bcfb" - ], - "1": [ - "id_mappings.csv:md5,7ee50def039a942e0ac8ca63292c8368" - ], - "2": [ - [ - "multiqc_config.yml:md5,3bc981f0de28023083cdf13691d249d5", - "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" - ] - ], - "3": [ - { - "experiment_accession": "ERX1234253", - "fastq_1": "ERX1234253_ERR1160846.fastq.gz:md5,b1de59f829fbd2d60a1ed4bc3da55709", - "fastq_2": "", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", - "id": "ERX1234253_ERR1160846", - "library_layout": "SINGLE", - "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", - "md5_2": "", - "run_accession": "ERR1160846", - "single_end": true - }, - { - "experiment_accession": "SRX17709227", - "fastq_1": "SRX17709227_SRR21711856.fastq.gz:md5,1fe5e87cc11c2af1584da9a75e49c4d2", - "fastq_2": "", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_md5": "7cd1402155befc87be338132d1f31f64", - "id": "SRX17709227_SRR21711856", - "library_layout": "SINGLE", - "md5_1": "7cd1402155befc87be338132d1f31f64", - "md5_2": "", - "run_accession": "SRR21711856", - "single_end": true - }, - { - "experiment_accession": "SRX17709228", - "fastq_1": "SRX17709228_SRR21711855.fastq.gz:md5,3a4b64f005eba3923da57a5e61131c2a", - "fastq_2": "", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", - "id": "SRX17709228_SRR21711855", - "library_layout": "SINGLE", - "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", - "md5_2": "", - "run_accession": "SRR21711855", - "single_end": true - }, - { - "experiment_accession": "SRX9315476", - "fastq_1": "SRX9315476_SRR12848126_1.fastq.gz:md5,e4e86261d46fc31146e8809e605fd381", - "fastq_2": "SRX9315476_SRR12848126_2.fastq.gz:md5,b154211da872f5a99697097628aa3afb", - "fastq_ftp": "", - "fastq_md5": "", - "id": "SRX9315476_SRR12848126", - "library_layout": "PAIRED", - "md5_1": "", - "md5_2": "", - "run_accession": "SRR12848126", - "single_end": false - } - ], - "4": [ - "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", - "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", - "versions.yml:md5,98a3ee9aa3bcc3b080247bccde481bbb", - "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" - ], - "mappings": [ - "id_mappings.csv:md5,7ee50def039a942e0ac8ca63292c8368" - ], - "sample_mappings": [ - [ - "multiqc_config.yml:md5,3bc981f0de28023083cdf13691d249d5", - "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" - ] - ], - "samplesheet": [ - "samplesheet.csv:md5,7cc8031f595157c6ac13ba5067e4bcfb" - ], - "sra_metadata": [ - { - "experiment_accession": "ERX1234253", - "fastq_1": "ERX1234253_ERR1160846.fastq.gz:md5,b1de59f829fbd2d60a1ed4bc3da55709", - "fastq_2": "", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", - "id": "ERX1234253_ERR1160846", - "library_layout": "SINGLE", - "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", - "md5_2": "", - "run_accession": "ERR1160846", - "single_end": true - }, - { - "experiment_accession": "SRX17709227", - "fastq_1": "SRX17709227_SRR21711856.fastq.gz:md5,1fe5e87cc11c2af1584da9a75e49c4d2", - "fastq_2": "", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_md5": "7cd1402155befc87be338132d1f31f64", - "id": "SRX17709227_SRR21711856", - "library_layout": "SINGLE", - "md5_1": "7cd1402155befc87be338132d1f31f64", - "md5_2": "", - "run_accession": "SRR21711856", - "single_end": true - }, - { - "experiment_accession": "SRX17709228", - "fastq_1": "SRX17709228_SRR21711855.fastq.gz:md5,3a4b64f005eba3923da57a5e61131c2a", - "fastq_2": "", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", - "id": "SRX17709228_SRR21711855", - "library_layout": "SINGLE", - "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", - "md5_2": "", - "run_accession": "SRR21711855", - "single_end": true - }, - { - "experiment_accession": "SRX9315476", - "fastq_1": "SRX9315476_SRR12848126_1.fastq.gz:md5,e4e86261d46fc31146e8809e605fd381", - "fastq_2": "SRX9315476_SRR12848126_2.fastq.gz:md5,b154211da872f5a99697097628aa3afb", - "fastq_ftp": "", - "fastq_md5": "", - "id": "SRX9315476_SRR12848126", - "library_layout": "PAIRED", - "md5_1": "", - "md5_2": "", - "run_accession": "SRR12848126", - "single_end": false - } - ], - "versions": [ - "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", - "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", - "versions.yml:md5,98a3ee9aa3bcc3b080247bccde481bbb", - "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" - ] - } - ], - "timestamp": "2024-01-07T14:50:20.141785" - } -} \ No newline at end of file diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test.snap b/workflows/sra/tests/sra_force_sratools_download.nf.test.snap deleted file mode 100644 index b0879235..00000000 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test.snap +++ /dev/null @@ -1,361 +0,0 @@ -{ - "Parameters: --force_sratools_download": { - "content": [ - { - "0": [ - "samplesheet.csv:md5,0f2c0516990774b5d7d76a7ddf763f55" - ], - "1": [ - "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" - ], - "2": [ - [ - "multiqc_config.yml:md5,6d4c3e5137704358474330207f5f2b5c", - "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" - ] - ], - "3": [ - { - "base_count": "35658", - "experiment_accession": "ERX1234253", - "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", - "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", - "fastq_1": "ERX1234253_ERR1160846.fastq.gz:md5,98515d664854f1c96f55ac836fb671b9", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_bytes": "18077", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", - "id": "ERX1234253_ERR1160846", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "10317.BLANK.93.3E.r22", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", - "md5_2": "", - "read_count": "283", - "run_accession": "ERR1160846", - "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", - "sample_accession": "SAMEA3687214", - "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", - "sample_description": "American Gut control", - "sample_title": "10317.BLANK.93.3E.r22", - "scientific_name": "metagenome", - "secondary_sample_accession": "ERS994363", - "secondary_study_accession": "ERP012803", - "single_end": true, - "study_accession": "PRJEB11419", - "study_alias": "qiita_sid_10317", - "study_title": "American Gut Project", - "submission_accession": "ERA541392", - "tax_id": "256318" - }, - { - "base_count": "431758", - "experiment_accession": "SRX9315476", - "experiment_alias": "F11-N1-05", - "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "fastq_1": "SRX9315476_SRR12848126_1.fastq.gz:md5,e4e86261d46fc31146e8809e605fd381", - "fastq_2": "SRX9315476_SRR12848126_2.fastq.gz:md5,b154211da872f5a99697097628aa3afb", - "fastq_aspera": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_md5": "", - "id": "SRX9315476_SRR12848126", - "instrument_model": "Illumina HiSeq 3000", - "instrument_platform": "ILLUMINA", - "library_layout": "PAIRED", - "library_name": "F11-N1-05", - "library_selection": "RANDOM PCR", - "library_source": "GENOMIC", - "library_strategy": "Synthetic-Long-Read", - "md5_1": "", - "md5_2": "", - "read_count": "2954", - "run_accession": "SRR12848126", - "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", - "sample_accession": "SAMN16455283", - "sample_alias": "F11-N1-05", - "sample_description": "F11-N1-05", - "sample_title": "Longshanks_F11-N1-05", - "scientific_name": "Mus musculus domesticus", - "secondary_sample_accession": "SRS7540262", - "secondary_study_accession": "SRP287769", - "single_end": false, - "study_accession": "PRJNA670070", - "study_alias": "PRJNA670070", - "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "submission_accession": "SRA1145417", - "tax_id": "10092" - }, - { - "base_count": "573417800", - "experiment_accession": "SRX17709227", - "experiment_alias": "GSM6601460_r1", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "fastq_1": "SRX17709227_SRR21711856_1.fastq.gz:md5,5f8db5a1966e244aad03f5bd9ca45b3d", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_bytes": "447377777", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_md5": "7cd1402155befc87be338132d1f31f64", - "id": "SRX17709227_SRR21711856", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "GSM6601460", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "md5_1": "7cd1402155befc87be338132d1f31f64", - "md5_2": "", - "read_count": "11468356", - "run_accession": "SRR21711856", - "run_alias": "GSM6601460_r1", - "sample_accession": "SAMN31021823", - "sample_alias": "GSM6601460", - "sample_description": "sham-treated worms in day 5", - "sample_title": "sham-treated worms in day 5", - "scientific_name": "Caenorhabditis elegans", - "secondary_sample_accession": "SRS15239723", - "secondary_study_accession": "SRP399678", - "single_end": true, - "study_accession": "PRJNA884373", - "study_alias": "GSE214215", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "submission_accession": "SRA1507236", - "tax_id": "6239" - }, - { - "base_count": "677912850", - "experiment_accession": "SRX17709228", - "experiment_alias": "GSM6601461_r1", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "fastq_1": "SRX17709228_SRR21711855_1.fastq.gz:md5,bb3026b15647a3fc82a62ecb58641924", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_bytes": "529798447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", - "id": "SRX17709228_SRR21711855", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "GSM6601461", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", - "md5_2": "", - "read_count": "13558257", - "run_accession": "SRR21711855", - "run_alias": "GSM6601461_r1", - "sample_accession": "SAMN31021822", - "sample_alias": "GSM6601461", - "sample_description": "PM2.5-treated worms in day 5", - "sample_title": "PM2.5-treated worms in day 5", - "scientific_name": "Caenorhabditis elegans", - "secondary_sample_accession": "SRS15239724", - "secondary_study_accession": "SRP399678", - "single_end": true, - "study_accession": "PRJNA884373", - "study_alias": "GSE214215", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "submission_accession": "SRA1507236", - "tax_id": "6239" - } - ], - "4": [ - "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", - "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", - "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" - ], - "mappings": [ - "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" - ], - "sample_mappings": [ - [ - "multiqc_config.yml:md5,6d4c3e5137704358474330207f5f2b5c", - "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" - ] - ], - "samplesheet": [ - "samplesheet.csv:md5,0f2c0516990774b5d7d76a7ddf763f55" - ], - "sra_metadata": [ - { - "base_count": "35658", - "experiment_accession": "ERX1234253", - "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", - "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", - "fastq_1": "ERX1234253_ERR1160846.fastq.gz:md5,98515d664854f1c96f55ac836fb671b9", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_bytes": "18077", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", - "id": "ERX1234253_ERR1160846", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "10317.BLANK.93.3E.r22", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", - "md5_2": "", - "read_count": "283", - "run_accession": "ERR1160846", - "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", - "sample_accession": "SAMEA3687214", - "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", - "sample_description": "American Gut control", - "sample_title": "10317.BLANK.93.3E.r22", - "scientific_name": "metagenome", - "secondary_sample_accession": "ERS994363", - "secondary_study_accession": "ERP012803", - "single_end": true, - "study_accession": "PRJEB11419", - "study_alias": "qiita_sid_10317", - "study_title": "American Gut Project", - "submission_accession": "ERA541392", - "tax_id": "256318" - }, - { - "base_count": "431758", - "experiment_accession": "SRX9315476", - "experiment_alias": "F11-N1-05", - "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "fastq_1": "SRX9315476_SRR12848126_1.fastq.gz:md5,e4e86261d46fc31146e8809e605fd381", - "fastq_2": "SRX9315476_SRR12848126_2.fastq.gz:md5,b154211da872f5a99697097628aa3afb", - "fastq_aspera": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_md5": "", - "id": "SRX9315476_SRR12848126", - "instrument_model": "Illumina HiSeq 3000", - "instrument_platform": "ILLUMINA", - "library_layout": "PAIRED", - "library_name": "F11-N1-05", - "library_selection": "RANDOM PCR", - "library_source": "GENOMIC", - "library_strategy": "Synthetic-Long-Read", - "md5_1": "", - "md5_2": "", - "read_count": "2954", - "run_accession": "SRR12848126", - "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", - "sample_accession": "SAMN16455283", - "sample_alias": "F11-N1-05", - "sample_description": "F11-N1-05", - "sample_title": "Longshanks_F11-N1-05", - "scientific_name": "Mus musculus domesticus", - "secondary_sample_accession": "SRS7540262", - "secondary_study_accession": "SRP287769", - "single_end": false, - "study_accession": "PRJNA670070", - "study_alias": "PRJNA670070", - "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "submission_accession": "SRA1145417", - "tax_id": "10092" - }, - { - "base_count": "573417800", - "experiment_accession": "SRX17709227", - "experiment_alias": "GSM6601460_r1", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "fastq_1": "SRX17709227_SRR21711856_1.fastq.gz:md5,5f8db5a1966e244aad03f5bd9ca45b3d", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_bytes": "447377777", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_md5": "7cd1402155befc87be338132d1f31f64", - "id": "SRX17709227_SRR21711856", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "GSM6601460", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "md5_1": "7cd1402155befc87be338132d1f31f64", - "md5_2": "", - "read_count": "11468356", - "run_accession": "SRR21711856", - "run_alias": "GSM6601460_r1", - "sample_accession": "SAMN31021823", - "sample_alias": "GSM6601460", - "sample_description": "sham-treated worms in day 5", - "sample_title": "sham-treated worms in day 5", - "scientific_name": "Caenorhabditis elegans", - "secondary_sample_accession": "SRS15239723", - "secondary_study_accession": "SRP399678", - "single_end": true, - "study_accession": "PRJNA884373", - "study_alias": "GSE214215", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "submission_accession": "SRA1507236", - "tax_id": "6239" - }, - { - "base_count": "677912850", - "experiment_accession": "SRX17709228", - "experiment_alias": "GSM6601461_r1", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "fastq_1": "SRX17709228_SRR21711855_1.fastq.gz:md5,bb3026b15647a3fc82a62ecb58641924", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_bytes": "529798447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", - "id": "SRX17709228_SRR21711855", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "GSM6601461", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", - "md5_2": "", - "read_count": "13558257", - "run_accession": "SRR21711855", - "run_alias": "GSM6601461_r1", - "sample_accession": "SAMN31021822", - "sample_alias": "GSM6601461", - "sample_description": "PM2.5-treated worms in day 5", - "sample_title": "PM2.5-treated worms in day 5", - "scientific_name": "Caenorhabditis elegans", - "secondary_sample_accession": "SRS15239724", - "secondary_study_accession": "SRP399678", - "single_end": true, - "study_accession": "PRJNA884373", - "study_alias": "GSE214215", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "submission_accession": "SRA1507236", - "tax_id": "6239" - } - ], - "versions": [ - "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", - "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", - "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" - ] - } - ], - "timestamp": "2024-01-07T15:09:34.563421" - } -} \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap deleted file mode 100644 index 9d162743..00000000 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test.snap +++ /dev/null @@ -1,363 +0,0 @@ -{ - "Parameters: --nf_core_pipeline atacseq": { - "content": [ - { - "0": [ - "samplesheet.csv:md5,8f985e9dd993b9c826ea095bd377d34a" - ], - "1": [ - "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" - ], - "2": [ - [ - "multiqc_config.yml:md5,6d4c3e5137704358474330207f5f2b5c", - "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" - ] - ], - "3": [ - { - "base_count": "35658", - "experiment_accession": "ERX1234253", - "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", - "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", - "fastq_1": "ERX1234253_ERR1160846.fastq.gz:md5,b1de59f829fbd2d60a1ed4bc3da55709", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_bytes": "18077", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", - "id": "ERX1234253_ERR1160846", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "10317.BLANK.93.3E.r22", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", - "md5_2": "", - "read_count": "283", - "run_accession": "ERR1160846", - "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", - "sample_accession": "SAMEA3687214", - "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", - "sample_description": "American Gut control", - "sample_title": "10317.BLANK.93.3E.r22", - "scientific_name": "metagenome", - "secondary_sample_accession": "ERS994363", - "secondary_study_accession": "ERP012803", - "single_end": true, - "study_accession": "PRJEB11419", - "study_alias": "qiita_sid_10317", - "study_title": "American Gut Project", - "submission_accession": "ERA541392", - "tax_id": "256318" - }, - { - "base_count": "431758", - "experiment_accession": "SRX9315476", - "experiment_alias": "F11-N1-05", - "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "fastq_1": "SRX9315476_SRR12848126_1.fastq.gz:md5,e4e86261d46fc31146e8809e605fd381", - "fastq_2": "SRX9315476_SRR12848126_2.fastq.gz:md5,b154211da872f5a99697097628aa3afb", - "fastq_aspera": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_md5": "", - "id": "SRX9315476_SRR12848126", - "instrument_model": "Illumina HiSeq 3000", - "instrument_platform": "ILLUMINA", - "library_layout": "PAIRED", - "library_name": "F11-N1-05", - "library_selection": "RANDOM PCR", - "library_source": "GENOMIC", - "library_strategy": "Synthetic-Long-Read", - "md5_1": "", - "md5_2": "", - "read_count": "2954", - "run_accession": "SRR12848126", - "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", - "sample_accession": "SAMN16455283", - "sample_alias": "F11-N1-05", - "sample_description": "F11-N1-05", - "sample_title": "Longshanks_F11-N1-05", - "scientific_name": "Mus musculus domesticus", - "secondary_sample_accession": "SRS7540262", - "secondary_study_accession": "SRP287769", - "single_end": false, - "study_accession": "PRJNA670070", - "study_alias": "PRJNA670070", - "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "submission_accession": "SRA1145417", - "tax_id": "10092" - }, - { - "base_count": "573417800", - "experiment_accession": "SRX17709227", - "experiment_alias": "GSM6601460_r1", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "fastq_1": "SRX17709227_SRR21711856.fastq.gz:md5,1fe5e87cc11c2af1584da9a75e49c4d2", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_bytes": "447377777", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_md5": "7cd1402155befc87be338132d1f31f64", - "id": "SRX17709227_SRR21711856", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "GSM6601460", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "md5_1": "7cd1402155befc87be338132d1f31f64", - "md5_2": "", - "read_count": "11468356", - "run_accession": "SRR21711856", - "run_alias": "GSM6601460_r1", - "sample_accession": "SAMN31021823", - "sample_alias": "GSM6601460", - "sample_description": "sham-treated worms in day 5", - "sample_title": "sham-treated worms in day 5", - "scientific_name": "Caenorhabditis elegans", - "secondary_sample_accession": "SRS15239723", - "secondary_study_accession": "SRP399678", - "single_end": true, - "study_accession": "PRJNA884373", - "study_alias": "GSE214215", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "submission_accession": "SRA1507236", - "tax_id": "6239" - }, - { - "base_count": "677912850", - "experiment_accession": "SRX17709228", - "experiment_alias": "GSM6601461_r1", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "fastq_1": "SRX17709228_SRR21711855.fastq.gz:md5,3a4b64f005eba3923da57a5e61131c2a", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_bytes": "529798447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", - "id": "SRX17709228_SRR21711855", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "GSM6601461", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", - "md5_2": "", - "read_count": "13558257", - "run_accession": "SRR21711855", - "run_alias": "GSM6601461_r1", - "sample_accession": "SAMN31021822", - "sample_alias": "GSM6601461", - "sample_description": "PM2.5-treated worms in day 5", - "sample_title": "PM2.5-treated worms in day 5", - "scientific_name": "Caenorhabditis elegans", - "secondary_sample_accession": "SRS15239724", - "secondary_study_accession": "SRP399678", - "single_end": true, - "study_accession": "PRJNA884373", - "study_alias": "GSE214215", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "submission_accession": "SRA1507236", - "tax_id": "6239" - } - ], - "4": [ - "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", - "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", - "versions.yml:md5,98a3ee9aa3bcc3b080247bccde481bbb", - "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" - ], - "mappings": [ - "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" - ], - "sample_mappings": [ - [ - "multiqc_config.yml:md5,6d4c3e5137704358474330207f5f2b5c", - "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" - ] - ], - "samplesheet": [ - "samplesheet.csv:md5,8f985e9dd993b9c826ea095bd377d34a" - ], - "sra_metadata": [ - { - "base_count": "35658", - "experiment_accession": "ERX1234253", - "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", - "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", - "fastq_1": "ERX1234253_ERR1160846.fastq.gz:md5,b1de59f829fbd2d60a1ed4bc3da55709", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_bytes": "18077", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", - "id": "ERX1234253_ERR1160846", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "10317.BLANK.93.3E.r22", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", - "md5_2": "", - "read_count": "283", - "run_accession": "ERR1160846", - "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", - "sample_accession": "SAMEA3687214", - "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", - "sample_description": "American Gut control", - "sample_title": "10317.BLANK.93.3E.r22", - "scientific_name": "metagenome", - "secondary_sample_accession": "ERS994363", - "secondary_study_accession": "ERP012803", - "single_end": true, - "study_accession": "PRJEB11419", - "study_alias": "qiita_sid_10317", - "study_title": "American Gut Project", - "submission_accession": "ERA541392", - "tax_id": "256318" - }, - { - "base_count": "431758", - "experiment_accession": "SRX9315476", - "experiment_alias": "F11-N1-05", - "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "fastq_1": "SRX9315476_SRR12848126_1.fastq.gz:md5,e4e86261d46fc31146e8809e605fd381", - "fastq_2": "SRX9315476_SRR12848126_2.fastq.gz:md5,b154211da872f5a99697097628aa3afb", - "fastq_aspera": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_md5": "", - "id": "SRX9315476_SRR12848126", - "instrument_model": "Illumina HiSeq 3000", - "instrument_platform": "ILLUMINA", - "library_layout": "PAIRED", - "library_name": "F11-N1-05", - "library_selection": "RANDOM PCR", - "library_source": "GENOMIC", - "library_strategy": "Synthetic-Long-Read", - "md5_1": "", - "md5_2": "", - "read_count": "2954", - "run_accession": "SRR12848126", - "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", - "sample_accession": "SAMN16455283", - "sample_alias": "F11-N1-05", - "sample_description": "F11-N1-05", - "sample_title": "Longshanks_F11-N1-05", - "scientific_name": "Mus musculus domesticus", - "secondary_sample_accession": "SRS7540262", - "secondary_study_accession": "SRP287769", - "single_end": false, - "study_accession": "PRJNA670070", - "study_alias": "PRJNA670070", - "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "submission_accession": "SRA1145417", - "tax_id": "10092" - }, - { - "base_count": "573417800", - "experiment_accession": "SRX17709227", - "experiment_alias": "GSM6601460_r1", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "fastq_1": "SRX17709227_SRR21711856.fastq.gz:md5,1fe5e87cc11c2af1584da9a75e49c4d2", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_bytes": "447377777", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_md5": "7cd1402155befc87be338132d1f31f64", - "id": "SRX17709227_SRR21711856", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "GSM6601460", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "md5_1": "7cd1402155befc87be338132d1f31f64", - "md5_2": "", - "read_count": "11468356", - "run_accession": "SRR21711856", - "run_alias": "GSM6601460_r1", - "sample_accession": "SAMN31021823", - "sample_alias": "GSM6601460", - "sample_description": "sham-treated worms in day 5", - "sample_title": "sham-treated worms in day 5", - "scientific_name": "Caenorhabditis elegans", - "secondary_sample_accession": "SRS15239723", - "secondary_study_accession": "SRP399678", - "single_end": true, - "study_accession": "PRJNA884373", - "study_alias": "GSE214215", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "submission_accession": "SRA1507236", - "tax_id": "6239" - }, - { - "base_count": "677912850", - "experiment_accession": "SRX17709228", - "experiment_alias": "GSM6601461_r1", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "fastq_1": "SRX17709228_SRR21711855.fastq.gz:md5,3a4b64f005eba3923da57a5e61131c2a", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_bytes": "529798447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", - "id": "SRX17709228_SRR21711855", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "GSM6601461", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", - "md5_2": "", - "read_count": "13558257", - "run_accession": "SRR21711855", - "run_alias": "GSM6601461_r1", - "sample_accession": "SAMN31021822", - "sample_alias": "GSM6601461", - "sample_description": "PM2.5-treated worms in day 5", - "sample_title": "PM2.5-treated worms in day 5", - "scientific_name": "Caenorhabditis elegans", - "secondary_sample_accession": "SRS15239724", - "secondary_study_accession": "SRP399678", - "single_end": true, - "study_accession": "PRJNA884373", - "study_alias": "GSE214215", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "submission_accession": "SRA1507236", - "tax_id": "6239" - } - ], - "versions": [ - "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", - "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", - "versions.yml:md5,98a3ee9aa3bcc3b080247bccde481bbb", - "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" - ] - } - ], - "timestamp": "2024-01-07T15:13:47.475783" - } -} \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap deleted file mode 100644 index 93c66f55..00000000 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test.snap +++ /dev/null @@ -1,363 +0,0 @@ -{ - "Parameters: --nf_core_pipeline rnaseq": { - "content": [ - { - "0": [ - "samplesheet.csv:md5,c0f7d7b70e884c78f90630c695703d7b" - ], - "1": [ - "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" - ], - "2": [ - [ - "multiqc_config.yml:md5,6d4c3e5137704358474330207f5f2b5c", - "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" - ] - ], - "3": [ - { - "base_count": "35658", - "experiment_accession": "ERX1234253", - "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", - "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", - "fastq_1": "ERX1234253_ERR1160846.fastq.gz:md5,b1de59f829fbd2d60a1ed4bc3da55709", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_bytes": "18077", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", - "id": "ERX1234253_ERR1160846", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "10317.BLANK.93.3E.r22", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", - "md5_2": "", - "read_count": "283", - "run_accession": "ERR1160846", - "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", - "sample_accession": "SAMEA3687214", - "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", - "sample_description": "American Gut control", - "sample_title": "10317.BLANK.93.3E.r22", - "scientific_name": "metagenome", - "secondary_sample_accession": "ERS994363", - "secondary_study_accession": "ERP012803", - "single_end": true, - "study_accession": "PRJEB11419", - "study_alias": "qiita_sid_10317", - "study_title": "American Gut Project", - "submission_accession": "ERA541392", - "tax_id": "256318" - }, - { - "base_count": "431758", - "experiment_accession": "SRX9315476", - "experiment_alias": "F11-N1-05", - "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "fastq_1": "SRX9315476_SRR12848126_1.fastq.gz:md5,e4e86261d46fc31146e8809e605fd381", - "fastq_2": "SRX9315476_SRR12848126_2.fastq.gz:md5,b154211da872f5a99697097628aa3afb", - "fastq_aspera": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_md5": "", - "id": "SRX9315476_SRR12848126", - "instrument_model": "Illumina HiSeq 3000", - "instrument_platform": "ILLUMINA", - "library_layout": "PAIRED", - "library_name": "F11-N1-05", - "library_selection": "RANDOM PCR", - "library_source": "GENOMIC", - "library_strategy": "Synthetic-Long-Read", - "md5_1": "", - "md5_2": "", - "read_count": "2954", - "run_accession": "SRR12848126", - "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", - "sample_accession": "SAMN16455283", - "sample_alias": "F11-N1-05", - "sample_description": "F11-N1-05", - "sample_title": "Longshanks_F11-N1-05", - "scientific_name": "Mus musculus domesticus", - "secondary_sample_accession": "SRS7540262", - "secondary_study_accession": "SRP287769", - "single_end": false, - "study_accession": "PRJNA670070", - "study_alias": "PRJNA670070", - "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "submission_accession": "SRA1145417", - "tax_id": "10092" - }, - { - "base_count": "573417800", - "experiment_accession": "SRX17709227", - "experiment_alias": "GSM6601460_r1", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "fastq_1": "SRX17709227_SRR21711856.fastq.gz:md5,1fe5e87cc11c2af1584da9a75e49c4d2", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_bytes": "447377777", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_md5": "7cd1402155befc87be338132d1f31f64", - "id": "SRX17709227_SRR21711856", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "GSM6601460", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "md5_1": "7cd1402155befc87be338132d1f31f64", - "md5_2": "", - "read_count": "11468356", - "run_accession": "SRR21711856", - "run_alias": "GSM6601460_r1", - "sample_accession": "SAMN31021823", - "sample_alias": "GSM6601460", - "sample_description": "sham-treated worms in day 5", - "sample_title": "sham-treated worms in day 5", - "scientific_name": "Caenorhabditis elegans", - "secondary_sample_accession": "SRS15239723", - "secondary_study_accession": "SRP399678", - "single_end": true, - "study_accession": "PRJNA884373", - "study_alias": "GSE214215", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "submission_accession": "SRA1507236", - "tax_id": "6239" - }, - { - "base_count": "677912850", - "experiment_accession": "SRX17709228", - "experiment_alias": "GSM6601461_r1", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "fastq_1": "SRX17709228_SRR21711855.fastq.gz:md5,3a4b64f005eba3923da57a5e61131c2a", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_bytes": "529798447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", - "id": "SRX17709228_SRR21711855", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "GSM6601461", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", - "md5_2": "", - "read_count": "13558257", - "run_accession": "SRR21711855", - "run_alias": "GSM6601461_r1", - "sample_accession": "SAMN31021822", - "sample_alias": "GSM6601461", - "sample_description": "PM2.5-treated worms in day 5", - "sample_title": "PM2.5-treated worms in day 5", - "scientific_name": "Caenorhabditis elegans", - "secondary_sample_accession": "SRS15239724", - "secondary_study_accession": "SRP399678", - "single_end": true, - "study_accession": "PRJNA884373", - "study_alias": "GSE214215", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "submission_accession": "SRA1507236", - "tax_id": "6239" - } - ], - "4": [ - "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", - "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", - "versions.yml:md5,98a3ee9aa3bcc3b080247bccde481bbb", - "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" - ], - "mappings": [ - "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" - ], - "sample_mappings": [ - [ - "multiqc_config.yml:md5,6d4c3e5137704358474330207f5f2b5c", - "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" - ] - ], - "samplesheet": [ - "samplesheet.csv:md5,c0f7d7b70e884c78f90630c695703d7b" - ], - "sra_metadata": [ - { - "base_count": "35658", - "experiment_accession": "ERX1234253", - "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", - "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", - "fastq_1": "ERX1234253_ERR1160846.fastq.gz:md5,b1de59f829fbd2d60a1ed4bc3da55709", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_bytes": "18077", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", - "id": "ERX1234253_ERR1160846", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "10317.BLANK.93.3E.r22", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", - "md5_2": "", - "read_count": "283", - "run_accession": "ERR1160846", - "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", - "sample_accession": "SAMEA3687214", - "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", - "sample_description": "American Gut control", - "sample_title": "10317.BLANK.93.3E.r22", - "scientific_name": "metagenome", - "secondary_sample_accession": "ERS994363", - "secondary_study_accession": "ERP012803", - "single_end": true, - "study_accession": "PRJEB11419", - "study_alias": "qiita_sid_10317", - "study_title": "American Gut Project", - "submission_accession": "ERA541392", - "tax_id": "256318" - }, - { - "base_count": "431758", - "experiment_accession": "SRX9315476", - "experiment_alias": "F11-N1-05", - "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "fastq_1": "SRX9315476_SRR12848126_1.fastq.gz:md5,e4e86261d46fc31146e8809e605fd381", - "fastq_2": "SRX9315476_SRR12848126_2.fastq.gz:md5,b154211da872f5a99697097628aa3afb", - "fastq_aspera": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_md5": "", - "id": "SRX9315476_SRR12848126", - "instrument_model": "Illumina HiSeq 3000", - "instrument_platform": "ILLUMINA", - "library_layout": "PAIRED", - "library_name": "F11-N1-05", - "library_selection": "RANDOM PCR", - "library_source": "GENOMIC", - "library_strategy": "Synthetic-Long-Read", - "md5_1": "", - "md5_2": "", - "read_count": "2954", - "run_accession": "SRR12848126", - "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", - "sample_accession": "SAMN16455283", - "sample_alias": "F11-N1-05", - "sample_description": "F11-N1-05", - "sample_title": "Longshanks_F11-N1-05", - "scientific_name": "Mus musculus domesticus", - "secondary_sample_accession": "SRS7540262", - "secondary_study_accession": "SRP287769", - "single_end": false, - "study_accession": "PRJNA670070", - "study_alias": "PRJNA670070", - "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "submission_accession": "SRA1145417", - "tax_id": "10092" - }, - { - "base_count": "573417800", - "experiment_accession": "SRX17709227", - "experiment_alias": "GSM6601460_r1", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "fastq_1": "SRX17709227_SRR21711856.fastq.gz:md5,1fe5e87cc11c2af1584da9a75e49c4d2", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_bytes": "447377777", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_md5": "7cd1402155befc87be338132d1f31f64", - "id": "SRX17709227_SRR21711856", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "GSM6601460", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "md5_1": "7cd1402155befc87be338132d1f31f64", - "md5_2": "", - "read_count": "11468356", - "run_accession": "SRR21711856", - "run_alias": "GSM6601460_r1", - "sample_accession": "SAMN31021823", - "sample_alias": "GSM6601460", - "sample_description": "sham-treated worms in day 5", - "sample_title": "sham-treated worms in day 5", - "scientific_name": "Caenorhabditis elegans", - "secondary_sample_accession": "SRS15239723", - "secondary_study_accession": "SRP399678", - "single_end": true, - "study_accession": "PRJNA884373", - "study_alias": "GSE214215", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "submission_accession": "SRA1507236", - "tax_id": "6239" - }, - { - "base_count": "677912850", - "experiment_accession": "SRX17709228", - "experiment_alias": "GSM6601461_r1", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "fastq_1": "SRX17709228_SRR21711855.fastq.gz:md5,3a4b64f005eba3923da57a5e61131c2a", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_bytes": "529798447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", - "id": "SRX17709228_SRR21711855", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "GSM6601461", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", - "md5_2": "", - "read_count": "13558257", - "run_accession": "SRR21711855", - "run_alias": "GSM6601461_r1", - "sample_accession": "SAMN31021822", - "sample_alias": "GSM6601461", - "sample_description": "PM2.5-treated worms in day 5", - "sample_title": "PM2.5-treated worms in day 5", - "scientific_name": "Caenorhabditis elegans", - "secondary_sample_accession": "SRS15239724", - "secondary_study_accession": "SRP399678", - "single_end": true, - "study_accession": "PRJNA884373", - "study_alias": "GSE214215", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "submission_accession": "SRA1507236", - "tax_id": "6239" - } - ], - "versions": [ - "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", - "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", - "versions.yml:md5,98a3ee9aa3bcc3b080247bccde481bbb", - "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" - ] - } - ], - "timestamp": "2024-01-07T15:17:19.511222" - } -} \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap deleted file mode 100644 index 27e12abd..00000000 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test.snap +++ /dev/null @@ -1,363 +0,0 @@ -{ - "Parameters: --nf_core_pipeline taxprofiler": { - "content": [ - { - "0": [ - "samplesheet.csv:md5,fe3c7ba9e7b7debe07291d6125f9edc7" - ], - "1": [ - "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" - ], - "2": [ - [ - "multiqc_config.yml:md5,6d4c3e5137704358474330207f5f2b5c", - "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" - ] - ], - "3": [ - { - "base_count": "35658", - "experiment_accession": "ERX1234253", - "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", - "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", - "fastq_1": "ERX1234253_ERR1160846.fastq.gz:md5,b1de59f829fbd2d60a1ed4bc3da55709", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_bytes": "18077", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", - "id": "ERX1234253_ERR1160846", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "10317.BLANK.93.3E.r22", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", - "md5_2": "", - "read_count": "283", - "run_accession": "ERR1160846", - "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", - "sample_accession": "SAMEA3687214", - "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", - "sample_description": "American Gut control", - "sample_title": "10317.BLANK.93.3E.r22", - "scientific_name": "metagenome", - "secondary_sample_accession": "ERS994363", - "secondary_study_accession": "ERP012803", - "single_end": true, - "study_accession": "PRJEB11419", - "study_alias": "qiita_sid_10317", - "study_title": "American Gut Project", - "submission_accession": "ERA541392", - "tax_id": "256318" - }, - { - "base_count": "431758", - "experiment_accession": "SRX9315476", - "experiment_alias": "F11-N1-05", - "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "fastq_1": "SRX9315476_SRR12848126_1.fastq.gz:md5,e4e86261d46fc31146e8809e605fd381", - "fastq_2": "SRX9315476_SRR12848126_2.fastq.gz:md5,b154211da872f5a99697097628aa3afb", - "fastq_aspera": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_md5": "", - "id": "SRX9315476_SRR12848126", - "instrument_model": "Illumina HiSeq 3000", - "instrument_platform": "ILLUMINA", - "library_layout": "PAIRED", - "library_name": "F11-N1-05", - "library_selection": "RANDOM PCR", - "library_source": "GENOMIC", - "library_strategy": "Synthetic-Long-Read", - "md5_1": "", - "md5_2": "", - "read_count": "2954", - "run_accession": "SRR12848126", - "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", - "sample_accession": "SAMN16455283", - "sample_alias": "F11-N1-05", - "sample_description": "F11-N1-05", - "sample_title": "Longshanks_F11-N1-05", - "scientific_name": "Mus musculus domesticus", - "secondary_sample_accession": "SRS7540262", - "secondary_study_accession": "SRP287769", - "single_end": false, - "study_accession": "PRJNA670070", - "study_alias": "PRJNA670070", - "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "submission_accession": "SRA1145417", - "tax_id": "10092" - }, - { - "base_count": "573417800", - "experiment_accession": "SRX17709227", - "experiment_alias": "GSM6601460_r1", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "fastq_1": "SRX17709227_SRR21711856.fastq.gz:md5,1fe5e87cc11c2af1584da9a75e49c4d2", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_bytes": "447377777", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_md5": "7cd1402155befc87be338132d1f31f64", - "id": "SRX17709227_SRR21711856", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "GSM6601460", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "md5_1": "7cd1402155befc87be338132d1f31f64", - "md5_2": "", - "read_count": "11468356", - "run_accession": "SRR21711856", - "run_alias": "GSM6601460_r1", - "sample_accession": "SAMN31021823", - "sample_alias": "GSM6601460", - "sample_description": "sham-treated worms in day 5", - "sample_title": "sham-treated worms in day 5", - "scientific_name": "Caenorhabditis elegans", - "secondary_sample_accession": "SRS15239723", - "secondary_study_accession": "SRP399678", - "single_end": true, - "study_accession": "PRJNA884373", - "study_alias": "GSE214215", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "submission_accession": "SRA1507236", - "tax_id": "6239" - }, - { - "base_count": "677912850", - "experiment_accession": "SRX17709228", - "experiment_alias": "GSM6601461_r1", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "fastq_1": "SRX17709228_SRR21711855.fastq.gz:md5,3a4b64f005eba3923da57a5e61131c2a", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_bytes": "529798447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", - "id": "SRX17709228_SRR21711855", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "GSM6601461", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", - "md5_2": "", - "read_count": "13558257", - "run_accession": "SRR21711855", - "run_alias": "GSM6601461_r1", - "sample_accession": "SAMN31021822", - "sample_alias": "GSM6601461", - "sample_description": "PM2.5-treated worms in day 5", - "sample_title": "PM2.5-treated worms in day 5", - "scientific_name": "Caenorhabditis elegans", - "secondary_sample_accession": "SRS15239724", - "secondary_study_accession": "SRP399678", - "single_end": true, - "study_accession": "PRJNA884373", - "study_alias": "GSE214215", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "submission_accession": "SRA1507236", - "tax_id": "6239" - } - ], - "4": [ - "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", - "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", - "versions.yml:md5,98a3ee9aa3bcc3b080247bccde481bbb", - "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" - ], - "mappings": [ - "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" - ], - "sample_mappings": [ - [ - "multiqc_config.yml:md5,6d4c3e5137704358474330207f5f2b5c", - "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" - ] - ], - "samplesheet": [ - "samplesheet.csv:md5,fe3c7ba9e7b7debe07291d6125f9edc7" - ], - "sra_metadata": [ - { - "base_count": "35658", - "experiment_accession": "ERX1234253", - "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", - "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", - "fastq_1": "ERX1234253_ERR1160846.fastq.gz:md5,b1de59f829fbd2d60a1ed4bc3da55709", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_bytes": "18077", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", - "id": "ERX1234253_ERR1160846", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "10317.BLANK.93.3E.r22", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", - "md5_2": "", - "read_count": "283", - "run_accession": "ERR1160846", - "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", - "sample_accession": "SAMEA3687214", - "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", - "sample_description": "American Gut control", - "sample_title": "10317.BLANK.93.3E.r22", - "scientific_name": "metagenome", - "secondary_sample_accession": "ERS994363", - "secondary_study_accession": "ERP012803", - "single_end": true, - "study_accession": "PRJEB11419", - "study_alias": "qiita_sid_10317", - "study_title": "American Gut Project", - "submission_accession": "ERA541392", - "tax_id": "256318" - }, - { - "base_count": "431758", - "experiment_accession": "SRX9315476", - "experiment_alias": "F11-N1-05", - "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "fastq_1": "SRX9315476_SRR12848126_1.fastq.gz:md5,e4e86261d46fc31146e8809e605fd381", - "fastq_2": "SRX9315476_SRR12848126_2.fastq.gz:md5,b154211da872f5a99697097628aa3afb", - "fastq_aspera": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_md5": "", - "id": "SRX9315476_SRR12848126", - "instrument_model": "Illumina HiSeq 3000", - "instrument_platform": "ILLUMINA", - "library_layout": "PAIRED", - "library_name": "F11-N1-05", - "library_selection": "RANDOM PCR", - "library_source": "GENOMIC", - "library_strategy": "Synthetic-Long-Read", - "md5_1": "", - "md5_2": "", - "read_count": "2954", - "run_accession": "SRR12848126", - "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", - "sample_accession": "SAMN16455283", - "sample_alias": "F11-N1-05", - "sample_description": "F11-N1-05", - "sample_title": "Longshanks_F11-N1-05", - "scientific_name": "Mus musculus domesticus", - "secondary_sample_accession": "SRS7540262", - "secondary_study_accession": "SRP287769", - "single_end": false, - "study_accession": "PRJNA670070", - "study_alias": "PRJNA670070", - "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "submission_accession": "SRA1145417", - "tax_id": "10092" - }, - { - "base_count": "573417800", - "experiment_accession": "SRX17709227", - "experiment_alias": "GSM6601460_r1", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "fastq_1": "SRX17709227_SRR21711856.fastq.gz:md5,1fe5e87cc11c2af1584da9a75e49c4d2", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_bytes": "447377777", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_md5": "7cd1402155befc87be338132d1f31f64", - "id": "SRX17709227_SRR21711856", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "GSM6601460", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "md5_1": "7cd1402155befc87be338132d1f31f64", - "md5_2": "", - "read_count": "11468356", - "run_accession": "SRR21711856", - "run_alias": "GSM6601460_r1", - "sample_accession": "SAMN31021823", - "sample_alias": "GSM6601460", - "sample_description": "sham-treated worms in day 5", - "sample_title": "sham-treated worms in day 5", - "scientific_name": "Caenorhabditis elegans", - "secondary_sample_accession": "SRS15239723", - "secondary_study_accession": "SRP399678", - "single_end": true, - "study_accession": "PRJNA884373", - "study_alias": "GSE214215", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "submission_accession": "SRA1507236", - "tax_id": "6239" - }, - { - "base_count": "677912850", - "experiment_accession": "SRX17709228", - "experiment_alias": "GSM6601461_r1", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "fastq_1": "SRX17709228_SRR21711855.fastq.gz:md5,3a4b64f005eba3923da57a5e61131c2a", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_bytes": "529798447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", - "id": "SRX17709228_SRR21711855", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "GSM6601461", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", - "md5_2": "", - "read_count": "13558257", - "run_accession": "SRR21711855", - "run_alias": "GSM6601461_r1", - "sample_accession": "SAMN31021822", - "sample_alias": "GSM6601461", - "sample_description": "PM2.5-treated worms in day 5", - "sample_title": "PM2.5-treated worms in day 5", - "scientific_name": "Caenorhabditis elegans", - "secondary_sample_accession": "SRS15239724", - "secondary_study_accession": "SRP399678", - "single_end": true, - "study_accession": "PRJNA884373", - "study_alias": "GSE214215", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "submission_accession": "SRA1507236", - "tax_id": "6239" - } - ], - "versions": [ - "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", - "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", - "versions.yml:md5,98a3ee9aa3bcc3b080247bccde481bbb", - "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" - ] - } - ], - "timestamp": "2024-01-07T15:21:54.519934" - } -} \ No newline at end of file diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap deleted file mode 100644 index 60708a54..00000000 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test.snap +++ /dev/null @@ -1,363 +0,0 @@ -{ - "Parameters: --nf_core_pipeline viralrecon": { - "content": [ - { - "0": [ - "samplesheet.csv:md5,99a3fd9fe3c7cad8184b1bbeadd89c45" - ], - "1": [ - "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" - ], - "2": [ - [ - "multiqc_config.yml:md5,6d4c3e5137704358474330207f5f2b5c", - "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" - ] - ], - "3": [ - { - "base_count": "35658", - "experiment_accession": "ERX1234253", - "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", - "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", - "fastq_1": "ERX1234253_ERR1160846.fastq.gz:md5,b1de59f829fbd2d60a1ed4bc3da55709", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_bytes": "18077", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", - "id": "ERX1234253_ERR1160846", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "10317.BLANK.93.3E.r22", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", - "md5_2": "", - "read_count": "283", - "run_accession": "ERR1160846", - "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", - "sample_accession": "SAMEA3687214", - "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", - "sample_description": "American Gut control", - "sample_title": "10317.BLANK.93.3E.r22", - "scientific_name": "metagenome", - "secondary_sample_accession": "ERS994363", - "secondary_study_accession": "ERP012803", - "single_end": true, - "study_accession": "PRJEB11419", - "study_alias": "qiita_sid_10317", - "study_title": "American Gut Project", - "submission_accession": "ERA541392", - "tax_id": "256318" - }, - { - "base_count": "431758", - "experiment_accession": "SRX9315476", - "experiment_alias": "F11-N1-05", - "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "fastq_1": "SRX9315476_SRR12848126_1.fastq.gz:md5,e4e86261d46fc31146e8809e605fd381", - "fastq_2": "SRX9315476_SRR12848126_2.fastq.gz:md5,b154211da872f5a99697097628aa3afb", - "fastq_aspera": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_md5": "", - "id": "SRX9315476_SRR12848126", - "instrument_model": "Illumina HiSeq 3000", - "instrument_platform": "ILLUMINA", - "library_layout": "PAIRED", - "library_name": "F11-N1-05", - "library_selection": "RANDOM PCR", - "library_source": "GENOMIC", - "library_strategy": "Synthetic-Long-Read", - "md5_1": "", - "md5_2": "", - "read_count": "2954", - "run_accession": "SRR12848126", - "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", - "sample_accession": "SAMN16455283", - "sample_alias": "F11-N1-05", - "sample_description": "F11-N1-05", - "sample_title": "Longshanks_F11-N1-05", - "scientific_name": "Mus musculus domesticus", - "secondary_sample_accession": "SRS7540262", - "secondary_study_accession": "SRP287769", - "single_end": false, - "study_accession": "PRJNA670070", - "study_alias": "PRJNA670070", - "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "submission_accession": "SRA1145417", - "tax_id": "10092" - }, - { - "base_count": "573417800", - "experiment_accession": "SRX17709227", - "experiment_alias": "GSM6601460_r1", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "fastq_1": "SRX17709227_SRR21711856.fastq.gz:md5,1fe5e87cc11c2af1584da9a75e49c4d2", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_bytes": "447377777", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_md5": "7cd1402155befc87be338132d1f31f64", - "id": "SRX17709227_SRR21711856", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "GSM6601460", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "md5_1": "7cd1402155befc87be338132d1f31f64", - "md5_2": "", - "read_count": "11468356", - "run_accession": "SRR21711856", - "run_alias": "GSM6601460_r1", - "sample_accession": "SAMN31021823", - "sample_alias": "GSM6601460", - "sample_description": "sham-treated worms in day 5", - "sample_title": "sham-treated worms in day 5", - "scientific_name": "Caenorhabditis elegans", - "secondary_sample_accession": "SRS15239723", - "secondary_study_accession": "SRP399678", - "single_end": true, - "study_accession": "PRJNA884373", - "study_alias": "GSE214215", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "submission_accession": "SRA1507236", - "tax_id": "6239" - }, - { - "base_count": "677912850", - "experiment_accession": "SRX17709228", - "experiment_alias": "GSM6601461_r1", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "fastq_1": "SRX17709228_SRR21711855.fastq.gz:md5,3a4b64f005eba3923da57a5e61131c2a", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_bytes": "529798447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", - "id": "SRX17709228_SRR21711855", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "GSM6601461", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", - "md5_2": "", - "read_count": "13558257", - "run_accession": "SRR21711855", - "run_alias": "GSM6601461_r1", - "sample_accession": "SAMN31021822", - "sample_alias": "GSM6601461", - "sample_description": "PM2.5-treated worms in day 5", - "sample_title": "PM2.5-treated worms in day 5", - "scientific_name": "Caenorhabditis elegans", - "secondary_sample_accession": "SRS15239724", - "secondary_study_accession": "SRP399678", - "single_end": true, - "study_accession": "PRJNA884373", - "study_alias": "GSE214215", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "submission_accession": "SRA1507236", - "tax_id": "6239" - } - ], - "4": [ - "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", - "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", - "versions.yml:md5,98a3ee9aa3bcc3b080247bccde481bbb", - "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" - ], - "mappings": [ - "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" - ], - "sample_mappings": [ - [ - "multiqc_config.yml:md5,6d4c3e5137704358474330207f5f2b5c", - "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" - ] - ], - "samplesheet": [ - "samplesheet.csv:md5,99a3fd9fe3c7cad8184b1bbeadd89c45" - ], - "sra_metadata": [ - { - "base_count": "35658", - "experiment_accession": "ERX1234253", - "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", - "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", - "fastq_1": "ERX1234253_ERR1160846.fastq.gz:md5,b1de59f829fbd2d60a1ed4bc3da55709", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_bytes": "18077", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", - "id": "ERX1234253_ERR1160846", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "10317.BLANK.93.3E.r22", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", - "md5_2": "", - "read_count": "283", - "run_accession": "ERR1160846", - "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", - "sample_accession": "SAMEA3687214", - "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", - "sample_description": "American Gut control", - "sample_title": "10317.BLANK.93.3E.r22", - "scientific_name": "metagenome", - "secondary_sample_accession": "ERS994363", - "secondary_study_accession": "ERP012803", - "single_end": true, - "study_accession": "PRJEB11419", - "study_alias": "qiita_sid_10317", - "study_title": "American Gut Project", - "submission_accession": "ERA541392", - "tax_id": "256318" - }, - { - "base_count": "431758", - "experiment_accession": "SRX9315476", - "experiment_alias": "F11-N1-05", - "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "fastq_1": "SRX9315476_SRR12848126_1.fastq.gz:md5,e4e86261d46fc31146e8809e605fd381", - "fastq_2": "SRX9315476_SRR12848126_2.fastq.gz:md5,b154211da872f5a99697097628aa3afb", - "fastq_aspera": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_md5": "", - "id": "SRX9315476_SRR12848126", - "instrument_model": "Illumina HiSeq 3000", - "instrument_platform": "ILLUMINA", - "library_layout": "PAIRED", - "library_name": "F11-N1-05", - "library_selection": "RANDOM PCR", - "library_source": "GENOMIC", - "library_strategy": "Synthetic-Long-Read", - "md5_1": "", - "md5_2": "", - "read_count": "2954", - "run_accession": "SRR12848126", - "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", - "sample_accession": "SAMN16455283", - "sample_alias": "F11-N1-05", - "sample_description": "F11-N1-05", - "sample_title": "Longshanks_F11-N1-05", - "scientific_name": "Mus musculus domesticus", - "secondary_sample_accession": "SRS7540262", - "secondary_study_accession": "SRP287769", - "single_end": false, - "study_accession": "PRJNA670070", - "study_alias": "PRJNA670070", - "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "submission_accession": "SRA1145417", - "tax_id": "10092" - }, - { - "base_count": "573417800", - "experiment_accession": "SRX17709227", - "experiment_alias": "GSM6601460_r1", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "fastq_1": "SRX17709227_SRR21711856.fastq.gz:md5,1fe5e87cc11c2af1584da9a75e49c4d2", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_bytes": "447377777", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_md5": "7cd1402155befc87be338132d1f31f64", - "id": "SRX17709227_SRR21711856", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "GSM6601460", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "md5_1": "7cd1402155befc87be338132d1f31f64", - "md5_2": "", - "read_count": "11468356", - "run_accession": "SRR21711856", - "run_alias": "GSM6601460_r1", - "sample_accession": "SAMN31021823", - "sample_alias": "GSM6601460", - "sample_description": "sham-treated worms in day 5", - "sample_title": "sham-treated worms in day 5", - "scientific_name": "Caenorhabditis elegans", - "secondary_sample_accession": "SRS15239723", - "secondary_study_accession": "SRP399678", - "single_end": true, - "study_accession": "PRJNA884373", - "study_alias": "GSE214215", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "submission_accession": "SRA1507236", - "tax_id": "6239" - }, - { - "base_count": "677912850", - "experiment_accession": "SRX17709228", - "experiment_alias": "GSM6601461_r1", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "fastq_1": "SRX17709228_SRR21711855.fastq.gz:md5,3a4b64f005eba3923da57a5e61131c2a", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_bytes": "529798447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", - "id": "SRX17709228_SRR21711855", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "GSM6601461", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", - "md5_2": "", - "read_count": "13558257", - "run_accession": "SRR21711855", - "run_alias": "GSM6601461_r1", - "sample_accession": "SAMN31021822", - "sample_alias": "GSM6601461", - "sample_description": "PM2.5-treated worms in day 5", - "sample_title": "PM2.5-treated worms in day 5", - "scientific_name": "Caenorhabditis elegans", - "secondary_sample_accession": "SRS15239724", - "secondary_study_accession": "SRP399678", - "single_end": true, - "study_accession": "PRJNA884373", - "study_alias": "GSE214215", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "submission_accession": "SRA1507236", - "tax_id": "6239" - } - ], - "versions": [ - "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", - "versions.yml:md5,45e4a369df2d3af023b8622aa3f6d5a8", - "versions.yml:md5,98a3ee9aa3bcc3b080247bccde481bbb", - "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" - ] - } - ], - "timestamp": "2024-01-07T15:04:57.029889" - } -} \ No newline at end of file diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap b/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap deleted file mode 100644 index 252392d7..00000000 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test.snap +++ /dev/null @@ -1,359 +0,0 @@ -{ - "Parameters: --skip_fastq_download": { - "content": [ - { - "0": [ - "samplesheet.csv:md5,eb18025bb1cb97a4fe399ca16757d2db" - ], - "1": [ - "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" - ], - "2": [ - [ - "multiqc_config.yml:md5,6d4c3e5137704358474330207f5f2b5c", - "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" - ] - ], - "3": [ - { - "base_count": "35658", - "experiment_accession": "ERX1234253", - "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", - "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_bytes": "18077", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", - "id": "ERX1234253_ERR1160846", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "10317.BLANK.93.3E.r22", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", - "md5_2": "", - "read_count": "283", - "run_accession": "ERR1160846", - "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", - "sample_accession": "SAMEA3687214", - "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", - "sample_description": "American Gut control", - "sample_title": "10317.BLANK.93.3E.r22", - "scientific_name": "metagenome", - "secondary_sample_accession": "ERS994363", - "secondary_study_accession": "ERP012803", - "single_end": true, - "study_accession": "PRJEB11419", - "study_alias": "qiita_sid_10317", - "study_title": "American Gut Project", - "submission_accession": "ERA541392", - "tax_id": "256318" - }, - { - "base_count": "431758", - "experiment_accession": "SRX9315476", - "experiment_alias": "F11-N1-05", - "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "fastq_1": "", - "fastq_2": "", - "fastq_aspera": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_md5": "", - "id": "SRX9315476_SRR12848126", - "instrument_model": "Illumina HiSeq 3000", - "instrument_platform": "ILLUMINA", - "library_layout": "PAIRED", - "library_name": "F11-N1-05", - "library_selection": "RANDOM PCR", - "library_source": "GENOMIC", - "library_strategy": "Synthetic-Long-Read", - "md5_1": "", - "md5_2": "", - "read_count": "2954", - "run_accession": "SRR12848126", - "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", - "sample_accession": "SAMN16455283", - "sample_alias": "F11-N1-05", - "sample_description": "F11-N1-05", - "sample_title": "Longshanks_F11-N1-05", - "scientific_name": "Mus musculus domesticus", - "secondary_sample_accession": "SRS7540262", - "secondary_study_accession": "SRP287769", - "single_end": false, - "study_accession": "PRJNA670070", - "study_alias": "PRJNA670070", - "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "submission_accession": "SRA1145417", - "tax_id": "10092" - }, - { - "base_count": "573417800", - "experiment_accession": "SRX17709227", - "experiment_alias": "GSM6601460_r1", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_bytes": "447377777", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_md5": "7cd1402155befc87be338132d1f31f64", - "id": "SRX17709227_SRR21711856", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "GSM6601460", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "md5_1": "7cd1402155befc87be338132d1f31f64", - "md5_2": "", - "read_count": "11468356", - "run_accession": "SRR21711856", - "run_alias": "GSM6601460_r1", - "sample_accession": "SAMN31021823", - "sample_alias": "GSM6601460", - "sample_description": "sham-treated worms in day 5", - "sample_title": "sham-treated worms in day 5", - "scientific_name": "Caenorhabditis elegans", - "secondary_sample_accession": "SRS15239723", - "secondary_study_accession": "SRP399678", - "single_end": true, - "study_accession": "PRJNA884373", - "study_alias": "GSE214215", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "submission_accession": "SRA1507236", - "tax_id": "6239" - }, - { - "base_count": "677912850", - "experiment_accession": "SRX17709228", - "experiment_alias": "GSM6601461_r1", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_bytes": "529798447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", - "id": "SRX17709228_SRR21711855", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "GSM6601461", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", - "md5_2": "", - "read_count": "13558257", - "run_accession": "SRR21711855", - "run_alias": "GSM6601461_r1", - "sample_accession": "SAMN31021822", - "sample_alias": "GSM6601461", - "sample_description": "PM2.5-treated worms in day 5", - "sample_title": "PM2.5-treated worms in day 5", - "scientific_name": "Caenorhabditis elegans", - "secondary_sample_accession": "SRS15239724", - "secondary_study_accession": "SRP399678", - "single_end": true, - "study_accession": "PRJNA884373", - "study_alias": "GSE214215", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "submission_accession": "SRA1507236", - "tax_id": "6239" - } - ], - "4": [ - "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", - "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" - ], - "mappings": [ - "id_mappings.csv:md5,f7c0bd1713fe14917b4298e252312296" - ], - "sample_mappings": [ - [ - "multiqc_config.yml:md5,6d4c3e5137704358474330207f5f2b5c", - "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" - ] - ], - "samplesheet": [ - "samplesheet.csv:md5,eb18025bb1cb97a4fe399ca16757d2db" - ], - "sra_metadata": [ - { - "base_count": "35658", - "experiment_accession": "ERX1234253", - "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", - "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_bytes": "18077", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", - "id": "ERX1234253_ERR1160846", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "10317.BLANK.93.3E.r22", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", - "md5_2": "", - "read_count": "283", - "run_accession": "ERR1160846", - "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", - "sample_accession": "SAMEA3687214", - "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", - "sample_description": "American Gut control", - "sample_title": "10317.BLANK.93.3E.r22", - "scientific_name": "metagenome", - "secondary_sample_accession": "ERS994363", - "secondary_study_accession": "ERP012803", - "single_end": true, - "study_accession": "PRJEB11419", - "study_alias": "qiita_sid_10317", - "study_title": "American Gut Project", - "submission_accession": "ERA541392", - "tax_id": "256318" - }, - { - "base_count": "431758", - "experiment_accession": "SRX9315476", - "experiment_alias": "F11-N1-05", - "experiment_title": "Illumina HiSeq 3000 sequencing: Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "fastq_1": "", - "fastq_2": "", - "fastq_aspera": "", - "fastq_bytes": "", - "fastq_ftp": "", - "fastq_galaxy": "", - "fastq_md5": "", - "id": "SRX9315476_SRR12848126", - "instrument_model": "Illumina HiSeq 3000", - "instrument_platform": "ILLUMINA", - "library_layout": "PAIRED", - "library_name": "F11-N1-05", - "library_selection": "RANDOM PCR", - "library_source": "GENOMIC", - "library_strategy": "Synthetic-Long-Read", - "md5_1": "", - "md5_2": "", - "read_count": "2954", - "run_accession": "SRR12848126", - "run_alias": "Longshanks_F11-N1-05_haplo.pMarkdup.chr3_focal.bam", - "sample_accession": "SAMN16455283", - "sample_alias": "F11-N1-05", - "sample_description": "F11-N1-05", - "sample_title": "Longshanks_F11-N1-05", - "scientific_name": "Mus musculus domesticus", - "secondary_sample_accession": "SRS7540262", - "secondary_study_accession": "SRP287769", - "single_end": false, - "study_accession": "PRJNA670070", - "study_alias": "PRJNA670070", - "study_title": "Haplotype tagging reveals parallel formation of hybrid races in two butterfly species", - "submission_accession": "SRA1145417", - "tax_id": "10092" - }, - { - "base_count": "573417800", - "experiment_accession": "SRX17709227", - "experiment_alias": "GSM6601460_r1", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601460: sham-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_bytes": "447377777", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/056/SRR21711856/SRR21711856.fastq.gz", - "fastq_md5": "7cd1402155befc87be338132d1f31f64", - "id": "SRX17709227_SRR21711856", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "GSM6601460", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "md5_1": "7cd1402155befc87be338132d1f31f64", - "md5_2": "", - "read_count": "11468356", - "run_accession": "SRR21711856", - "run_alias": "GSM6601460_r1", - "sample_accession": "SAMN31021823", - "sample_alias": "GSM6601460", - "sample_description": "sham-treated worms in day 5", - "sample_title": "sham-treated worms in day 5", - "scientific_name": "Caenorhabditis elegans", - "secondary_sample_accession": "SRS15239723", - "secondary_study_accession": "SRP399678", - "single_end": true, - "study_accession": "PRJNA884373", - "study_alias": "GSE214215", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "submission_accession": "SRA1507236", - "tax_id": "6239" - }, - { - "base_count": "677912850", - "experiment_accession": "SRX17709228", - "experiment_alias": "GSM6601461_r1", - "experiment_title": "Illumina HiSeq 4000 sequencing: GSM6601461: PM2.5-treated worms in day 5 Caenorhabditis elegans RNA-Seq", - "fastq_1": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_bytes": "529798447", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR217/055/SRR21711855/SRR21711855.fastq.gz", - "fastq_md5": "cbe4e9f967a71593f9ec3c6edaf11c83", - "id": "SRX17709228_SRR21711855", - "instrument_model": "Illumina HiSeq 4000", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "GSM6601461", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "md5_1": "cbe4e9f967a71593f9ec3c6edaf11c83", - "md5_2": "", - "read_count": "13558257", - "run_accession": "SRR21711855", - "run_alias": "GSM6601461_r1", - "sample_accession": "SAMN31021822", - "sample_alias": "GSM6601461", - "sample_description": "PM2.5-treated worms in day 5", - "sample_title": "PM2.5-treated worms in day 5", - "scientific_name": "Caenorhabditis elegans", - "secondary_sample_accession": "SRS15239724", - "secondary_study_accession": "SRP399678", - "single_end": true, - "study_accession": "PRJNA884373", - "study_alias": "GSE214215", - "study_title": "PM2.5 exposure induces lifespan reduction in Caenorhabditis elegans", - "submission_accession": "SRA1507236", - "tax_id": "6239" - } - ], - "versions": [ - "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", - "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" - ] - } - ], - "timestamp": "2024-01-07T15:11:52.542678" - } -} \ No newline at end of file From 6a0120d07b5866f4674e0cf18ce650085dec5ef0 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 7 Jan 2024 22:53:04 +0000 Subject: [PATCH 629/852] Tidy up tests and configuration --- conf/test.config | 4 ++-- nf-test.config | 14 ++++---------- tests/main.nf.test | 2 +- tests/nextflow.config | 0 tests/sra_ids_test.csv | 3 --- 5 files changed, 7 insertions(+), 16 deletions(-) create mode 100644 tests/nextflow.config delete mode 100644 tests/sra_ids_test.csv diff --git a/conf/test.config b/conf/test.config index 9bfd2adc..7b8941aa 100644 --- a/conf/test.config +++ b/conf/test.config @@ -20,7 +20,7 @@ params { max_time = '6.h' // Input data - input = "${projectDir}/tests/sra_ids_test.csv" + input = "https://raw.githubusercontent.com/nf-core/test-datasets/fetchngs/sra_ids_test.csv" - validationSchemaIgnoreParams = 'test_data_base,merge_samplesheet_ids,fastq_ftp_ids,test_data' + validationSchemaIgnoreParams = 'test_data_base,fastq_ftp_ids,test_data' } diff --git a/nf-test.config b/nf-test.config index 76aab204..5721f19d 100644 --- a/nf-test.config +++ b/nf-test.config @@ -1,16 +1,10 @@ config { - // location for all nf-tests + // Location of nf-tests testsDir "." - // nf-test directory including temporary files for each test + // nf-test directory used to create temporary files for each test workDir "nf-test" - // location of library folder that is added automatically to the classpath - libDir "lib/" - - // location of an optional nextflow.config file specific for executing tests - configFile "nextflow.config" - - // run all test with the defined docker profile from the main nextflow.config - profile "" + // Location of an optional nextflow.config file specific for executing pipeline tests + configFile "tests/nextflow.config" } diff --git a/tests/main.nf.test b/tests/main.nf.test index ac05aea9..6f992505 100644 --- a/tests/main.nf.test +++ b/tests/main.nf.test @@ -14,7 +14,7 @@ nextflow_pipeline { max_memory = '6.GB' max_time = '6.h' input = "$projectDir/tests/sra_ids_test.csv" - validationSchemaIgnoreParams = 'test_data_base,merge_samplesheet_ids,fastq_ftp_ids,test_data' + validationSchemaIgnoreParams = 'test_data_base,fastq_ftp_ids,test_data' } } diff --git a/tests/nextflow.config b/tests/nextflow.config new file mode 100644 index 00000000..e69de29b diff --git a/tests/sra_ids_test.csv b/tests/sra_ids_test.csv deleted file mode 100644 index d9a20c22..00000000 --- a/tests/sra_ids_test.csv +++ /dev/null @@ -1,3 +0,0 @@ -ERR1160846 -GSE214215 -SRR12848126 From f6510d596e7a7d85f75eb4cccc853ed468f2ef6b Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 7 Jan 2024 22:53:35 +0000 Subject: [PATCH 630/852] Use smaller test data to speed up test runtimes --- workflows/sra/tests/main.nf.test | 16 ++++++++-------- .../tests/sra_custom_ena_metadata_fields.nf.test | 12 ++++++------ .../tests/sra_force_sratools_download.nf.test | 16 ++++++++-------- .../tests/sra_nf_core_pipeline_atacseq.nf.test | 16 ++++++++-------- .../tests/sra_nf_core_pipeline_rnaseq.nf.test | 16 ++++++++-------- .../sra_nf_core_pipeline_taxprofiler.nf.test | 16 ++++++++-------- .../sra_nf_core_pipeline_viralrecon.nf.test | 16 ++++++++-------- .../sra/tests/sra_skip_fastq_download.nf.test | 16 ++++++++-------- 8 files changed, 62 insertions(+), 62 deletions(-) diff --git a/workflows/sra/tests/main.nf.test b/workflows/sra/tests/main.nf.test index a57187b1..e3c3025e 100644 --- a/workflows/sra/tests/main.nf.test +++ b/workflows/sra/tests/main.nf.test @@ -13,7 +13,7 @@ nextflow_workflow { when { workflow { """ - input[0] = Channel.from('ERR1160846', 'GSE214215', 'SRR12848126') + input[0] = Channel.from("DRX026011", "ERX1234253", "SRX6725035") """ } params { @@ -25,19 +25,19 @@ nextflow_workflow { assert workflow.success with(workflow.out.samplesheet) { - assert path(get(0)).readLines().size() == 5 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"ERX1234253"', '"SRX17709227"', '"SRX17709228"', '"SRX9315476"'] - assert path(get(0)).text.contains('Illumina HiSeq 4000') + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') } with(workflow.out.mappings) { - assert path(get(0)).readLines().size() == 5 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"ERX1234253"', '"SRX17709227"', '"SRX17709228"', '"SRX9315476"'] - assert path(get(0)).text.contains('Illumina HiSeq 4000') + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') } with(workflow.out.sample_mappings) { - assert path(get(0)[0]).md5 == "3bc981f0de28023083cdf13691d249d5" + assert path(get(0)[0]).md5 == "1ac06bb95b503703430e74660bbdd768" } } } diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test index 008cc258..b8750959 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test @@ -13,7 +13,7 @@ nextflow_workflow { when { workflow { """ - input[0] = Channel.from('ERR1160846', 'GSE214215', 'SRR12848126') + input[0] = Channel.from("DRX026011", "ERX1234253", "SRX6725035") """ } params { @@ -28,19 +28,19 @@ nextflow_workflow { assert workflow.success with(workflow.out.samplesheet) { - assert path(get(0)).readLines().size() == 5 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"ERX1234253"', '"SRX17709227"', '"SRX17709228"', '"SRX9315476"'] + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] assert path(get(0)).text.contains('SINGLE') } with(workflow.out.mappings) { - assert path(get(0)).readLines().size() == 5 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"ERX1234253"', '"SRX17709227"', '"SRX17709228"', '"SRX9315476"'] + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] assert path(get(0)).text.contains('SINGLE') } with(workflow.out.sample_mappings) { - assert path(get(0)[0]).md5 == "3bc981f0de28023083cdf13691d249d5" + assert path(get(0)[0]).md5 == "3b70bc9658eab4ba2f4ec98cb749ac9d" } } } diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test b/workflows/sra/tests/sra_force_sratools_download.nf.test index bfb7dfba..5109af7e 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test @@ -13,7 +13,7 @@ nextflow_workflow { when { workflow { """ - input[0] = Channel.from('ERR1160846', 'GSE214215', 'SRR12848126') + input[0] = Channel.from("DRX026011", "ERX1234253", "SRX6725035") """ } params { @@ -26,19 +26,19 @@ nextflow_workflow { assert workflow.success with(workflow.out.samplesheet) { - assert path(get(0)).readLines().size() == 5 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"ERX1234253"', '"SRX17709227"', '"SRX17709228"', '"SRX9315476"'] - assert path(get(0)).text.contains('Illumina HiSeq 4000') + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') } with(workflow.out.mappings) { - assert path(get(0)).readLines().size() == 5 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"ERX1234253"', '"SRX17709227"', '"SRX17709228"', '"SRX9315476"'] - assert path(get(0)).text.contains('Illumina HiSeq 4000') + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') } with(workflow.out.sample_mappings) { - assert path(get(0)[0]).md5 == "6d4c3e5137704358474330207f5f2b5c" + assert path(get(0)[0]).md5 == "1ac06bb95b503703430e74660bbdd768" } } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test index 770915a3..bdd6a572 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test @@ -13,7 +13,7 @@ nextflow_workflow { when { workflow { """ - input[0] = Channel.from('ERR1160846', 'GSE214215', 'SRR12848126') + input[0] = Channel.from("DRX026011", "ERX1234253", "SRX6725035") """ } params { @@ -26,19 +26,19 @@ nextflow_workflow { assert workflow.success with(workflow.out.samplesheet) { - assert path(get(0)).readLines().size() == 5 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"ERX1234253"', '"SRX17709227"', '"SRX17709228"', '"SRX9315476"'] - assert path(get(0)).text.contains('Illumina HiSeq 4000') + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') } with(workflow.out.mappings) { - assert path(get(0)).readLines().size() == 5 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"ERX1234253"', '"SRX17709227"', '"SRX17709228"', '"SRX9315476"'] - assert path(get(0)).text.contains('Illumina HiSeq 4000') + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') } with(workflow.out.sample_mappings) { - assert path(get(0)[0]).md5 == "6d4c3e5137704358474330207f5f2b5c" + assert path(get(0)[0]).md5 == "1ac06bb95b503703430e74660bbdd768" } } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test index cbf42a53..5d8241ab 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test @@ -13,7 +13,7 @@ nextflow_workflow { when { workflow { """ - input[0] = Channel.from('ERR1160846', 'GSE214215', 'SRR12848126') + input[0] = Channel.from("DRX026011", "ERX1234253", "SRX6725035") """ } params { @@ -26,19 +26,19 @@ nextflow_workflow { assert workflow.success with(workflow.out.samplesheet) { - assert path(get(0)).readLines().size() == 5 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"ERX1234253"', '"SRX17709227"', '"SRX17709228"', '"SRX9315476"'] - assert path(get(0)).text.contains('Illumina HiSeq 4000') + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') } with(workflow.out.mappings) { - assert path(get(0)).readLines().size() == 5 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"ERX1234253"', '"SRX17709227"', '"SRX17709228"', '"SRX9315476"'] - assert path(get(0)).text.contains('Illumina HiSeq 4000') + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') } with(workflow.out.sample_mappings) { - assert path(get(0)[0]).md5 == "6d4c3e5137704358474330207f5f2b5c" + assert path(get(0)[0]).md5 == "1ac06bb95b503703430e74660bbdd768" } } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test index db0400c1..5246581e 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test @@ -13,7 +13,7 @@ nextflow_workflow { when { workflow { """ - input[0] = Channel.from('ERR1160846', 'GSE214215', 'SRR12848126') + input[0] = Channel.from("DRX026011", "ERX1234253", "SRX6725035") """ } params { @@ -26,19 +26,19 @@ nextflow_workflow { assert workflow.success with(workflow.out.samplesheet) { - assert path(get(0)).readLines().size() == 5 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"ERX1234253"', '"SRX17709227"', '"SRX17709228"', '"SRX9315476"'] - assert path(get(0)).text.contains('Illumina HiSeq 4000') + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') } with(workflow.out.mappings) { - assert path(get(0)).readLines().size() == 5 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"ERX1234253"', '"SRX17709227"', '"SRX17709228"', '"SRX9315476"'] - assert path(get(0)).text.contains('Illumina HiSeq 4000') + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') } with(workflow.out.sample_mappings) { - assert path(get(0)[0]).md5 == "6d4c3e5137704358474330207f5f2b5c" + assert path(get(0)[0]).md5 == "1ac06bb95b503703430e74660bbdd768" } } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test index e13f83b3..ec57b425 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test @@ -13,7 +13,7 @@ nextflow_workflow { when { workflow { """ - input[0] = Channel.from('ERR1160846', 'GSE214215', 'SRR12848126') + input[0] = Channel.from("DRX026011", "ERX1234253", "SRX6725035") """ } params { @@ -26,19 +26,19 @@ nextflow_workflow { assert workflow.success with(workflow.out.samplesheet) { - assert path(get(0)).readLines().size() == 5 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"ERX1234253"', '"SRX17709227"', '"SRX17709228"', '"SRX9315476"'] - assert path(get(0)).text.contains('Illumina HiSeq 4000') + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') } with(workflow.out.mappings) { - assert path(get(0)).readLines().size() == 5 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"ERX1234253"', '"SRX17709227"', '"SRX17709228"', '"SRX9315476"'] - assert path(get(0)).text.contains('Illumina HiSeq 4000') + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') } with(workflow.out.sample_mappings) { - assert path(get(0)[0]).md5 == "6d4c3e5137704358474330207f5f2b5c" + assert path(get(0)[0]).md5 == "1ac06bb95b503703430e74660bbdd768" } } } diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test b/workflows/sra/tests/sra_skip_fastq_download.nf.test index f5805367..65a6bc28 100644 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test @@ -13,7 +13,7 @@ nextflow_workflow { when { workflow { """ - input[0] = Channel.from('ERR1160846', 'GSE214215', 'SRR12848126') + input[0] = Channel.from("DRX026011", "ERX1234253", "SRX6725035") """ } params { @@ -26,19 +26,19 @@ nextflow_workflow { assert workflow.success with(workflow.out.samplesheet) { - assert path(get(0)).readLines().size() == 5 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"ERX1234253"', '"SRX17709227"', '"SRX17709228"', '"SRX9315476"'] - assert path(get(0)).text.contains('Illumina HiSeq 4000') + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') } with(workflow.out.mappings) { - assert path(get(0)).readLines().size() == 5 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"ERX1234253"', '"SRX17709227"', '"SRX17709228"', '"SRX9315476"'] - assert path(get(0)).text.contains('Illumina HiSeq 4000') + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') } with(workflow.out.sample_mappings) { - assert path(get(0)[0]).md5 == "6d4c3e5137704358474330207f5f2b5c" + assert path(get(0)[0]).md5 == "1ac06bb95b503703430e74660bbdd768" } } } From 8fc22ecef6d7463befc8036ee05a645e2810d4bd Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 7 Jan 2024 23:06:36 +0000 Subject: [PATCH 631/852] Update pipeline test to load test.config directly --- tests/main.nf.test | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/tests/main.nf.test b/tests/main.nf.test index 6f992505..f9ad32e2 100644 --- a/tests/main.nf.test +++ b/tests/main.nf.test @@ -2,6 +2,7 @@ nextflow_pipeline { name "Test pipeline" script "../main.nf" + config "../conf/test.config" tag "pipeline" tag "pipeline_fetchngs" @@ -9,20 +10,12 @@ nextflow_pipeline { when { params { - outdir = "results" - max_cpus = 2 - max_memory = '6.GB' - max_time = '6.h' - input = "$projectDir/tests/sra_ids_test.csv" - validationSchemaIgnoreParams = 'test_data_base,fastq_ftp_ids,test_data' + outdir = "$outputDir" } } then { - assertAll( - { assert workflow.success } - ) + assert workflow.success } } - } From 61b36d8437f7efae9674022dd753b758396e7c4d Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 8 Jan 2024 13:34:40 +0000 Subject: [PATCH 632/852] Standardise nf-test env vars and add tap output option --- .github/workflows/ci.yml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8917a345..1b4921ce 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,7 +13,8 @@ on: env: NXF_ANSI_LOG: false - NFTEST_VER: "0.8.3" + NFT_VER: "0.8.3" + NFT_WORKDIR: "~" NFT_DIFF: "icdiff" NFT_DIFF_ARGS: "-N --cols 200 -L expected -L observed -t" @@ -83,7 +84,7 @@ jobs: path: | /usr/local/bin/nf-test /home/runner/.nf-test/nf-test.jar - key: ${{ runner.os }}-${{ env.NFTEST_VER }}-nftest + key: ${{ runner.os }}-${{ env.NFT_VER }}-nftest - name: Install nf-test if: steps.cache-software.outputs.cache-hit != 'true' @@ -96,8 +97,12 @@ jobs: sudo apt install icdiff - name: Run nf-test + uses: pcolby/tap-summary@v1 + with: + path: >- + test.tap run: | - nf-test test --verbose --tag ${{ matrix.tags }} --profile "test,${{ matrix.profile }}" --junitxml=test.xml + nf-test test --verbose --tag ${{ matrix.tags }} --profile "test,${{ matrix.profile }}" --junitxml=test.xml --tap=test.tap - name: Output log on failure if: failure() From 25eac030c5e0c9660afa726d3928e8cbbf1ccee0 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 8 Jan 2024 13:34:58 +0000 Subject: [PATCH 633/852] Use env var to evaluate nf-test workDir --- nf-test.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nf-test.config b/nf-test.config index 5721f19d..6f5e2c47 100644 --- a/nf-test.config +++ b/nf-test.config @@ -3,7 +3,7 @@ config { testsDir "." // nf-test directory used to create temporary files for each test - workDir "nf-test" + workDir System.getenv("NFT_WORKDIR") ?: ".nf-test" // Location of an optional nextflow.config file specific for executing pipeline tests configFile "tests/nextflow.config" From 3255d8fc07d7df5105b5fb2e8210f3e6b9e8693a Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 8 Jan 2024 13:35:25 +0000 Subject: [PATCH 634/852] Bump tower-launch plugin version and switch off default tests for GCP --- .github/workflows/cloud_tests_full.yml | 39 ++++++++++++++----------- .github/workflows/cloud_tests_small.yml | 39 ++++++++++++++----------- 2 files changed, 44 insertions(+), 34 deletions(-) diff --git a/.github/workflows/cloud_tests_full.yml b/.github/workflows/cloud_tests_full.yml index d0ed0552..522cfc4a 100644 --- a/.github/workflows/cloud_tests_full.yml +++ b/.github/workflows/cloud_tests_full.yml @@ -20,62 +20,67 @@ jobs: if: ${{ github.event.inputs.platform == 'all' || github.event.inputs.platform == 'aws' || !github.event.inputs }} runs-on: ubuntu-latest steps: - - uses: seqeralabs/action-tower-launch@v1 + - uses: seqeralabs/action-tower-launch@v2 with: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} compute_env: ${{ secrets.TOWER_CE_AWS_CPU }} workdir: "${{ secrets.TOWER_BUCKET_AWS }}/work/fetchngs/work-${{ github.sha }}" run_name: "aws_fetchngs_full" + revision: ${{ github.sha }} profiles: test_full parameters: | { "hook_url": "${{ secrets.MEGATESTS_ALERTS_SLACK_HOOK_URL }}", - "outdir": "${{ secrets.TOWER_BUCKET_AWS }}/fetchngs/results-${{ github.sha }}" + "outdir": "${{ secrets.TOWER_BUCKET_AWS }}/fetchngs/results-${{ github.sha }}/" } - uses: actions/upload-artifact@v3 with: name: Tower debug log file path: tower_action_*.log - run-full-tests-on-gcp: - if: ${{ github.event.inputs.platform == 'all' || github.event.inputs.platform == 'gcp' || !github.event.inputs }} + + run-full-tests-on-azure: + if: ${{ github.event.inputs.platform == 'all' || github.event.inputs.platform == 'azure' || !github.event.inputs }} runs-on: ubuntu-latest steps: - - uses: seqeralabs/action-tower-launch@v1 + - uses: seqeralabs/action-tower-launch@v2 with: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} - compute_env: ${{ secrets.TOWER_CE_GCP_CPU }} - workdir: "${{ secrets.TOWER_BUCKET_GCP }}/work/fetchngs/work-${{ github.sha }}" - run_name: "gcp_fetchngs_full" + compute_env: ${{ secrets.TOWER_CE_AZURE_CPU }} + workdir: "${{ secrets.TOWER_BUCKET_AZURE }}/work/fetchngs/work-${{ github.sha }}" + run_name: "azure_fetchngs_full" + revision: ${{ github.sha }} profiles: test_full parameters: | { "hook_url": "${{ secrets.MEGATESTS_ALERTS_SLACK_HOOK_URL }}", - "outdir": "${{ secrets.TOWER_BUCKET_GCP }}/fetchngs/results-${{ github.sha }}" + "outdir": "${{ secrets.TOWER_BUCKET_AZURE }}/fetchngs/results-${{ github.sha }}/" } - uses: actions/upload-artifact@v3 with: name: Tower debug log file path: tower_action_*.log - run-full-tests-on-azure: - if: ${{ github.event.inputs.platform == 'all' || github.event.inputs.platform == 'azure' || !github.event.inputs }} + + run-full-tests-on-gcp: + if: ${{ github.event.inputs.platform == 'gcp' || !github.event.inputs }} runs-on: ubuntu-latest steps: - - uses: seqeralabs/action-tower-launch@v1 + - uses: seqeralabs/action-tower-launch@v2 with: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} - compute_env: ${{ secrets.TOWER_CE_AZURE_CPU }} - workdir: "${{ secrets.TOWER_BUCKET_AZURE }}/work/fetchngs/work-${{ github.sha }}" - run_name: "azure_fetchngs_full" + compute_env: ${{ secrets.TOWER_CE_GCP_CPU }} + workdir: "${{ secrets.TOWER_BUCKET_GCP }}/work/fetchngs/work-${{ github.sha }}" + run_name: "gcp_fetchngs_full" + revision: ${{ github.sha }} profiles: test_full parameters: | { "hook_url": "${{ secrets.MEGATESTS_ALERTS_SLACK_HOOK_URL }}", - "outdir": "${{ secrets.TOWER_BUCKET_AZURE }}/fetchngs/results-${{ github.sha }}" + "outdir": "${{ secrets.TOWER_BUCKET_GCP }}/fetchngs/results-${{ github.sha }}/" } - uses: actions/upload-artifact@v3 with: name: Tower debug log file - path: tower_action_*.log + path: tower_action_*.log \ No newline at end of file diff --git a/.github/workflows/cloud_tests_small.yml b/.github/workflows/cloud_tests_small.yml index 12b8daab..e64ab1ef 100644 --- a/.github/workflows/cloud_tests_small.yml +++ b/.github/workflows/cloud_tests_small.yml @@ -18,59 +18,64 @@ jobs: if: ${{ github.event.inputs.platform == 'all' || github.event.inputs.platform == 'aws' }} runs-on: ubuntu-latest steps: - - uses: seqeralabs/action-tower-launch@v1 + - uses: seqeralabs/action-tower-launch@v2 with: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} compute_env: ${{ secrets.TOWER_CE_AWS_CPU }} workdir: "${{ secrets.TOWER_BUCKET_AWS }}/work/fetchngs/work-${{ github.sha }}" run_name: "aws_fetchngs_small" + revision: ${{ github.sha }} profiles: test parameters: | { - "outdir": "${{ secrets.TOWER_BUCKET_AWS }}/fetchngs/results-test-${{ github.sha }}" + "outdir": "${{ secrets.TOWER_BUCKET_AWS }}/fetchngs/results-test-${{ github.sha }}/" } - uses: actions/upload-artifact@v3 with: name: Tower debug log file path: tower_action_*.log - run-small-tests-on-gcp: - if: ${{ github.event.inputs.platform == 'all' || github.event.inputs.platform == 'gcp' }} + + run-small-tests-on-azure: + if: ${{ github.event.inputs.platform == 'all' || github.event.inputs.platform == 'azure' }} runs-on: ubuntu-latest steps: - - uses: seqeralabs/action-tower-launch@v1 + - uses: seqeralabs/action-tower-launch@v2 with: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} - compute_env: ${{ secrets.TOWER_CE_GCP_CPU }} - workdir: "${{ secrets.TOWER_BUCKET_GCP }}/work/fetchngs/work-${{ github.sha }}" - run_name: "gcp_fetchngs_small" + compute_env: ${{ secrets.TOWER_CE_AZURE_CPU }} + workdir: "${{ secrets.TOWER_BUCKET_AZURE }}/work/fetchngs/work-${{ github.sha }}" + run_name: "azure_fetchngs_small" + revision: ${{ github.sha }} profiles: test parameters: | { - "outdir": "${{ secrets.TOWER_BUCKET_GCP }}/fetchngs/results-test-${{ github.sha }}" + "outdir": "${{ secrets.TOWER_BUCKET_AZURE }}/fetchngs/results-test-${{ github.sha }}/" } - uses: actions/upload-artifact@v3 with: name: Tower debug log file path: tower_action_*.log - run-small-tests-on-azure: - if: ${{ github.event.inputs.platform == 'all' || github.event.inputs.platform == 'azure' }} + + run-small-tests-on-gcp: + if: ${{ github.event.inputs.platform == 'gcp' }} runs-on: ubuntu-latest steps: - - uses: seqeralabs/action-tower-launch@v1 + - uses: seqeralabs/action-tower-launch@v2 with: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} - compute_env: ${{ secrets.TOWER_CE_AZURE_CPU }} - workdir: "${{ secrets.TOWER_BUCKET_AZURE }}/work/fetchngs/work-${{ github.sha }}" - run_name: "azure_fetchngs_small" + compute_env: ${{ secrets.TOWER_CE_GCP_CPU }} + workdir: "${{ secrets.TOWER_BUCKET_GCP }}/work/fetchngs/work-${{ github.sha }}" + run_name: "gcp_fetchngs_small" + revision: ${{ github.sha }} profiles: test parameters: | { - "outdir": "${{ secrets.TOWER_BUCKET_AZURE }}/fetchngs/results-test-${{ github.sha }}" + "outdir": "${{ secrets.TOWER_BUCKET_GCP }}/fetchngs/results-test-${{ github.sha }}/" } - uses: actions/upload-artifact@v3 with: name: Tower debug log file - path: tower_action_*.log + path: tower_action_*.log \ No newline at end of file From 86618c1a19571dbb9b7d285853e8799983dd5226 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 8 Jan 2024 13:46:58 +0000 Subject: [PATCH 635/852] Fix prettier --- .github/workflows/cloud_tests_full.yml | 2 +- .github/workflows/cloud_tests_small.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cloud_tests_full.yml b/.github/workflows/cloud_tests_full.yml index 522cfc4a..2748b542 100644 --- a/.github/workflows/cloud_tests_full.yml +++ b/.github/workflows/cloud_tests_full.yml @@ -83,4 +83,4 @@ jobs: - uses: actions/upload-artifact@v3 with: name: Tower debug log file - path: tower_action_*.log \ No newline at end of file + path: tower_action_*.log diff --git a/.github/workflows/cloud_tests_small.yml b/.github/workflows/cloud_tests_small.yml index e64ab1ef..195eb9d4 100644 --- a/.github/workflows/cloud_tests_small.yml +++ b/.github/workflows/cloud_tests_small.yml @@ -78,4 +78,4 @@ jobs: - uses: actions/upload-artifact@v3 with: name: Tower debug log file - path: tower_action_*.log \ No newline at end of file + path: tower_action_*.log From a5f4ec4f251e1fc016ccd7a0772e4eb6943e129c Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 8 Jan 2024 13:47:23 +0000 Subject: [PATCH 636/852] Use SHA in paths to test data used in pipeline --- conf/test.config | 2 +- conf/test_full.config | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/test.config b/conf/test.config index 7b8941aa..4272648c 100644 --- a/conf/test.config +++ b/conf/test.config @@ -20,7 +20,7 @@ params { max_time = '6.h' // Input data - input = "https://raw.githubusercontent.com/nf-core/test-datasets/fetchngs/sra_ids_test.csv" + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/2732b911c57e607fa7aea5ba0c3d91b25bafb662/testdata/v1.12.0/sra_ids_test.csv' validationSchemaIgnoreParams = 'test_data_base,fastq_ftp_ids,test_data' } diff --git a/conf/test_full.config b/conf/test_full.config index c16fda7f..9215d510 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -15,5 +15,5 @@ params { config_profile_description = 'Full test dataset to check pipeline function' // Input data for full size test - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/fetchngs/sra_ids_test_full.csv' + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/bb634bcfef520552e8314dfa3f8a764e1d62f7dc/testdata/v1.12.0/sra_ids_test_full.csv' } From d2ea5cf17cebf708c495cfe2feb7f26890b4c3d0 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 8 Jan 2024 14:21:48 +0000 Subject: [PATCH 637/852] Be more explicit with pipeline tests --- tests/main.nf.test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/main.nf.test b/tests/main.nf.test index f9ad32e2..c52e98a8 100644 --- a/tests/main.nf.test +++ b/tests/main.nf.test @@ -2,7 +2,6 @@ nextflow_pipeline { name "Test pipeline" script "../main.nf" - config "../conf/test.config" tag "pipeline" tag "pipeline_fetchngs" @@ -11,6 +10,7 @@ nextflow_pipeline { when { params { outdir = "$outputDir" + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/2732b911c57e607fa7aea5ba0c3d91b25bafb662/testdata/v1.12.0/sra_ids_test.csv' } } From 375a4e52d2081d20bad83277b32bbdaf0e29baeb Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 8 Jan 2024 15:45:17 +0000 Subject: [PATCH 638/852] Add --nf_core_pipeline specific tests at the workflow level --- workflows/sra/tests/main.nf.test | 1 + workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test | 1 + workflows/sra/tests/sra_force_sratools_download.nf.test | 1 + workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test | 1 + workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test | 1 + workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test | 1 + workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test | 1 + workflows/sra/tests/sra_skip_fastq_download.nf.test | 1 + 8 files changed, 8 insertions(+) diff --git a/workflows/sra/tests/main.nf.test b/workflows/sra/tests/main.nf.test index e3c3025e..24dbf9cc 100644 --- a/workflows/sra/tests/main.nf.test +++ b/workflows/sra/tests/main.nf.test @@ -26,6 +26,7 @@ nextflow_workflow { with(workflow.out.samplesheet) { assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',')[0].take(4) == ['"sample"', '"fastq_1"', '"fastq_2"', '"run_accession"'] assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] assert path(get(0)).text.contains('Illumina HiSeq 2500') } diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test index b8750959..3e88691e 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test @@ -29,6 +29,7 @@ nextflow_workflow { with(workflow.out.samplesheet) { assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',')[0].take(4) == ['"sample"', '"fastq_1"', '"fastq_2"', '"run_accession"'] assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] assert path(get(0)).text.contains('SINGLE') } diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test b/workflows/sra/tests/sra_force_sratools_download.nf.test index 5109af7e..3db1ae13 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test @@ -27,6 +27,7 @@ nextflow_workflow { with(workflow.out.samplesheet) { assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',')[0].take(4) == ['"sample"', '"fastq_1"', '"fastq_2"', '"run_accession"'] assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] assert path(get(0)).text.contains('Illumina HiSeq 2500') } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test index bdd6a572..b7c89ec3 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test @@ -27,6 +27,7 @@ nextflow_workflow { with(workflow.out.samplesheet) { assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',')[0].take(5) == ['"sample"', '"fastq_1"', '"fastq_2"', '"replicate"', '"run_accession"'] assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] assert path(get(0)).text.contains('Illumina HiSeq 2500') } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test index 5d8241ab..b4ff8467 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test @@ -27,6 +27,7 @@ nextflow_workflow { with(workflow.out.samplesheet) { assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',')[0].take(5) == ['"sample"', '"fastq_1"', '"fastq_2"', '"strandedness"' , '"run_accession"'] assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] assert path(get(0)).text.contains('Illumina HiSeq 2500') } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test index 5246581e..9b76b683 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test @@ -27,6 +27,7 @@ nextflow_workflow { with(workflow.out.samplesheet) { assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',')[0].take(5) == ['"sample"', '"fastq_1"', '"fastq_2"', '"fasta"', '"run_accession"'] assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] assert path(get(0)).text.contains('Illumina HiSeq 2500') } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test index ec57b425..d2aaf569 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test @@ -27,6 +27,7 @@ nextflow_workflow { with(workflow.out.samplesheet) { assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',')[0].take(4) == ['"sample"', '"fastq_1"', '"fastq_2"', '"run_accession"'] assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] assert path(get(0)).text.contains('Illumina HiSeq 2500') } diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test b/workflows/sra/tests/sra_skip_fastq_download.nf.test index 65a6bc28..249c0387 100644 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test @@ -27,6 +27,7 @@ nextflow_workflow { with(workflow.out.samplesheet) { assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',')[0].take(4) == ['"sample"', '"fastq_1"', '"fastq_2"', '"run_accession"'] assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] assert path(get(0)).text.contains('Illumina HiSeq 2500') } From 5b9348c428d10b6a33bd0df66c0f8cf4319ec364 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 8 Jan 2024 16:00:32 +0000 Subject: [PATCH 639/852] Use pdiff instead of icdiff for nf-test snapshot diffs --- .github/workflows/ci.yml | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1b4921ce..b395350f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,8 +15,8 @@ env: NXF_ANSI_LOG: false NFT_VER: "0.8.3" NFT_WORKDIR: "~" - NFT_DIFF: "icdiff" - NFT_DIFF_ARGS: "-N --cols 200 -L expected -L observed -t" + NFT_DIFF: "pdiff" + NFT_DIFF_ARGS: "--line-numbers --expand-tabs=2" concurrency: group: "${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}" @@ -77,6 +77,16 @@ jobs: with: version: "${{ matrix.NXF_VER }}" + - uses: actions/setup-python@v4 + with: + python-version: "3.11" + architecture: "x64" + + - name: Install pdiff to see diff between nf-test snapshots + run: | + python -m pip install --upgrade pip + pip install pdiff + - name: Cache nf-test installation id: cache-software uses: actions/cache@v3 @@ -97,12 +107,13 @@ jobs: sudo apt install icdiff - name: Run nf-test - uses: pcolby/tap-summary@v1 + run: | + nf-test test --verbose --tag ${{ matrix.tags }} --profile "test,${{ matrix.profile }}" --junitxml=test.xml --tap=test.tap + + - uses: pcolby/tap-summary@v1 with: path: >- test.tap - run: | - nf-test test --verbose --tag ${{ matrix.tags }} --profile "test,${{ matrix.profile }}" --junitxml=test.xml --tap=test.tap - name: Output log on failure if: failure() From e392e376d2fd1a062aed405ba87fbd885ebe17b7 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 8 Jan 2024 17:25:14 +0000 Subject: [PATCH 640/852] Update workflow tests to use assertAll --- workflows/sra/tests/main.nf.test | 30 ++++++++++--------- .../sra_custom_ena_metadata_fields.nf.test | 30 ++++++++++--------- .../tests/sra_force_sratools_download.nf.test | 30 ++++++++++--------- .../sra_nf_core_pipeline_atacseq.nf.test | 30 ++++++++++--------- .../tests/sra_nf_core_pipeline_rnaseq.nf.test | 30 ++++++++++--------- .../sra_nf_core_pipeline_taxprofiler.nf.test | 30 ++++++++++--------- .../sra_nf_core_pipeline_viralrecon.nf.test | 30 ++++++++++--------- .../sra/tests/sra_skip_fastq_download.nf.test | 30 ++++++++++--------- 8 files changed, 128 insertions(+), 112 deletions(-) diff --git a/workflows/sra/tests/main.nf.test b/workflows/sra/tests/main.nf.test index 24dbf9cc..102b8796 100644 --- a/workflows/sra/tests/main.nf.test +++ b/workflows/sra/tests/main.nf.test @@ -24,22 +24,24 @@ nextflow_workflow { then { assert workflow.success - with(workflow.out.samplesheet) { - assert path(get(0)).readLines().size() == 4 - assert path(get(0)).readLines()*.split(',')[0].take(4) == ['"sample"', '"fastq_1"', '"fastq_2"', '"run_accession"'] - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] - assert path(get(0)).text.contains('Illumina HiSeq 2500') - } + assertAll( + with(workflow.out.samplesheet) { + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',')[0].take(4) == ['"sample"', '"fastq_1"', '"fastq_2"', '"run_accession"'] + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') + } - with(workflow.out.mappings) { - assert path(get(0)).readLines().size() == 4 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] - assert path(get(0)).text.contains('Illumina HiSeq 2500') - } + with(workflow.out.mappings) { + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') + } - with(workflow.out.sample_mappings) { - assert path(get(0)[0]).md5 == "1ac06bb95b503703430e74660bbdd768" - } + with(workflow.out.sample_mappings) { + assert path(get(0)[0]).md5 == "1ac06bb95b503703430e74660bbdd768" + } + ) } } } diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test index 3e88691e..c5379bee 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test @@ -27,22 +27,24 @@ nextflow_workflow { then { assert workflow.success - with(workflow.out.samplesheet) { - assert path(get(0)).readLines().size() == 4 - assert path(get(0)).readLines()*.split(',')[0].take(4) == ['"sample"', '"fastq_1"', '"fastq_2"', '"run_accession"'] - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] - assert path(get(0)).text.contains('SINGLE') - } + assertAll( + with(workflow.out.samplesheet) { + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',')[0].take(5) == ['"sample"', '"fastq_1"', '"fastq_2"', '"strandedness"' , '"run_accession"'] + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('SINGLE') + } - with(workflow.out.mappings) { - assert path(get(0)).readLines().size() == 4 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] - assert path(get(0)).text.contains('SINGLE') - } + with(workflow.out.mappings) { + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('SINGLE') + } - with(workflow.out.sample_mappings) { - assert path(get(0)[0]).md5 == "3b70bc9658eab4ba2f4ec98cb749ac9d" - } + with(workflow.out.sample_mappings) { + assert path(get(0)[0]).md5 == "3b70bc9658eab4ba2f4ec98cb749ac9d" + } + ) } } } diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test b/workflows/sra/tests/sra_force_sratools_download.nf.test index 3db1ae13..2a821807 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test @@ -25,22 +25,24 @@ nextflow_workflow { then { assert workflow.success - with(workflow.out.samplesheet) { - assert path(get(0)).readLines().size() == 4 - assert path(get(0)).readLines()*.split(',')[0].take(4) == ['"sample"', '"fastq_1"', '"fastq_2"', '"run_accession"'] - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] - assert path(get(0)).text.contains('Illumina HiSeq 2500') - } + assertAll( + with(workflow.out.samplesheet) { + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',')[0].take(4) == ['"sample"', '"fastq_1"', '"fastq_2"', '"run_accession"'] + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') + } - with(workflow.out.mappings) { - assert path(get(0)).readLines().size() == 4 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] - assert path(get(0)).text.contains('Illumina HiSeq 2500') - } + with(workflow.out.mappings) { + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') + } - with(workflow.out.sample_mappings) { - assert path(get(0)[0]).md5 == "1ac06bb95b503703430e74660bbdd768" - } + with(workflow.out.sample_mappings) { + assert path(get(0)[0]).md5 == "1ac06bb95b503703430e74660bbdd768" + } + ) } } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test index b7c89ec3..45f8f478 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test @@ -25,22 +25,24 @@ nextflow_workflow { then { assert workflow.success - with(workflow.out.samplesheet) { - assert path(get(0)).readLines().size() == 4 - assert path(get(0)).readLines()*.split(',')[0].take(5) == ['"sample"', '"fastq_1"', '"fastq_2"', '"replicate"', '"run_accession"'] - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] - assert path(get(0)).text.contains('Illumina HiSeq 2500') - } + assertAll( + with(workflow.out.samplesheet) { + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',')[0].take(5) == ['"sample"', '"fastq_1"', '"fastq_2"', '"replicate"', '"run_accession"'] + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') + } - with(workflow.out.mappings) { - assert path(get(0)).readLines().size() == 4 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] - assert path(get(0)).text.contains('Illumina HiSeq 2500') - } + with(workflow.out.mappings) { + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') + } - with(workflow.out.sample_mappings) { - assert path(get(0)[0]).md5 == "1ac06bb95b503703430e74660bbdd768" - } + with(workflow.out.sample_mappings) { + assert path(get(0)[0]).md5 == "1ac06bb95b503703430e74660bbdd768" + } + ) } } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test index b4ff8467..faeee87c 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test @@ -25,22 +25,24 @@ nextflow_workflow { then { assert workflow.success - with(workflow.out.samplesheet) { - assert path(get(0)).readLines().size() == 4 - assert path(get(0)).readLines()*.split(',')[0].take(5) == ['"sample"', '"fastq_1"', '"fastq_2"', '"strandedness"' , '"run_accession"'] - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] - assert path(get(0)).text.contains('Illumina HiSeq 2500') - } + assertAll( + with(workflow.out.samplesheet) { + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',')[0].take(5) == ['"sample"', '"fastq_1"', '"fastq_2"', '"strandedness"' , '"run_accession"'] + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') + } - with(workflow.out.mappings) { - assert path(get(0)).readLines().size() == 4 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] - assert path(get(0)).text.contains('Illumina HiSeq 2500') - } + with(workflow.out.mappings) { + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') + } - with(workflow.out.sample_mappings) { - assert path(get(0)[0]).md5 == "1ac06bb95b503703430e74660bbdd768" - } + with(workflow.out.sample_mappings) { + assert path(get(0)[0]).md5 == "1ac06bb95b503703430e74660bbdd768" + } + ) } } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test index 9b76b683..714d45d9 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test @@ -25,22 +25,24 @@ nextflow_workflow { then { assert workflow.success - with(workflow.out.samplesheet) { - assert path(get(0)).readLines().size() == 4 - assert path(get(0)).readLines()*.split(',')[0].take(5) == ['"sample"', '"fastq_1"', '"fastq_2"', '"fasta"', '"run_accession"'] - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] - assert path(get(0)).text.contains('Illumina HiSeq 2500') - } + assertAll( + with(workflow.out.samplesheet) { + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',')[0].take(5) == ['"sample"', '"fastq_1"', '"fastq_2"', '"fasta"', '"run_accession"'] + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') + } - with(workflow.out.mappings) { - assert path(get(0)).readLines().size() == 4 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] - assert path(get(0)).text.contains('Illumina HiSeq 2500') - } + with(workflow.out.mappings) { + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') + } - with(workflow.out.sample_mappings) { - assert path(get(0)[0]).md5 == "1ac06bb95b503703430e74660bbdd768" - } + with(workflow.out.sample_mappings) { + assert path(get(0)[0]).md5 == "1ac06bb95b503703430e74660bbdd768" + } + ) } } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test index d2aaf569..a5f68cb6 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test @@ -25,22 +25,24 @@ nextflow_workflow { then { assert workflow.success - with(workflow.out.samplesheet) { - assert path(get(0)).readLines().size() == 4 - assert path(get(0)).readLines()*.split(',')[0].take(4) == ['"sample"', '"fastq_1"', '"fastq_2"', '"run_accession"'] - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] - assert path(get(0)).text.contains('Illumina HiSeq 2500') - } + assertAll( + with(workflow.out.samplesheet) { + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',')[0].take(4) == ['"sample"', '"fastq_1"', '"fastq_2"', '"run_accession"'] + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') + } - with(workflow.out.mappings) { - assert path(get(0)).readLines().size() == 4 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] - assert path(get(0)).text.contains('Illumina HiSeq 2500') - } + with(workflow.out.mappings) { + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') + } - with(workflow.out.sample_mappings) { - assert path(get(0)[0]).md5 == "1ac06bb95b503703430e74660bbdd768" - } + with(workflow.out.sample_mappings) { + assert path(get(0)[0]).md5 == "1ac06bb95b503703430e74660bbdd768" + } + ) } } } diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test b/workflows/sra/tests/sra_skip_fastq_download.nf.test index 249c0387..8cc3bd94 100644 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test @@ -25,22 +25,24 @@ nextflow_workflow { then { assert workflow.success - with(workflow.out.samplesheet) { - assert path(get(0)).readLines().size() == 4 - assert path(get(0)).readLines()*.split(',')[0].take(4) == ['"sample"', '"fastq_1"', '"fastq_2"', '"run_accession"'] - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] - assert path(get(0)).text.contains('Illumina HiSeq 2500') - } + assertAll( + with(workflow.out.samplesheet) { + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',')[0].take(4) == ['"sample"', '"fastq_1"', '"fastq_2"', '"run_accession"'] + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') + } - with(workflow.out.mappings) { - assert path(get(0)).readLines().size() == 4 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] - assert path(get(0)).text.contains('Illumina HiSeq 2500') - } + with(workflow.out.mappings) { + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') + } - with(workflow.out.sample_mappings) { - assert path(get(0)[0]).md5 == "1ac06bb95b503703430e74660bbdd768" - } + with(workflow.out.sample_mappings) { + assert path(get(0)[0]).md5 == "1ac06bb95b503703430e74660bbdd768" + } + ) } } } From 30333c46827cb40b71e9801ca95710125d77095a Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 8 Jan 2024 17:25:43 +0000 Subject: [PATCH 641/852] Add more explicit pipeline tests for file paths and samplesheet contents --- tests/main.nf.test | 62 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/tests/main.nf.test b/tests/main.nf.test index c52e98a8..d85519f4 100644 --- a/tests/main.nf.test +++ b/tests/main.nf.test @@ -11,11 +11,73 @@ nextflow_pipeline { params { outdir = "$outputDir" input = 'https://raw.githubusercontent.com/nf-core/test-datasets/2732b911c57e607fa7aea5ba0c3d91b25bafb662/testdata/v1.12.0/sra_ids_test.csv' + //input = "$projectDir/ids.csv" } } then { assert workflow.success + + assertAll( + { assert new File("$outputDir/samplesheet/samplesheet.csv").readLines().size() == 15 }, + { assert new File("$outputDir/samplesheet/samplesheet.csv").readLines()*.split(',')[0].take(4) == ['"sample"', '"fastq_1"', '"fastq_2"', '"run_accession"'] }, + { assert new File("$outputDir/samplesheet/samplesheet.csv").readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX024467"', '"DRX026011"', '"ERX1234253"', '"SRX10940790"', '"SRX11047067"', '"SRX17709227"', '"SRX17709228"', '"SRX6725035"', '"SRX9315476"', '"SRX9504942"', '"SRX9504942"', '"SRX9504942"', '"SRX9504942"', '"SRX9626017"'] }, + { assert new File("$outputDir/samplesheet/samplesheet.csv").text.contains('Illumina HiSeq 2500') }, + { assert new File("$outputDir/custom/user-settings.mkfg").exists() }, + { assert new File("$outputDir/fastq/DRX024467_DRR026872.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/DRX026011_DRR028935_1.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/DRX026011_DRR028935_2.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/ERX1234253_ERR1160846.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/SRX10940790_SRR14593545_1.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/SRX10940790_SRR14593545_2.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/SRX11047067_SRR14709033.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/SRX17709227_SRR21711856.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/SRX17709228_SRR21711855.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/SRX6725035_SRR9984183.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/SRX9315476_SRR12848126_1.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/SRX9315476_SRR12848126_2.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/SRX9504942_SRR13055517_1.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/SRX9504942_SRR13055517_2.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/SRX9504942_SRR13055518_1.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/SRX9504942_SRR13055518_2.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/SRX9504942_SRR13055519_1.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/SRX9504942_SRR13055519_2.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/SRX9504942_SRR13055520_1.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/SRX9504942_SRR13055520_2.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/SRX9626017_SRR13191702_1.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/SRX9626017_SRR13191702_2.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/md5/DRX024467_DRR026872.fastq.gz.md5").exists() }, + { assert new File("$outputDir/fastq/md5/DRX026011_DRR028935_1.fastq.gz.md5").exists() }, + { assert new File("$outputDir/fastq/md5/DRX026011_DRR028935_2.fastq.gz.md5").exists() }, + { assert new File("$outputDir/fastq/md5/ERX1234253_ERR1160846.fastq.gz.md5").exists() }, + { assert new File("$outputDir/fastq/md5/SRX17709227_SRR21711856.fastq.gz.md5").exists() }, + { assert new File("$outputDir/fastq/md5/SRX17709228_SRR21711855.fastq.gz.md5").exists() }, + { assert new File("$outputDir/fastq/md5/SRX6725035_SRR9984183.fastq.gz.md5").exists() }, + { assert new File("$outputDir/fastq/md5/SRX9504942_SRR13055517_1.fastq.gz.md5").exists() }, + { assert new File("$outputDir/fastq/md5/SRX9504942_SRR13055517_2.fastq.gz.md5").exists() }, + { assert new File("$outputDir/fastq/md5/SRX9504942_SRR13055518_1.fastq.gz.md5").exists() }, + { assert new File("$outputDir/fastq/md5/SRX9504942_SRR13055518_2.fastq.gz.md5").exists() }, + { assert new File("$outputDir/fastq/md5/SRX9504942_SRR13055519_1.fastq.gz.md5").exists() }, + { assert new File("$outputDir/fastq/md5/SRX9504942_SRR13055519_2.fastq.gz.md5").exists() }, + { assert new File("$outputDir/fastq/md5/SRX9504942_SRR13055520_1.fastq.gz.md5").exists() }, + { assert new File("$outputDir/fastq/md5/SRX9504942_SRR13055520_2.fastq.gz.md5").exists() }, + { assert new File("$outputDir/fastq/md5/SRX9626017_SRR13191702_1.fastq.gz.md5").exists() }, + { assert new File("$outputDir/fastq/md5/SRX9626017_SRR13191702_2.fastq.gz.md5").exists() }, + { assert new File("$outputDir/metadata/DRR026872.runinfo_ftp.tsv").exists() }, + { assert new File("$outputDir/metadata/DRR028935.runinfo_ftp.tsv").exists() }, + { assert new File("$outputDir/metadata/ERR1160846.runinfo_ftp.tsv").exists() }, + { assert new File("$outputDir/metadata/GSE214215.runinfo_ftp.tsv").exists() }, + { assert new File("$outputDir/metadata/GSM4907283.runinfo_ftp.tsv").exists() }, + { assert new File("$outputDir/metadata/SRR12848126.runinfo_ftp.tsv").exists() }, + { assert new File("$outputDir/metadata/SRR13191702.runinfo_ftp.tsv").exists() }, + { assert new File("$outputDir/metadata/SRR14593545.runinfo_ftp.tsv").exists() }, + { assert new File("$outputDir/metadata/SRR14709033.runinfo_ftp.tsv").exists() }, + { assert new File("$outputDir/metadata/SRR9984183.runinfo_ftp.tsv").exists() }, + { assert new File("$outputDir/pipeline_info/fetchngs_mqc_versions.yml").exists() }, + { assert new File("$outputDir/samplesheet/id_mappings.csv").exists() }, + { assert new File("$outputDir/samplesheet/multiqc_config.yml").exists() }, + { assert new File("$outputDir/samplesheet/samplesheet.csv").exists() } + ) } } } From a367b4b0d5ad86c916ecb6aad9c83ff93f8936b6 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 8 Jan 2024 17:26:07 +0000 Subject: [PATCH 642/852] Remove comments --- tests/main.nf.test | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/main.nf.test b/tests/main.nf.test index d85519f4..b79f1cc2 100644 --- a/tests/main.nf.test +++ b/tests/main.nf.test @@ -11,7 +11,6 @@ nextflow_pipeline { params { outdir = "$outputDir" input = 'https://raw.githubusercontent.com/nf-core/test-datasets/2732b911c57e607fa7aea5ba0c3d91b25bafb662/testdata/v1.12.0/sra_ids_test.csv' - //input = "$projectDir/ids.csv" } } From b31ab040e4beea8609d9569620f77da7a8340bab Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 8 Jan 2024 17:58:55 +0000 Subject: [PATCH 643/852] Use closures for with statements in assertAll blocks --- workflows/sra/tests/main.nf.test | 34 +++++++++++-------- .../sra_custom_ena_metadata_fields.nf.test | 34 +++++++++++-------- .../tests/sra_force_sratools_download.nf.test | 34 +++++++++++-------- .../sra_nf_core_pipeline_atacseq.nf.test | 34 +++++++++++-------- .../tests/sra_nf_core_pipeline_rnaseq.nf.test | 34 +++++++++++-------- .../sra_nf_core_pipeline_taxprofiler.nf.test | 34 +++++++++++-------- .../sra_nf_core_pipeline_viralrecon.nf.test | 34 +++++++++++-------- .../sra/tests/sra_skip_fastq_download.nf.test | 34 +++++++++++-------- 8 files changed, 152 insertions(+), 120 deletions(-) diff --git a/workflows/sra/tests/main.nf.test b/workflows/sra/tests/main.nf.test index 102b8796..902debe6 100644 --- a/workflows/sra/tests/main.nf.test +++ b/workflows/sra/tests/main.nf.test @@ -25,21 +25,25 @@ nextflow_workflow { assert workflow.success assertAll( - with(workflow.out.samplesheet) { - assert path(get(0)).readLines().size() == 4 - assert path(get(0)).readLines()*.split(',')[0].take(4) == ['"sample"', '"fastq_1"', '"fastq_2"', '"run_accession"'] - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] - assert path(get(0)).text.contains('Illumina HiSeq 2500') - } - - with(workflow.out.mappings) { - assert path(get(0)).readLines().size() == 4 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] - assert path(get(0)).text.contains('Illumina HiSeq 2500') - } - - with(workflow.out.sample_mappings) { - assert path(get(0)[0]).md5 == "1ac06bb95b503703430e74660bbdd768" + { + with(workflow.out.samplesheet) { + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',')[0].take(4) == ['"sample"', '"fastq_1"', '"fastq_2"', '"run_accession"'] + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') + } + }, + { + with(workflow.out.mappings) { + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') + } + }, + { + with(workflow.out.sample_mappings) { + assert path(get(0)[0]).md5 == "1ac06bb95b503703430e74660bbdd768" + } } ) } diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test index c5379bee..433288f9 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test @@ -28,21 +28,25 @@ nextflow_workflow { assert workflow.success assertAll( - with(workflow.out.samplesheet) { - assert path(get(0)).readLines().size() == 4 - assert path(get(0)).readLines()*.split(',')[0].take(5) == ['"sample"', '"fastq_1"', '"fastq_2"', '"strandedness"' , '"run_accession"'] - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] - assert path(get(0)).text.contains('SINGLE') - } - - with(workflow.out.mappings) { - assert path(get(0)).readLines().size() == 4 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] - assert path(get(0)).text.contains('SINGLE') - } - - with(workflow.out.sample_mappings) { - assert path(get(0)[0]).md5 == "3b70bc9658eab4ba2f4ec98cb749ac9d" + { + with(workflow.out.samplesheet) { + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',')[0].take(5) == ['"sample"', '"fastq_1"', '"fastq_2"', '"strandedness"' , '"run_accession"'] + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('SINGLE') + } + }, + { + with(workflow.out.mappings) { + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('SINGLE') + } + }, + { + with(workflow.out.sample_mappings) { + assert path(get(0)[0]).md5 == "3b70bc9658eab4ba2f4ec98cb749ac9d" + } } ) } diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test b/workflows/sra/tests/sra_force_sratools_download.nf.test index 2a821807..2019be08 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test @@ -26,21 +26,25 @@ nextflow_workflow { assert workflow.success assertAll( - with(workflow.out.samplesheet) { - assert path(get(0)).readLines().size() == 4 - assert path(get(0)).readLines()*.split(',')[0].take(4) == ['"sample"', '"fastq_1"', '"fastq_2"', '"run_accession"'] - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] - assert path(get(0)).text.contains('Illumina HiSeq 2500') - } - - with(workflow.out.mappings) { - assert path(get(0)).readLines().size() == 4 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] - assert path(get(0)).text.contains('Illumina HiSeq 2500') - } - - with(workflow.out.sample_mappings) { - assert path(get(0)[0]).md5 == "1ac06bb95b503703430e74660bbdd768" + { + with(workflow.out.samplesheet) { + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',')[0].take(4) == ['"sample"', '"fastq_1"', '"fastq_2"', '"run_accession"'] + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') + } + }, + { + with(workflow.out.mappings) { + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') + } + }, + { + with(workflow.out.sample_mappings) { + assert path(get(0)[0]).md5 == "1ac06bb95b503703430e74660bbdd768" + } } ) } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test index 45f8f478..46e4eed8 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test @@ -26,21 +26,25 @@ nextflow_workflow { assert workflow.success assertAll( - with(workflow.out.samplesheet) { - assert path(get(0)).readLines().size() == 4 - assert path(get(0)).readLines()*.split(',')[0].take(5) == ['"sample"', '"fastq_1"', '"fastq_2"', '"replicate"', '"run_accession"'] - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] - assert path(get(0)).text.contains('Illumina HiSeq 2500') - } - - with(workflow.out.mappings) { - assert path(get(0)).readLines().size() == 4 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] - assert path(get(0)).text.contains('Illumina HiSeq 2500') - } - - with(workflow.out.sample_mappings) { - assert path(get(0)[0]).md5 == "1ac06bb95b503703430e74660bbdd768" + { + with(workflow.out.samplesheet) { + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',')[0].take(5) == ['"sample"', '"fastq_1"', '"fastq_2"', '"replicate"', '"run_accession"'] + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') + } + }, + { + with(workflow.out.mappings) { + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') + } + }, + { + with(workflow.out.sample_mappings) { + assert path(get(0)[0]).md5 == "1ac06bb95b503703430e74660bbdd768" + } } ) } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test index faeee87c..f24d2648 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test @@ -26,21 +26,25 @@ nextflow_workflow { assert workflow.success assertAll( - with(workflow.out.samplesheet) { - assert path(get(0)).readLines().size() == 4 - assert path(get(0)).readLines()*.split(',')[0].take(5) == ['"sample"', '"fastq_1"', '"fastq_2"', '"strandedness"' , '"run_accession"'] - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] - assert path(get(0)).text.contains('Illumina HiSeq 2500') - } - - with(workflow.out.mappings) { - assert path(get(0)).readLines().size() == 4 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] - assert path(get(0)).text.contains('Illumina HiSeq 2500') - } - - with(workflow.out.sample_mappings) { - assert path(get(0)[0]).md5 == "1ac06bb95b503703430e74660bbdd768" + { + with(workflow.out.samplesheet) { + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',')[0].take(5) == ['"sample"', '"fastq_1"', '"fastq_2"', '"strandedness"' , '"run_accession"'] + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') + } + }, + { + with(workflow.out.mappings) { + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') + } + }, + { + with(workflow.out.sample_mappings) { + assert path(get(0)[0]).md5 == "1ac06bb95b503703430e74660bbdd768" + } } ) } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test index 714d45d9..447e8c6e 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test @@ -26,21 +26,25 @@ nextflow_workflow { assert workflow.success assertAll( - with(workflow.out.samplesheet) { - assert path(get(0)).readLines().size() == 4 - assert path(get(0)).readLines()*.split(',')[0].take(5) == ['"sample"', '"fastq_1"', '"fastq_2"', '"fasta"', '"run_accession"'] - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] - assert path(get(0)).text.contains('Illumina HiSeq 2500') - } - - with(workflow.out.mappings) { - assert path(get(0)).readLines().size() == 4 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] - assert path(get(0)).text.contains('Illumina HiSeq 2500') - } - - with(workflow.out.sample_mappings) { - assert path(get(0)[0]).md5 == "1ac06bb95b503703430e74660bbdd768" + { + with(workflow.out.samplesheet) { + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',')[0].take(5) == ['"sample"', '"fastq_1"', '"fastq_2"', '"fasta"', '"run_accession"'] + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') + } + }, + { + with(workflow.out.mappings) { + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') + } + }, + { + with(workflow.out.sample_mappings) { + assert path(get(0)[0]).md5 == "1ac06bb95b503703430e74660bbdd768" + } } ) } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test index a5f68cb6..9b27c0a5 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test @@ -26,21 +26,25 @@ nextflow_workflow { assert workflow.success assertAll( - with(workflow.out.samplesheet) { - assert path(get(0)).readLines().size() == 4 - assert path(get(0)).readLines()*.split(',')[0].take(4) == ['"sample"', '"fastq_1"', '"fastq_2"', '"run_accession"'] - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] - assert path(get(0)).text.contains('Illumina HiSeq 2500') - } - - with(workflow.out.mappings) { - assert path(get(0)).readLines().size() == 4 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] - assert path(get(0)).text.contains('Illumina HiSeq 2500') - } - - with(workflow.out.sample_mappings) { - assert path(get(0)[0]).md5 == "1ac06bb95b503703430e74660bbdd768" + { + with(workflow.out.samplesheet) { + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',')[0].take(4) == ['"sample"', '"fastq_1"', '"fastq_2"', '"run_accession"'] + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') + } + }, + { + with(workflow.out.mappings) { + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') + } + }, + { + with(workflow.out.sample_mappings) { + assert path(get(0)[0]).md5 == "1ac06bb95b503703430e74660bbdd768" + } } ) } diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test b/workflows/sra/tests/sra_skip_fastq_download.nf.test index 8cc3bd94..1a3ab733 100644 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test @@ -26,21 +26,25 @@ nextflow_workflow { assert workflow.success assertAll( - with(workflow.out.samplesheet) { - assert path(get(0)).readLines().size() == 4 - assert path(get(0)).readLines()*.split(',')[0].take(4) == ['"sample"', '"fastq_1"', '"fastq_2"', '"run_accession"'] - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] - assert path(get(0)).text.contains('Illumina HiSeq 2500') - } - - with(workflow.out.mappings) { - assert path(get(0)).readLines().size() == 4 - assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] - assert path(get(0)).text.contains('Illumina HiSeq 2500') - } - - with(workflow.out.sample_mappings) { - assert path(get(0)[0]).md5 == "1ac06bb95b503703430e74660bbdd768" + { + with(workflow.out.samplesheet) { + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',')[0].take(4) == ['"sample"', '"fastq_1"', '"fastq_2"', '"run_accession"'] + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') + } + }, + { + with(workflow.out.mappings) { + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') + } + }, + { + with(workflow.out.sample_mappings) { + assert path(get(0)[0]).md5 == "1ac06bb95b503703430e74660bbdd768" + } } ) } From c135899c0a741650457d2b78495f6231fe7219e0 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 8 Jan 2024 18:00:14 +0000 Subject: [PATCH 644/852] Fix ECLint --- tests/main.nf.test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/main.nf.test b/tests/main.nf.test index b79f1cc2..21c6ac8b 100644 --- a/tests/main.nf.test +++ b/tests/main.nf.test @@ -21,7 +21,7 @@ nextflow_pipeline { { assert new File("$outputDir/samplesheet/samplesheet.csv").readLines().size() == 15 }, { assert new File("$outputDir/samplesheet/samplesheet.csv").readLines()*.split(',')[0].take(4) == ['"sample"', '"fastq_1"', '"fastq_2"', '"run_accession"'] }, { assert new File("$outputDir/samplesheet/samplesheet.csv").readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX024467"', '"DRX026011"', '"ERX1234253"', '"SRX10940790"', '"SRX11047067"', '"SRX17709227"', '"SRX17709228"', '"SRX6725035"', '"SRX9315476"', '"SRX9504942"', '"SRX9504942"', '"SRX9504942"', '"SRX9504942"', '"SRX9626017"'] }, - { assert new File("$outputDir/samplesheet/samplesheet.csv").text.contains('Illumina HiSeq 2500') }, + { assert new File("$outputDir/samplesheet/samplesheet.csv").text.contains('Illumina HiSeq 2500') }, { assert new File("$outputDir/custom/user-settings.mkfg").exists() }, { assert new File("$outputDir/fastq/DRX024467_DRR026872.fastq.gz").exists() }, { assert new File("$outputDir/fastq/DRX026011_DRR028935_1.fastq.gz").exists() }, From 20769af129780bb304db51f1d38543702ed2b44a Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 8 Jan 2024 18:08:36 +0000 Subject: [PATCH 645/852] Update all nf-core modules and subworkflows --- modules.json | 28 +- .../sratoolsncbisettings/environment.yml | 7 + .../custom/sratoolsncbisettings/main.nf | 2 +- .../custom/sratoolsncbisettings/meta.yml | 4 +- .../sratoolsncbisettings/nextflow.config | 0 .../sratools/fasterqdump/environment.yml | 8 + modules/nf-core/sratools/fasterqdump/main.nf | 12 +- modules/nf-core/sratools/fasterqdump/meta.yml | 14 +- .../sratools/fasterqdump/nextflow.config | 10 - .../fasterqdump/sratools-fasterqdump.diff | 36 -- .../sratools/fasterqdump/tests/main.nf.test | 4 +- .../fasterqdump/tests/main.nf.test.snap | 4 +- .../nf-core/sratools/prefetch/environment.yml | 7 + modules/nf-core/sratools/prefetch/main.nf | 13 +- modules/nf-core/sratools/prefetch/meta.yml | 16 +- .../nf-core/sratools/prefetch/nextflow.config | 8 - modules/nf-core/untar/environment.yml | 9 + modules/nf-core/untar/main.nf | 2 +- modules/nf-core/untar/meta.yml | 5 + modules/nf-core/untar/tests/main.nf.test | 77 +++ modules/nf-core/untar/tests/main.nf.test.snap | 513 ++++++++++++++++++ modules/nf-core/untar/tests/tags.yml | 2 + .../meta.yml | 13 +- .../nextflow.config | 3 - .../nf-core/nextflowpipelineutils/main.nf | 126 ----- .../nf-core/nextflowpipelineutils/meta.yml | 34 -- .../tests/main.functions.nf.test | 71 --- .../tests/main.functions.nf.test.snap | 12 - .../tests/main.workflow.nf.test | 104 ---- .../tests/main.workflow.nf.test.snap | 44 -- .../tests/nextflow.config | 9 - .../nf-core/nfcore_pipeline_utils/main.nf | 311 ----------- .../nf-core/nfcore_pipeline_utils/meta.yml | 17 - .../tests/main.function.nf.test | 120 ---- .../tests/main.function.nf.test.snap | 78 --- .../tests/main.workflow.nf.test | 33 -- .../tests/nextflow.config | 9 - .../nf-core/nfvalidation_plugin_utils/main.nf | 62 --- .../nfvalidation_plugin_utils/meta.yml | 49 -- .../tests/main.nf.test | 199 ------- .../tests/main.nf.test.snap | 26 - .../tests/nextflow_schema.json | 96 ---- 42 files changed, 690 insertions(+), 1507 deletions(-) create mode 100644 modules/nf-core/custom/sratoolsncbisettings/environment.yml delete mode 100644 modules/nf-core/custom/sratoolsncbisettings/nextflow.config create mode 100644 modules/nf-core/sratools/fasterqdump/environment.yml delete mode 100644 modules/nf-core/sratools/fasterqdump/nextflow.config delete mode 100644 modules/nf-core/sratools/fasterqdump/sratools-fasterqdump.diff create mode 100644 modules/nf-core/sratools/prefetch/environment.yml delete mode 100644 modules/nf-core/sratools/prefetch/nextflow.config create mode 100644 modules/nf-core/untar/environment.yml create mode 100644 modules/nf-core/untar/tests/main.nf.test create mode 100644 modules/nf-core/untar/tests/main.nf.test.snap create mode 100644 modules/nf-core/untar/tests/tags.yml delete mode 100644 subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/nextflow.config delete mode 100644 subworkflows/nf-core/nextflowpipelineutils/main.nf delete mode 100644 subworkflows/nf-core/nextflowpipelineutils/meta.yml delete mode 100644 subworkflows/nf-core/nextflowpipelineutils/tests/main.functions.nf.test delete mode 100644 subworkflows/nf-core/nextflowpipelineutils/tests/main.functions.nf.test.snap delete mode 100644 subworkflows/nf-core/nextflowpipelineutils/tests/main.workflow.nf.test delete mode 100644 subworkflows/nf-core/nextflowpipelineutils/tests/main.workflow.nf.test.snap delete mode 100644 subworkflows/nf-core/nextflowpipelineutils/tests/nextflow.config delete mode 100644 subworkflows/nf-core/nfcore_pipeline_utils/main.nf delete mode 100644 subworkflows/nf-core/nfcore_pipeline_utils/meta.yml delete mode 100644 subworkflows/nf-core/nfcore_pipeline_utils/tests/main.function.nf.test delete mode 100644 subworkflows/nf-core/nfcore_pipeline_utils/tests/main.function.nf.test.snap delete mode 100644 subworkflows/nf-core/nfcore_pipeline_utils/tests/main.workflow.nf.test delete mode 100644 subworkflows/nf-core/nfcore_pipeline_utils/tests/nextflow.config delete mode 100644 subworkflows/nf-core/nfvalidation_plugin_utils/main.nf delete mode 100644 subworkflows/nf-core/nfvalidation_plugin_utils/meta.yml delete mode 100644 subworkflows/nf-core/nfvalidation_plugin_utils/tests/main.nf.test delete mode 100644 subworkflows/nf-core/nfvalidation_plugin_utils/tests/main.nf.test.snap delete mode 100644 subworkflows/nf-core/nfvalidation_plugin_utils/tests/nextflow_schema.json diff --git a/modules.json b/modules.json index 81312b77..59b7e9c4 100644 --- a/modules.json +++ b/modules.json @@ -7,23 +7,22 @@ "nf-core": { "custom/sratoolsncbisettings": { "branch": "master", - "git_sha": "4125fb0c2152efbcec8d9ed71a756c9274b2f7f5", + "git_sha": "3f5420aa22e00bd030a2556dfdffc9e164ec0ec5", "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] }, "sratools/fasterqdump": { "branch": "master", - "git_sha": "4125fb0c2152efbcec8d9ed71a756c9274b2f7f5", - "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"], - "patch": "modules/nf-core/sratools/fasterqdump/sratools-fasterqdump.diff" + "git_sha": "b1d2002587ed81dcd0f4b4ffa79fcdbda59b4e80", + "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] }, "sratools/prefetch": { "branch": "master", - "git_sha": "4125fb0c2152efbcec8d9ed71a756c9274b2f7f5", + "git_sha": "b1d2002587ed81dcd0f4b4ffa79fcdbda59b4e80", "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] }, "untar": { "branch": "master", - "git_sha": "d0b4fc03af52a1cc8c6fb4493b921b57352b1dd8", + "git_sha": "3f5420aa22e00bd030a2556dfdffc9e164ec0ec5", "installed_by": ["modules"] } } @@ -32,22 +31,7 @@ "nf-core": { "fastq_download_prefetch_fasterqdump_sratools": { "branch": "master", - "git_sha": "4125fb0c2152efbcec8d9ed71a756c9274b2f7f5", - "installed_by": ["subworkflows"] - }, - "nextflowpipelineutils": { - "branch": "master", - "git_sha": "1405b3d5078f108f86a2c122846ed2797b4ec8bf", - "installed_by": ["subworkflows"] - }, - "nfcore_pipeline_utils": { - "branch": "master", - "git_sha": "b1f3d31bbf14fe83959cc03f98db96c6b4f73b37", - "installed_by": ["subworkflows"] - }, - "nfvalidation_plugin_utils": { - "branch": "master", - "git_sha": "a8223a72def6cc46f4652a348feba21845ce68c6", + "git_sha": "cfd937a668919d948f6fcbf4218e79de50c2f36f", "installed_by": ["subworkflows"] } } diff --git a/modules/nf-core/custom/sratoolsncbisettings/environment.yml b/modules/nf-core/custom/sratoolsncbisettings/environment.yml new file mode 100644 index 00000000..5ea32741 --- /dev/null +++ b/modules/nf-core/custom/sratoolsncbisettings/environment.yml @@ -0,0 +1,7 @@ +name: sratoolsncbisettings +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::sra-tools=2.11.0 diff --git a/modules/nf-core/custom/sratoolsncbisettings/main.nf b/modules/nf-core/custom/sratoolsncbisettings/main.nf index 5deb8892..bad6f9cf 100644 --- a/modules/nf-core/custom/sratoolsncbisettings/main.nf +++ b/modules/nf-core/custom/sratoolsncbisettings/main.nf @@ -2,7 +2,7 @@ process CUSTOM_SRATOOLSNCBISETTINGS { tag 'ncbi-settings' label 'process_low' - conda "bioconda::sra-tools=2.11.0" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/sra-tools:2.11.0--pl5321ha49a11a_3' : 'biocontainers/sra-tools:2.11.0--pl5321ha49a11a_3' }" diff --git a/modules/nf-core/custom/sratoolsncbisettings/meta.yml b/modules/nf-core/custom/sratoolsncbisettings/meta.yml index 01e98856..8637dd19 100644 --- a/modules/nf-core/custom/sratoolsncbisettings/meta.yml +++ b/modules/nf-core/custom/sratoolsncbisettings/meta.yml @@ -13,7 +13,6 @@ tools: documentation: https://github.com/ncbi/sra-tools/wiki tool_dev_url: https://github.com/ncbi/sra-tools licence: "['Public Domain']" - output: - versions: type: file @@ -23,6 +22,7 @@ output: type: file description: An NCBI user settings file. pattern: "*.mkfg" - authors: - "@Midnighter" +maintainers: + - "@Midnighter" diff --git a/modules/nf-core/custom/sratoolsncbisettings/nextflow.config b/modules/nf-core/custom/sratoolsncbisettings/nextflow.config deleted file mode 100644 index e69de29b..00000000 diff --git a/modules/nf-core/sratools/fasterqdump/environment.yml b/modules/nf-core/sratools/fasterqdump/environment.yml new file mode 100644 index 00000000..4011b691 --- /dev/null +++ b/modules/nf-core/sratools/fasterqdump/environment.yml @@ -0,0 +1,8 @@ +name: sratools_fasterqdump +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::sra-tools=3.0.8 + - conda-forge::pigz=2.6 diff --git a/modules/nf-core/sratools/fasterqdump/main.nf b/modules/nf-core/sratools/fasterqdump/main.nf index 2c5cc8f6..f86d15b7 100644 --- a/modules/nf-core/sratools/fasterqdump/main.nf +++ b/modules/nf-core/sratools/fasterqdump/main.nf @@ -2,7 +2,7 @@ process SRATOOLS_FASTERQDUMP { tag "$meta.id" label 'process_medium' - conda "bioconda::sra-tools=3.0.8 conda-forge::pigz=2.6" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:2f4a4c900edd6801ff0068c2b3048b4459d119eb-0' : 'biocontainers/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:2f4a4c900edd6801ff0068c2b3048b4459d119eb-0' }" @@ -24,7 +24,15 @@ process SRATOOLS_FASTERQDUMP { def args2 = task.ext.args2 ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def outfile = meta.single_end ? "${prefix}.fastq" : prefix - def key_file = certificate ? "--perm ${certificate}" : '' + def key_file = '' + + if (certificate.toString().endsWith('.jwt')){ + key_file += " --perm ${certificate}" + } + else if (certificate.toString().endsWith('.ngc')){ + key_file += " --ngc ${certificate}" + } + """ export NCBI_SETTINGS="\$PWD/${ncbi_settings}" diff --git a/modules/nf-core/sratools/fasterqdump/meta.yml b/modules/nf-core/sratools/fasterqdump/meta.yml index 629bdca5..b5e0175a 100644 --- a/modules/nf-core/sratools/fasterqdump/meta.yml +++ b/modules/nf-core/sratools/fasterqdump/meta.yml @@ -11,13 +11,12 @@ tools: documentation: https://github.com/ncbi/sra-tools/wiki tool_dev_url: https://github.com/ncbi/sra-tools licence: ["Public Domain"] - input: - meta: type: map description: > - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] + Groovy Map containing sample information e.g. [ id:'test', single_end:false ] + - sra: type: directory description: Directory containing ETL data for the given SRA. @@ -26,18 +25,20 @@ input: type: file description: > An NCBI user settings file. + pattern: "*.mkfg" - certificate: type: file description: > Path to a JWT cart file used to access protected dbGAP data on SRA using the sra-toolkit + pattern: "*.cart" output: - meta: type: map description: > - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] + Groovy Map containing sample information e.g. [ id:'test', single_end:false ] + - versions: type: file description: File containing software versions @@ -46,6 +47,7 @@ output: type: file description: Extracted FASTQ file or files if the sequencing reads are paired-end. pattern: "*.fastq.gz" - authors: - "@Midnighter" +maintainers: + - "@Midnighter" diff --git a/modules/nf-core/sratools/fasterqdump/nextflow.config b/modules/nf-core/sratools/fasterqdump/nextflow.config deleted file mode 100644 index f98b140d..00000000 --- a/modules/nf-core/sratools/fasterqdump/nextflow.config +++ /dev/null @@ -1,10 +0,0 @@ -process { - withName: SRATOOLS_FASTERQDUMP { - ext.args = '--split-files --include-technical' - publishDir = [ - path: { "${params.outdir}/fastq" }, - mode: params.publish_dir_mode, - pattern: "*.fastq.gz" - ] - } -} \ No newline at end of file diff --git a/modules/nf-core/sratools/fasterqdump/sratools-fasterqdump.diff b/modules/nf-core/sratools/fasterqdump/sratools-fasterqdump.diff deleted file mode 100644 index 5275d3e4..00000000 --- a/modules/nf-core/sratools/fasterqdump/sratools-fasterqdump.diff +++ /dev/null @@ -1,36 +0,0 @@ -Changes in module 'nf-core/sratools/fasterqdump' ---- /dev/null -+++ modules/nf-core/sratools/fasterqdump/nextflow.config -@@ -0,0 +1,10 @@ -+process { -+ withName: SRATOOLS_FASTERQDUMP { -+ ext.args = '--split-files --include-technical' -+ publishDir = [ -+ path: { "${params.outdir}/fastq" }, -+ mode: params.publish_dir_mode, -+ pattern: "*.fastq.gz" -+ ] -+ } -+} ---- modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap -+++ modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap -@@ -8,7 +8,7 @@ - "id": "test_single_end", - "single_end": true - }, -- "test_single_end.fastq.gz:md5,1054c7b71884acdb5eed8a378f18be82" -+ "test_single_end_1.fastq.gz:md5,1054c7b71884acdb5eed8a378f18be82" - ] - ], - "1": [ -@@ -20,7 +20,7 @@ - "id": "test_single_end", - "single_end": true - }, -- "test_single_end.fastq.gz:md5,1054c7b71884acdb5eed8a378f18be82" -+ "test_single_end_1.fastq.gz:md5,1054c7b71884acdb5eed8a378f18be82" - ] - ], - "versions": [ - -************************************************************ diff --git a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test index ee4c5844..e194b52a 100644 --- a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test +++ b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test @@ -22,7 +22,7 @@ nextflow_process { when { process { """ - input[0] = UNTAR.out.untar.collect{ meta, files -> files }.map{ files -> [ [ id:'test_single_end', single_end:true ], files]} + input[0] = UNTAR.out.untar.map{ meta, files -> [ [ id:'test_single_end', single_end:true ], files]} input[1] = file(params.test_data['generic']['config']['ncbi_user_settings'], checkIfExists: true) input[2] = [] """ @@ -53,7 +53,7 @@ nextflow_process { when { process { """ - input[0] = UNTAR.out.untar.collect{ meta, files -> files }.map{ files -> [ [ id:'test_paired_end', single_end:false ], files]} + input[0] = UNTAR.out.untar.map{ meta, files -> [ [ id:'test_paired_end', single_end:false ], files]} input[1] = file(params.test_data['generic']['config']['ncbi_user_settings'], checkIfExists: true) input[2] = [] """ diff --git a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap index 77fd6c79..d3bf90f7 100644 --- a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap +++ b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap @@ -8,7 +8,7 @@ "id": "test_single_end", "single_end": true }, - "test_single_end_1.fastq.gz:md5,1054c7b71884acdb5eed8a378f18be82" + "test_single_end.fastq.gz:md5,1054c7b71884acdb5eed8a378f18be82" ] ], "1": [ @@ -20,7 +20,7 @@ "id": "test_single_end", "single_end": true }, - "test_single_end_1.fastq.gz:md5,1054c7b71884acdb5eed8a378f18be82" + "test_single_end.fastq.gz:md5,1054c7b71884acdb5eed8a378f18be82" ] ], "versions": [ diff --git a/modules/nf-core/sratools/prefetch/environment.yml b/modules/nf-core/sratools/prefetch/environment.yml new file mode 100644 index 00000000..cfc7d9a8 --- /dev/null +++ b/modules/nf-core/sratools/prefetch/environment.yml @@ -0,0 +1,7 @@ +name: sratools_prefetch +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::sra-tools=3.0.8 diff --git a/modules/nf-core/sratools/prefetch/main.nf b/modules/nf-core/sratools/prefetch/main.nf index fb226962..f12dc68d 100644 --- a/modules/nf-core/sratools/prefetch/main.nf +++ b/modules/nf-core/sratools/prefetch/main.nf @@ -2,7 +2,7 @@ process SRATOOLS_PREFETCH { tag "$id" label 'process_low' - conda "bioconda::sra-tools=3.0.8" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/sra-tools:3.0.8--h9f5acd7_0' : 'biocontainers/sra-tools:3.0.8--h9f5acd7_0' }" @@ -21,7 +21,16 @@ process SRATOOLS_PREFETCH { shell: args = task.ext.args ?: '' - args += certificate ? " --perm ${certificate}" : '' + + if (certificate){ + if (certificate.toString().endsWith('.jwt')){ + args += " --perm ${certificate}" + } + else if (certificate.toString().endsWith('.ngc')){ + args += " --ngc ${certificate}" + } + } + args2 = task.ext.args2 ?: '5 1 100' // template 'retry_with_backoff.sh' } diff --git a/modules/nf-core/sratools/prefetch/meta.yml b/modules/nf-core/sratools/prefetch/meta.yml index 9817b0b2..ff54229f 100644 --- a/modules/nf-core/sratools/prefetch/meta.yml +++ b/modules/nf-core/sratools/prefetch/meta.yml @@ -11,42 +11,46 @@ tools: documentation: https://github.com/ncbi/sra-tools/wiki tool_dev_url: https://github.com/ncbi/sra-tools licence: ["Public Domain"] - input: - meta: type: map description: > - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] + Groovy Map containing sample information e.g. [ id:'test', single_end:false ] + - id: type: string description: > A string denoting an SRA id. + - ncbi_settings: type: file description: > An NCBI user settings file. + pattern: "*.mkfg" - certificate: type: file description: > Path to a JWT cart file used to access protected dbGAP data on SRA using the sra-toolkit + pattern: "*.cart" output: - meta: type: map description: > - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] + Groovy Map containing sample information e.g. [ id:'test', single_end:false ] + - sra: type: directory description: > Directory containing the ETL data for the given SRA id. + pattern: "*/*.sra" - versions: type: file description: File containing software versions pattern: "versions.yml" - authors: - "@Midnighter" +maintainers: + - "@Midnighter" diff --git a/modules/nf-core/sratools/prefetch/nextflow.config b/modules/nf-core/sratools/prefetch/nextflow.config deleted file mode 100644 index a2ca8848..00000000 --- a/modules/nf-core/sratools/prefetch/nextflow.config +++ /dev/null @@ -1,8 +0,0 @@ -process { - withName: SRATOOLS_PREFETCH { - publishDir = [ - path: { "${params.outdir}/sra" }, - enabled: false - ] - } -} \ No newline at end of file diff --git a/modules/nf-core/untar/environment.yml b/modules/nf-core/untar/environment.yml new file mode 100644 index 00000000..d6917da3 --- /dev/null +++ b/modules/nf-core/untar/environment.yml @@ -0,0 +1,9 @@ +name: untar +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - conda-forge::sed=4.7 + - conda-forge::grep=3.11 + - conda-forge::tar=1.34 diff --git a/modules/nf-core/untar/main.nf b/modules/nf-core/untar/main.nf index 61461c39..8a75bb95 100644 --- a/modules/nf-core/untar/main.nf +++ b/modules/nf-core/untar/main.nf @@ -2,7 +2,7 @@ process UNTAR { tag "$archive" label 'process_single' - conda "conda-forge::sed=4.7 conda-forge::grep=3.11 conda-forge::tar=1.34" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/ubuntu:20.04' : 'nf-core/ubuntu:20.04' }" diff --git a/modules/nf-core/untar/meta.yml b/modules/nf-core/untar/meta.yml index db241a6e..a9a2110f 100644 --- a/modules/nf-core/untar/meta.yml +++ b/modules/nf-core/untar/meta.yml @@ -39,3 +39,8 @@ authors: - "@drpatelh" - "@matthdsm" - "@jfy133" +maintainers: + - "@joseespinosa" + - "@drpatelh" + - "@matthdsm" + - "@jfy133" diff --git a/modules/nf-core/untar/tests/main.nf.test b/modules/nf-core/untar/tests/main.nf.test new file mode 100644 index 00000000..d40db13d --- /dev/null +++ b/modules/nf-core/untar/tests/main.nf.test @@ -0,0 +1,77 @@ +nextflow_process { + + name "Test Process UNTAR" + script "../main.nf" + process "UNTAR" + + tag "modules" + tag "modules_nfcore" + tag "untar" + + test("test_untar") { + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = [ [], file(params.test_data['sarscov2']['genome']['kraken2_tar_gz'], checkIfExists: true) ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out.untar).match("test_untar") }, + ) + } + + } + + test("test_untar_different_output_path") { + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = [ [], file(params.test_data['homo_sapiens']['illumina']['test_flowcell'], checkIfExists: true) ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out.untar).match("test_untar_different_output_path") }, + ) + } + + } + + test("test_untar_onlyfiles") { + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = [ [], file(params.test_data['generic']['tar']['tar_gz'], checkIfExists: true) ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out.untar).match("test_untar_onlyfiles") }, + ) + } + + } + +} diff --git a/modules/nf-core/untar/tests/main.nf.test.snap b/modules/nf-core/untar/tests/main.nf.test.snap new file mode 100644 index 00000000..146c8678 --- /dev/null +++ b/modules/nf-core/untar/tests/main.nf.test.snap @@ -0,0 +1,513 @@ +{ + "test_untar_different_output_path": { + "content": [ + [ + [ + [ + + ], + [ + [ + [ + [ + [ + [ + "s_1_1101.bcl:md5,ad01889e2ff43e2f194224e20bdb600c", + "s_1_1101.stats:md5,4bbbf103454b37fbc3138fadf1b4446b" + ], + [ + "s_1_1101.bcl:md5,565384bbe67a694dfd690bae6d1d30c2", + "s_1_1101.stats:md5,55e5abd8f129ff38ef169873547abdb8" + ], + [ + "s_1_1101.bcl:md5,650fa58a630a9148835ba79e323d4237", + "s_1_1101.stats:md5,77403669ca1b05340c390dff64425c1e" + ], + [ + "s_1_1101.bcl:md5,54471c9e97299cd141e202e204637702", + "s_1_1101.stats:md5,67b14c9a89b7f8556674a7524d5cfb2d" + ], + [ + "s_1_1101.bcl:md5,74e4f929fc7476c380fd9d741ddb6700", + "s_1_1101.stats:md5,5730a4c35463eaa12a06b6758710b98c" + ], + [ + "s_1_1101.bcl:md5,c785f472f4350c120c02c888c8189590", + "s_1_1101.stats:md5,fee4ec63895ea81007e06ee6a36ba5e0" + ], + [ + "s_1_1101.bcl:md5,b7ea50bb25f08d43c301741d77050a9b", + "s_1_1101.stats:md5,fa7c68f3122c74d14364e6f7b011af70" + ], + [ + "s_1_1101.bcl:md5,9d5087dc4bcae39d66486363d4f68ecf", + "s_1_1101.stats:md5,23cdceee4d82c4b8e7c60018b9276ace" + ], + [ + "s_1_1101.bcl:md5,581e0c5ee94e8f2de14b2b1d8e777530", + "s_1_1101.stats:md5,9a3536d573c97f66bb56b49463612607" + ], + [ + "s_1_1101.bcl:md5,296fc026bb34c67bbe2b44845fe0d1de", + "s_1_1101.stats:md5,a7f57a7770fb9c5ae2a0fb1ef403ec4f" + ], + [ + "s_1_1101.bcl:md5,2a3ca15531556c36d10d132a9e051de8", + "s_1_1101.stats:md5,2d0bcdb0a1b51d3d79e415db2ab2d3b1" + ], + [ + "s_1_1101.bcl:md5,1150d46a2ccd4ac58aee0585d3e4ffd7", + "s_1_1101.stats:md5,2e97550bd5b5864ffd0565bb7a3f6d40" + ], + [ + "s_1_1101.bcl:md5,0b85c4b3da0de95e7b862d849c5333ae", + "s_1_1101.stats:md5,6eab9746fbeb783b0cd70398f44e0c1a" + ], + [ + "s_1_1101.bcl:md5,e0e9c91f4698804d7a6d1058ef68b34f", + "s_1_1101.stats:md5,790022cdc7878a02b2ebd166e1ddf0a7" + ], + [ + "s_1_1101.bcl:md5,38cd0ad4de359e651c8ac0d5777ea625", + "s_1_1101.stats:md5,a1b1d5ea5371d326abb029774483c5e6" + ], + [ + "s_1_1101.bcl:md5,b0ddc05c4012ccba24e712a1cfec748f", + "s_1_1101.stats:md5,af3d232f839d720f76f40ba06caa2987" + ], + [ + "s_1_1101.bcl:md5,af32fcc5dc3b836cf7a5ba3db85a75dd", + "s_1_1101.stats:md5,f93f2c09bd4e486c74a5f6e2040f7296" + ], + [ + "s_1_1101.bcl:md5,54b7428e037ca87816107647d4a3d9db", + "s_1_1101.stats:md5,e5ac77a72cd7bed5e9bf03cccda0e48c" + ], + [ + "s_1_1101.bcl:md5,fc8b4eacd493bf3d0b20bc23998dc7ff", + "s_1_1101.stats:md5,190315e159e2f4bc4c057ded7470dc52" + ], + [ + "s_1_1101.bcl:md5,9484ecffda489927fce424ac6a44fa9d", + "s_1_1101.stats:md5,0825feeb457ecc9efcf6f8526ba32311" + ], + [ + "s_1_1101.bcl:md5,eec59e21036e31c95ce1e847bfb0a9c4", + "s_1_1101.stats:md5,9acc13f63c98e5a8445e7be70d49222b" + ], + [ + "s_1_1101.bcl:md5,a9fb24476f87cba4fba68e2b3c3f2c07", + "s_1_1101.stats:md5,dc0aa7db9790733291c3e6480ca2a0fc" + ], + [ + "s_1_1101.bcl:md5,ed950b3e82c500927c2e236c9df005c6", + "s_1_1101.stats:md5,dccb71ec47d1f9d33a192da6d5660a45" + ], + [ + "s_1_1101.bcl:md5,b3e992025e995ca56b5ea2820144ef47", + "s_1_1101.stats:md5,a6a829bf2cffb26ac5d9dc3012057699" + ], + [ + "s_1_1101.bcl:md5,89edc726a5a4e0b4ff8ca3899ed0232b", + "s_1_1101.stats:md5,5b9b4fd8110577a59b82d0c419519d29" + ], + [ + "s_1_1101.bcl:md5,4dc696149169f232c451225f563cb5cd", + "s_1_1101.stats:md5,d3514a71ea3adc60e2943c6b8f6e2598" + ], + [ + "s_1_1101.bcl:md5,35b992d0318afb7c825ceaa31b0755e6", + "s_1_1101.stats:md5,2826093acc175c16c3795de7c4ca8f07" + ], + [ + "s_1_1101.bcl:md5,7bc927f56a362e49c00b5d76ee048901", + "s_1_1101.stats:md5,e47d862b795fd6b88a31d7d482ab22f6" + ], + [ + "s_1_1101.bcl:md5,84742233ff2a651626fe9036f27f7cb2", + "s_1_1101.stats:md5,b78fad11d3c50bc76b722cdc03e3028b" + ], + [ + "s_1_1101.bcl:md5,3935341c86263a7938e8c49620ef39f8", + "s_1_1101.stats:md5,cc6585b2daac5354073d150874da9704" + ], + [ + "s_1_1101.bcl:md5,3627f4fd548bf6e64aaf08fba3a342be", + "s_1_1101.stats:md5,120ae4831ae004ff7d16728aef36e82f" + ], + [ + "s_1_1101.bcl:md5,07631014bc35124149fabd80ef19f933", + "s_1_1101.stats:md5,eadd63d91f47cc6db6b6f0a967a23927" + ], + [ + "s_1_1101.bcl:md5,a1149c80415dc2f34d768eeb397c43fb", + "s_1_1101.stats:md5,ca89a9def67611a9151c6ce685b7cce1" + ], + [ + "s_1_1101.bcl:md5,eb5f71d4741d2f40618756bc72eaf8b4", + "s_1_1101.stats:md5,90f48501e735e5915b843478e23d1ae2" + ], + [ + "s_1_1101.bcl:md5,9bf270fe3f6add1a591ebc24fff10078", + "s_1_1101.stats:md5,a4e429671d4098034293c638aa655e16" + ], + [ + "s_1_1101.bcl:md5,219bedcbd24bae54fe4cf05dae05282c", + "s_1_1101.stats:md5,dd97525b65b68207137d51fcf19132c7" + ], + [ + "s_1_1101.bcl:md5,5163bc00a68fd57ae50cae0b76350892", + "s_1_1101.stats:md5,b606a5368eff1f012f3ea5d11ccdf2e0" + ], + [ + "s_1_1101.bcl:md5,fc429195a5af59a59e0cc4c48e6c05ea", + "s_1_1101.stats:md5,d809aa19698053f90d639da4dcad8008" + ], + [ + "s_1_1101.bcl:md5,383340219a1dd77076a092a64a71a7e4", + "s_1_1101.stats:md5,b204a5cf256378679ffc906c15cc1bae" + ], + [ + "s_1_1101.bcl:md5,0c369540d3e24696cf1f9c55bab69315", + "s_1_1101.stats:md5,a2bc69a4031a22ce9621dcc623a0bf4b" + ], + [ + "s_1_1101.bcl:md5,3127abc8016ba8eb954f8f8015dff387", + "s_1_1101.stats:md5,5deafff31150b7bf757f814e49a53bc2" + ], + [ + "s_1_1101.bcl:md5,045f40c82de676bafec3d59f91376a7a", + "s_1_1101.stats:md5,890700edc20687c090ef52248c7884b1" + ], + [ + "s_1_1101.bcl:md5,78af269aa2b39a1d765703f0a4739a86", + "s_1_1101.stats:md5,303cf457aa1543a8208544f694cbc531" + ], + [ + "s_1_1101.bcl:md5,0ab8c781959b783b62888e9274364a46", + "s_1_1101.stats:md5,2605b0e8322f83aa4d0dae5da4ec7a7a" + ], + [ + "s_1_1101.bcl:md5,d0cf823ffe352e8b3f75d589544ab617", + "s_1_1101.stats:md5,efa3c0e01e3db71e12fd961cb2d03739" + ], + [ + "s_1_1101.bcl:md5,db4ca4ab7a01e03c246f9160c3758d82", + "s_1_1101.stats:md5,f61550d9e4a90df6b860e68f41f82f60" + ], + [ + "s_1_1101.bcl:md5,1af39a2c7e5ff20ece91cb8160b51d17", + "s_1_1101.stats:md5,d0e20879afcaf6dfcd88c73f1c5c78cf" + ], + [ + "s_1_1101.bcl:md5,4cf7123bb0fffcd79266df03aef01665", + "s_1_1101.stats:md5,29bff4075109a121b087116b58d7e927" + ], + [ + "s_1_1101.bcl:md5,aa9980428cb60cd6320f4b48f4dd0d74", + "s_1_1101.stats:md5,6b0e20bde93133117a8d1a6df3d6f37b" + ], + [ + "s_1_1101.bcl:md5,0f6e440374e15b9b491d52fb83a8adfe", + "s_1_1101.stats:md5,55cb5eb0ecdabd23dca39ab8c4607598" + ], + [ + "s_1_1101.bcl:md5,2c645d7bdaddaa403f6e304d36df9e4b", + "s_1_1101.stats:md5,53acf33d21f832779b400c2447386ce4" + ], + [ + "s_1_1101.bcl:md5,3bbf0863b423b770c879203644420206", + "s_1_1101.stats:md5,579bdc7293cac8c3d7407249cacf4c25" + ], + [ + "s_1_1101.bcl:md5,6658a08409e81d29cfeb2d096b491985", + "s_1_1101.stats:md5,bb559ffbea46d612f9933cefa84c4c03" + ], + [ + "s_1_1101.bcl:md5,1700d9a13d3d4f7643af2943ef838acb", + "s_1_1101.stats:md5,f01cb6050ebfb15da1e0399ebd791eb4" + ], + [ + "s_1_1101.bcl:md5,1ac7aa9ffae25eb103f755f33e4a39c6", + "s_1_1101.stats:md5,0b9d45d7929ccf336d5e5b95373ed3c2" + ], + [ + "s_1_1101.bcl:md5,812a97af2e983a53226e18c75190b06c", + "s_1_1101.stats:md5,d2410c7b0e506dab2972e77e2398de1e" + ], + [ + "s_1_1101.bcl:md5,c981e8e4dcc434956c2b86159da268bc", + "s_1_1101.stats:md5,e9c826e85361ce673f1f248786c9a611" + ], + [ + "s_1_1101.bcl:md5,88e09e99a0a4ef3357b203a41b22f77c", + "s_1_1101.stats:md5,ef06f2e5ad667bbd383f9ed6a05b7b42" + ], + [ + "s_1_1101.bcl:md5,461c8b146fc8a7938be38689978ecd09", + "s_1_1101.stats:md5,65115693935da66f9791b27136e22fb0" + ], + [ + "s_1_1101.bcl:md5,c7b827df5ce20e0f21916fe60860ca3f", + "s_1_1101.stats:md5,87be73613aeb507847f94d3cac5bb30a" + ], + [ + "s_1_1101.bcl:md5,7c4cc3dc9c8a1b0f15917b282dfb40ce", + "s_1_1101.stats:md5,bdd9181fa89debbfafe7b6ea3e064065" + ], + [ + "s_1_1101.bcl:md5,19f4debaf91e118aca8934517179ac33", + "s_1_1101.stats:md5,1143082719e136241d21b14a6b19b8a2" + ], + [ + "s_1_1101.bcl:md5,38aa256ad2d697d84b0b2c0e876a3eba", + "s_1_1101.stats:md5,64dd82f03df23f7f437eede2671ed4fe" + ], + [ + "s_1_1101.bcl:md5,b7929970378949571fed922c1b8cab32", + "s_1_1101.stats:md5,3d6d7985a41629fe196e4342d7fe36aa" + ], + [ + "s_1_1101.bcl:md5,fb2ed0bf6e89d79624ee78754e773491", + "s_1_1101.stats:md5,f34940810ff255aee79953496a12716d" + ], + [ + "s_1_1101.bcl:md5,4f8a8311f5f9c3a7629c1a973a7b280e", + "s_1_1101.stats:md5,4fd7cd28c09f4e152e7c2ad1ab541cd2" + ], + [ + "s_1_1101.bcl:md5,9eb46c903d0344e25af51f88cc311d60", + "s_1_1101.stats:md5,df3abd5f620d9e7f99496098d9fd3f7f" + ], + [ + "s_1_1101.bcl:md5,3ecbc17f3660e2014b58d7fe70ae62d5", + "s_1_1101.stats:md5,8e89a13c85a6d6ab3ccd251b66d1f165" + ], + [ + "s_1_1101.bcl:md5,5d59cc2499a77791233a64f73fe82894", + "s_1_1101.stats:md5,32ec99cd400f4b80cb26e2fa8e07ece0" + ], + [ + "s_1_1101.bcl:md5,1c052da47b9ae8554388f0fa3aade482", + "s_1_1101.stats:md5,d23f438772673688aa7bc92421dc6dce" + ], + [ + "s_1_1101.bcl:md5,1a52bd4f23130c0c96bc967ccd448a2b", + "s_1_1101.stats:md5,9b597e3388d59ef1f61aba30ac90ea79" + ], + [ + "s_1_1101.bcl:md5,8a1e84b79cf3f80794c20e3a0cc84688", + "s_1_1101.stats:md5,9561f7b6ef4b1849afc72b2bb49792bd" + ], + [ + "s_1_1101.bcl:md5,75c00111051f3fa95d04286823cb9109", + "s_1_1101.stats:md5,1fe786cdf8181767deafbd60b3c76610" + ], + [ + "s_1_1101.bcl:md5,529255d8deee0873ed5565e6d1a2ebda", + "s_1_1101.stats:md5,3fa7f467e97a75880f32d17b7429d316" + ], + [ + "s_1_1101.bcl:md5,ea4d960e3d9355d2149da71b88a21df4", + "s_1_1101.stats:md5,2540fe65586e8e800c1ddd8cddd1e8cd" + ], + [ + "s_1_1101.bcl:md5,0dfe1fd92a2dce2f23119aa483429744", + "s_1_1101.stats:md5,78257b2169fb9f0cf40966e06e847e86" + ], + [ + "s_1_1101.bcl:md5,f692ddc9aa3ab849271d07c666d0b3b9", + "s_1_1101.stats:md5,aa2ec6a3e3a9c116e34fe74a21e6459e" + ], + [ + "s_1_1101.bcl:md5,29cc4c239eae7c871c9a1adf92ebdb98", + "s_1_1101.stats:md5,263184813090acd740a5bf25304aed3a" + ], + [ + "s_1_1101.bcl:md5,e005af6a84925e326afbfe264241f047", + "s_1_1101.stats:md5,b6fb20868eebaffcc19daa694a449795" + ], + [ + "s_1_1101.bcl:md5,02f1a699b1ba9967accccf99a7af3d24", + "s_1_1101.stats:md5,4f007efacecaf26dc0e0231aede28754" + ], + [ + "s_1_1101.bcl:md5,df308c72a2dcc655cd95e98f5457187a", + "s_1_1101.stats:md5,130c4b07f4c14030bab012824cbe34da" + ], + [ + "s_1_1101.bcl:md5,f3ce10d8d2406b72355023bfa8c96822", + "s_1_1101.stats:md5,2638f4db393ed5b699ec2ce59ff0ec19" + ], + [ + "s_1_1101.bcl:md5,cc2f6d675ad1593ff96f734b172d249e", + "s_1_1101.stats:md5,f5b13f1e1ababc9e1a7a73b0b993cbf1" + ], + [ + "s_1_1101.bcl:md5,7938a0b21448305a951b023b1845b3a7", + "s_1_1101.stats:md5,fcd57511adabfc3ba1ac045165330006" + ], + [ + "s_1_1101.bcl:md5,44879bc6a38df1fee8def61868115041", + "s_1_1101.stats:md5,517e20e4b58a8023a37f9af62e0e2036" + ], + [ + "s_1_1101.bcl:md5,8749611e62406a7d2f34c610a55e56af", + "s_1_1101.stats:md5,8ccf24b3676ef84f2e513be8f2a9f3d1" + ], + [ + "s_1_1101.bcl:md5,a9846a037611cda3721958088f714c0e", + "s_1_1101.stats:md5,6438fa5a1892f328cab1605a95d80a3b" + ], + [ + "s_1_1101.bcl:md5,d6c4a2a726496476eb826532f974ed5f", + "s_1_1101.stats:md5,8c2c65b5e8b00dbf61ada65252aeb266" + ], + [ + "s_1_1101.bcl:md5,be3dde6cae7dd85855a6bf295ebfacfe", + "s_1_1101.stats:md5,93bc13f3b0749b2b8d8bcb0b1199f4f0" + ], + [ + "s_1_1101.bcl:md5,7c64514735a6cf1565b60647edd17d20", + "s_1_1101.stats:md5,4a0aa6c49b24f876415e5878cef7f805" + ], + [ + "s_1_1101.bcl:md5,3983b4043bc9df4b505202a5134ccf03", + "s_1_1101.stats:md5,1c9d9a8558adc1279ca27c96bc1b9758" + ], + [ + "s_1_1101.bcl:md5,a0b8d77f116ec95975f9253dcb768136", + "s_1_1101.stats:md5,c3992b786756e7ec42f65ef4b13b50d4" + ], + [ + "s_1_1101.bcl:md5,43c95ba35d06bb7c57fbd16f3d1cfd6c", + "s_1_1101.stats:md5,3cb69d04698c39f97f962e5bf1eea7f0" + ], + [ + "s_1_1101.bcl:md5,3dbeea0cad7052f19f53ff6f19dd4d90", + "s_1_1101.stats:md5,58bbc8254f0f5f4a244531e8e9c12a04" + ], + [ + "s_1_1101.bcl:md5,da56d088996376c898d855b6cd0a7dfc", + "s_1_1101.stats:md5,9f2d78af6908ce1576b89cdc059844ff" + ], + [ + "s_1_1101.bcl:md5,7b641a5565f095e9a6ffcad9e4305033", + "s_1_1101.stats:md5,3ada06c59b4fb41b83ab6abd0979e9fc" + ], + [ + "s_1_1101.bcl:md5,a3843d397a01d51657825bb652c191e5", + "s_1_1101.stats:md5,19341e52a4bfc7d9d48e9d2acc68c519" + ], + [ + "s_1_1101.bcl:md5,048e3ebfc8efeb8012def6b741c9060d", + "s_1_1101.stats:md5,88bd38deca1e87d700effab1fd099565" + ], + [ + "s_1_1101.bcl:md5,b340db0e07e829dd5da22371916a1a9e", + "s_1_1101.stats:md5,e44cfaddcc4ffb968e5b1a2f41ac48a5" + ], + [ + "s_1_1101.bcl:md5,e6011ec6eabbc2b8792deb283c621ce0", + "s_1_1101.stats:md5,090875dcd1a431af24bc631333f089c4" + ], + [ + "s_1_1101.bcl:md5,a08f216e3352345031ed100ec4245082", + "s_1_1101.stats:md5,97b949ef4b96219e1369f673cf5f8a6c" + ], + [ + "s_1_1101.bcl:md5,b43337c76fb037dfcf5f8f7bcb3618e5", + "s_1_1101.stats:md5,ddef585805e79951f69d23ab7354f69b" + ], + [ + "s_1_1101.bcl:md5,8c61fd004104397b360855e058bbf1bf", + "s_1_1101.stats:md5,0f8d253816d594dcfea3ccf48c826401" + ], + [ + "s_1_1101.bcl:md5,594d06310d328b188aa0b3edfff22cb2", + "s_1_1101.stats:md5,3160bf271b39aeb7590e4fd2984710ba" + ], + [ + "s_1_1101.bcl:md5,4c9eada67c9d55437211d83e111961d5", + "s_1_1101.stats:md5,2901b46ab16ec4863d30e4c84ec29c97" + ], + [ + "s_1_1101.bcl:md5,e03971ae5282f0accc0c1b7374d9ef1b", + "s_1_1101.stats:md5,60d2a19ce59bf70a21a28555484cead8" + ], + [ + "s_1_1101.bcl:md5,e1c6f7a06e63d149895d3e48e63df155", + "s_1_1101.stats:md5,44beb10af847ea3dddaf06dda7031126" + ], + [ + "s_1_1101.bcl:md5,960a99bf29a8f9d936e9b8582d46c9c6", + "s_1_1101.stats:md5,544cd1a7aaaa841914b40ece43399334" + ], + [ + "s_1_1101.bcl:md5,5706679f349fd4a6b6313bc2c41c7a42", + "s_1_1101.stats:md5,627eea844b26dae033848c2f9f69177b" + ], + [ + "s_1_1101.bcl:md5,21da5abc4b0402bbac14b5ab998b0b4f", + "s_1_1101.stats:md5,515bd140b095ad90473ca7a9a69877ab" + ], + "s_1_1101.control:md5,08a72e2198ae95150718e8adf011d105", + "s_1_1101.filter:md5,3a72bc73b323c8cb0ac5bfeb62d98989" + ] + ], + [ + "s_1_1101.locs:md5,0827ea802e5257cc5b20e757a33d4c98" + ], + "RTAConfiguration.xml:md5,c7d6e257bc374f142dc64b9d2281d4c9", + "config.xml:md5,9a4cc7ec01fefa2f1ce9bcb45bbad6e9" + ] + ], + [ + "ControlMetricsOut.bin:md5,6d77b38d0793a6e1ce1e85706e488953", + "CorrectedIntMetricsOut.bin:md5,2bbf84d3be72734addaa2fe794711434", + "ErrorMetricsOut.bin:md5,38c88def138e9bb832539911affdb286", + "ExtractionMetricsOut.bin:md5,7497c3178837eea8f09350b5cd252e99", + "IndexMetricsOut.bin:md5,d41d8cd98f00b204e9800998ecf8427e", + "QMetricsOut.bin:md5,7e9f198d53ebdfbb699a5f94cf1ed51c", + "TileMetricsOut.bin:md5,83891751ec1c91a425a524b476b6ca3c" + ], + "RunInfo.xml:md5,03038959f4dd181c86bc97ae71fe270a" + ] + ] + ] + ], + "timestamp": "2023-10-18T11:56:39.562418" + }, + "test_untar_onlyfiles": { + "content": [ + [ + [ + [ + + ], + [ + "hello.txt:md5,e59ff97941044f85df5297e1c302d260" + ] + ] + ] + ], + "timestamp": "2023-10-18T11:56:46.878844" + }, + "test_untar": { + "content": [ + [ + [ + [ + + ], + [ + "hash.k2d:md5,8b8598468f54a7087c203ad0190555d9", + "opts.k2d:md5,a033d00cf6759407010b21700938f543", + "taxo.k2d:md5,094d5891cdccf2f1468088855c214b2c" + ] + ] + ] + ], + "timestamp": "2023-10-18T11:56:08.16574" + } +} \ No newline at end of file diff --git a/modules/nf-core/untar/tests/tags.yml b/modules/nf-core/untar/tests/tags.yml new file mode 100644 index 00000000..feb6f15c --- /dev/null +++ b/modules/nf-core/untar/tests/tags.yml @@ -0,0 +1,2 @@ +untar: + - modules/nf-core/untar/** diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/meta.yml b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/meta.yml index 6a36b225..1b968acc 100644 --- a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/meta.yml +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/meta.yml @@ -16,24 +16,26 @@ input: - meta: type: map description: > - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] + Groovy Map containing sample information e.g. [ id:'test', single_end:false ] + - id: type: string description: > SRA run identifier. + - certificate: type: file description: > Path to a JWT cart file used to access protected dbGAP data on SRA using the sra-toolkit + pattern: "*.cart" # TODO Update when we decide on a standard for subworkflow docs output: - meta: type: map description: > - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] + Groovy Map containing sample information e.g. [ id:'test', single_end:false ] + - reads: type: file description: Extracted FASTQ file or files if the sequencing reads are paired-end. @@ -45,3 +47,6 @@ output: authors: - "@Midnighter" - "@drpatelh" +maintainers: + - "@Midnighter" + - "@drpatelh" diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/nextflow.config b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/nextflow.config deleted file mode 100644 index 996c1888..00000000 --- a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/nextflow.config +++ /dev/null @@ -1,3 +0,0 @@ -includeConfig '../../../modules/nf-core/sratools/prefetch/nextflow.config' -includeConfig '../../../modules/nf-core/sratools/fasterqdump/nextflow.config' -includeConfig '../../../modules/nf-core/custom/sratoolsncbisettings/nextflow.config' \ No newline at end of file diff --git a/subworkflows/nf-core/nextflowpipelineutils/main.nf b/subworkflows/nf-core/nextflowpipelineutils/main.nf deleted file mode 100644 index 5cb9af8c..00000000 --- a/subworkflows/nf-core/nextflowpipelineutils/main.nf +++ /dev/null @@ -1,126 +0,0 @@ -// -// Subworkflow with functionality that may be useful for any Nextflow pipeline -// - -import org.yaml.snakeyaml.Yaml -import groovy.json.JsonOutput - -/* -======================================================================================== - SUBWORKFLOW DEFINITION -======================================================================================== -*/ - -workflow NEXTFLOW_PIPELINE_UTILS { - - take: - print_version // bool - dump_parameters // bool - output_directory // path: base directory used to publish pipeline results - check_conda_channels // bool - - main: - - // - // Print workflow version and exit on --version - // - if (print_version) { - log.info "${workflow.manifest.name} ${getWorkflowVersion()}" - System.exit(0) - } - - // - // Dump pipeline parameters to a JSON file - // - if (dump_parameters && output_directory) { - dumpParametersToJSON(output_directory) - } - - // - // When running with Conda, warn if channels have not been set-up appropriately - // - if (check_conda_channels) { - checkCondaChannels() - } - - emit: - out = true -} - -/* -======================================================================================== - FUNCTIONS -======================================================================================== -*/ - -// -// Generate version string -// -def getWorkflowVersion() { - String version_string = "" - if (workflow.manifest.version) { - def prefix_v = workflow.manifest.version[0] != 'v' ? 'v' : '' - version_string += "${prefix_v}${workflow.manifest.version}" - } - - if (workflow.commitId) { - def git_shortsha = workflow.commitId.substring(0, 7) - version_string += "-g${git_shortsha}" - } - - return version_string -} - -// -// Dump pipeline parameters to a JSON file -// -def dumpParametersToJSON(output_directory) { - def output_d = new File("${output_directory}/pipeline_info/") - if (!output_d.exists()) { - output_d.mkdirs() - } - - def timestamp = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss') - def output_pf = new File(output_d, "params_${timestamp}.json") - def jsonStr = JsonOutput.toJson(params) - output_pf.text = JsonOutput.prettyPrint(jsonStr) -} - -// -// When running with -profile conda, warn if channels have not been set-up appropriately -// -def checkCondaChannels() { - Yaml parser = new Yaml() - def channels = [] - try { - def config = parser.load("conda config --show channels".execute().text) - channels = config.channels - } catch(NullPointerException | IOException e) { - log.warn "Could not verify conda channel configuration." - return - } - - // Check that all channels are present - // This channel list is ordered by required channel priority. - def required_channels_in_order = ['conda-forge', 'bioconda', 'defaults'] - def channels_missing = ((required_channels_in_order as Set) - (channels as Set)) as Boolean - - // Check that they are in the right order - def channel_priority_violation = false - def n = required_channels_in_order.size() - for (int i = 0; i < n - 1; i++) { - channel_priority_violation |= !(channels.indexOf(required_channels_in_order[i]) < channels.indexOf(required_channels_in_order[i+1])) - } - - if (channels_missing | channel_priority_violation) { - log.warn "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + - " There is a problem with your Conda configuration!\n\n" + - " You will need to set-up the conda-forge and bioconda channels correctly.\n" + - " Please refer to https://bioconda.github.io/\n" + - " The observed channel order is \n" + - " ${channels}\n" + - " but the following channel order is required:\n" + - " ${required_channels_in_order}\n" + - "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" - } -} diff --git a/subworkflows/nf-core/nextflowpipelineutils/meta.yml b/subworkflows/nf-core/nextflowpipelineutils/meta.yml deleted file mode 100644 index f56b827b..00000000 --- a/subworkflows/nf-core/nextflowpipelineutils/meta.yml +++ /dev/null @@ -1,34 +0,0 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/subworkflows/yaml-schema.json -name: "nextflow_pipeline_utils" -description: Subworkflow with functionality that may be useful for any Nextflow pipeline -keywords: - - utility - - pipeline - - initialise - - version -components: [] -input: - - print_version: - type: boolean - description: | - Print the version of the pipeline and exit - - dump_parameters: - type: boolean - description: | - Dump the parameters of the pipeline to a JSON file - - output_directory: - type: directory - description: Path to output dir to write JSON file to. - pattern: "results/" - - check_conda_channel: - type: boolean - description: | - Check if the conda channel priority is correct. -output: - - out: - type: boolean - description: | - Dummy output for making using in process chaining. -authors: - - "@adamrtalbot" - - "@drpatelh" diff --git a/subworkflows/nf-core/nextflowpipelineutils/tests/main.functions.nf.test b/subworkflows/nf-core/nextflowpipelineutils/tests/main.functions.nf.test deleted file mode 100644 index 1a1577eb..00000000 --- a/subworkflows/nf-core/nextflowpipelineutils/tests/main.functions.nf.test +++ /dev/null @@ -1,71 +0,0 @@ - -nextflow_function { - - name "Test Functions" - script "subworkflows/nf-core/nextflowpipelineutils/main.nf" - config "subworkflows/nf-core/nextflowpipelineutils/tests/nextflow.config" - tag 'subworkflows' - tag 'nextflowpipelineutils' - tag 'subworkflows/nextflowpipelineutils' - - test("Test Function getWorkflowVersion") { - - function "getWorkflowVersion" - - when { - function { - """ - // no inputs - """ - } - } - - then { - assert function.success - assert snapshot(function.result).match() - } - - } - - - test("Test Function dumpParametersToJSON") { - - function "dumpParametersToJSON" - - when { - function { - """ - // define inputs of the function here. Example: - input[0] = "$outputDir" - """.stripIndent() - } - } - - then { - assert function.success - assert function.result =~ /publish_dir_mode/ - assert function.result =~ /copy/ - } - - } - - test("Test Function checkCondaChannels") { - - function "checkCondaChannels" - - when { - function { - """ - // no inputs - """ - } - } - - then { - assert function.success - assert snapshot(function.result).match() - } - - } - -} \ No newline at end of file diff --git a/subworkflows/nf-core/nextflowpipelineutils/tests/main.functions.nf.test.snap b/subworkflows/nf-core/nextflowpipelineutils/tests/main.functions.nf.test.snap deleted file mode 100644 index 939dbbad..00000000 --- a/subworkflows/nf-core/nextflowpipelineutils/tests/main.functions.nf.test.snap +++ /dev/null @@ -1,12 +0,0 @@ -{ - "Test Function getWorkflowVersion": { - "content": [ - "v9.9.9" - ], - "timestamp": "2023-10-15T13:43:55.128868" - }, - "Test Function checkCondaChannels": { - "content": null, - "timestamp": "2023-10-12T17:09:24.933468" - } -} \ No newline at end of file diff --git a/subworkflows/nf-core/nextflowpipelineutils/tests/main.workflow.nf.test b/subworkflows/nf-core/nextflowpipelineutils/tests/main.workflow.nf.test deleted file mode 100644 index 3cf7f034..00000000 --- a/subworkflows/nf-core/nextflowpipelineutils/tests/main.workflow.nf.test +++ /dev/null @@ -1,104 +0,0 @@ -nextflow_workflow { - - name "Test Workflow NEXTFLOW_PIPELINE_UTILS" - script "../main.nf" - config "subworkflows/nf-core/nextflowpipelineutils/tests/nextflow.config" - workflow "NEXTFLOW_PIPELINE_UTILS" - tag 'subworkflows' - tag 'nextflowpipelineutils' - tag 'subworkflows/nextflowpipelineutils' - - test("Should run no inputs") { - - when { - params { - outdir = "tests/results" - } - workflow { - """ - input[0] = false - input[1] = false - input[2] = null - input[3] = false - """ - } - } - - then { - assert workflow.success - assert snapshot(workflow.out).match() - } - - } - - test("Should print version") { - - when { - params { - outdir = "tests/results" - } - workflow { - """ - input[0] = true - input[1] = false - input[2] = null - input[3] = false - """ - } - } - - then { - assert workflow.success - assert workflow.stdout.contains("nextflow_workflow v9.9.9") - } - - } - - - test("Should dump params") { - - when { - params { - outdir = "$outputDir" - } - workflow { - """ - input[0] = false - input[1] = true - input[2] = params.outdir - input[3] = false - """ - } - } - - then { - assert workflow.success - assert snapshot(workflow.out).match() - } - - } - - test("Should not create params JSON if no output directory") { - - when { - params { - outdir = "$outputDir" - } - workflow { - """ - input[0] = false - input[1] = true - input[2] = null - input[3] = false - """ - } - } - - then { - assert workflow.success - assert snapshot(workflow.out, path(params.outdir).list()).match() - } - - } - -} diff --git a/subworkflows/nf-core/nextflowpipelineutils/tests/main.workflow.nf.test.snap b/subworkflows/nf-core/nextflowpipelineutils/tests/main.workflow.nf.test.snap deleted file mode 100644 index 08040fd4..00000000 --- a/subworkflows/nf-core/nextflowpipelineutils/tests/main.workflow.nf.test.snap +++ /dev/null @@ -1,44 +0,0 @@ -{ - "Should not create params JSON if no output directory": { - "content": [ - { - "0": [ - true - ], - "out": [ - true - ] - }, - [ - - ] - ], - "timestamp": "2023-10-13T11:55:54.576748" - }, - "Should dump params": { - "content": [ - { - "0": [ - true - ], - "out": [ - true - ] - } - ], - "timestamp": "2023-10-13T11:55:52.711329" - }, - "Should run no inputs": { - "content": [ - { - "0": [ - true - ], - "out": [ - true - ] - } - ], - "timestamp": "2023-10-13T11:55:49.048315" - } -} \ No newline at end of file diff --git a/subworkflows/nf-core/nextflowpipelineutils/tests/nextflow.config b/subworkflows/nf-core/nextflowpipelineutils/tests/nextflow.config deleted file mode 100644 index 53574ffe..00000000 --- a/subworkflows/nf-core/nextflowpipelineutils/tests/nextflow.config +++ /dev/null @@ -1,9 +0,0 @@ -manifest { - name = 'nextflow_workflow' - author = """nf-core""" - homePage = 'https://127.0.0.1' - description = """Dummy pipeline""" - nextflowVersion = '!>=23.04.0' - version = '9.9.9' - doi = 'https://doi.org/10.5281/zenodo.5070524' -} \ No newline at end of file diff --git a/subworkflows/nf-core/nfcore_pipeline_utils/main.nf b/subworkflows/nf-core/nfcore_pipeline_utils/main.nf deleted file mode 100644 index b3b136dc..00000000 --- a/subworkflows/nf-core/nfcore_pipeline_utils/main.nf +++ /dev/null @@ -1,311 +0,0 @@ -// -// Subworkflow with utility functions specific to the nf-core pipeline template -// - -/* -======================================================================================== - SUBWORKFLOW DEFINITION -======================================================================================== -*/ - -workflow NFCORE_PIPELINE_UTILS { - - main: - checkConfigProvided() - - emit: - success = true - -} - -/* -======================================================================================== - FUNCTIONS -======================================================================================== -*/ - -// -// Warn if a -profile or Nextflow config has not been provided to run the pipeline -// -def checkConfigProvided() { - if (workflow.profile == 'standard' && workflow.configFiles.size() <= 1) { - log.warn "[$workflow.manifest.name] You are attempting to run the pipeline without any custom configuration!\n\n" + - "This will be dependent on your local compute environment but can be achieved via one or more of the following:\n" + - " (1) Using an existing pipeline profile e.g. `-profile docker` or `-profile singularity`\n" + - " (2) Using an existing nf-core/configs for your Institution e.g. `-profile crick` or `-profile uppmax`\n" + - " (3) Using your own local custom config e.g. `-c /path/to/your/custom.config`\n\n" + - "Please refer to the quick start section and usage docs for the pipeline.\n " - } -} - -// -// Citation string for pipeline -// -def workflowCitation() { - return "If you use ${workflow.manifest.name} for your analysis please cite:\n\n" + - "* The pipeline\n" + - " ${workflow.manifest.doi}\n\n" + - "* The nf-core framework\n" + - " https://doi.org/10.1038/s41587-020-0439-x\n\n" + - "* Software dependencies\n" + - " https://github.com/${workflow.manifest.name}/blob/master/CITATIONS.md" -} - -// -// nf-core logo -// -def nfCoreLogo(workflow_version) { - Map colors = logColours() - String.format( - """\n - ${dashedLine()} - ${colors.green},--.${colors.black}/${colors.green},-.${colors.reset} - ${colors.blue} ___ __ __ __ ___ ${colors.green}/,-._.--~\'${colors.reset} - ${colors.blue} |\\ | |__ __ / ` / \\ |__) |__ ${colors.yellow}} {${colors.reset} - ${colors.blue} | \\| | \\__, \\__/ | \\ |___ ${colors.green}\\`-._,-`-,${colors.reset} - ${colors.green}`._,._,\'${colors.reset} - ${colors.purple} ${workflow.manifest.name} ${workflow_version}${colors.reset} - ${dashedLine()} - """.stripIndent() - ) -} - -// -// Return dashed line -// -def dashedLine() { - Map colors = logColours() - return "-${colors.dim}----------------------------------------------------${colors.reset}-" -} - -// -// ANSII colours used for terminal logging -// -def logColours() { - Map colorcodes = [:] - - // Reset / Meta - colorcodes['reset'] = params.monochrome_logs ? '' : "\033[0m" - colorcodes['bold'] = params.monochrome_logs ? '' : "\033[1m" - colorcodes['dim'] = params.monochrome_logs ? '' : "\033[2m" - colorcodes['underlined'] = params.monochrome_logs ? '' : "\033[4m" - colorcodes['blink'] = params.monochrome_logs ? '' : "\033[5m" - colorcodes['reverse'] = params.monochrome_logs ? '' : "\033[7m" - colorcodes['hidden'] = params.monochrome_logs ? '' : "\033[8m" - - // Regular Colors - colorcodes['black'] = params.monochrome_logs ? '' : "\033[0;30m" - colorcodes['red'] = params.monochrome_logs ? '' : "\033[0;31m" - colorcodes['green'] = params.monochrome_logs ? '' : "\033[0;32m" - colorcodes['yellow'] = params.monochrome_logs ? '' : "\033[0;33m" - colorcodes['blue'] = params.monochrome_logs ? '' : "\033[0;34m" - colorcodes['purple'] = params.monochrome_logs ? '' : "\033[0;35m" - colorcodes['cyan'] = params.monochrome_logs ? '' : "\033[0;36m" - colorcodes['white'] = params.monochrome_logs ? '' : "\033[0;37m" - - // Bold - colorcodes['bblack'] = params.monochrome_logs ? '' : "\033[1;30m" - colorcodes['bred'] = params.monochrome_logs ? '' : "\033[1;31m" - colorcodes['bgreen'] = params.monochrome_logs ? '' : "\033[1;32m" - colorcodes['byellow'] = params.monochrome_logs ? '' : "\033[1;33m" - colorcodes['bblue'] = params.monochrome_logs ? '' : "\033[1;34m" - colorcodes['bpurple'] = params.monochrome_logs ? '' : "\033[1;35m" - colorcodes['bcyan'] = params.monochrome_logs ? '' : "\033[1;36m" - colorcodes['bwhite'] = params.monochrome_logs ? '' : "\033[1;37m" - - // Underline - colorcodes['ublack'] = params.monochrome_logs ? '' : "\033[4;30m" - colorcodes['ured'] = params.monochrome_logs ? '' : "\033[4;31m" - colorcodes['ugreen'] = params.monochrome_logs ? '' : "\033[4;32m" - colorcodes['uyellow'] = params.monochrome_logs ? '' : "\033[4;33m" - colorcodes['ublue'] = params.monochrome_logs ? '' : "\033[4;34m" - colorcodes['upurple'] = params.monochrome_logs ? '' : "\033[4;35m" - colorcodes['ucyan'] = params.monochrome_logs ? '' : "\033[4;36m" - colorcodes['uwhite'] = params.monochrome_logs ? '' : "\033[4;37m" - - // High Intensity - colorcodes['iblack'] = params.monochrome_logs ? '' : "\033[0;90m" - colorcodes['ired'] = params.monochrome_logs ? '' : "\033[0;91m" - colorcodes['igreen'] = params.monochrome_logs ? '' : "\033[0;92m" - colorcodes['iyellow'] = params.monochrome_logs ? '' : "\033[0;93m" - colorcodes['iblue'] = params.monochrome_logs ? '' : "\033[0;94m" - colorcodes['ipurple'] = params.monochrome_logs ? '' : "\033[0;95m" - colorcodes['icyan'] = params.monochrome_logs ? '' : "\033[0;96m" - colorcodes['iwhite'] = params.monochrome_logs ? '' : "\033[0;97m" - - // Bold High Intensity - colorcodes['biblack'] = params.monochrome_logs ? '' : "\033[1;90m" - colorcodes['bired'] = params.monochrome_logs ? '' : "\033[1;91m" - colorcodes['bigreen'] = params.monochrome_logs ? '' : "\033[1;92m" - colorcodes['biyellow'] = params.monochrome_logs ? '' : "\033[1;93m" - colorcodes['biblue'] = params.monochrome_logs ? '' : "\033[1;94m" - colorcodes['bipurple'] = params.monochrome_logs ? '' : "\033[1;95m" - colorcodes['bicyan'] = params.monochrome_logs ? '' : "\033[1;96m" - colorcodes['biwhite'] = params.monochrome_logs ? '' : "\033[1;97m" - - return colorcodes -} - -// -// Construct and send completion email -// -def completionEmail(summary_params) { - - // Set up the e-mail variables - def subject = "[$workflow.manifest.name] Successful: $workflow.runName" - if (!workflow.success) { - subject = "[$workflow.manifest.name] FAILED: $workflow.runName" - } - - def summary = [:] - for (group in summary_params.keySet()) { - summary << summary_params[group] - } - - def misc_fields = [:] - misc_fields['Date Started'] = workflow.start - misc_fields['Date Completed'] = workflow.complete - misc_fields['Pipeline script file path'] = workflow.scriptFile - misc_fields['Pipeline script hash ID'] = workflow.scriptId - if (workflow.repository) misc_fields['Pipeline repository Git URL'] = workflow.repository - if (workflow.commitId) misc_fields['Pipeline repository Git Commit'] = workflow.commitId - if (workflow.revision) misc_fields['Pipeline Git branch/tag'] = workflow.revision - misc_fields['Nextflow Version'] = workflow.nextflow.version - misc_fields['Nextflow Build'] = workflow.nextflow.build - misc_fields['Nextflow Compile Timestamp'] = workflow.nextflow.timestamp - - def email_fields = [:] - email_fields['version'] = NfcoreTemplate.version(workflow) - email_fields['runName'] = workflow.runName - email_fields['success'] = workflow.success - email_fields['dateComplete'] = workflow.complete - email_fields['duration'] = workflow.duration - email_fields['exitStatus'] = workflow.exitStatus - email_fields['errorMessage'] = (workflow.errorMessage ?: 'None') - email_fields['errorReport'] = (workflow.errorReport ?: 'None') - email_fields['commandLine'] = workflow.commandLine - email_fields['projectDir'] = workflow.projectDir - email_fields['summary'] = summary << misc_fields - - // Check if we are only sending emails on failure - def email_address = params.email - if (!params.email && params.email_on_fail && !workflow.success) { - email_address = params.email_on_fail - } - - // Render the TXT template - def engine = new groovy.text.GStringTemplateEngine() - def tf = new File("${workflow.projectDir}/assets/email_template.txt") - def txt_template = engine.createTemplate(tf).make(email_fields) - def email_txt = txt_template.toString() - - // Render the HTML template - def hf = new File("${workflow.projectDir}/assets/email_template.html") - def html_template = engine.createTemplate(hf).make(email_fields) - def email_html = html_template.toString() - - // Render the sendmail template - def smail_fields = [ email: email_address, subject: subject, email_txt: email_txt, email_html: email_html, projectDir: "${workflow.projectDir}" ] - def sf = new File("${workflow.projectDir}/assets/sendmail_template.txt") - def sendmail_template = engine.createTemplate(sf).make(smail_fields) - def sendmail_html = sendmail_template.toString() - - // Send the HTML e-mail - Map colors = logColours() - if (email_address) { - try { - if (params.plaintext_email) { throw GroovyException('Send plaintext e-mail, not HTML') } - // Try to send HTML e-mail using sendmail - [ 'sendmail', '-t' ].execute() << sendmail_html - log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Sent summary e-mail to $email_address (sendmail)-" - } catch (all) { - // Catch failures and try with plaintext - def mail_cmd = [ 'mail', '-s', subject, '--content-type=text/html', email_address ] - mail_cmd.execute() << email_html - log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Sent summary e-mail to $email_address (mail)-" - } - } - - // Write summary e-mail HTML to a file - def output_d = new File("${params.outdir}/pipeline_info/") - if (!output_d.exists()) { - output_d.mkdirs() - } - def output_hf = new File(output_d, "pipeline_report.html") - output_hf.withWriter { w -> w << email_html } - def output_tf = new File(output_d, "pipeline_report.txt") - output_tf.withWriter { w -> w << email_txt } -} - -// -// Print pipeline summary on completion -// -def completionSummary() { - Map colors = logColours() - if (workflow.success) { - if (workflow.stats.ignoredCount == 0) { - log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Pipeline completed successfully${colors.reset}-" - } else { - log.info "-${colors.purple}[$workflow.manifest.name]${colors.yellow} Pipeline completed successfully, but with errored process(es) ${colors.reset}-" - } - } else { - log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed with errors${colors.reset}-" - } -} - -// -// Construct and send a notification to a web server as JSON e.g. Microsoft Teams and Slack -// -def imNotification(summary_params) { - def hook_url = params.hook_url - - def summary = [:] - for (group in summary_params.keySet()) { - summary << summary_params[group] - } - - def misc_fields = [:] - misc_fields['start'] = workflow.start - misc_fields['complete'] = workflow.complete - misc_fields['scriptfile'] = workflow.scriptFile - misc_fields['scriptid'] = workflow.scriptId - if (workflow.repository) misc_fields['repository'] = workflow.repository - if (workflow.commitId) misc_fields['commitid'] = workflow.commitId - if (workflow.revision) misc_fields['revision'] = workflow.revision - misc_fields['nxf_version'] = workflow.nextflow.version - misc_fields['nxf_build'] = workflow.nextflow.build - misc_fields['nxf_timestamp'] = workflow.nextflow.timestamp - - def msg_fields = [:] - msg_fields['version'] = NfcoreTemplate.version(workflow) - msg_fields['runName'] = workflow.runName - msg_fields['success'] = workflow.success - msg_fields['dateComplete'] = workflow.complete - msg_fields['duration'] = workflow.duration - msg_fields['exitStatus'] = workflow.exitStatus - msg_fields['errorMessage'] = (workflow.errorMessage ?: 'None') - msg_fields['errorReport'] = (workflow.errorReport ?: 'None') - msg_fields['commandLine'] = workflow.commandLine.replaceFirst(/ +--hook_url +[^ ]+/, "") - msg_fields['projectDir'] = workflow.projectDir - msg_fields['summary'] = summary << misc_fields - - // Render the JSON template - def engine = new groovy.text.GStringTemplateEngine() - // Different JSON depending on the service provider - // Defaults to "Adaptive Cards" (https://adaptivecards.io), except Slack which has its own format - def json_path = hook_url.contains("hooks.slack.com") ? "slackreport.json" : "adaptivecard.json" - def hf = new File("${workflow.projectDir}/assets/${json_path}") - def json_template = engine.createTemplate(hf).make(msg_fields) - def json_message = json_template.toString() - - // POST - def post = new URL(hook_url).openConnection(); - post.setRequestMethod("POST") - post.setDoOutput(true) - post.setRequestProperty("Content-Type", "application/json") - post.getOutputStream().write(json_message.getBytes("UTF-8")); - def postRC = post.getResponseCode(); - if (! postRC.equals(200)) { - log.warn(post.getErrorStream().getText()); - } -} diff --git a/subworkflows/nf-core/nfcore_pipeline_utils/meta.yml b/subworkflows/nf-core/nfcore_pipeline_utils/meta.yml deleted file mode 100644 index 5721b7e3..00000000 --- a/subworkflows/nf-core/nfcore_pipeline_utils/meta.yml +++ /dev/null @@ -1,17 +0,0 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/subworkflows/yaml-schema.json -name: "NFCORE_PIPELINE_UTILS" -description: Subworkflow with utility functions specific to the nf-core pipeline template -keywords: - - utility - - pipeline - - initialise - - version -components: [] -input: [] -output: - - success: - type: boolean - description: | - Dummy output to indicate success -authors: - - "@adamrtalbot" diff --git a/subworkflows/nf-core/nfcore_pipeline_utils/tests/main.function.nf.test b/subworkflows/nf-core/nfcore_pipeline_utils/tests/main.function.nf.test deleted file mode 100644 index 265ece39..00000000 --- a/subworkflows/nf-core/nfcore_pipeline_utils/tests/main.function.nf.test +++ /dev/null @@ -1,120 +0,0 @@ - -nextflow_function { - - name "Test Functions" - script "../main.nf" - config "subworkflows/nf-core/nfcore_pipeline_utils/tests/nextflow.config" - - test("Test Function checkConfigProvided") { - - function "checkConfigProvided" - - when { - function { - """ - // define inputs of the function here. Example: - // input[0] = 1 - """ - } - } - - then { - assertAll ( - { assert function.success }, - { assert snapshot(function.result).match() } - ) - } - - } - - test("Test Function workflowCitation") { - - function "workflowCitation" - - when { - function { - """ - // define inputs of the function here. Example: - // input[0] = 1 - """ - } - } - - then { - assertAll ( - { assert function.success }, - { assert snapshot(function.result).match() } - ) - } - - } - - test("Test Function nfCoreLogo") { - - function "nfCoreLogo" - - when { - function { - """ - input[0] = "9.9.9" - """ - } - } - - then { - assertAll ( - { assert function.success }, - { assert snapshot(function.result).match() } - ) - } - - } - - - - test("Test Function dashedLine") { - - function "dashedLine" - - when { - function { - """ - // define inputs of the function here. Example: - // input[0] = 1 - """ - } - } - - then { - assertAll ( - { assert function.success }, - { assert snapshot(function.result).match() } - ) - } - - } - - - - test("Test Function logColours") { - - function "logColours" - - when { - function { - """ - // define inputs of the function here. Example: - // input[0] = 1 - """ - } - } - - then { - assertAll ( - { assert function.success }, - { assert snapshot(function.result).match() } - ) - } - - } -} \ No newline at end of file diff --git a/subworkflows/nf-core/nfcore_pipeline_utils/tests/main.function.nf.test.snap b/subworkflows/nf-core/nfcore_pipeline_utils/tests/main.function.nf.test.snap deleted file mode 100644 index 3ea51f68..00000000 --- a/subworkflows/nf-core/nfcore_pipeline_utils/tests/main.function.nf.test.snap +++ /dev/null @@ -1,78 +0,0 @@ -{ - "Test Function logColours": { - "content": [ - { - "reset": "\u001b[0m", - "bold": "\u001b[1m", - "dim": "\u001b[2m", - "underlined": "\u001b[4m", - "blink": "\u001b[5m", - "reverse": "\u001b[7m", - "hidden": "\u001b[8m", - "black": "\u001b[0;30m", - "red": "\u001b[0;31m", - "green": "\u001b[0;32m", - "yellow": "\u001b[0;33m", - "blue": "\u001b[0;34m", - "purple": "\u001b[0;35m", - "cyan": "\u001b[0;36m", - "white": "\u001b[0;37m", - "bblack": "\u001b[1;30m", - "bred": "\u001b[1;31m", - "bgreen": "\u001b[1;32m", - "byellow": "\u001b[1;33m", - "bblue": "\u001b[1;34m", - "bpurple": "\u001b[1;35m", - "bcyan": "\u001b[1;36m", - "bwhite": "\u001b[1;37m", - "ublack": "\u001b[4;30m", - "ured": "\u001b[4;31m", - "ugreen": "\u001b[4;32m", - "uyellow": "\u001b[4;33m", - "ublue": "\u001b[4;34m", - "upurple": "\u001b[4;35m", - "ucyan": "\u001b[4;36m", - "uwhite": "\u001b[4;37m", - "iblack": "\u001b[0;90m", - "ired": "\u001b[0;91m", - "igreen": "\u001b[0;92m", - "iyellow": "\u001b[0;93m", - "iblue": "\u001b[0;94m", - "ipurple": "\u001b[0;95m", - "icyan": "\u001b[0;96m", - "iwhite": "\u001b[0;97m", - "biblack": "\u001b[1;90m", - "bired": "\u001b[1;91m", - "bigreen": "\u001b[1;92m", - "biyellow": "\u001b[1;93m", - "biblue": "\u001b[1;94m", - "bipurple": "\u001b[1;95m", - "bicyan": "\u001b[1;96m", - "biwhite": "\u001b[1;97m" - } - ], - "timestamp": "2023-10-16T14:27:09.843064" - }, - "Test Function checkConfigProvided": { - "content": null, - "timestamp": "2023-10-16T14:27:01.415849" - }, - "Test Function nfCoreLogo": { - "content": [ - "\n\n-\u001b[2m----------------------------------------------------\u001b[0m-\n \u001b[0;32m,--.\u001b[0;30m/\u001b[0;32m,-.\u001b[0m\n\u001b[0;34m ___ __ __ __ ___ \u001b[0;32m/,-._.--~'\u001b[0m\n\u001b[0;34m |\\ | |__ __ / ` / \\ |__) |__ \u001b[0;33m} {\u001b[0m\n\u001b[0;34m | \\| | \\__, \\__/ | \\ |___ \u001b[0;32m\\`-._,-`-,\u001b[0m\n \u001b[0;32m`._,._,'\u001b[0m\n\u001b[0;35m nextflow_workflow 9.9.9\u001b[0m\n-\u001b[2m----------------------------------------------------\u001b[0m-\n" - ], - "timestamp": "2023-10-16T14:27:51.566211" - }, - "Test Function workflowCitation": { - "content": [ - "If you use nextflow_workflow for your analysis please cite:\n\n* The pipeline\n https://doi.org/10.5281/zenodo.5070524\n\n* The nf-core framework\n https://doi.org/10.1038/s41587-020-0439-x\n\n* Software dependencies\n https://github.com/nextflow_workflow/blob/master/CITATIONS.md" - ], - "timestamp": "2023-10-16T14:27:03.505737" - }, - "Test Function dashedLine": { - "content": [ - "-\u001b[2m----------------------------------------------------\u001b[0m-" - ], - "timestamp": "2023-10-16T14:27:07.721916" - } -} \ No newline at end of file diff --git a/subworkflows/nf-core/nfcore_pipeline_utils/tests/main.workflow.nf.test b/subworkflows/nf-core/nfcore_pipeline_utils/tests/main.workflow.nf.test deleted file mode 100644 index ad7c73a8..00000000 --- a/subworkflows/nf-core/nfcore_pipeline_utils/tests/main.workflow.nf.test +++ /dev/null @@ -1,33 +0,0 @@ -nextflow_workflow { - - name "Test Workflow NFCORE_PIPELINE_UTILS" - script "../main.nf" - config "subworkflows/nf-core/nfcore_pipeline_utils/tests/nextflow.config" - workflow "NFCORE_PIPELINE_UTILS" - tag "subworkflows" - tag "subworkflows_nfcore" - tag "nfcorepipelineutils" - tag "subworkflows/nfcorepipelineutils" - - test("Should run without failures") { - - when { - params { - // define parameters here. Example: - // outdir = "tests/results" - } - workflow { - """ - // define inputs of the workflow here. Example: - // input[0] = file("test-file.txt") - """ - } - } - - then { - assert workflow.success - } - - } - -} diff --git a/subworkflows/nf-core/nfcore_pipeline_utils/tests/nextflow.config b/subworkflows/nf-core/nfcore_pipeline_utils/tests/nextflow.config deleted file mode 100644 index 53574ffe..00000000 --- a/subworkflows/nf-core/nfcore_pipeline_utils/tests/nextflow.config +++ /dev/null @@ -1,9 +0,0 @@ -manifest { - name = 'nextflow_workflow' - author = """nf-core""" - homePage = 'https://127.0.0.1' - description = """Dummy pipeline""" - nextflowVersion = '!>=23.04.0' - version = '9.9.9' - doi = 'https://doi.org/10.5281/zenodo.5070524' -} \ No newline at end of file diff --git a/subworkflows/nf-core/nfvalidation_plugin_utils/main.nf b/subworkflows/nf-core/nfvalidation_plugin_utils/main.nf deleted file mode 100644 index 22531719..00000000 --- a/subworkflows/nf-core/nfvalidation_plugin_utils/main.nf +++ /dev/null @@ -1,62 +0,0 @@ -// -// Subworkflow that uses the nf-validation plugin to render help text and parameter summary -// - -/* -======================================================================================== - IMPORT NF-VALIDATION PLUGIN -======================================================================================== -*/ - -include { paramsHelp; paramsSummaryLog; paramsSummaryMap; validateParameters } from 'plugin/nf-validation' - -/* -======================================================================================== - SUBWORKFLOW DEFINITION -======================================================================================== -*/ - -workflow NF_VALIDATION_PLUGIN_UTILS { - - take: - print_help // bool - workflow_command // string: default commmand used to run pipeline - pre_help_text // string: string to be printed before help text and summary log - post_help_text // string: string to be printed after help text and summary log - validate_params // bool: Validate parameters - schema_filename // path: JSON schema file, null to use default value - - main: - - log.debug "Using schema file: ${schema_filename}" - - // Default values for strings - pre_help_text = pre_help_text ?: '' - post_help_text = post_help_text ?: '' - workflow_command = workflow_command ?: '' - - // - // Print help message if needed - // - if (print_help) { - log.info pre_help_text + paramsHelp(workflow_command, parameters_schema: schema_filename) + post_help_text - System.exit(0) - } - - // - // Print parameter summary to stdout - // - log.info pre_help_text + paramsSummaryLog(workflow, parameters_schema: schema_filename) + post_help_text - - // - // Validate parameters relative to the parameter JSON schema - // - if (validate_params){ - validateParameters(parameters_schema: schema_filename) - } - - summary_params = paramsSummaryMap(workflow, parameters_schema: schema_filename) - - emit: - summary_params = summary_params -} diff --git a/subworkflows/nf-core/nfvalidation_plugin_utils/meta.yml b/subworkflows/nf-core/nfvalidation_plugin_utils/meta.yml deleted file mode 100644 index 6117b455..00000000 --- a/subworkflows/nf-core/nfvalidation_plugin_utils/meta.yml +++ /dev/null @@ -1,49 +0,0 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/subworkflows/yaml-schema.json -name: "nfvalidationpluginutils" -## TODO nf-core: Add a description of the subworkflow and list keywords -description: Sort SAM/BAM/CRAM file -keywords: - - sort - - bam - - sam - - cram -## TODO nf-core: Add a list of the modules and/or subworkflows used in the subworkflow -components: - - samtools/sort - - samtools/index -## TODO nf-core: List all of the channels used as input with a description and their structure -input: - - ch_bam: - type: file - description: | - The input channel containing the BAM/CRAM/SAM files - Structure: [ val(meta), path(bam) ] - pattern: "*.{bam/cram/sam}" -## TODO nf-core: List all of the channels used as output with a descriptions and their structure -output: - - bam: - type: file - description: | - Channel containing BAM files - Structure: [ val(meta), path(bam) ] - pattern: "*.bam" - - bai: - type: file - description: | - Channel containing indexed BAM (BAI) files - Structure: [ val(meta), path(bai) ] - pattern: "*.bai" - - csi: - type: file - description: | - Channel containing CSI files - Structure: [ val(meta), path(csi) ] - pattern: "*.csi" - - versions: - type: file - description: | - File containing software versions - Structure: [ path(versions.yml) ] - pattern: "versions.yml" -authors: - - "@adamrtalbot" diff --git a/subworkflows/nf-core/nfvalidation_plugin_utils/tests/main.nf.test b/subworkflows/nf-core/nfvalidation_plugin_utils/tests/main.nf.test deleted file mode 100644 index 6a0efd1e..00000000 --- a/subworkflows/nf-core/nfvalidation_plugin_utils/tests/main.nf.test +++ /dev/null @@ -1,199 +0,0 @@ -nextflow_workflow { - - name "Test Workflow NF_VALIDATION_PLUGIN_UTILS" - script "../main.nf" - workflow "NF_VALIDATION_PLUGIN_UTILS" - tag "subworkflow" - tag "subworkflow_nfcore" - tag "nfvalidationpluginutils" - tag "subworkflows/nfvalidationpluginutils" - - test("Should run nothing") { - - when { - - params { - monochrome_logs = true - test_data = '' - } - - workflow { - """ - help = false - workflow_command = null - pre_help_text = null - post_help_text = null - validate_params = false - schema_filename = "$moduleTestDir/nextflow_schema.json" - - input[0] = help - input[1] = workflow_command - input[2] = pre_help_text - input[3] = post_help_text - input[4] = validate_params - input[5] = schema_filename - """ - } - } - - then { - assert workflow.success - } - - } - - test("Should run help") { - - - when { - - params { - monochrome_logs = true - test_data = '' - } - workflow { - """ - help = true - workflow_command = null - pre_help_text = null - post_help_text = null - validate_params = false - schema_filename = "$moduleTestDir/nextflow_schema.json" - - input[0] = help - input[1] = workflow_command - input[2] = pre_help_text - input[3] = post_help_text - input[4] = validate_params - input[5] = schema_filename - """ - } - } - - then { - assert workflow.success - assert workflow.exitStatus == 0 - assert workflow.stdout.any { it.contains('Input/output options') } - assert workflow.stdout.any { it.contains('--outdir') } - assert workflow.stdout.any { it.contains('--outdir') } - } - - } - - test("Should run help with command") { - - - when { - - params { - monochrome_logs = true - test_data = '' - } - workflow { - """ - help = true - workflow_command = "nextflow run noorg/doesntexist" - pre_help_text = null - post_help_text = null - validate_params = false - schema_filename = "$moduleTestDir/nextflow_schema.json" - - input[0] = help - input[1] = workflow_command - input[2] = pre_help_text - input[3] = post_help_text - input[4] = validate_params - input[5] = schema_filename - """ - } - } - - then { - assert workflow.success - assert workflow.exitStatus == 0 - assert workflow.stdout.any { it.contains('nextflow run noorg/doesntexist') } - assert workflow.stdout.any { it.contains('Input/output options') } - assert workflow.stdout.any { it.contains('--outdir') } - assert workflow.stdout.any { it.contains('--outdir') } - } - - } - - test("Should run help with extra text") { - - - when { - - params { - monochrome_logs = true - test_data = '' - } - workflow { - """ - help = true - workflow_command = "nextflow run noorg/doesntexist" - pre_help_text = "pre-help-text" - post_help_text = "post-help-text" - validate_params = false - schema_filename = "$moduleTestDir/nextflow_schema.json" - - input[0] = help - input[1] = workflow_command - input[2] = pre_help_text - input[3] = post_help_text - input[4] = validate_params - input[5] = schema_filename - """ - } - } - - then { - assert workflow.success - assert workflow.exitStatus == 0 - assert workflow.stdout.any { it.contains('pre-help-text') } - assert workflow.stdout.any { it.contains('nextflow run noorg/doesntexist') } - assert workflow.stdout.any { it.contains('Input/output options') } - assert workflow.stdout.any { it.contains('--outdir') } - assert workflow.stdout.any { it.contains('--outdir') } - assert workflow.stdout.any { it.contains('post-help-text') } - } - - } - - test("Should validate params") { - - - when { - - params { - monochrome_logs = true - test_data = '' - } - workflow { - """ - help = false - workflow_command = null - pre_help_text = null - post_help_text = null - validate_params = true - schema_filename = "$moduleTestDir/nextflow_schema.json" - - input[0] = help - input[1] = workflow_command - input[2] = pre_help_text - input[3] = post_help_text - input[4] = validate_params - input[5] = schema_filename - """ - } - } - - then { - assert workflow.failed - assert workflow.stdout.any { it.contains('ERROR ~ ERROR: Validation of pipeline parameters failed!') } - assert workflow.stdout.any { it.contains('The following invalid input values have been detected:') } - } - - } - -} diff --git a/subworkflows/nf-core/nfvalidation_plugin_utils/tests/main.nf.test.snap b/subworkflows/nf-core/nfvalidation_plugin_utils/tests/main.nf.test.snap deleted file mode 100644 index ae33a930..00000000 --- a/subworkflows/nf-core/nfvalidation_plugin_utils/tests/main.nf.test.snap +++ /dev/null @@ -1,26 +0,0 @@ -{ - "Should run help": { - "content": [ - { - "stderr": [ - - ], - "errorReport": "", - "exitStatus": 0, - "failed": false, - "stdout": [ - - ], - "errorMessage": "", - "trace": { - "tasksFailed": 0, - "tasksCount": 0, - "tasksSucceeded": 0 - }, - "name": "workflow", - "success": true - } - ], - "timestamp": "2023-10-13T13:18:16.933251413" - } -} diff --git a/subworkflows/nf-core/nfvalidation_plugin_utils/tests/nextflow_schema.json b/subworkflows/nf-core/nfvalidation_plugin_utils/tests/nextflow_schema.json deleted file mode 100644 index 7626c1c9..00000000 --- a/subworkflows/nf-core/nfvalidation_plugin_utils/tests/nextflow_schema.json +++ /dev/null @@ -1,96 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema", - "$id": "https://raw.githubusercontent.com/./master/nextflow_schema.json", - "title": ". pipeline parameters", - "description": "", - "type": "object", - "definitions": { - "input_output_options": { - "title": "Input/output options", - "type": "object", - "fa_icon": "fas fa-terminal", - "description": "Define where the pipeline should find input data and save output data.", - "required": ["outdir"], - "properties": { - "validate_params": { - "type": "boolean", - "description": "Validate parameters?", - "default": true, - "hidden": true - }, - "outdir": { - "type": "string", - "format": "directory-path", - "description": "The output directory where the results will be saved. You have to use absolute paths to storage on Cloud infrastructure.", - "fa_icon": "fas fa-folder-open" - }, - "test_data_base": { - "type": "string", - "default": "https://raw.githubusercontent.com/nf-core/test-datasets/modules", - "description": "Base for test data directory", - "hidden": true - }, - "test_data": { - "type": "string", - "description": "Fake test data param", - "hidden": true - } - } - }, - "generic_options": { - "title": "Generic options", - "type": "object", - "fa_icon": "fas fa-file-import", - "description": "Less common options for the pipeline, typically set in a config file.", - "help_text": "These options are common to all nf-core pipelines and allow you to customise some of the core preferences for how the pipeline runs.\n\nTypically these options would be set in a Nextflow config file loaded for all pipeline runs, such as `~/.nextflow/config`.", - "properties": { - "help": { - "type": "boolean", - "description": "Display help text.", - "fa_icon": "fas fa-question-circle", - "hidden": true - }, - "version": { - "type": "boolean", - "description": "Display version and exit.", - "fa_icon": "fas fa-question-circle", - "hidden": true - }, - "logo": { - "type": "boolean", - "default": true, - "description": "Display nf-core logo in console output.", - "fa_icon": "fas fa-image", - "hidden": true - }, - "singularity_pull_docker_container": { - "type": "boolean", - "description": "Pull Singularity container from Docker?", - "hidden": true - }, - "publish_dir_mode": { - "type": "string", - "default": "copy", - "description": "Method used to save pipeline results to output directory.", - "help_text": "The Nextflow `publishDir` option specifies which intermediate files should be saved to the output directory. This option tells the pipeline what method should be used to move these files. See [Nextflow docs](https://www.nextflow.io/docs/latest/process.html#publishdir) for details.", - "fa_icon": "fas fa-copy", - "enum": ["symlink", "rellink", "link", "copy", "copyNoFollow", "move"], - "hidden": true - }, - "monochrome_logs": { - "type": "boolean", - "description": "Use monochrome_logs", - "hidden": true - } - } - } - }, - "allOf": [ - { - "$ref": "#/definitions/input_output_options" - }, - { - "$ref": "#/definitions/generic_options" - } - ] -} From bce4b7a09ee14ff9e25e5bc94e1939f3d345bef1 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 8 Jan 2024 18:10:44 +0000 Subject: [PATCH 646/852] Install new utils subworkflows --- modules.json | 15 + .../nf-core/utils_nextflow_pipeline/main.nf | 126 +++++++ .../nf-core/utils_nextflow_pipeline/meta.yml | 37 +++ .../tests/main.functions.nf.test | 71 ++++ .../tests/main.functions.nf.test.snap | 12 + .../tests/main.workflow.nf.test | 104 ++++++ .../tests/main.workflow.nf.test.snap | 44 +++ .../tests/nextflow.config | 9 + .../utils_nextflow_pipeline/tests/tags.yml | 2 + .../nf-core/utils_nfcore_pipeline/main.nf | 311 ++++++++++++++++++ .../nf-core/utils_nfcore_pipeline/meta.yml | 19 ++ .../tests/main.function.nf.test | 124 +++++++ .../tests/main.function.nf.test.snap | 78 +++++ .../tests/main.workflow.nf.test | 33 ++ .../tests/nextflow.config | 9 + .../utils_nfcore_pipeline/tests/tags.yml | 2 + .../nf-core/utils_nfvalidation_plugin/main.nf | 62 ++++ .../utils_nfvalidation_plugin/meta.yml | 46 +++ .../tests/main.nf.test | 201 +++++++++++ .../tests/main.nf.test.snap | 26 ++ .../tests/nextflow_schema.json | 96 ++++++ .../utils_nfvalidation_plugin/tests/tags.yml | 2 + 22 files changed, 1429 insertions(+) create mode 100644 subworkflows/nf-core/utils_nextflow_pipeline/main.nf create mode 100644 subworkflows/nf-core/utils_nextflow_pipeline/meta.yml create mode 100644 subworkflows/nf-core/utils_nextflow_pipeline/tests/main.functions.nf.test create mode 100644 subworkflows/nf-core/utils_nextflow_pipeline/tests/main.functions.nf.test.snap create mode 100644 subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test create mode 100644 subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test.snap create mode 100644 subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config create mode 100644 subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml create mode 100644 subworkflows/nf-core/utils_nfcore_pipeline/main.nf create mode 100644 subworkflows/nf-core/utils_nfcore_pipeline/meta.yml create mode 100644 subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test create mode 100644 subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test.snap create mode 100644 subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test create mode 100644 subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config create mode 100644 subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml create mode 100644 subworkflows/nf-core/utils_nfvalidation_plugin/main.nf create mode 100644 subworkflows/nf-core/utils_nfvalidation_plugin/meta.yml create mode 100644 subworkflows/nf-core/utils_nfvalidation_plugin/tests/main.nf.test create mode 100644 subworkflows/nf-core/utils_nfvalidation_plugin/tests/main.nf.test.snap create mode 100644 subworkflows/nf-core/utils_nfvalidation_plugin/tests/nextflow_schema.json create mode 100644 subworkflows/nf-core/utils_nfvalidation_plugin/tests/tags.yml diff --git a/modules.json b/modules.json index 59b7e9c4..d0766098 100644 --- a/modules.json +++ b/modules.json @@ -33,6 +33,21 @@ "branch": "master", "git_sha": "cfd937a668919d948f6fcbf4218e79de50c2f36f", "installed_by": ["subworkflows"] + }, + "utils_nextflow_pipeline": { + "branch": "master", + "git_sha": "c81784b47d44464b35e04220e00051bb5be27524", + "installed_by": ["subworkflows"] + }, + "utils_nfcore_pipeline": { + "branch": "master", + "git_sha": "c81784b47d44464b35e04220e00051bb5be27524", + "installed_by": ["subworkflows"] + }, + "utils_nfvalidation_plugin": { + "branch": "master", + "git_sha": "f0f8f4dc889970251eb251b85610f7ec2eafded9", + "installed_by": ["subworkflows"] } } } diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/main.nf b/subworkflows/nf-core/utils_nextflow_pipeline/main.nf new file mode 100644 index 00000000..9dbb86c7 --- /dev/null +++ b/subworkflows/nf-core/utils_nextflow_pipeline/main.nf @@ -0,0 +1,126 @@ +// +// Subworkflow with functionality that may be useful for any Nextflow pipeline +// + +import org.yaml.snakeyaml.Yaml +import groovy.json.JsonOutput + +/* +======================================================================================== + SUBWORKFLOW DEFINITION +======================================================================================== +*/ + +workflow UTILS_NEXTFLOW_PIPELINE { + + take: + print_version // bool + dump_parameters // bool + output_directory // path: base directory used to publish pipeline results + check_conda_channels // bool + + main: + + // + // Print workflow version and exit on --version + // + if (print_version) { + log.info "${workflow.manifest.name} ${getWorkflowVersion()}" + System.exit(0) + } + + // + // Dump pipeline parameters to a JSON file + // + if (dump_parameters && output_directory) { + dumpParametersToJSON(output_directory) + } + + // + // When running with Conda, warn if channels have not been set-up appropriately + // + if (check_conda_channels) { + checkCondaChannels() + } + + emit: + out = true +} + +/* +======================================================================================== + FUNCTIONS +======================================================================================== +*/ + +// +// Generate version string +// +def getWorkflowVersion() { + String version_string = "" + if (workflow.manifest.version) { + def prefix_v = workflow.manifest.version[0] != 'v' ? 'v' : '' + version_string += "${prefix_v}${workflow.manifest.version}" + } + + if (workflow.commitId) { + def git_shortsha = workflow.commitId.substring(0, 7) + version_string += "-g${git_shortsha}" + } + + return version_string +} + +// +// Dump pipeline parameters to a JSON file +// +def dumpParametersToJSON(output_directory) { + def output_d = new File("${output_directory}/pipeline_info/") + if (!output_d.exists()) { + output_d.mkdirs() + } + + def timestamp = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss') + def output_pf = new File(output_d, "params_${timestamp}.json") + def jsonStr = JsonOutput.toJson(params) + output_pf.text = JsonOutput.prettyPrint(jsonStr) +} + +// +// When running with -profile conda, warn if channels have not been set-up appropriately +// +def checkCondaChannels() { + Yaml parser = new Yaml() + def channels = [] + try { + def config = parser.load("conda config --show channels".execute().text) + channels = config.channels + } catch(NullPointerException | IOException e) { + log.warn "Could not verify conda channel configuration." + return + } + + // Check that all channels are present + // This channel list is ordered by required channel priority. + def required_channels_in_order = ['conda-forge', 'bioconda', 'defaults'] + def channels_missing = ((required_channels_in_order as Set) - (channels as Set)) as Boolean + + // Check that they are in the right order + def channel_priority_violation = false + def n = required_channels_in_order.size() + for (int i = 0; i < n - 1; i++) { + channel_priority_violation |= !(channels.indexOf(required_channels_in_order[i]) < channels.indexOf(required_channels_in_order[i+1])) + } + + if (channels_missing | channel_priority_violation) { + log.warn "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + + " There is a problem with your Conda configuration!\n\n" + + " You will need to set-up the conda-forge and bioconda channels correctly.\n" + + " Please refer to https://bioconda.github.io/\n" + + " The observed channel order is \n" + + " ${channels}\n" + + " but the following channel order is required:\n" + + " ${required_channels_in_order}\n" + + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + } +} diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/meta.yml b/subworkflows/nf-core/utils_nextflow_pipeline/meta.yml new file mode 100644 index 00000000..3d2b304f --- /dev/null +++ b/subworkflows/nf-core/utils_nextflow_pipeline/meta.yml @@ -0,0 +1,37 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/subworkflows/yaml-schema.json +name: "UTILS_NEXTFLOW_PIPELINE" +description: Subworkflow with functionality that may be useful for any Nextflow pipeline +keywords: + - utility + - pipeline + - initialise + - version +components: [] +input: + - print_version: + type: boolean + description: | + Print the version of the pipeline and exit + - dump_parameters: + type: boolean + description: | + Dump the parameters of the pipeline to a JSON file + - output_directory: + type: directory + description: Path to output dir to write JSON file to. + pattern: "results/" + - check_conda_channel: + type: boolean + description: | + Check if the conda channel priority is correct. +output: + - out: + type: boolean + description: | + Dummy output for making using in process chaining. +authors: + - "@adamrtalbot" + - "@drpatelh" +maintainers: + - "@adamrtalbot" + - "@drpatelh" diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.functions.nf.test b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.functions.nf.test new file mode 100644 index 00000000..05f54930 --- /dev/null +++ b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.functions.nf.test @@ -0,0 +1,71 @@ + +nextflow_function { + + name "Test Functions" + script "subworkflows/nf-core/utils_nextflow_pipeline/main.nf" + config "subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config" + tag 'subworkflows' + tag 'utils_nextflow_pipeline' + tag 'subworkflows/utils_nextflow_pipeline' + + test("Test Function getWorkflowVersion") { + + function "getWorkflowVersion" + + when { + function { + """ + // no inputs + """ + } + } + + then { + assert function.success + assert snapshot(function.result).match() + } + + } + + + test("Test Function dumpParametersToJSON") { + + function "dumpParametersToJSON" + + when { + function { + """ + // define inputs of the function here. Example: + input[0] = "$outputDir" + """.stripIndent() + } + } + + then { + assert function.success + assert function.result =~ /publish_dir_mode/ + assert function.result =~ /copy/ + } + + } + + test("Test Function checkCondaChannels") { + + function "checkCondaChannels" + + when { + function { + """ + // no inputs + """ + } + } + + then { + assert function.success + assert snapshot(function.result).match() + } + + } + +} \ No newline at end of file diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.functions.nf.test.snap b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.functions.nf.test.snap new file mode 100644 index 00000000..939dbbad --- /dev/null +++ b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.functions.nf.test.snap @@ -0,0 +1,12 @@ +{ + "Test Function getWorkflowVersion": { + "content": [ + "v9.9.9" + ], + "timestamp": "2023-10-15T13:43:55.128868" + }, + "Test Function checkCondaChannels": { + "content": null, + "timestamp": "2023-10-12T17:09:24.933468" + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test new file mode 100644 index 00000000..583f6a84 --- /dev/null +++ b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test @@ -0,0 +1,104 @@ +nextflow_workflow { + + name "Test Workflow UTILS_NEXTFLOW_PIPELINE" + script "../main.nf" + config "subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config" + workflow "UTILS_NEXTFLOW_PIPELINE" + tag 'subworkflows' + tag 'utils_nextflow_pipeline' + tag 'subworkflows/utils_nextflow_pipeline' + + test("Should run no inputs") { + + when { + params { + outdir = "tests/results" + } + workflow { + """ + input[0] = false + input[1] = false + input[2] = null + input[3] = false + """ + } + } + + then { + assert workflow.success + assert snapshot(workflow.out).match() + } + + } + + test("Should print version") { + + when { + params { + outdir = "tests/results" + } + workflow { + """ + input[0] = true + input[1] = false + input[2] = null + input[3] = false + """ + } + } + + then { + assert workflow.success + assert workflow.stdout.contains("nextflow_workflow v9.9.9") + } + + } + + + test("Should dump params") { + + when { + params { + outdir = "$outputDir" + } + workflow { + """ + input[0] = false + input[1] = true + input[2] = params.outdir + input[3] = false + """ + } + } + + then { + assert workflow.success + assert snapshot(workflow.out).match() + } + + } + + test("Should not create params JSON if no output directory") { + + when { + params { + outdir = "$outputDir" + } + workflow { + """ + input[0] = false + input[1] = true + input[2] = null + input[3] = false + """ + } + } + + then { + assert workflow.success + assert snapshot(workflow.out, path(params.outdir).list()).match() + } + + } + +} diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test.snap b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test.snap new file mode 100644 index 00000000..08040fd4 --- /dev/null +++ b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test.snap @@ -0,0 +1,44 @@ +{ + "Should not create params JSON if no output directory": { + "content": [ + { + "0": [ + true + ], + "out": [ + true + ] + }, + [ + + ] + ], + "timestamp": "2023-10-13T11:55:54.576748" + }, + "Should dump params": { + "content": [ + { + "0": [ + true + ], + "out": [ + true + ] + } + ], + "timestamp": "2023-10-13T11:55:52.711329" + }, + "Should run no inputs": { + "content": [ + { + "0": [ + true + ], + "out": [ + true + ] + } + ], + "timestamp": "2023-10-13T11:55:49.048315" + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config b/subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config new file mode 100644 index 00000000..53574ffe --- /dev/null +++ b/subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config @@ -0,0 +1,9 @@ +manifest { + name = 'nextflow_workflow' + author = """nf-core""" + homePage = 'https://127.0.0.1' + description = """Dummy pipeline""" + nextflowVersion = '!>=23.04.0' + version = '9.9.9' + doi = 'https://doi.org/10.5281/zenodo.5070524' +} \ No newline at end of file diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml b/subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml new file mode 100644 index 00000000..f8476112 --- /dev/null +++ b/subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml @@ -0,0 +1,2 @@ +subworkflows/utils_nextflow_pipeline: + - subworkflows/nf-core/utils_nextflow_pipeline/** diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf new file mode 100644 index 00000000..d88aeebe --- /dev/null +++ b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf @@ -0,0 +1,311 @@ +// +// Subworkflow with utility functions specific to the nf-core pipeline template +// + +/* +======================================================================================== + SUBWORKFLOW DEFINITION +======================================================================================== +*/ + +workflow UTILS_NFCORE_PIPELINE { + + main: + checkConfigProvided() + + emit: + success = true + +} + +/* +======================================================================================== + FUNCTIONS +======================================================================================== +*/ + +// +// Warn if a -profile or Nextflow config has not been provided to run the pipeline +// +def checkConfigProvided() { + if (workflow.profile == 'standard' && workflow.configFiles.size() <= 1) { + log.warn "[$workflow.manifest.name] You are attempting to run the pipeline without any custom configuration!\n\n" + + "This will be dependent on your local compute environment but can be achieved via one or more of the following:\n" + + " (1) Using an existing pipeline profile e.g. `-profile docker` or `-profile singularity`\n" + + " (2) Using an existing nf-core/configs for your Institution e.g. `-profile crick` or `-profile uppmax`\n" + + " (3) Using your own local custom config e.g. `-c /path/to/your/custom.config`\n\n" + + "Please refer to the quick start section and usage docs for the pipeline.\n " + } +} + +// +// Citation string for pipeline +// +def workflowCitation() { + return "If you use ${workflow.manifest.name} for your analysis please cite:\n\n" + + "* The pipeline\n" + + " ${workflow.manifest.doi}\n\n" + + "* The nf-core framework\n" + + " https://doi.org/10.1038/s41587-020-0439-x\n\n" + + "* Software dependencies\n" + + " https://github.com/${workflow.manifest.name}/blob/master/CITATIONS.md" +} + +// +// nf-core logo +// +def nfCoreLogo(workflow_version) { + Map colors = logColours() + String.format( + """\n + ${dashedLine()} + ${colors.green},--.${colors.black}/${colors.green},-.${colors.reset} + ${colors.blue} ___ __ __ __ ___ ${colors.green}/,-._.--~\'${colors.reset} + ${colors.blue} |\\ | |__ __ / ` / \\ |__) |__ ${colors.yellow}} {${colors.reset} + ${colors.blue} | \\| | \\__, \\__/ | \\ |___ ${colors.green}\\`-._,-`-,${colors.reset} + ${colors.green}`._,._,\'${colors.reset} + ${colors.purple} ${workflow.manifest.name} ${workflow_version}${colors.reset} + ${dashedLine()} + """.stripIndent() + ) +} + +// +// Return dashed line +// +def dashedLine() { + Map colors = logColours() + return "-${colors.dim}----------------------------------------------------${colors.reset}-" +} + +// +// ANSII colours used for terminal logging +// +def logColours() { + Map colorcodes = [:] + + // Reset / Meta + colorcodes['reset'] = params.monochrome_logs ? '' : "\033[0m" + colorcodes['bold'] = params.monochrome_logs ? '' : "\033[1m" + colorcodes['dim'] = params.monochrome_logs ? '' : "\033[2m" + colorcodes['underlined'] = params.monochrome_logs ? '' : "\033[4m" + colorcodes['blink'] = params.monochrome_logs ? '' : "\033[5m" + colorcodes['reverse'] = params.monochrome_logs ? '' : "\033[7m" + colorcodes['hidden'] = params.monochrome_logs ? '' : "\033[8m" + + // Regular Colors + colorcodes['black'] = params.monochrome_logs ? '' : "\033[0;30m" + colorcodes['red'] = params.monochrome_logs ? '' : "\033[0;31m" + colorcodes['green'] = params.monochrome_logs ? '' : "\033[0;32m" + colorcodes['yellow'] = params.monochrome_logs ? '' : "\033[0;33m" + colorcodes['blue'] = params.monochrome_logs ? '' : "\033[0;34m" + colorcodes['purple'] = params.monochrome_logs ? '' : "\033[0;35m" + colorcodes['cyan'] = params.monochrome_logs ? '' : "\033[0;36m" + colorcodes['white'] = params.monochrome_logs ? '' : "\033[0;37m" + + // Bold + colorcodes['bblack'] = params.monochrome_logs ? '' : "\033[1;30m" + colorcodes['bred'] = params.monochrome_logs ? '' : "\033[1;31m" + colorcodes['bgreen'] = params.monochrome_logs ? '' : "\033[1;32m" + colorcodes['byellow'] = params.monochrome_logs ? '' : "\033[1;33m" + colorcodes['bblue'] = params.monochrome_logs ? '' : "\033[1;34m" + colorcodes['bpurple'] = params.monochrome_logs ? '' : "\033[1;35m" + colorcodes['bcyan'] = params.monochrome_logs ? '' : "\033[1;36m" + colorcodes['bwhite'] = params.monochrome_logs ? '' : "\033[1;37m" + + // Underline + colorcodes['ublack'] = params.monochrome_logs ? '' : "\033[4;30m" + colorcodes['ured'] = params.monochrome_logs ? '' : "\033[4;31m" + colorcodes['ugreen'] = params.monochrome_logs ? '' : "\033[4;32m" + colorcodes['uyellow'] = params.monochrome_logs ? '' : "\033[4;33m" + colorcodes['ublue'] = params.monochrome_logs ? '' : "\033[4;34m" + colorcodes['upurple'] = params.monochrome_logs ? '' : "\033[4;35m" + colorcodes['ucyan'] = params.monochrome_logs ? '' : "\033[4;36m" + colorcodes['uwhite'] = params.monochrome_logs ? '' : "\033[4;37m" + + // High Intensity + colorcodes['iblack'] = params.monochrome_logs ? '' : "\033[0;90m" + colorcodes['ired'] = params.monochrome_logs ? '' : "\033[0;91m" + colorcodes['igreen'] = params.monochrome_logs ? '' : "\033[0;92m" + colorcodes['iyellow'] = params.monochrome_logs ? '' : "\033[0;93m" + colorcodes['iblue'] = params.monochrome_logs ? '' : "\033[0;94m" + colorcodes['ipurple'] = params.monochrome_logs ? '' : "\033[0;95m" + colorcodes['icyan'] = params.monochrome_logs ? '' : "\033[0;96m" + colorcodes['iwhite'] = params.monochrome_logs ? '' : "\033[0;97m" + + // Bold High Intensity + colorcodes['biblack'] = params.monochrome_logs ? '' : "\033[1;90m" + colorcodes['bired'] = params.monochrome_logs ? '' : "\033[1;91m" + colorcodes['bigreen'] = params.monochrome_logs ? '' : "\033[1;92m" + colorcodes['biyellow'] = params.monochrome_logs ? '' : "\033[1;93m" + colorcodes['biblue'] = params.monochrome_logs ? '' : "\033[1;94m" + colorcodes['bipurple'] = params.monochrome_logs ? '' : "\033[1;95m" + colorcodes['bicyan'] = params.monochrome_logs ? '' : "\033[1;96m" + colorcodes['biwhite'] = params.monochrome_logs ? '' : "\033[1;97m" + + return colorcodes +} + +// +// Construct and send completion email +// +def completionEmail(summary_params) { + + // Set up the e-mail variables + def subject = "[$workflow.manifest.name] Successful: $workflow.runName" + if (!workflow.success) { + subject = "[$workflow.manifest.name] FAILED: $workflow.runName" + } + + def summary = [:] + for (group in summary_params.keySet()) { + summary << summary_params[group] + } + + def misc_fields = [:] + misc_fields['Date Started'] = workflow.start + misc_fields['Date Completed'] = workflow.complete + misc_fields['Pipeline script file path'] = workflow.scriptFile + misc_fields['Pipeline script hash ID'] = workflow.scriptId + if (workflow.repository) misc_fields['Pipeline repository Git URL'] = workflow.repository + if (workflow.commitId) misc_fields['Pipeline repository Git Commit'] = workflow.commitId + if (workflow.revision) misc_fields['Pipeline Git branch/tag'] = workflow.revision + misc_fields['Nextflow Version'] = workflow.nextflow.version + misc_fields['Nextflow Build'] = workflow.nextflow.build + misc_fields['Nextflow Compile Timestamp'] = workflow.nextflow.timestamp + + def email_fields = [:] + email_fields['version'] = NfcoreTemplate.version(workflow) + email_fields['runName'] = workflow.runName + email_fields['success'] = workflow.success + email_fields['dateComplete'] = workflow.complete + email_fields['duration'] = workflow.duration + email_fields['exitStatus'] = workflow.exitStatus + email_fields['errorMessage'] = (workflow.errorMessage ?: 'None') + email_fields['errorReport'] = (workflow.errorReport ?: 'None') + email_fields['commandLine'] = workflow.commandLine + email_fields['projectDir'] = workflow.projectDir + email_fields['summary'] = summary << misc_fields + + // Check if we are only sending emails on failure + def email_address = params.email + if (!params.email && params.email_on_fail && !workflow.success) { + email_address = params.email_on_fail + } + + // Render the TXT template + def engine = new groovy.text.GStringTemplateEngine() + def tf = new File("${workflow.projectDir}/assets/email_template.txt") + def txt_template = engine.createTemplate(tf).make(email_fields) + def email_txt = txt_template.toString() + + // Render the HTML template + def hf = new File("${workflow.projectDir}/assets/email_template.html") + def html_template = engine.createTemplate(hf).make(email_fields) + def email_html = html_template.toString() + + // Render the sendmail template + def smail_fields = [ email: email_address, subject: subject, email_txt: email_txt, email_html: email_html, projectDir: "${workflow.projectDir}" ] + def sf = new File("${workflow.projectDir}/assets/sendmail_template.txt") + def sendmail_template = engine.createTemplate(sf).make(smail_fields) + def sendmail_html = sendmail_template.toString() + + // Send the HTML e-mail + Map colors = logColours() + if (email_address) { + try { + if (params.plaintext_email) { throw GroovyException('Send plaintext e-mail, not HTML') } + // Try to send HTML e-mail using sendmail + [ 'sendmail', '-t' ].execute() << sendmail_html + log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Sent summary e-mail to $email_address (sendmail)-" + } catch (all) { + // Catch failures and try with plaintext + def mail_cmd = [ 'mail', '-s', subject, '--content-type=text/html', email_address ] + mail_cmd.execute() << email_html + log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Sent summary e-mail to $email_address (mail)-" + } + } + + // Write summary e-mail HTML to a file + def output_d = new File("${params.outdir}/pipeline_info/") + if (!output_d.exists()) { + output_d.mkdirs() + } + def output_hf = new File(output_d, "pipeline_report.html") + output_hf.withWriter { w -> w << email_html } + def output_tf = new File(output_d, "pipeline_report.txt") + output_tf.withWriter { w -> w << email_txt } +} + +// +// Print pipeline summary on completion +// +def completionSummary() { + Map colors = logColours() + if (workflow.success) { + if (workflow.stats.ignoredCount == 0) { + log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Pipeline completed successfully${colors.reset}-" + } else { + log.info "-${colors.purple}[$workflow.manifest.name]${colors.yellow} Pipeline completed successfully, but with errored process(es) ${colors.reset}-" + } + } else { + log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed with errors${colors.reset}-" + } +} + +// +// Construct and send a notification to a web server as JSON e.g. Microsoft Teams and Slack +// +def imNotification(summary_params) { + def hook_url = params.hook_url + + def summary = [:] + for (group in summary_params.keySet()) { + summary << summary_params[group] + } + + def misc_fields = [:] + misc_fields['start'] = workflow.start + misc_fields['complete'] = workflow.complete + misc_fields['scriptfile'] = workflow.scriptFile + misc_fields['scriptid'] = workflow.scriptId + if (workflow.repository) misc_fields['repository'] = workflow.repository + if (workflow.commitId) misc_fields['commitid'] = workflow.commitId + if (workflow.revision) misc_fields['revision'] = workflow.revision + misc_fields['nxf_version'] = workflow.nextflow.version + misc_fields['nxf_build'] = workflow.nextflow.build + misc_fields['nxf_timestamp'] = workflow.nextflow.timestamp + + def msg_fields = [:] + msg_fields['version'] = NfcoreTemplate.version(workflow) + msg_fields['runName'] = workflow.runName + msg_fields['success'] = workflow.success + msg_fields['dateComplete'] = workflow.complete + msg_fields['duration'] = workflow.duration + msg_fields['exitStatus'] = workflow.exitStatus + msg_fields['errorMessage'] = (workflow.errorMessage ?: 'None') + msg_fields['errorReport'] = (workflow.errorReport ?: 'None') + msg_fields['commandLine'] = workflow.commandLine.replaceFirst(/ +--hook_url +[^ ]+/, "") + msg_fields['projectDir'] = workflow.projectDir + msg_fields['summary'] = summary << misc_fields + + // Render the JSON template + def engine = new groovy.text.GStringTemplateEngine() + // Different JSON depending on the service provider + // Defaults to "Adaptive Cards" (https://adaptivecards.io), except Slack which has its own format + def json_path = hook_url.contains("hooks.slack.com") ? "slackreport.json" : "adaptivecard.json" + def hf = new File("${workflow.projectDir}/assets/${json_path}") + def json_template = engine.createTemplate(hf).make(msg_fields) + def json_message = json_template.toString() + + // POST + def post = new URL(hook_url).openConnection(); + post.setRequestMethod("POST") + post.setDoOutput(true) + post.setRequestProperty("Content-Type", "application/json") + post.getOutputStream().write(json_message.getBytes("UTF-8")); + def postRC = post.getResponseCode(); + if (! postRC.equals(200)) { + log.warn(post.getErrorStream().getText()); + } +} diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/meta.yml b/subworkflows/nf-core/utils_nfcore_pipeline/meta.yml new file mode 100644 index 00000000..953f7143 --- /dev/null +++ b/subworkflows/nf-core/utils_nfcore_pipeline/meta.yml @@ -0,0 +1,19 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/subworkflows/yaml-schema.json +name: "UTILS_NFCORE_PIPELINE" +description: Subworkflow with utility functions specific to the nf-core pipeline template +keywords: + - utility + - pipeline + - initialise + - version +components: [] +input: [] +output: + - success: + type: boolean + description: | + Dummy output to indicate success +authors: + - "@adamrtalbot" +maintainers: + - "@adamrtalbot" diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test new file mode 100644 index 00000000..63988b1b --- /dev/null +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test @@ -0,0 +1,124 @@ + +nextflow_function { + + name "Test Functions" + script "../main.nf" + config "subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config" + tag "subworkflows" + tag "subworkflows_nfcore" + tag "utils_nfcore_pipeline" + tag "subworkflows/utils_nfcore_pipeline" + + test("Test Function checkConfigProvided") { + + function "checkConfigProvided" + + when { + function { + """ + // define inputs of the function here. Example: + // input[0] = 1 + """ + } + } + + then { + assertAll ( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + + } + + test("Test Function workflowCitation") { + + function "workflowCitation" + + when { + function { + """ + // define inputs of the function here. Example: + // input[0] = 1 + """ + } + } + + then { + assertAll ( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + + } + + test("Test Function nfCoreLogo") { + + function "nfCoreLogo" + + when { + function { + """ + input[0] = "9.9.9" + """ + } + } + + then { + assertAll ( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + + } + + + + test("Test Function dashedLine") { + + function "dashedLine" + + when { + function { + """ + // define inputs of the function here. Example: + // input[0] = 1 + """ + } + } + + then { + assertAll ( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + + } + + + + test("Test Function logColours") { + + function "logColours" + + when { + function { + """ + // define inputs of the function here. Example: + // input[0] = 1 + """ + } + } + + then { + assertAll ( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test.snap b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test.snap new file mode 100644 index 00000000..3ea51f68 --- /dev/null +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test.snap @@ -0,0 +1,78 @@ +{ + "Test Function logColours": { + "content": [ + { + "reset": "\u001b[0m", + "bold": "\u001b[1m", + "dim": "\u001b[2m", + "underlined": "\u001b[4m", + "blink": "\u001b[5m", + "reverse": "\u001b[7m", + "hidden": "\u001b[8m", + "black": "\u001b[0;30m", + "red": "\u001b[0;31m", + "green": "\u001b[0;32m", + "yellow": "\u001b[0;33m", + "blue": "\u001b[0;34m", + "purple": "\u001b[0;35m", + "cyan": "\u001b[0;36m", + "white": "\u001b[0;37m", + "bblack": "\u001b[1;30m", + "bred": "\u001b[1;31m", + "bgreen": "\u001b[1;32m", + "byellow": "\u001b[1;33m", + "bblue": "\u001b[1;34m", + "bpurple": "\u001b[1;35m", + "bcyan": "\u001b[1;36m", + "bwhite": "\u001b[1;37m", + "ublack": "\u001b[4;30m", + "ured": "\u001b[4;31m", + "ugreen": "\u001b[4;32m", + "uyellow": "\u001b[4;33m", + "ublue": "\u001b[4;34m", + "upurple": "\u001b[4;35m", + "ucyan": "\u001b[4;36m", + "uwhite": "\u001b[4;37m", + "iblack": "\u001b[0;90m", + "ired": "\u001b[0;91m", + "igreen": "\u001b[0;92m", + "iyellow": "\u001b[0;93m", + "iblue": "\u001b[0;94m", + "ipurple": "\u001b[0;95m", + "icyan": "\u001b[0;96m", + "iwhite": "\u001b[0;97m", + "biblack": "\u001b[1;90m", + "bired": "\u001b[1;91m", + "bigreen": "\u001b[1;92m", + "biyellow": "\u001b[1;93m", + "biblue": "\u001b[1;94m", + "bipurple": "\u001b[1;95m", + "bicyan": "\u001b[1;96m", + "biwhite": "\u001b[1;97m" + } + ], + "timestamp": "2023-10-16T14:27:09.843064" + }, + "Test Function checkConfigProvided": { + "content": null, + "timestamp": "2023-10-16T14:27:01.415849" + }, + "Test Function nfCoreLogo": { + "content": [ + "\n\n-\u001b[2m----------------------------------------------------\u001b[0m-\n \u001b[0;32m,--.\u001b[0;30m/\u001b[0;32m,-.\u001b[0m\n\u001b[0;34m ___ __ __ __ ___ \u001b[0;32m/,-._.--~'\u001b[0m\n\u001b[0;34m |\\ | |__ __ / ` / \\ |__) |__ \u001b[0;33m} {\u001b[0m\n\u001b[0;34m | \\| | \\__, \\__/ | \\ |___ \u001b[0;32m\\`-._,-`-,\u001b[0m\n \u001b[0;32m`._,._,'\u001b[0m\n\u001b[0;35m nextflow_workflow 9.9.9\u001b[0m\n-\u001b[2m----------------------------------------------------\u001b[0m-\n" + ], + "timestamp": "2023-10-16T14:27:51.566211" + }, + "Test Function workflowCitation": { + "content": [ + "If you use nextflow_workflow for your analysis please cite:\n\n* The pipeline\n https://doi.org/10.5281/zenodo.5070524\n\n* The nf-core framework\n https://doi.org/10.1038/s41587-020-0439-x\n\n* Software dependencies\n https://github.com/nextflow_workflow/blob/master/CITATIONS.md" + ], + "timestamp": "2023-10-16T14:27:03.505737" + }, + "Test Function dashedLine": { + "content": [ + "-\u001b[2m----------------------------------------------------\u001b[0m-" + ], + "timestamp": "2023-10-16T14:27:07.721916" + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test new file mode 100644 index 00000000..637a416d --- /dev/null +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test @@ -0,0 +1,33 @@ +nextflow_workflow { + + name "Test Workflow UTILS_NFCORE_PIPELINE" + script "../main.nf" + config "subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config" + workflow "UTILS_NFCORE_PIPELINE" + tag "subworkflows" + tag "subworkflows_nfcore" + tag "utils_nfcore_pipeline" + tag "subworkflows/utils_nfcore_pipeline" + + test("Should run without failures") { + + when { + params { + // define parameters here. Example: + // outdir = "tests/results" + } + workflow { + """ + // define inputs of the workflow here. Example: + // input[0] = file("test-file.txt") + """ + } + } + + then { + assert workflow.success + } + + } + +} diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config b/subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config new file mode 100644 index 00000000..53574ffe --- /dev/null +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config @@ -0,0 +1,9 @@ +manifest { + name = 'nextflow_workflow' + author = """nf-core""" + homePage = 'https://127.0.0.1' + description = """Dummy pipeline""" + nextflowVersion = '!>=23.04.0' + version = '9.9.9' + doi = 'https://doi.org/10.5281/zenodo.5070524' +} \ No newline at end of file diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml b/subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml new file mode 100644 index 00000000..ac8523c9 --- /dev/null +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml @@ -0,0 +1,2 @@ +subworkflows/utils_nfcore_pipeline: + - subworkflows/nf-core/utils_nfcore_pipeline/** diff --git a/subworkflows/nf-core/utils_nfvalidation_plugin/main.nf b/subworkflows/nf-core/utils_nfvalidation_plugin/main.nf new file mode 100644 index 00000000..43c57187 --- /dev/null +++ b/subworkflows/nf-core/utils_nfvalidation_plugin/main.nf @@ -0,0 +1,62 @@ +// +// Subworkflow that uses the nf-validation plugin to render help text and parameter summary +// + +/* +======================================================================================== + IMPORT NF-VALIDATION PLUGIN +======================================================================================== +*/ + +include { paramsHelp; paramsSummaryLog; paramsSummaryMap; validateParameters } from 'plugin/nf-validation' + +/* +======================================================================================== + SUBWORKFLOW DEFINITION +======================================================================================== +*/ + +workflow UTILS_NFVALIDATION_PLUGIN { + + take: + print_help // bool + workflow_command // string: default commmand used to run pipeline + pre_help_text // string: string to be printed before help text and summary log + post_help_text // string: string to be printed after help text and summary log + validate_params // bool: Validate parameters + schema_filename // path: JSON schema file, null to use default value + + main: + + log.debug "Using schema file: ${schema_filename}" + + // Default values for strings + pre_help_text = pre_help_text ?: '' + post_help_text = post_help_text ?: '' + workflow_command = workflow_command ?: '' + + // + // Print help message if needed + // + if (print_help) { + log.info pre_help_text + paramsHelp(workflow_command, parameters_schema: schema_filename) + post_help_text + System.exit(0) + } + + // + // Print parameter summary to stdout + // + log.info pre_help_text + paramsSummaryLog(workflow, parameters_schema: schema_filename) + post_help_text + + // + // Validate parameters relative to the parameter JSON schema + // + if (validate_params){ + validateParameters(parameters_schema: schema_filename) + } + + summary_params = paramsSummaryMap(workflow, parameters_schema: schema_filename) + + emit: + summary_params = summary_params +} diff --git a/subworkflows/nf-core/utils_nfvalidation_plugin/meta.yml b/subworkflows/nf-core/utils_nfvalidation_plugin/meta.yml new file mode 100644 index 00000000..80438ccf --- /dev/null +++ b/subworkflows/nf-core/utils_nfvalidation_plugin/meta.yml @@ -0,0 +1,46 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/subworkflows/yaml-schema.json +name: "UTILS_NFVALIDATION_PLUGIN" +description: Use nf-validation to initiate and validate a pipeline +keywords: + - utility + - pipeline + - initialise + - validation +components: [] +input: + - print_help: + type: boolean + description: | + Print help message and exit + - workflow_command: + type: string + description: | + The command to run the workflow e.g. "nextflow run main.nf" + - pre_help_text: + type: string + description: | + Text to print before the help message + - post_help_text: + type: string + description: | + Text to print after the help message + - validate_params: + type: boolean + description: | + Validate the parameters and error if invalid. + - schema_filename: + type: string + description: | + The filename of the schema to validate against. + +output: + - summary_params: + type: file + description: | + A Groovy map constructed from parameters. + Structure: [ val(meta), path(bam) ] + pattern: "*.bam" +authors: + - "@adamrtalbot" +maintainers: + - "@adamrtalbot" diff --git a/subworkflows/nf-core/utils_nfvalidation_plugin/tests/main.nf.test b/subworkflows/nf-core/utils_nfvalidation_plugin/tests/main.nf.test new file mode 100644 index 00000000..904f97be --- /dev/null +++ b/subworkflows/nf-core/utils_nfvalidation_plugin/tests/main.nf.test @@ -0,0 +1,201 @@ +nextflow_workflow { + + name "Test Workflow UTILS_NFVALIDATION_PLUGIN" + script "../main.nf" + workflow "UTILS_NFVALIDATION_PLUGIN" + tag "subworkflows" + tag "subworkflows_nfcore" + tag "plugin/nf-validation" + tag "'plugin/nf-validation'" + tag "utils_nfvalidation_plugin" + tag "subworkflows/utils_nfvalidation_plugin" + + test("Should run nothing") { + + when { + + params { + monochrome_logs = true + test_data = '' + } + + workflow { + """ + help = false + workflow_command = null + pre_help_text = null + post_help_text = null + validate_params = false + schema_filename = "$moduleTestDir/nextflow_schema.json" + + input[0] = help + input[1] = workflow_command + input[2] = pre_help_text + input[3] = post_help_text + input[4] = validate_params + input[5] = schema_filename + """ + } + } + + then { + assert workflow.success + } + + } + + test("Should run help") { + + + when { + + params { + monochrome_logs = true + test_data = '' + } + workflow { + """ + help = true + workflow_command = null + pre_help_text = null + post_help_text = null + validate_params = false + schema_filename = "$moduleTestDir/nextflow_schema.json" + + input[0] = help + input[1] = workflow_command + input[2] = pre_help_text + input[3] = post_help_text + input[4] = validate_params + input[5] = schema_filename + """ + } + } + + then { + assert workflow.success + assert workflow.exitStatus == 0 + assert workflow.stdout.any { it.contains('Input/output options') } + assert workflow.stdout.any { it.contains('--outdir') } + assert workflow.stdout.any { it.contains('--outdir') } + } + + } + + test("Should run help with command") { + + + when { + + params { + monochrome_logs = true + test_data = '' + } + workflow { + """ + help = true + workflow_command = "nextflow run noorg/doesntexist" + pre_help_text = null + post_help_text = null + validate_params = false + schema_filename = "$moduleTestDir/nextflow_schema.json" + + input[0] = help + input[1] = workflow_command + input[2] = pre_help_text + input[3] = post_help_text + input[4] = validate_params + input[5] = schema_filename + """ + } + } + + then { + assert workflow.success + assert workflow.exitStatus == 0 + assert workflow.stdout.any { it.contains('nextflow run noorg/doesntexist') } + assert workflow.stdout.any { it.contains('Input/output options') } + assert workflow.stdout.any { it.contains('--outdir') } + assert workflow.stdout.any { it.contains('--outdir') } + } + + } + + test("Should run help with extra text") { + + + when { + + params { + monochrome_logs = true + test_data = '' + } + workflow { + """ + help = true + workflow_command = "nextflow run noorg/doesntexist" + pre_help_text = "pre-help-text" + post_help_text = "post-help-text" + validate_params = false + schema_filename = "$moduleTestDir/nextflow_schema.json" + + input[0] = help + input[1] = workflow_command + input[2] = pre_help_text + input[3] = post_help_text + input[4] = validate_params + input[5] = schema_filename + """ + } + } + + then { + assert workflow.success + assert workflow.exitStatus == 0 + assert workflow.stdout.any { it.contains('pre-help-text') } + assert workflow.stdout.any { it.contains('nextflow run noorg/doesntexist') } + assert workflow.stdout.any { it.contains('Input/output options') } + assert workflow.stdout.any { it.contains('--outdir') } + assert workflow.stdout.any { it.contains('--outdir') } + assert workflow.stdout.any { it.contains('post-help-text') } + } + + } + + test("Should validate params") { + + + when { + + params { + monochrome_logs = true + test_data = '' + outdir = 1 + } + workflow { + """ + help = false + workflow_command = null + pre_help_text = null + post_help_text = null + validate_params = true + schema_filename = "$moduleTestDir/nextflow_schema.json" + + input[0] = help + input[1] = workflow_command + input[2] = pre_help_text + input[3] = post_help_text + input[4] = validate_params + input[5] = schema_filename + """ + } + } + + then { + assert workflow.failed + assert workflow.stdout.any { it.contains('ERROR ~ ERROR: Validation of pipeline parameters failed!') } + } + + } + +} diff --git a/subworkflows/nf-core/utils_nfvalidation_plugin/tests/main.nf.test.snap b/subworkflows/nf-core/utils_nfvalidation_plugin/tests/main.nf.test.snap new file mode 100644 index 00000000..ae33a930 --- /dev/null +++ b/subworkflows/nf-core/utils_nfvalidation_plugin/tests/main.nf.test.snap @@ -0,0 +1,26 @@ +{ + "Should run help": { + "content": [ + { + "stderr": [ + + ], + "errorReport": "", + "exitStatus": 0, + "failed": false, + "stdout": [ + + ], + "errorMessage": "", + "trace": { + "tasksFailed": 0, + "tasksCount": 0, + "tasksSucceeded": 0 + }, + "name": "workflow", + "success": true + } + ], + "timestamp": "2023-10-13T13:18:16.933251413" + } +} diff --git a/subworkflows/nf-core/utils_nfvalidation_plugin/tests/nextflow_schema.json b/subworkflows/nf-core/utils_nfvalidation_plugin/tests/nextflow_schema.json new file mode 100644 index 00000000..7626c1c9 --- /dev/null +++ b/subworkflows/nf-core/utils_nfvalidation_plugin/tests/nextflow_schema.json @@ -0,0 +1,96 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "https://raw.githubusercontent.com/./master/nextflow_schema.json", + "title": ". pipeline parameters", + "description": "", + "type": "object", + "definitions": { + "input_output_options": { + "title": "Input/output options", + "type": "object", + "fa_icon": "fas fa-terminal", + "description": "Define where the pipeline should find input data and save output data.", + "required": ["outdir"], + "properties": { + "validate_params": { + "type": "boolean", + "description": "Validate parameters?", + "default": true, + "hidden": true + }, + "outdir": { + "type": "string", + "format": "directory-path", + "description": "The output directory where the results will be saved. You have to use absolute paths to storage on Cloud infrastructure.", + "fa_icon": "fas fa-folder-open" + }, + "test_data_base": { + "type": "string", + "default": "https://raw.githubusercontent.com/nf-core/test-datasets/modules", + "description": "Base for test data directory", + "hidden": true + }, + "test_data": { + "type": "string", + "description": "Fake test data param", + "hidden": true + } + } + }, + "generic_options": { + "title": "Generic options", + "type": "object", + "fa_icon": "fas fa-file-import", + "description": "Less common options for the pipeline, typically set in a config file.", + "help_text": "These options are common to all nf-core pipelines and allow you to customise some of the core preferences for how the pipeline runs.\n\nTypically these options would be set in a Nextflow config file loaded for all pipeline runs, such as `~/.nextflow/config`.", + "properties": { + "help": { + "type": "boolean", + "description": "Display help text.", + "fa_icon": "fas fa-question-circle", + "hidden": true + }, + "version": { + "type": "boolean", + "description": "Display version and exit.", + "fa_icon": "fas fa-question-circle", + "hidden": true + }, + "logo": { + "type": "boolean", + "default": true, + "description": "Display nf-core logo in console output.", + "fa_icon": "fas fa-image", + "hidden": true + }, + "singularity_pull_docker_container": { + "type": "boolean", + "description": "Pull Singularity container from Docker?", + "hidden": true + }, + "publish_dir_mode": { + "type": "string", + "default": "copy", + "description": "Method used to save pipeline results to output directory.", + "help_text": "The Nextflow `publishDir` option specifies which intermediate files should be saved to the output directory. This option tells the pipeline what method should be used to move these files. See [Nextflow docs](https://www.nextflow.io/docs/latest/process.html#publishdir) for details.", + "fa_icon": "fas fa-copy", + "enum": ["symlink", "rellink", "link", "copy", "copyNoFollow", "move"], + "hidden": true + }, + "monochrome_logs": { + "type": "boolean", + "description": "Use monochrome_logs", + "hidden": true + } + } + } + }, + "allOf": [ + { + "$ref": "#/definitions/input_output_options" + }, + { + "$ref": "#/definitions/generic_options" + } + ] +} diff --git a/subworkflows/nf-core/utils_nfvalidation_plugin/tests/tags.yml b/subworkflows/nf-core/utils_nfvalidation_plugin/tests/tags.yml new file mode 100644 index 00000000..60b1cfff --- /dev/null +++ b/subworkflows/nf-core/utils_nfvalidation_plugin/tests/tags.yml @@ -0,0 +1,2 @@ +subworkflows/utils_nfvalidation_plugin: + - subworkflows/nf-core/utils_nfvalidation_plugin/** From 596ca7cd2b0ae2f485d12f43fee159eea7230182 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 8 Jan 2024 18:23:06 +0000 Subject: [PATCH 647/852] Re-add nextflow config files for publishing --- modules/nf-core/sratools/fasterqdump/nextflow.config | 10 ++++++++++ modules/nf-core/sratools/prefetch/nextflow.config | 8 ++++++++ .../nextflow.config | 2 ++ 3 files changed, 20 insertions(+) create mode 100644 modules/nf-core/sratools/fasterqdump/nextflow.config create mode 100644 modules/nf-core/sratools/prefetch/nextflow.config create mode 100644 subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/nextflow.config diff --git a/modules/nf-core/sratools/fasterqdump/nextflow.config b/modules/nf-core/sratools/fasterqdump/nextflow.config new file mode 100644 index 00000000..f98b140d --- /dev/null +++ b/modules/nf-core/sratools/fasterqdump/nextflow.config @@ -0,0 +1,10 @@ +process { + withName: SRATOOLS_FASTERQDUMP { + ext.args = '--split-files --include-technical' + publishDir = [ + path: { "${params.outdir}/fastq" }, + mode: params.publish_dir_mode, + pattern: "*.fastq.gz" + ] + } +} \ No newline at end of file diff --git a/modules/nf-core/sratools/prefetch/nextflow.config b/modules/nf-core/sratools/prefetch/nextflow.config new file mode 100644 index 00000000..a2ca8848 --- /dev/null +++ b/modules/nf-core/sratools/prefetch/nextflow.config @@ -0,0 +1,8 @@ +process { + withName: SRATOOLS_PREFETCH { + publishDir = [ + path: { "${params.outdir}/sra" }, + enabled: false + ] + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/nextflow.config b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/nextflow.config new file mode 100644 index 00000000..b11c499f --- /dev/null +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/nextflow.config @@ -0,0 +1,2 @@ +includeConfig '../../../modules/nf-core/sratools/prefetch/nextflow.config' +includeConfig '../../../modules/nf-core/sratools/fasterqdump/nextflow.config' \ No newline at end of file From d0efbaca3bea884a4fef01c17bdb3914ddbf68ca Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 8 Jan 2024 18:38:52 +0000 Subject: [PATCH 648/852] Rename local subworkflow to utils_nfcore_fetchngs_pipeline --- main.nf | 4 ++-- .../main.nf | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) rename subworkflows/local/{nf_core_fetchngs_utils => utils_nfcore_fetchngs_pipeline}/main.nf (95%) diff --git a/main.nf b/main.nf index bf39d7ea..2fe0061e 100644 --- a/main.nf +++ b/main.nf @@ -57,8 +57,8 @@ workflow NFCORE_FETCHNGS { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -include { PIPELINE_INITIALISATION } from './subworkflows/local/nf_core_fetchngs_utils' -include { PIPELINE_COMPLETION } from './subworkflows/local/nf_core_fetchngs_utils' +include { PIPELINE_INITIALISATION } from './subworkflows/local/utils_nfcore_fetchngs_pipeline' +include { PIPELINE_COMPLETION } from './subworkflows/local/utils_nfcore_fetchngs_pipeline' // // WORKFLOW: Execute a single named workflow for the pipeline diff --git a/subworkflows/local/nf_core_fetchngs_utils/main.nf b/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf similarity index 95% rename from subworkflows/local/nf_core_fetchngs_utils/main.nf rename to subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf index 509a4473..42e115f8 100644 --- a/subworkflows/local/nf_core_fetchngs_utils/main.nf +++ b/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf @@ -8,17 +8,17 @@ ======================================================================================== */ -include { NEXTFLOW_PIPELINE_UTILS; getWorkflowVersion } from '../../nf-core/nextflowpipelineutils/main' -include { NF_VALIDATION_PLUGIN_UTILS } from '../../nf-core/nfvalidation_plugin_utils/main.nf' +include { UTILS_NEXTFLOW_PIPELINE; getWorkflowVersion } from '../../nf-core/utils_nextflow_pipeline' +include { UTILS_NFVALIDATION_PLUGIN } from '../../nf-core/utils_nfvalidation_plugin' include { - NFCORE_PIPELINE_UTILS; + UTILS_NFCORE_PIPELINE; workflowCitation; nfCoreLogo; dashedLine; completionEmail; completionSummary; imNotification -} from '../../nf-core/nfcore_pipeline_utils' +} from '../../nf-core/utils_nfcore_pipeline' /* ======================================================================================== @@ -33,7 +33,7 @@ workflow PIPELINE_INITIALISATION { // // Print version and exit if required and dump pipeline parameters to JSON file // - NEXTFLOW_PIPELINE_UTILS ( + UTILS_NEXTFLOW_PIPELINE ( params.version, true, params.outdir, @@ -46,7 +46,7 @@ workflow PIPELINE_INITIALISATION { def pre_help_text = nfCoreLogo(getWorkflowVersion()) def post_help_text = '\n' + workflowCitation() + '\n' + dashedLine() def String workflow_command = "nextflow run ${workflow.manifest.name} -profile --input ids.csv --outdir " - NF_VALIDATION_PLUGIN_UTILS ( + UTILS_NFVALIDATION_PLUGIN ( params.help, workflow_command, pre_help_text, @@ -58,7 +58,7 @@ workflow PIPELINE_INITIALISATION { // // Check config provided to the pipeline // - NFCORE_PIPELINE_UTILS () + UTILS_NFCORE_PIPELINE () // // Auto-detect input id type @@ -88,7 +88,7 @@ workflow PIPELINE_INITIALISATION { emit: ids = ch_ids - summary_params = NF_VALIDATION_PLUGIN_UTILS.out.summary_params + summary_params = UTILS_NFVALIDATION_PLUGIN.out.summary_params } /* From 06123e0217fd6173572f847699a7f7447551e4d7 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Tue, 9 Jan 2024 13:21:43 +0100 Subject: [PATCH 649/852] deal with picture dark and light mode properly --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index be373b35..f650c9a7 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,7 @@ -# ![nf-core/fetchngs](docs/images/nf-core-fetchngs_logo_light.png#gh-light-mode-only) ![nf-core/fetchngs](docs/images/nf-core-fetchngs_logo_dark.png#gh-dark-mode-only) + + + nf-core/fetchngs logo + [![GitHub Actions CI Status](https://github.com/nf-core/fetchngs/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/fetchngs/actions?query=workflow%3A%22nf-core+CI%22) [![GitHub Actions Linting Status](https://github.com/nf-core/fetchngs/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/fetchngs/actions?query=workflow%3A%22nf-core+linting%22) From 51af5b54ac113112897754a5e3e44c68f872c09c Mon Sep 17 00:00:00 2001 From: maxulysse Date: Tue, 9 Jan 2024 13:23:58 +0100 Subject: [PATCH 650/852] update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 48944423..c354cd3f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements - [PR #241](https://github.com/nf-core/fetchngs/pull/241) - Download of big files time out and don't resume ([#169](https://github.com/nf-core/fetchngs/issues/169)) - [PR #242](https://github.com/nf-core/fetchngs/pull/242) - Template update for nf-core/tools v2.11 - [PR #243](https://github.com/nf-core/fetchngs/pull/243) - Fixes for [PR #238](https://github.com/nf-core/fetchngs/pull/238) +- [PR #246](https://github.com/nf-core/fetchngs/pull/246) - Handle dark/light mode for logo in GitHub README properly ### Software dependencies From 09600981c1f21c94eb169d19a72a9dd4050c61f3 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Tue, 9 Jan 2024 13:26:50 +0100 Subject: [PATCH 651/852] fix path to logo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f650c9a7..eb369218 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ - nf-core/fetchngs logo + nf-core/fetchngs logo [![GitHub Actions CI Status](https://github.com/nf-core/fetchngs/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/fetchngs/actions?query=workflow%3A%22nf-core+CI%22) From 259e281ba68e092440c0e734845518b55704baa0 Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Tue, 9 Jan 2024 15:45:47 +0100 Subject: [PATCH 652/852] Update README.md wrap picture in h1 cf https://github.com/nf-core/tools/pull/2647 --- README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index eb369218..56ba2cb0 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,9 @@ - - - nf-core/fetchngs logo - +

+ + + nf-core/fetchngs logo + +

[![GitHub Actions CI Status](https://github.com/nf-core/fetchngs/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/fetchngs/actions?query=workflow%3A%22nf-core+CI%22) [![GitHub Actions Linting Status](https://github.com/nf-core/fetchngs/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/fetchngs/actions?query=workflow%3A%22nf-core+linting%22) From f9eb52509483a646bb53ef7e39b95cfdcc138b25 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 9 Jan 2024 17:39:31 +0000 Subject: [PATCH 653/852] Proof of concept to refactor test data usage for nf-test in modules and pipelines --- .github/workflows/ci.yml | 6 +--- conf/test_data.config | 33 ------------------- .../tests/main.nf.test | 2 +- .../local/sra_fastq_ftp/tests/main.nf.test | 5 ++- .../sra_runinfo_to_ftp/tests/main.nf.test | 2 +- .../sratoolsncbisettings/tests/main.nf.test | 2 +- .../tests/main.nf.test.snap | 8 +++++ .../sratools/fasterqdump/tests/main.nf.test | 8 ++--- .../fasterqdump/tests/main.nf.test.snap | 16 ++++----- .../sratools/prefetch/tests/main.nf.test | 4 +-- modules/nf-core/untar/tests/main.nf.test | 6 ++-- nextflow.config | 5 +-- .../tests/main.nf.test.snap | 14 ++++---- tests/nextflow.config | 18 ++++++++++ 14 files changed, 59 insertions(+), 70 deletions(-) delete mode 100644 conf/test_data.config diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b395350f..9034d1db 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -102,13 +102,9 @@ jobs: wget -qO- https://code.askimed.com/install/nf-test | bash sudo mv nf-test /usr/local/bin/ - - name: Install icdiff for nf-test diff viewing - run: | - sudo apt install icdiff - - name: Run nf-test run: | - nf-test test --verbose --tag ${{ matrix.tags }} --profile "test,${{ matrix.profile }}" --junitxml=test.xml --tap=test.tap + nf-test test --verbose --tag ${{ matrix.tags }} --profile "${{ matrix.profile }}" --junitxml=test.xml --tap=test.tap - uses: pcolby/tap-summary@v1 with: diff --git a/conf/test_data.config b/conf/test_data.config deleted file mode 100644 index 167dff83..00000000 --- a/conf/test_data.config +++ /dev/null @@ -1,33 +0,0 @@ -params { - // Base directory for test data - test_data_base = "https://raw.githubusercontent.com/nf-core/test-datasets/fetchngs" - - fastq_ftp_ids = ["SRR13191702"] - def fastq_ftp_url = "ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/" - def fastq_ftp_urls = [] - - fastq_ftp_ids.each { id -> - fastq_ftp_urls += "${fastq_ftp_url}${id}_1.fastq.gz" - fastq_ftp_urls += "${fastq_ftp_url}${id}_2.fastq.gz" - } - - test_data { - 'sarscov2'{ - 'illumina' { - SRR11140744_tar_gz = "${params.test_data_base}/data/genomics/sarscov2/illumina/sra/SRR11140744.tar.gz" - SRR13255544_tar_gz = "${params.test_data_base}/data/genomics/sarscov2/illumina/sra/SRR13255544.tar.gz" - } - } - 'generic' { - 'config' { - ncbi_user_settings = "${params.test_data_base}/data/generic/config/ncbi_user_settings.mkfg" - } - } - 'modules_local' { - multiqc_mappings_config = "${params.test_data_base}/modules/local/multiqc_mappings_config/SRX9626017_SRR13191702.mappings.csv" - sra_to_samplesheet = "${params.test_data_base}/modules/local/sra_to_samplesheet/SRX9626017_SRR13191702.mappings.csv" - sra_fastq_ftp = fastq_ftp_urls - sra_runinfo_to_ftp = "${params.test_data_base}/modules/local/sra_runinfo_to_ftp/SRR13191702.runinfo.tsv" - } - } -} diff --git a/modules/local/multiqc_mappings_config/tests/main.nf.test b/modules/local/multiqc_mappings_config/tests/main.nf.test index 75356197..c49cedd7 100644 --- a/modules/local/multiqc_mappings_config/tests/main.nf.test +++ b/modules/local/multiqc_mappings_config/tests/main.nf.test @@ -16,7 +16,7 @@ nextflow_process { process { """ - input[0] = file(params.test_data['modules_local']['multiqc_mappings_config'], checkIfExists: true) + input[0] = file(params.pipelines_test_data_base + '/modules/local/multiqc_mappings_config/SRX9626017_SRR13191702.mappings.csv', checkIfExists: true) """ } } diff --git a/modules/local/sra_fastq_ftp/tests/main.nf.test b/modules/local/sra_fastq_ftp/tests/main.nf.test index ab846e5d..55b34bce 100644 --- a/modules/local/sra_fastq_ftp/tests/main.nf.test +++ b/modules/local/sra_fastq_ftp/tests/main.nf.test @@ -18,7 +18,10 @@ nextflow_process { """ input[0] = [ [ id:'SRX9626017_SRR13191702', single_end:false, md5_1: '89c5be920021a035084d8aeb74f32df7', md5_2: '56271be38a80db78ef3bdfc5d9909b98' ], // meta map - params.test_data['modules_local']['sra_fastq_ftp'] + [ + 'ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz', + 'ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz' + ] ] """ } diff --git a/modules/local/sra_runinfo_to_ftp/tests/main.nf.test b/modules/local/sra_runinfo_to_ftp/tests/main.nf.test index 3b1405f9..4dbe2570 100644 --- a/modules/local/sra_runinfo_to_ftp/tests/main.nf.test +++ b/modules/local/sra_runinfo_to_ftp/tests/main.nf.test @@ -16,7 +16,7 @@ nextflow_process { process { """ - input[0] = file(params.test_data['modules_local']['sra_runinfo_to_ftp'], checkIfExists: true) + input[0] = file(params.pipelines_test_data_base + '/modules/local/sra_runinfo_to_ftp/SRR13191702.runinfo.tsv', checkIfExists: true) """ } } diff --git a/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test b/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test index ec4a7797..989487f1 100644 --- a/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test +++ b/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test @@ -20,7 +20,7 @@ nextflow_process { process { """ file(params.settings_path).mkdirs() - def settings = file(params.test_data['generic']['config']['ncbi_user_settings'], checkIfExists: true) + def settings = file(params.modules_test_data_base + '/data/generic/config/ncbi_user_settings.mkfg', checkIfExists: true) settings.copyTo(params.settings_file) """ } diff --git a/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test.snap b/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test.snap index edb3b351..035aeeb7 100644 --- a/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test.snap +++ b/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test.snap @@ -1,4 +1,12 @@ { + "Should fail": { + "content": [ + [ + + ] + ], + "timestamp": "2024-01-09T12:59:19.679292" + }, "Should run with nonexisting": { "content": [ [ diff --git a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test index e194b52a..662fdde6 100644 --- a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test +++ b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test @@ -13,7 +13,7 @@ nextflow_process { script "modules/nf-core/untar/main.nf" process { """ - input[0] = Channel.of([ [], file(params.test_data['sarscov2']['illumina']['SRR13255544_tar_gz'], checkIfExists: true) ]) + input[0] = Channel.of([ [], file(params.modules_test_data_base + '/data/genomics/sarscov2/illumina/sra/SRR13255544.tar.gz', checkIfExists: true) ]) """ } } @@ -23,7 +23,7 @@ nextflow_process { process { """ input[0] = UNTAR.out.untar.map{ meta, files -> [ [ id:'test_single_end', single_end:true ], files]} - input[1] = file(params.test_data['generic']['config']['ncbi_user_settings'], checkIfExists: true) + input[1] = file(params.modules_test_data_base + '/data/generic/config/ncbi_user_settings.mkfg', checkIfExists: true) input[2] = [] """ } @@ -44,7 +44,7 @@ nextflow_process { script "modules/nf-core/untar/main.nf" process { """ - input[0] = Channel.of([ [], file(params.test_data['sarscov2']['illumina']['SRR11140744_tar_gz'], checkIfExists: true) ]) + input[0] = Channel.of([ [], file(params.modules_test_data_base + '/data/genomics/sarscov2/illumina/sra/SRR11140744.tar.gz', checkIfExists: true) ]) """ } } @@ -54,7 +54,7 @@ nextflow_process { process { """ input[0] = UNTAR.out.untar.map{ meta, files -> [ [ id:'test_paired_end', single_end:false ], files]} - input[1] = file(params.test_data['generic']['config']['ncbi_user_settings'], checkIfExists: true) + input[1] = file(params.modules_test_data_base + '/data/generic/config/ncbi_user_settings.mkfg', checkIfExists: true) input[2] = [] """ } diff --git a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap index d3bf90f7..123feb2e 100644 --- a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap +++ b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap @@ -8,7 +8,7 @@ "id": "test_single_end", "single_end": true }, - "test_single_end.fastq.gz:md5,1054c7b71884acdb5eed8a378f18be82" + "test_single_end_1.fastq.gz:md5,674d78c1cc3c1308d6d39d6369a42887" ] ], "1": [ @@ -20,7 +20,7 @@ "id": "test_single_end", "single_end": true }, - "test_single_end.fastq.gz:md5,1054c7b71884acdb5eed8a378f18be82" + "test_single_end_1.fastq.gz:md5,674d78c1cc3c1308d6d39d6369a42887" ] ], "versions": [ @@ -28,7 +28,7 @@ ] } ], - "timestamp": "2023-10-10T18:11:12.87053" + "timestamp": "2024-01-09T12:55:00.629261" }, "Paired-end": { "content": [ @@ -40,8 +40,8 @@ "single_end": false }, [ - "test_paired_end_1.fastq.gz:md5,193809c784a4ea132ab2a253fa4f55b6", - "test_paired_end_2.fastq.gz:md5,3e3b3af3413f50a1685fd7b3f1456d4e" + "test_paired_end_1.fastq.gz:md5,8573015c91d099b6e30789f8bab2f43c", + "test_paired_end_2.fastq.gz:md5,37e6f719a022dc3c9994c80fbc20c311" ] ] ], @@ -55,8 +55,8 @@ "single_end": false }, [ - "test_paired_end_1.fastq.gz:md5,193809c784a4ea132ab2a253fa4f55b6", - "test_paired_end_2.fastq.gz:md5,3e3b3af3413f50a1685fd7b3f1456d4e" + "test_paired_end_1.fastq.gz:md5,8573015c91d099b6e30789f8bab2f43c", + "test_paired_end_2.fastq.gz:md5,37e6f719a022dc3c9994c80fbc20c311" ] ] ], @@ -65,6 +65,6 @@ ] } ], - "timestamp": "2023-10-10T18:11:50.928006" + "timestamp": "2024-01-09T12:55:34.40299" } } \ No newline at end of file diff --git a/modules/nf-core/sratools/prefetch/tests/main.nf.test b/modules/nf-core/sratools/prefetch/tests/main.nf.test index fcf4036d..e67e496e 100644 --- a/modules/nf-core/sratools/prefetch/tests/main.nf.test +++ b/modules/nf-core/sratools/prefetch/tests/main.nf.test @@ -15,7 +15,7 @@ nextflow_process { process { """ input[0] = Channel.of([ [ id:'test', single_end:false ], 'DRR000774' ]) - input[1] = file(params.test_data['generic']['config']['ncbi_user_settings'], checkIfExists: true) + input[1] = file(params.modules_test_data_base + '/data/generic/config/ncbi_user_settings.mkfg', checkIfExists: true) input[2] = [] """ } @@ -38,7 +38,7 @@ nextflow_process { process { """ input[0] = Channel.of([ [ id:'test', single_end:false ], 'SRR1170046' ]) - input[1] = file(params.test_data['generic']['config']['ncbi_user_settings'], checkIfExists: true) + input[1] = file(params.modules_test_data_base + '/data/generic/config/ncbi_user_settings.mkfg', checkIfExists: true) input[2] = [] """ } diff --git a/modules/nf-core/untar/tests/main.nf.test b/modules/nf-core/untar/tests/main.nf.test index d40db13d..372afc0b 100644 --- a/modules/nf-core/untar/tests/main.nf.test +++ b/modules/nf-core/untar/tests/main.nf.test @@ -16,7 +16,7 @@ nextflow_process { } process { """ - input[0] = [ [], file(params.test_data['sarscov2']['genome']['kraken2_tar_gz'], checkIfExists: true) ] + input[0] = [ [], file(params.modules_test_data_base + '/data/genomics/sarscov2/genome/db/kraken2.tar.gz', checkIfExists: true) ] """ } } @@ -38,7 +38,7 @@ nextflow_process { } process { """ - input[0] = [ [], file(params.test_data['homo_sapiens']['illumina']['test_flowcell'], checkIfExists: true) ] + input[0] = [ [], file(params.modules_test_data_base + '/data/genomics/homo_sapiens/illumina/bcl/flowcell.tar.gz', checkIfExists: true) ] """ } } @@ -60,7 +60,7 @@ nextflow_process { } process { """ - input[0] = [ [], file(params.test_data['generic']['tar']['tar_gz'], checkIfExists: true) ] + input[0] = [ [], file(params.modules_test_data_base + '/data/generic/tar/hello.tar.gz', checkIfExists: true) ] """ } } diff --git a/nextflow.config b/nextflow.config index d3c6d840..b3c65b78 100644 --- a/nextflow.config +++ b/nextflow.config @@ -171,10 +171,7 @@ profiles { executor.cpus = 4 executor.memory = 8.GB } - test { - includeConfig 'conf/test.config' - includeConfig 'conf/test_data.config' - } + test { includeConfig 'conf/test.config' } test_synapse { includeConfig 'conf/test_synapse.config' } test_full { includeConfig 'conf/test_full.config' } } diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap index a73679e0..806b3cf2 100644 --- a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap @@ -9,8 +9,8 @@ "single_end": false }, [ - "test_paired_end_1.fastq.gz:md5,193809c784a4ea132ab2a253fa4f55b6", - "test_paired_end_2.fastq.gz:md5,3e3b3af3413f50a1685fd7b3f1456d4e" + "test_paired_end_1.fastq.gz:md5,8573015c91d099b6e30789f8bab2f43c", + "test_paired_end_2.fastq.gz:md5,37e6f719a022dc3c9994c80fbc20c311" ] ], [ @@ -18,7 +18,7 @@ "id": "test_single_end", "single_end": true }, - "test_single_end.fastq.gz:md5,19029a1132115b55277a0d79ee089b49" + "test_single_end.fastq.gz:md5,a110f93f7a9b0271455f5a435bce73c7" ] ], "1": [ @@ -33,8 +33,8 @@ "single_end": false }, [ - "test_paired_end_1.fastq.gz:md5,193809c784a4ea132ab2a253fa4f55b6", - "test_paired_end_2.fastq.gz:md5,3e3b3af3413f50a1685fd7b3f1456d4e" + "test_paired_end_1.fastq.gz:md5,8573015c91d099b6e30789f8bab2f43c", + "test_paired_end_2.fastq.gz:md5,37e6f719a022dc3c9994c80fbc20c311" ] ], [ @@ -42,7 +42,7 @@ "id": "test_single_end", "single_end": true }, - "test_single_end.fastq.gz:md5,19029a1132115b55277a0d79ee089b49" + "test_single_end.fastq.gz:md5,a110f93f7a9b0271455f5a435bce73c7" ] ], "versions": [ @@ -52,6 +52,6 @@ ] } ], - "timestamp": "2023-10-12T20:09:55.255971" + "timestamp": "2024-01-09T12:54:35.314326" } } \ No newline at end of file diff --git a/tests/nextflow.config b/tests/nextflow.config index e69de29b..55884b79 100644 --- a/tests/nextflow.config +++ b/tests/nextflow.config @@ -0,0 +1,18 @@ +params { + // Base directory for nf-core/modules test data + modules_test_data_base = 'https://raw.githubusercontent.com/nf-core/test-datasets/3e79d4b5fbed8c6ef7546d50696b343ab9a95fbe/' + + // Base directory for pipeline test data + pipelines_test_data_base = 'https://raw.githubusercontent.com/nf-core/test-datasets/2732b911c57e607fa7aea5ba0c3d91b25bafb662/' +} + +// Impose same minimum Nextflow version as the pipeline for testing +manifest { + nextflowVersion = '!>=23.04.0' +} + +// Disable all Nextflow reporting options +timeline { enabled = false } +report { enabled = false } +trace { enabled = false } +dag { enabled = false } \ No newline at end of file From f2da06ca8f1b033bb05310697f3054d0030eaf92 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 9 Jan 2024 17:40:52 +0000 Subject: [PATCH 654/852] Fix ECLint --- modules/local/sra_fastq_ftp/tests/main.nf.test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/sra_fastq_ftp/tests/main.nf.test b/modules/local/sra_fastq_ftp/tests/main.nf.test index 55b34bce..33f4be9f 100644 --- a/modules/local/sra_fastq_ftp/tests/main.nf.test +++ b/modules/local/sra_fastq_ftp/tests/main.nf.test @@ -18,7 +18,7 @@ nextflow_process { """ input[0] = [ [ id:'SRX9626017_SRR13191702', single_end:false, md5_1: '89c5be920021a035084d8aeb74f32df7', md5_2: '56271be38a80db78ef3bdfc5d9909b98' ], // meta map - [ + [ 'ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz', 'ftp.sra.ebi.ac.uk/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz' ] From 7413e123ead07a24ab07c8231d73465ba12fd7ca Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 9 Jan 2024 17:54:31 +0000 Subject: [PATCH 655/852] Impose sensible resource limits for testing --- tests/nextflow.config | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/nextflow.config b/tests/nextflow.config index 55884b79..9bd65e59 100644 --- a/tests/nextflow.config +++ b/tests/nextflow.config @@ -6,6 +6,13 @@ params { pipelines_test_data_base = 'https://raw.githubusercontent.com/nf-core/test-datasets/2732b911c57e607fa7aea5ba0c3d91b25bafb662/' } +// Impose sensible resource limits for testing +process { + cpus = 2 + memory = 3.GB + time = 2.h +} + // Impose same minimum Nextflow version as the pipeline for testing manifest { nextflowVersion = '!>=23.04.0' From b880ba243c77cb824fa36dc337886ee55a0cefe9 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 9 Jan 2024 19:31:52 +0000 Subject: [PATCH 656/852] Use process selector to change default resources for tests --- tests/nextflow.config | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tests/nextflow.config b/tests/nextflow.config index 9bd65e59..4533e874 100644 --- a/tests/nextflow.config +++ b/tests/nextflow.config @@ -8,9 +8,11 @@ params { // Impose sensible resource limits for testing process { - cpus = 2 - memory = 3.GB - time = 2.h + withName: '.*' { + cpus = 2 + memory = 3.GB + time = 2.h + } } // Impose same minimum Nextflow version as the pipeline for testing From 6447feff4dc2d8975a2e656295465dc343e72d4b Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 9 Jan 2024 19:36:25 +0000 Subject: [PATCH 657/852] Remove redundanct validationSchemaIgnoreParams parameter in test.config --- conf/test.config | 2 -- 1 file changed, 2 deletions(-) diff --git a/conf/test.config b/conf/test.config index 4272648c..42b1c34f 100644 --- a/conf/test.config +++ b/conf/test.config @@ -21,6 +21,4 @@ params { // Input data input = 'https://raw.githubusercontent.com/nf-core/test-datasets/2732b911c57e607fa7aea5ba0c3d91b25bafb662/testdata/v1.12.0/sra_ids_test.csv' - - validationSchemaIgnoreParams = 'test_data_base,fastq_ftp_ids,test_data' } From 62a14f19244ab3eecb4de45d1fda50e4e4953b1b Mon Sep 17 00:00:00 2001 From: maxulysse Date: Thu, 11 Jan 2024 20:23:00 +0100 Subject: [PATCH 658/852] use s3 path --- modules/local/multiqc_mappings_config/tests/main.nf.test | 2 +- modules/local/sra_runinfo_to_ftp/tests/main.nf.test | 2 +- tests/nextflow.config | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/local/multiqc_mappings_config/tests/main.nf.test b/modules/local/multiqc_mappings_config/tests/main.nf.test index c49cedd7..c1b2c5df 100644 --- a/modules/local/multiqc_mappings_config/tests/main.nf.test +++ b/modules/local/multiqc_mappings_config/tests/main.nf.test @@ -16,7 +16,7 @@ nextflow_process { process { """ - input[0] = file(params.pipelines_test_data_base + '/modules/local/multiqc_mappings_config/SRX9626017_SRR13191702.mappings.csv', checkIfExists: true) + input[0] = file(params.pipelines_test_data_base + 'modules/local/multiqc_mappings_config/SRX9626017_SRR13191702.mappings.csv', checkIfExists: true) """ } } diff --git a/modules/local/sra_runinfo_to_ftp/tests/main.nf.test b/modules/local/sra_runinfo_to_ftp/tests/main.nf.test index 4dbe2570..31224dab 100644 --- a/modules/local/sra_runinfo_to_ftp/tests/main.nf.test +++ b/modules/local/sra_runinfo_to_ftp/tests/main.nf.test @@ -16,7 +16,7 @@ nextflow_process { process { """ - input[0] = file(params.pipelines_test_data_base + '/modules/local/sra_runinfo_to_ftp/SRR13191702.runinfo.tsv', checkIfExists: true) + input[0] = file(params.pipelines_test_data_base + 'modules/local/sra_runinfo_to_ftp/SRR13191702.runinfo.tsv', checkIfExists: true) """ } } diff --git a/tests/nextflow.config b/tests/nextflow.config index 4533e874..9a7db8d2 100644 --- a/tests/nextflow.config +++ b/tests/nextflow.config @@ -3,7 +3,7 @@ params { modules_test_data_base = 'https://raw.githubusercontent.com/nf-core/test-datasets/3e79d4b5fbed8c6ef7546d50696b343ab9a95fbe/' // Base directory for pipeline test data - pipelines_test_data_base = 'https://raw.githubusercontent.com/nf-core/test-datasets/2732b911c57e607fa7aea5ba0c3d91b25bafb662/' + pipelines_test_data_base = 's3://ngi-igenomes/testdata/nf-core/pipelines/fetchngs/1.15.0/' } // Impose sensible resource limits for testing @@ -24,4 +24,4 @@ manifest { timeline { enabled = false } report { enabled = false } trace { enabled = false } -dag { enabled = false } \ No newline at end of file +dag { enabled = false } From 451d56b8e0f8833cc0885a54e232f2d0bb1a83d2 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Fri, 12 Jan 2024 09:41:26 +0000 Subject: [PATCH 659/852] Update modules to include absolute paths for test data Changes: - Modules updated - Now use absolute paths for test data - All modules tests should work within the this repository --- CHANGELOG.md | 1 + modules.json | 10 +- .../sratoolsncbisettings/environment.yml | 4 +- .../custom/sratoolsncbisettings/main.nf | 4 +- .../custom/sratoolsncbisettings/meta.yml | 4 +- .../sratoolsncbisettings/tests/main.nf.test | 76 +-- .../tests/main.nf.test.snap | 22 +- modules/nf-core/sratools/fasterqdump/main.nf | 7 +- .../sratools/fasterqdump/nextflow.config | 10 - .../sratools/fasterqdump/tests/main.nf.test | 2 + .../fasterqdump/tests/main.nf.test.snap | 4 +- modules/nf-core/sratools/prefetch/main.nf | 11 +- .../nf-core/sratools/prefetch/nextflow.config | 8 - .../sratools/prefetch/tests/main.nf.test | 1 + modules/nf-core/untar/environment.yml | 4 +- modules/nf-core/untar/tests/main.nf.test | 22 - modules/nf-core/untar/tests/main.nf.test.snap | 479 ------------------ .../nextflow.config | 2 - .../tests/main.nf.test | 17 +- .../tests/main.nf.test.snap | 116 +++-- .../tests/tags.yml | 2 +- 21 files changed, 110 insertions(+), 696 deletions(-) delete mode 100644 modules/nf-core/sratools/fasterqdump/nextflow.config delete mode 100644 modules/nf-core/sratools/prefetch/nextflow.config delete mode 100644 subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/nextflow.config diff --git a/CHANGELOG.md b/CHANGELOG.md index c354cd3f..38f6ff84 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements - [PR #242](https://github.com/nf-core/fetchngs/pull/242) - Template update for nf-core/tools v2.11 - [PR #243](https://github.com/nf-core/fetchngs/pull/243) - Fixes for [PR #238](https://github.com/nf-core/fetchngs/pull/238) - [PR #246](https://github.com/nf-core/fetchngs/pull/246) - Handle dark/light mode for logo in GitHub README properly +- [PR #249](https://github.com/nf-core/fetchngs/pull/249) - Update modules which includes absolute paths for test data, making module level test compatible within the pipeline. ### Software dependencies diff --git a/modules.json b/modules.json index d0766098..98f040b1 100644 --- a/modules.json +++ b/modules.json @@ -7,22 +7,22 @@ "nf-core": { "custom/sratoolsncbisettings": { "branch": "master", - "git_sha": "3f5420aa22e00bd030a2556dfdffc9e164ec0ec5", + "git_sha": "88e4709f3252aba9a776bee998b0890d9cc52799", "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] }, "sratools/fasterqdump": { "branch": "master", - "git_sha": "b1d2002587ed81dcd0f4b4ffa79fcdbda59b4e80", + "git_sha": "f2cf495ede41c301af75f1fb411724bb04258af4", "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] }, "sratools/prefetch": { "branch": "master", - "git_sha": "b1d2002587ed81dcd0f4b4ffa79fcdbda59b4e80", + "git_sha": "88e4709f3252aba9a776bee998b0890d9cc52799", "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] }, "untar": { "branch": "master", - "git_sha": "3f5420aa22e00bd030a2556dfdffc9e164ec0ec5", + "git_sha": "574074e6ea2497b53df1f226473a8c71524af0d0", "installed_by": ["modules"] } } @@ -31,7 +31,7 @@ "nf-core": { "fastq_download_prefetch_fasterqdump_sratools": { "branch": "master", - "git_sha": "cfd937a668919d948f6fcbf4218e79de50c2f36f", + "git_sha": "bdfd7bc8d2e5a93531e14bd94c4128d9a72a2435", "installed_by": ["subworkflows"] }, "utils_nextflow_pipeline": { diff --git a/modules/nf-core/custom/sratoolsncbisettings/environment.yml b/modules/nf-core/custom/sratoolsncbisettings/environment.yml index 5ea32741..44a1b008 100644 --- a/modules/nf-core/custom/sratoolsncbisettings/environment.yml +++ b/modules/nf-core/custom/sratoolsncbisettings/environment.yml @@ -1,7 +1,7 @@ -name: sratoolsncbisettings +name: custom_sratoolsncbisettings channels: - conda-forge - bioconda - defaults dependencies: - - bioconda::sra-tools=2.11.0 + - bioconda::sra-tools=3.0.8 diff --git a/modules/nf-core/custom/sratoolsncbisettings/main.nf b/modules/nf-core/custom/sratoolsncbisettings/main.nf index bad6f9cf..ba9441c9 100644 --- a/modules/nf-core/custom/sratoolsncbisettings/main.nf +++ b/modules/nf-core/custom/sratoolsncbisettings/main.nf @@ -4,8 +4,8 @@ process CUSTOM_SRATOOLSNCBISETTINGS { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/sra-tools:2.11.0--pl5321ha49a11a_3' : - 'biocontainers/sra-tools:2.11.0--pl5321ha49a11a_3' }" + 'https://depot.galaxyproject.org/singularity/sra-tools:3.0.8--h9f5acd7_0' : + 'biocontainers/sra-tools:3.0.8--h9f5acd7_0' }" output: path('*.mkfg') , emit: ncbi_settings diff --git a/modules/nf-core/custom/sratoolsncbisettings/meta.yml b/modules/nf-core/custom/sratoolsncbisettings/meta.yml index 8637dd19..46a6cd32 100644 --- a/modules/nf-core/custom/sratoolsncbisettings/meta.yml +++ b/modules/nf-core/custom/sratoolsncbisettings/meta.yml @@ -1,4 +1,4 @@ -name: "sratoolsncbisettings" +name: "custom_sratoolsncbisettings" description: Test for the presence of suitable NCBI settings or create them on the fly. keywords: - NCBI @@ -12,7 +12,7 @@ tools: homepage: https://github.com/ncbi/sra-tools documentation: https://github.com/ncbi/sra-tools/wiki tool_dev_url: https://github.com/ncbi/sra-tools - licence: "['Public Domain']" + licence: ["Public Domain"] output: - versions: type: file diff --git a/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test b/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test index 989487f1..71530d6e 100644 --- a/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test +++ b/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test @@ -14,7 +14,8 @@ nextflow_process { when { params { settings_path = '/tmp/.ncbi' - settings_file = "${params.settings_path}/user-settings.mkfg" + settings_file = "${params.settings_path}/user-settings.mkfg" + outdir = "$outputDir" } process { @@ -37,78 +38,5 @@ nextflow_process { assert path(get(0)).readLines().any { it.contains('/libs/cloud/report_instance_identity') } } } - - } - - test("Should fail") { - - when { - params { - settings_path = '/tmp/.ncbi' - settings_file = "${params.settings_path}/user-settings.mkfg" - } - - process { - """ - file(params.settings_path).mkdirs() - def settings = file(params.settings_file) - settings.text = ''' - ## auto-generated configuration file - DO NOT EDIT ## - config/default = "false" - /repository/remote/main/CGI/resolver-cgi = "https://trace.ncbi.nlm.nih.gov/Traces/names/names.fcgi" - /repository/remote/protected/CGI/resolver-cgi = "https://trace.ncbi.nlm.nih.gov/Traces/names/names.fcgi" - /repository/user/ad/public/apps/file/volumes/flatAd = "." - /repository/user/ad/public/apps/refseq/volumes/refseqAd = "." - /repository/user/ad/public/apps/sra/volumes/sraAd = "." - /repository/user/ad/public/apps/sraPileup/volumes/ad = "." - /repository/user/ad/public/apps/sraRealign/volumes/ad = "." - /repository/user/ad/public/apps/wgs/volumes/wgsAd = "." - /repository/user/ad/public/root = "." - /repository/user/default-path = "/root/ncbi" - '''.stripIndent() - """ - } - } - - then { - assert process.failed - assert snapshot( - process.out.versions - ).match() - assert process.stdout.any { it.contains('Command error:') } - assert process.stdout.any { it.contains('missing the required entries') } - assert process.stdout.any { it.contains('/LIBS/GUID') } - assert process.stdout.any { it.contains('/libs/cloud/report_instance_identity') } - } - } - - test("Should run with nonexisting") { - - when { - params { - settings_path = '/tmp/.ncbi' - settings_file = "${params.settings_path}/user-settings.mkfg" - } - - process { - """ - def settings = file(params.settings_file) - settings.delete() - """ - } - } - - then { - assert process.success - assert snapshot(process.out.versions).match() - - with(process.out.ncbi_settings) { - { assert path(get(0)).readLines().any { it.contains('/LIBS/GUID') } } - { assert path(get(0)).readLines().any { it.contains('/libs/cloud/report_instance_identity') } } - } - } - - } - } diff --git a/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test.snap b/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test.snap index 035aeeb7..65a706d4 100644 --- a/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test.snap +++ b/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test.snap @@ -1,26 +1,10 @@ { - "Should fail": { - "content": [ - [ - - ] - ], - "timestamp": "2024-01-09T12:59:19.679292" - }, - "Should run with nonexisting": { - "content": [ - [ - "versions.yml:md5,fec13b593c3b42ddd38f2fc77df25b70" - ] - ], - "timestamp": "2023-10-12T12:24:24.023849" - }, "Should run without failures": { "content": [ [ - "versions.yml:md5,fec13b593c3b42ddd38f2fc77df25b70" + "versions.yml:md5,3d6ee88cce1ee517e198633f062589a8" ] ], - "timestamp": "2023-10-12T10:40:51.717351" + "timestamp": "2024-01-09T22:43:44.996003" } -} \ No newline at end of file +} diff --git a/modules/nf-core/sratools/fasterqdump/main.nf b/modules/nf-core/sratools/fasterqdump/main.nf index f86d15b7..d4ddf268 100644 --- a/modules/nf-core/sratools/fasterqdump/main.nf +++ b/modules/nf-core/sratools/fasterqdump/main.nf @@ -25,14 +25,11 @@ process SRATOOLS_FASTERQDUMP { def prefix = task.ext.prefix ?: "${meta.id}" def outfile = meta.single_end ? "${prefix}.fastq" : prefix def key_file = '' - - if (certificate.toString().endsWith('.jwt')){ + if (certificate.toString().endsWith('.jwt')) { key_file += " --perm ${certificate}" - } - else if (certificate.toString().endsWith('.ngc')){ + } else if (certificate.toString().endsWith('.ngc')) { key_file += " --ngc ${certificate}" } - """ export NCBI_SETTINGS="\$PWD/${ncbi_settings}" diff --git a/modules/nf-core/sratools/fasterqdump/nextflow.config b/modules/nf-core/sratools/fasterqdump/nextflow.config deleted file mode 100644 index f98b140d..00000000 --- a/modules/nf-core/sratools/fasterqdump/nextflow.config +++ /dev/null @@ -1,10 +0,0 @@ -process { - withName: SRATOOLS_FASTERQDUMP { - ext.args = '--split-files --include-technical' - publishDir = [ - path: { "${params.outdir}/fastq" }, - mode: params.publish_dir_mode, - pattern: "*.fastq.gz" - ] - } -} \ No newline at end of file diff --git a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test index 662fdde6..8c920203 100644 --- a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test +++ b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test @@ -4,6 +4,8 @@ nextflow_process { process "SRATOOLS_FASTERQDUMP" tag "modules" tag "modules_nfcore" + tag "untar" + tag "sratools" tag "sratools/fasterqdump" test("Single-end") { diff --git a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap index 123feb2e..e2cc2612 100644 --- a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap +++ b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap @@ -8,7 +8,7 @@ "id": "test_single_end", "single_end": true }, - "test_single_end_1.fastq.gz:md5,674d78c1cc3c1308d6d39d6369a42887" + "test_single_end.fastq.gz:md5,674d78c1cc3c1308d6d39d6369a42887" ] ], "1": [ @@ -20,7 +20,7 @@ "id": "test_single_end", "single_end": true }, - "test_single_end_1.fastq.gz:md5,674d78c1cc3c1308d6d39d6369a42887" + "test_single_end.fastq.gz:md5,674d78c1cc3c1308d6d39d6369a42887" ] ], "versions": [ diff --git a/modules/nf-core/sratools/prefetch/main.nf b/modules/nf-core/sratools/prefetch/main.nf index f12dc68d..3c30739a 100644 --- a/modules/nf-core/sratools/prefetch/main.nf +++ b/modules/nf-core/sratools/prefetch/main.nf @@ -21,16 +21,15 @@ process SRATOOLS_PREFETCH { shell: args = task.ext.args ?: '' - - if (certificate){ - if (certificate.toString().endsWith('.jwt')){ + args2 = task.ext.args2 ?: '5 1 100' // + if (certificate) { + if (certificate.toString().endsWith('.jwt')) { args += " --perm ${certificate}" - } - else if (certificate.toString().endsWith('.ngc')){ + } + else if (certificate.toString().endsWith('.ngc')) { args += " --ngc ${certificate}" } } - args2 = task.ext.args2 ?: '5 1 100' // template 'retry_with_backoff.sh' } diff --git a/modules/nf-core/sratools/prefetch/nextflow.config b/modules/nf-core/sratools/prefetch/nextflow.config deleted file mode 100644 index a2ca8848..00000000 --- a/modules/nf-core/sratools/prefetch/nextflow.config +++ /dev/null @@ -1,8 +0,0 @@ -process { - withName: SRATOOLS_PREFETCH { - publishDir = [ - path: { "${params.outdir}/sra" }, - enabled: false - ] - } -} \ No newline at end of file diff --git a/modules/nf-core/sratools/prefetch/tests/main.nf.test b/modules/nf-core/sratools/prefetch/tests/main.nf.test index e67e496e..1001ecf5 100644 --- a/modules/nf-core/sratools/prefetch/tests/main.nf.test +++ b/modules/nf-core/sratools/prefetch/tests/main.nf.test @@ -4,6 +4,7 @@ nextflow_process { process "SRATOOLS_PREFETCH" tag "modules" tag "modules_nfcore" + tag "sratools" tag "sratools/prefetch" test("sratools/prefetch") { diff --git a/modules/nf-core/untar/environment.yml b/modules/nf-core/untar/environment.yml index d6917da3..0c9cbb10 100644 --- a/modules/nf-core/untar/environment.yml +++ b/modules/nf-core/untar/environment.yml @@ -1,9 +1,11 @@ name: untar + channels: - conda-forge - bioconda - defaults + dependencies: - - conda-forge::sed=4.7 - conda-forge::grep=3.11 + - conda-forge::sed=4.7 - conda-forge::tar=1.34 diff --git a/modules/nf-core/untar/tests/main.nf.test b/modules/nf-core/untar/tests/main.nf.test index 372afc0b..8d8cdcc0 100644 --- a/modules/nf-core/untar/tests/main.nf.test +++ b/modules/nf-core/untar/tests/main.nf.test @@ -30,28 +30,6 @@ nextflow_process { } - test("test_untar_different_output_path") { - - when { - params { - outdir = "$outputDir" - } - process { - """ - input[0] = [ [], file(params.modules_test_data_base + '/data/genomics/homo_sapiens/illumina/bcl/flowcell.tar.gz', checkIfExists: true) ] - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert snapshot(process.out.untar).match("test_untar_different_output_path") }, - ) - } - - } - test("test_untar_onlyfiles") { when { diff --git a/modules/nf-core/untar/tests/main.nf.test.snap b/modules/nf-core/untar/tests/main.nf.test.snap index 146c8678..ace42576 100644 --- a/modules/nf-core/untar/tests/main.nf.test.snap +++ b/modules/nf-core/untar/tests/main.nf.test.snap @@ -1,483 +1,4 @@ { - "test_untar_different_output_path": { - "content": [ - [ - [ - [ - - ], - [ - [ - [ - [ - [ - [ - "s_1_1101.bcl:md5,ad01889e2ff43e2f194224e20bdb600c", - "s_1_1101.stats:md5,4bbbf103454b37fbc3138fadf1b4446b" - ], - [ - "s_1_1101.bcl:md5,565384bbe67a694dfd690bae6d1d30c2", - "s_1_1101.stats:md5,55e5abd8f129ff38ef169873547abdb8" - ], - [ - "s_1_1101.bcl:md5,650fa58a630a9148835ba79e323d4237", - "s_1_1101.stats:md5,77403669ca1b05340c390dff64425c1e" - ], - [ - "s_1_1101.bcl:md5,54471c9e97299cd141e202e204637702", - "s_1_1101.stats:md5,67b14c9a89b7f8556674a7524d5cfb2d" - ], - [ - "s_1_1101.bcl:md5,74e4f929fc7476c380fd9d741ddb6700", - "s_1_1101.stats:md5,5730a4c35463eaa12a06b6758710b98c" - ], - [ - "s_1_1101.bcl:md5,c785f472f4350c120c02c888c8189590", - "s_1_1101.stats:md5,fee4ec63895ea81007e06ee6a36ba5e0" - ], - [ - "s_1_1101.bcl:md5,b7ea50bb25f08d43c301741d77050a9b", - "s_1_1101.stats:md5,fa7c68f3122c74d14364e6f7b011af70" - ], - [ - "s_1_1101.bcl:md5,9d5087dc4bcae39d66486363d4f68ecf", - "s_1_1101.stats:md5,23cdceee4d82c4b8e7c60018b9276ace" - ], - [ - "s_1_1101.bcl:md5,581e0c5ee94e8f2de14b2b1d8e777530", - "s_1_1101.stats:md5,9a3536d573c97f66bb56b49463612607" - ], - [ - "s_1_1101.bcl:md5,296fc026bb34c67bbe2b44845fe0d1de", - "s_1_1101.stats:md5,a7f57a7770fb9c5ae2a0fb1ef403ec4f" - ], - [ - "s_1_1101.bcl:md5,2a3ca15531556c36d10d132a9e051de8", - "s_1_1101.stats:md5,2d0bcdb0a1b51d3d79e415db2ab2d3b1" - ], - [ - "s_1_1101.bcl:md5,1150d46a2ccd4ac58aee0585d3e4ffd7", - "s_1_1101.stats:md5,2e97550bd5b5864ffd0565bb7a3f6d40" - ], - [ - "s_1_1101.bcl:md5,0b85c4b3da0de95e7b862d849c5333ae", - "s_1_1101.stats:md5,6eab9746fbeb783b0cd70398f44e0c1a" - ], - [ - "s_1_1101.bcl:md5,e0e9c91f4698804d7a6d1058ef68b34f", - "s_1_1101.stats:md5,790022cdc7878a02b2ebd166e1ddf0a7" - ], - [ - "s_1_1101.bcl:md5,38cd0ad4de359e651c8ac0d5777ea625", - "s_1_1101.stats:md5,a1b1d5ea5371d326abb029774483c5e6" - ], - [ - "s_1_1101.bcl:md5,b0ddc05c4012ccba24e712a1cfec748f", - "s_1_1101.stats:md5,af3d232f839d720f76f40ba06caa2987" - ], - [ - "s_1_1101.bcl:md5,af32fcc5dc3b836cf7a5ba3db85a75dd", - "s_1_1101.stats:md5,f93f2c09bd4e486c74a5f6e2040f7296" - ], - [ - "s_1_1101.bcl:md5,54b7428e037ca87816107647d4a3d9db", - "s_1_1101.stats:md5,e5ac77a72cd7bed5e9bf03cccda0e48c" - ], - [ - "s_1_1101.bcl:md5,fc8b4eacd493bf3d0b20bc23998dc7ff", - "s_1_1101.stats:md5,190315e159e2f4bc4c057ded7470dc52" - ], - [ - "s_1_1101.bcl:md5,9484ecffda489927fce424ac6a44fa9d", - "s_1_1101.stats:md5,0825feeb457ecc9efcf6f8526ba32311" - ], - [ - "s_1_1101.bcl:md5,eec59e21036e31c95ce1e847bfb0a9c4", - "s_1_1101.stats:md5,9acc13f63c98e5a8445e7be70d49222b" - ], - [ - "s_1_1101.bcl:md5,a9fb24476f87cba4fba68e2b3c3f2c07", - "s_1_1101.stats:md5,dc0aa7db9790733291c3e6480ca2a0fc" - ], - [ - "s_1_1101.bcl:md5,ed950b3e82c500927c2e236c9df005c6", - "s_1_1101.stats:md5,dccb71ec47d1f9d33a192da6d5660a45" - ], - [ - "s_1_1101.bcl:md5,b3e992025e995ca56b5ea2820144ef47", - "s_1_1101.stats:md5,a6a829bf2cffb26ac5d9dc3012057699" - ], - [ - "s_1_1101.bcl:md5,89edc726a5a4e0b4ff8ca3899ed0232b", - "s_1_1101.stats:md5,5b9b4fd8110577a59b82d0c419519d29" - ], - [ - "s_1_1101.bcl:md5,4dc696149169f232c451225f563cb5cd", - "s_1_1101.stats:md5,d3514a71ea3adc60e2943c6b8f6e2598" - ], - [ - "s_1_1101.bcl:md5,35b992d0318afb7c825ceaa31b0755e6", - "s_1_1101.stats:md5,2826093acc175c16c3795de7c4ca8f07" - ], - [ - "s_1_1101.bcl:md5,7bc927f56a362e49c00b5d76ee048901", - "s_1_1101.stats:md5,e47d862b795fd6b88a31d7d482ab22f6" - ], - [ - "s_1_1101.bcl:md5,84742233ff2a651626fe9036f27f7cb2", - "s_1_1101.stats:md5,b78fad11d3c50bc76b722cdc03e3028b" - ], - [ - "s_1_1101.bcl:md5,3935341c86263a7938e8c49620ef39f8", - "s_1_1101.stats:md5,cc6585b2daac5354073d150874da9704" - ], - [ - "s_1_1101.bcl:md5,3627f4fd548bf6e64aaf08fba3a342be", - "s_1_1101.stats:md5,120ae4831ae004ff7d16728aef36e82f" - ], - [ - "s_1_1101.bcl:md5,07631014bc35124149fabd80ef19f933", - "s_1_1101.stats:md5,eadd63d91f47cc6db6b6f0a967a23927" - ], - [ - "s_1_1101.bcl:md5,a1149c80415dc2f34d768eeb397c43fb", - "s_1_1101.stats:md5,ca89a9def67611a9151c6ce685b7cce1" - ], - [ - "s_1_1101.bcl:md5,eb5f71d4741d2f40618756bc72eaf8b4", - "s_1_1101.stats:md5,90f48501e735e5915b843478e23d1ae2" - ], - [ - "s_1_1101.bcl:md5,9bf270fe3f6add1a591ebc24fff10078", - "s_1_1101.stats:md5,a4e429671d4098034293c638aa655e16" - ], - [ - "s_1_1101.bcl:md5,219bedcbd24bae54fe4cf05dae05282c", - "s_1_1101.stats:md5,dd97525b65b68207137d51fcf19132c7" - ], - [ - "s_1_1101.bcl:md5,5163bc00a68fd57ae50cae0b76350892", - "s_1_1101.stats:md5,b606a5368eff1f012f3ea5d11ccdf2e0" - ], - [ - "s_1_1101.bcl:md5,fc429195a5af59a59e0cc4c48e6c05ea", - "s_1_1101.stats:md5,d809aa19698053f90d639da4dcad8008" - ], - [ - "s_1_1101.bcl:md5,383340219a1dd77076a092a64a71a7e4", - "s_1_1101.stats:md5,b204a5cf256378679ffc906c15cc1bae" - ], - [ - "s_1_1101.bcl:md5,0c369540d3e24696cf1f9c55bab69315", - "s_1_1101.stats:md5,a2bc69a4031a22ce9621dcc623a0bf4b" - ], - [ - "s_1_1101.bcl:md5,3127abc8016ba8eb954f8f8015dff387", - "s_1_1101.stats:md5,5deafff31150b7bf757f814e49a53bc2" - ], - [ - "s_1_1101.bcl:md5,045f40c82de676bafec3d59f91376a7a", - "s_1_1101.stats:md5,890700edc20687c090ef52248c7884b1" - ], - [ - "s_1_1101.bcl:md5,78af269aa2b39a1d765703f0a4739a86", - "s_1_1101.stats:md5,303cf457aa1543a8208544f694cbc531" - ], - [ - "s_1_1101.bcl:md5,0ab8c781959b783b62888e9274364a46", - "s_1_1101.stats:md5,2605b0e8322f83aa4d0dae5da4ec7a7a" - ], - [ - "s_1_1101.bcl:md5,d0cf823ffe352e8b3f75d589544ab617", - "s_1_1101.stats:md5,efa3c0e01e3db71e12fd961cb2d03739" - ], - [ - "s_1_1101.bcl:md5,db4ca4ab7a01e03c246f9160c3758d82", - "s_1_1101.stats:md5,f61550d9e4a90df6b860e68f41f82f60" - ], - [ - "s_1_1101.bcl:md5,1af39a2c7e5ff20ece91cb8160b51d17", - "s_1_1101.stats:md5,d0e20879afcaf6dfcd88c73f1c5c78cf" - ], - [ - "s_1_1101.bcl:md5,4cf7123bb0fffcd79266df03aef01665", - "s_1_1101.stats:md5,29bff4075109a121b087116b58d7e927" - ], - [ - "s_1_1101.bcl:md5,aa9980428cb60cd6320f4b48f4dd0d74", - "s_1_1101.stats:md5,6b0e20bde93133117a8d1a6df3d6f37b" - ], - [ - "s_1_1101.bcl:md5,0f6e440374e15b9b491d52fb83a8adfe", - "s_1_1101.stats:md5,55cb5eb0ecdabd23dca39ab8c4607598" - ], - [ - "s_1_1101.bcl:md5,2c645d7bdaddaa403f6e304d36df9e4b", - "s_1_1101.stats:md5,53acf33d21f832779b400c2447386ce4" - ], - [ - "s_1_1101.bcl:md5,3bbf0863b423b770c879203644420206", - "s_1_1101.stats:md5,579bdc7293cac8c3d7407249cacf4c25" - ], - [ - "s_1_1101.bcl:md5,6658a08409e81d29cfeb2d096b491985", - "s_1_1101.stats:md5,bb559ffbea46d612f9933cefa84c4c03" - ], - [ - "s_1_1101.bcl:md5,1700d9a13d3d4f7643af2943ef838acb", - "s_1_1101.stats:md5,f01cb6050ebfb15da1e0399ebd791eb4" - ], - [ - "s_1_1101.bcl:md5,1ac7aa9ffae25eb103f755f33e4a39c6", - "s_1_1101.stats:md5,0b9d45d7929ccf336d5e5b95373ed3c2" - ], - [ - "s_1_1101.bcl:md5,812a97af2e983a53226e18c75190b06c", - "s_1_1101.stats:md5,d2410c7b0e506dab2972e77e2398de1e" - ], - [ - "s_1_1101.bcl:md5,c981e8e4dcc434956c2b86159da268bc", - "s_1_1101.stats:md5,e9c826e85361ce673f1f248786c9a611" - ], - [ - "s_1_1101.bcl:md5,88e09e99a0a4ef3357b203a41b22f77c", - "s_1_1101.stats:md5,ef06f2e5ad667bbd383f9ed6a05b7b42" - ], - [ - "s_1_1101.bcl:md5,461c8b146fc8a7938be38689978ecd09", - "s_1_1101.stats:md5,65115693935da66f9791b27136e22fb0" - ], - [ - "s_1_1101.bcl:md5,c7b827df5ce20e0f21916fe60860ca3f", - "s_1_1101.stats:md5,87be73613aeb507847f94d3cac5bb30a" - ], - [ - "s_1_1101.bcl:md5,7c4cc3dc9c8a1b0f15917b282dfb40ce", - "s_1_1101.stats:md5,bdd9181fa89debbfafe7b6ea3e064065" - ], - [ - "s_1_1101.bcl:md5,19f4debaf91e118aca8934517179ac33", - "s_1_1101.stats:md5,1143082719e136241d21b14a6b19b8a2" - ], - [ - "s_1_1101.bcl:md5,38aa256ad2d697d84b0b2c0e876a3eba", - "s_1_1101.stats:md5,64dd82f03df23f7f437eede2671ed4fe" - ], - [ - "s_1_1101.bcl:md5,b7929970378949571fed922c1b8cab32", - "s_1_1101.stats:md5,3d6d7985a41629fe196e4342d7fe36aa" - ], - [ - "s_1_1101.bcl:md5,fb2ed0bf6e89d79624ee78754e773491", - "s_1_1101.stats:md5,f34940810ff255aee79953496a12716d" - ], - [ - "s_1_1101.bcl:md5,4f8a8311f5f9c3a7629c1a973a7b280e", - "s_1_1101.stats:md5,4fd7cd28c09f4e152e7c2ad1ab541cd2" - ], - [ - "s_1_1101.bcl:md5,9eb46c903d0344e25af51f88cc311d60", - "s_1_1101.stats:md5,df3abd5f620d9e7f99496098d9fd3f7f" - ], - [ - "s_1_1101.bcl:md5,3ecbc17f3660e2014b58d7fe70ae62d5", - "s_1_1101.stats:md5,8e89a13c85a6d6ab3ccd251b66d1f165" - ], - [ - "s_1_1101.bcl:md5,5d59cc2499a77791233a64f73fe82894", - "s_1_1101.stats:md5,32ec99cd400f4b80cb26e2fa8e07ece0" - ], - [ - "s_1_1101.bcl:md5,1c052da47b9ae8554388f0fa3aade482", - "s_1_1101.stats:md5,d23f438772673688aa7bc92421dc6dce" - ], - [ - "s_1_1101.bcl:md5,1a52bd4f23130c0c96bc967ccd448a2b", - "s_1_1101.stats:md5,9b597e3388d59ef1f61aba30ac90ea79" - ], - [ - "s_1_1101.bcl:md5,8a1e84b79cf3f80794c20e3a0cc84688", - "s_1_1101.stats:md5,9561f7b6ef4b1849afc72b2bb49792bd" - ], - [ - "s_1_1101.bcl:md5,75c00111051f3fa95d04286823cb9109", - "s_1_1101.stats:md5,1fe786cdf8181767deafbd60b3c76610" - ], - [ - "s_1_1101.bcl:md5,529255d8deee0873ed5565e6d1a2ebda", - "s_1_1101.stats:md5,3fa7f467e97a75880f32d17b7429d316" - ], - [ - "s_1_1101.bcl:md5,ea4d960e3d9355d2149da71b88a21df4", - "s_1_1101.stats:md5,2540fe65586e8e800c1ddd8cddd1e8cd" - ], - [ - "s_1_1101.bcl:md5,0dfe1fd92a2dce2f23119aa483429744", - "s_1_1101.stats:md5,78257b2169fb9f0cf40966e06e847e86" - ], - [ - "s_1_1101.bcl:md5,f692ddc9aa3ab849271d07c666d0b3b9", - "s_1_1101.stats:md5,aa2ec6a3e3a9c116e34fe74a21e6459e" - ], - [ - "s_1_1101.bcl:md5,29cc4c239eae7c871c9a1adf92ebdb98", - "s_1_1101.stats:md5,263184813090acd740a5bf25304aed3a" - ], - [ - "s_1_1101.bcl:md5,e005af6a84925e326afbfe264241f047", - "s_1_1101.stats:md5,b6fb20868eebaffcc19daa694a449795" - ], - [ - "s_1_1101.bcl:md5,02f1a699b1ba9967accccf99a7af3d24", - "s_1_1101.stats:md5,4f007efacecaf26dc0e0231aede28754" - ], - [ - "s_1_1101.bcl:md5,df308c72a2dcc655cd95e98f5457187a", - "s_1_1101.stats:md5,130c4b07f4c14030bab012824cbe34da" - ], - [ - "s_1_1101.bcl:md5,f3ce10d8d2406b72355023bfa8c96822", - "s_1_1101.stats:md5,2638f4db393ed5b699ec2ce59ff0ec19" - ], - [ - "s_1_1101.bcl:md5,cc2f6d675ad1593ff96f734b172d249e", - "s_1_1101.stats:md5,f5b13f1e1ababc9e1a7a73b0b993cbf1" - ], - [ - "s_1_1101.bcl:md5,7938a0b21448305a951b023b1845b3a7", - "s_1_1101.stats:md5,fcd57511adabfc3ba1ac045165330006" - ], - [ - "s_1_1101.bcl:md5,44879bc6a38df1fee8def61868115041", - "s_1_1101.stats:md5,517e20e4b58a8023a37f9af62e0e2036" - ], - [ - "s_1_1101.bcl:md5,8749611e62406a7d2f34c610a55e56af", - "s_1_1101.stats:md5,8ccf24b3676ef84f2e513be8f2a9f3d1" - ], - [ - "s_1_1101.bcl:md5,a9846a037611cda3721958088f714c0e", - "s_1_1101.stats:md5,6438fa5a1892f328cab1605a95d80a3b" - ], - [ - "s_1_1101.bcl:md5,d6c4a2a726496476eb826532f974ed5f", - "s_1_1101.stats:md5,8c2c65b5e8b00dbf61ada65252aeb266" - ], - [ - "s_1_1101.bcl:md5,be3dde6cae7dd85855a6bf295ebfacfe", - "s_1_1101.stats:md5,93bc13f3b0749b2b8d8bcb0b1199f4f0" - ], - [ - "s_1_1101.bcl:md5,7c64514735a6cf1565b60647edd17d20", - "s_1_1101.stats:md5,4a0aa6c49b24f876415e5878cef7f805" - ], - [ - "s_1_1101.bcl:md5,3983b4043bc9df4b505202a5134ccf03", - "s_1_1101.stats:md5,1c9d9a8558adc1279ca27c96bc1b9758" - ], - [ - "s_1_1101.bcl:md5,a0b8d77f116ec95975f9253dcb768136", - "s_1_1101.stats:md5,c3992b786756e7ec42f65ef4b13b50d4" - ], - [ - "s_1_1101.bcl:md5,43c95ba35d06bb7c57fbd16f3d1cfd6c", - "s_1_1101.stats:md5,3cb69d04698c39f97f962e5bf1eea7f0" - ], - [ - "s_1_1101.bcl:md5,3dbeea0cad7052f19f53ff6f19dd4d90", - "s_1_1101.stats:md5,58bbc8254f0f5f4a244531e8e9c12a04" - ], - [ - "s_1_1101.bcl:md5,da56d088996376c898d855b6cd0a7dfc", - "s_1_1101.stats:md5,9f2d78af6908ce1576b89cdc059844ff" - ], - [ - "s_1_1101.bcl:md5,7b641a5565f095e9a6ffcad9e4305033", - "s_1_1101.stats:md5,3ada06c59b4fb41b83ab6abd0979e9fc" - ], - [ - "s_1_1101.bcl:md5,a3843d397a01d51657825bb652c191e5", - "s_1_1101.stats:md5,19341e52a4bfc7d9d48e9d2acc68c519" - ], - [ - "s_1_1101.bcl:md5,048e3ebfc8efeb8012def6b741c9060d", - "s_1_1101.stats:md5,88bd38deca1e87d700effab1fd099565" - ], - [ - "s_1_1101.bcl:md5,b340db0e07e829dd5da22371916a1a9e", - "s_1_1101.stats:md5,e44cfaddcc4ffb968e5b1a2f41ac48a5" - ], - [ - "s_1_1101.bcl:md5,e6011ec6eabbc2b8792deb283c621ce0", - "s_1_1101.stats:md5,090875dcd1a431af24bc631333f089c4" - ], - [ - "s_1_1101.bcl:md5,a08f216e3352345031ed100ec4245082", - "s_1_1101.stats:md5,97b949ef4b96219e1369f673cf5f8a6c" - ], - [ - "s_1_1101.bcl:md5,b43337c76fb037dfcf5f8f7bcb3618e5", - "s_1_1101.stats:md5,ddef585805e79951f69d23ab7354f69b" - ], - [ - "s_1_1101.bcl:md5,8c61fd004104397b360855e058bbf1bf", - "s_1_1101.stats:md5,0f8d253816d594dcfea3ccf48c826401" - ], - [ - "s_1_1101.bcl:md5,594d06310d328b188aa0b3edfff22cb2", - "s_1_1101.stats:md5,3160bf271b39aeb7590e4fd2984710ba" - ], - [ - "s_1_1101.bcl:md5,4c9eada67c9d55437211d83e111961d5", - "s_1_1101.stats:md5,2901b46ab16ec4863d30e4c84ec29c97" - ], - [ - "s_1_1101.bcl:md5,e03971ae5282f0accc0c1b7374d9ef1b", - "s_1_1101.stats:md5,60d2a19ce59bf70a21a28555484cead8" - ], - [ - "s_1_1101.bcl:md5,e1c6f7a06e63d149895d3e48e63df155", - "s_1_1101.stats:md5,44beb10af847ea3dddaf06dda7031126" - ], - [ - "s_1_1101.bcl:md5,960a99bf29a8f9d936e9b8582d46c9c6", - "s_1_1101.stats:md5,544cd1a7aaaa841914b40ece43399334" - ], - [ - "s_1_1101.bcl:md5,5706679f349fd4a6b6313bc2c41c7a42", - "s_1_1101.stats:md5,627eea844b26dae033848c2f9f69177b" - ], - [ - "s_1_1101.bcl:md5,21da5abc4b0402bbac14b5ab998b0b4f", - "s_1_1101.stats:md5,515bd140b095ad90473ca7a9a69877ab" - ], - "s_1_1101.control:md5,08a72e2198ae95150718e8adf011d105", - "s_1_1101.filter:md5,3a72bc73b323c8cb0ac5bfeb62d98989" - ] - ], - [ - "s_1_1101.locs:md5,0827ea802e5257cc5b20e757a33d4c98" - ], - "RTAConfiguration.xml:md5,c7d6e257bc374f142dc64b9d2281d4c9", - "config.xml:md5,9a4cc7ec01fefa2f1ce9bcb45bbad6e9" - ] - ], - [ - "ControlMetricsOut.bin:md5,6d77b38d0793a6e1ce1e85706e488953", - "CorrectedIntMetricsOut.bin:md5,2bbf84d3be72734addaa2fe794711434", - "ErrorMetricsOut.bin:md5,38c88def138e9bb832539911affdb286", - "ExtractionMetricsOut.bin:md5,7497c3178837eea8f09350b5cd252e99", - "IndexMetricsOut.bin:md5,d41d8cd98f00b204e9800998ecf8427e", - "QMetricsOut.bin:md5,7e9f198d53ebdfbb699a5f94cf1ed51c", - "TileMetricsOut.bin:md5,83891751ec1c91a425a524b476b6ca3c" - ], - "RunInfo.xml:md5,03038959f4dd181c86bc97ae71fe270a" - ] - ] - ] - ], - "timestamp": "2023-10-18T11:56:39.562418" - }, "test_untar_onlyfiles": { "content": [ [ diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/nextflow.config b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/nextflow.config deleted file mode 100644 index b11c499f..00000000 --- a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/nextflow.config +++ /dev/null @@ -1,2 +0,0 @@ -includeConfig '../../../modules/nf-core/sratools/prefetch/nextflow.config' -includeConfig '../../../modules/nf-core/sratools/fasterqdump/nextflow.config' \ No newline at end of file diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test index be18fc3b..2a16d1ef 100644 --- a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test @@ -3,12 +3,12 @@ nextflow_workflow { name "Test workflow: fastq_download_prefetch_fasterqdump_sratools/main.nf" script "../main.nf" workflow "FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS" - tag "subworkflow" - tag "subworkflow_nfcore" + tag "subworkflows" + tag "subworkflows_nfcore" tag "custom/sratoolsncbisettings" tag "sratools/prefetch" tag "sratools/fasterqdump" - tag "fastq_download_prefetch_fasterqdump_sratools" + tag "subworkflows/fastq_download_prefetch_fasterqdump_sratools" test("Parameters: default") { @@ -28,9 +28,18 @@ nextflow_workflow { } then { + def pelines1 = path(workflow.out.reads[0][1][0]).linesGzip + def pelines2 = path(workflow.out.reads[0][1][1]).linesGzip + def selines = path(workflow.out.reads[1][1]).linesGzip assertAll( { assert workflow.success }, - { assert snapshot(workflow.out).match() } + { assert snapshot(pelines1[0..5]).match("test_pe_reads_1_lines") }, + { assert snapshot(pelines1.size()).match("test_pe_reads_1_size") }, + { assert snapshot(pelines2[0..5]).match("test_pe_reads_2_lines") }, + { assert snapshot(pelines2.size()).match("test_pe_reads_2_size") }, + { assert snapshot(selines[0..5]).match("test_se_reads_lines") }, + { assert snapshot(selines.size()).match("test_se_reads_size") }, + { assert snapshot(workflow.out.versions).match("versions") } ) } } diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap index 806b3cf2..2123d3f7 100644 --- a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap @@ -1,57 +1,69 @@ { - "Parameters: default": { + "test_se_reads_size": { "content": [ - { - "0": [ - [ - { - "id": "test_paired_end", - "single_end": false - }, - [ - "test_paired_end_1.fastq.gz:md5,8573015c91d099b6e30789f8bab2f43c", - "test_paired_end_2.fastq.gz:md5,37e6f719a022dc3c9994c80fbc20c311" - ] - ], - [ - { - "id": "test_single_end", - "single_end": true - }, - "test_single_end.fastq.gz:md5,a110f93f7a9b0271455f5a435bce73c7" - ] - ], - "1": [ - "versions.yml:md5,98d78bba9f3da39a0b7db6e9c7dcc224", - "versions.yml:md5,9c558ff624585a6eee82a19c8c0136db", - "versions.yml:md5,db0e1352064b53c651661f43f2620765" - ], - "reads": [ - [ - { - "id": "test_paired_end", - "single_end": false - }, - [ - "test_paired_end_1.fastq.gz:md5,8573015c91d099b6e30789f8bab2f43c", - "test_paired_end_2.fastq.gz:md5,37e6f719a022dc3c9994c80fbc20c311" - ] - ], - [ - { - "id": "test_single_end", - "single_end": true - }, - "test_single_end.fastq.gz:md5,a110f93f7a9b0271455f5a435bce73c7" - ] - ], - "versions": [ - "versions.yml:md5,98d78bba9f3da39a0b7db6e9c7dcc224", - "versions.yml:md5,9c558ff624585a6eee82a19c8c0136db", - "versions.yml:md5,db0e1352064b53c651661f43f2620765" - ] - } + 19996 ], - "timestamp": "2024-01-09T12:54:35.314326" + "timestamp": "2024-01-11T11:52:21.464438219" + }, + "test_pe_reads_2_lines": { + "content": [ + [ + "@SRR11140744.1 M01472:285:000000000-CYHNP:1:1101:12117:3295 length=251", + "ACAGGACACGAGTAACTCGTCTATCTTCTGCTGGCTGCTTACGGTTTCGTCCGTGTTGCAGCCGATCATCAGCACATCTAGGTTTCGTCCGGGTGTGACCGAAAGGTAAGATGGAGAGCCTTGTCCCTGGTTTCAACGAGAAAACACACGTCCAACTCAGTTTGCCTGTTTTACAGGTTCGCGACGTGCTCGTACGTGGCTTTGGAGACTCCGTGGAGGAGGTCTTATCAGAGGCACGTCAACATCTTAAA", + "+SRR11140744.1 M01472:285:000000000-CYHNP:1:1101:12117:3295 length=251", + "ABAAAFBFFBDBGGGGGGGGGGHHHHHHHHHHCHGHGGGHHHGGHGGHGHGGGHFHHHHHHHHGGGGGHHHHHHHHHFHHHHGHHHGHGGGGGEFGDGHHGFGGGHHHHHGHHGGHHFHHHHGHHHHHHHHHHHHHHGFFGGHHHHHHGGHHGGHHHHHEGHHHHHHHGHHGHHFHHHHHGGGGGGGGGGGGAGGG9BEFFFFFFFFFFFFFFEEFFFFFFFA.FFFFFFFEFEFFFFFFF.BFFFFFFFB", + "@SRR11140744.2 M01472:285:000000000-CYHNP:1:1101:20752:3564 length=238", + "GTGCACTCACGCAGTATAATTAATAACTAATTACTGTCGTTGACAGGACACGAGTAACTCGTCTATCTTCTGCAGGCTGCTTACGGTTTCGTCCGTGTTGCAGCCGATCATCAGCACATCTAGGTTTCGTCCGGGTGTGACCGAAAGGTAAGATGGAGAGCCTTGTCCCTGGTTTCAACGAGAAAACACACGTCCAACTCAGTTTGCCTGTTTTACAGGTTCGCGACGTGCTCGTACG" + ] + ], + "timestamp": "2024-01-11T11:52:21.437261931" + }, + "test_pe_reads_2_size": { + "content": [ + 2011460 + ], + "timestamp": "2024-01-11T11:52:21.44875993" + }, + "versions": { + "content": [ + [ + "versions.yml:md5,1a2218ff913fc33408bffccb081b5048", + "versions.yml:md5,98d78bba9f3da39a0b7db6e9c7dcc224", + "versions.yml:md5,9c558ff624585a6eee82a19c8c0136db" + ] + ], + "timestamp": "2024-01-11T12:11:06.731937323" + }, + "test_pe_reads_1_size": { + "content": [ + 2011460 + ], + "timestamp": "2024-01-11T11:52:21.428267242" + }, + "test_se_reads_lines": { + "content": [ + [ + "@DRR000774.1 1 length=421", + "ACGCAGGTGCCAGCAGCCGCGGTAATACGTAGGATCCGAGCGTTGTCCGGATTTATTGGGCGTAAAGGGTGCGTAGGCGGCTTGTCAAGTCTCATGTGAAATCTCCCGGCTCAACTGGGAGGGTCATGGGAAACTGATGAGCTCGAGGGCAGTAGAGGGAAGCGGAATTCCGAGAGTAGTGGTGAAATGCGTAGATACTCGGAGGAACACCAGTGGCGAAAGCGGCTTCCTGGACTGTACCTGACGCTGAGGCACGAAAGCGTGGGGAGCAAACCGGATTAGATACCCGGGTAGTCCACGCCCTAAACGATGGATACTAGATATAGGGGGTATCGACCCTCTGTGTCGAAGCTAACGCATTAAGTATCCCGCCTGAGGAGTACGGCCGCAAGGCTAAAACTTAAGGAATTGACGGCTGCGT", + "+DRR000774.1 1 length=421", + "FFFFFFFFFFFIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIHHFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:88FFF888???DBBBBB666F222ADDDFFF::;FFFFFFFFFFFFFFFFFFFFFFFFFFFF9:::FFFFCCCFFFFDDDFFFFF<<<<<8888886623//38><83238@B@@<;855557,,,,,,,0/0;;8:==DDDDDDDDD9:", + "@DRR000774.2 2 length=126", + "ACGCAGGTGCCAGCAGCCGCGGTAATACGGAGGGAGCTAGCGTTGTTCGGAATTACTGGGCGTAAAGCGCACGTAGGCGGCTTTTCAAGTCAGGGGTGGAAATACCCGGGGCCGTCAACCCGACCG" + ] + ], + "timestamp": "2024-01-11T11:52:21.45496474" + }, + "test_pe_reads_1_lines": { + "content": [ + [ + "@SRR11140744.1 M01472:285:000000000-CYHNP:1:1101:12117:3295 length=251", + "ACATAGGGCTGTTCAAGTTGAGGCAAAACGCCTTTTTCAACTTCTACTAAGCCACAAGTGCCATCTTTAAGATGTTGACGTGCCTCTGATAAGACCTCCTCCACGGAGTCTCCAAAGCCACGTACGAGCACGTCGCGAACCTGTAAAACAGGCAAACTGAGTTGGACGTGTGTTTTCTCGTTGAAACCAGGGACAAGGCTCTCCATCTTACCTTTCGGTCACACCCGGACGAAACCTAGATGTGCTGATGA", + "+SRR11140744.1 M01472:285:000000000-CYHNP:1:1101:12117:3295 length=251", + "BCCCCFFFFFCFGGGGGGGGGGHGGHHHHGGGHGHHHHHHHHHHHHHHHHHHHHHHHGHHHHHHHHHHHHHHHHHHHHHGGGHHHHHGHHGHHHHHHHHHHHHHGGGGGHHHHHHHHHHHHGHHHGGGGGHGHHGGGGGGGHHHHHHHHHHHGGHHHHHFHHHHHHHGGGHHHHHHHHHGGGHHHHHHHHGGGGGGGFGGGGGGGGGGGGGGGGGGGGGGFFFFFFFFFDFFFFFFFFFFFFFFFFFFFFB", + "@SRR11140744.2 M01472:285:000000000-CYHNP:1:1101:20752:3564 length=238", + "CGTACGAGCACGTCGCGAACCTGTAAAACAGGCAAACTGAGTTGGACGTGTGTTTTCTCGTTGAAACCAGGGACAAGGCTCTCCATCTTACCTTTCGGTCACACCCGGACGAAACCTAGATGTGCTGATGATCGGCTGCAACACGGACGAAACCGTAAGCAGCCTGCAGAAGATAGACGAGTTACTCGTGTCCTGTCAACGACAGTAATTAGTTATTAATTATACTGCGTGAGTGCAC" + ] + ], + "timestamp": "2024-01-11T11:52:21.400169604" } } \ No newline at end of file diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/tags.yml b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/tags.yml index ab064503..03028c32 100644 --- a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/tags.yml +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/tags.yml @@ -1,2 +1,2 @@ -fastq_download_prefetch_fasterqdump_sratools: +subworkflows/fastq_download_prefetch_fasterqdump_sratools: - subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/** From cba05a318ce2b88fc0b29321cb8e54fa00c89390 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Fri, 12 Jan 2024 09:50:47 +0000 Subject: [PATCH 660/852] Remove includeConfig statements for missing config files --- workflows/sra/nextflow.config | 2 -- 1 file changed, 2 deletions(-) diff --git a/workflows/sra/nextflow.config b/workflows/sra/nextflow.config index 21b374c5..b053d8a9 100644 --- a/workflows/sra/nextflow.config +++ b/workflows/sra/nextflow.config @@ -3,5 +3,3 @@ includeConfig "../../modules/local/sra_fastq_ftp/nextflow.config" includeConfig "../../modules/local/sra_ids_to_runinfo/nextflow.config" includeConfig "../../modules/local/sra_runinfo_to_ftp/nextflow.config" includeConfig "../../modules/local/sra_to_samplesheet/nextflow.config" -includeConfig "../../modules/nf-core/sratools/prefetch/nextflow.config" -includeConfig "../../subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/nextflow.config" From 9b7b18cc0ddd7edd64b561821b828240fddbdad5 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Fri, 12 Jan 2024 14:52:27 +0000 Subject: [PATCH 661/852] Use testdata_base_path for all tests --- modules.json | 8 ++++---- .../custom/sratoolsncbisettings/tests/main.nf.test | 2 +- modules/nf-core/sratools/fasterqdump/tests/main.nf.test | 8 ++++---- modules/nf-core/sratools/prefetch/tests/main.nf.test | 4 ++-- modules/nf-core/untar/tests/main.nf.test | 4 ++-- tests/nextflow.config | 2 +- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/modules.json b/modules.json index 98f040b1..4b37d239 100644 --- a/modules.json +++ b/modules.json @@ -7,22 +7,22 @@ "nf-core": { "custom/sratoolsncbisettings": { "branch": "master", - "git_sha": "88e4709f3252aba9a776bee998b0890d9cc52799", + "git_sha": "20e78a9868eaa69c8cac91152397def32374b807", "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] }, "sratools/fasterqdump": { "branch": "master", - "git_sha": "f2cf495ede41c301af75f1fb411724bb04258af4", + "git_sha": "20e78a9868eaa69c8cac91152397def32374b807", "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] }, "sratools/prefetch": { "branch": "master", - "git_sha": "88e4709f3252aba9a776bee998b0890d9cc52799", + "git_sha": "20e78a9868eaa69c8cac91152397def32374b807", "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] }, "untar": { "branch": "master", - "git_sha": "574074e6ea2497b53df1f226473a8c71524af0d0", + "git_sha": "20e78a9868eaa69c8cac91152397def32374b807", "installed_by": ["modules"] } } diff --git a/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test b/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test index 71530d6e..883a8d1e 100644 --- a/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test +++ b/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test @@ -21,7 +21,7 @@ nextflow_process { process { """ file(params.settings_path).mkdirs() - def settings = file(params.modules_test_data_base + '/data/generic/config/ncbi_user_settings.mkfg', checkIfExists: true) + def settings = file(params.testdata_base_path + '/generic/config/ncbi_user_settings.mkfg', checkIfExists: true) settings.copyTo(params.settings_file) """ } diff --git a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test index 8c920203..af6b26d8 100644 --- a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test +++ b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test @@ -15,7 +15,7 @@ nextflow_process { script "modules/nf-core/untar/main.nf" process { """ - input[0] = Channel.of([ [], file(params.modules_test_data_base + '/data/genomics/sarscov2/illumina/sra/SRR13255544.tar.gz', checkIfExists: true) ]) + input[0] = Channel.of([ [], file(params.testdata_base_path + 'genomics/sarscov2/illumina/sra/SRR13255544.tar.gz', checkIfExists: true) ]) """ } } @@ -25,7 +25,7 @@ nextflow_process { process { """ input[0] = UNTAR.out.untar.map{ meta, files -> [ [ id:'test_single_end', single_end:true ], files]} - input[1] = file(params.modules_test_data_base + '/data/generic/config/ncbi_user_settings.mkfg', checkIfExists: true) + input[1] = file(params.testdata_base_path + 'generic/config/ncbi_user_settings.mkfg', checkIfExists: true) input[2] = [] """ } @@ -46,7 +46,7 @@ nextflow_process { script "modules/nf-core/untar/main.nf" process { """ - input[0] = Channel.of([ [], file(params.modules_test_data_base + '/data/genomics/sarscov2/illumina/sra/SRR11140744.tar.gz', checkIfExists: true) ]) + input[0] = Channel.of([ [], file(params.testdata_base_path + 'genomics/sarscov2/illumina/sra/SRR11140744.tar.gz', checkIfExists: true) ]) """ } } @@ -56,7 +56,7 @@ nextflow_process { process { """ input[0] = UNTAR.out.untar.map{ meta, files -> [ [ id:'test_paired_end', single_end:false ], files]} - input[1] = file(params.modules_test_data_base + '/data/generic/config/ncbi_user_settings.mkfg', checkIfExists: true) + input[1] = file(params.testdata_base_path + 'generic/config/ncbi_user_settings.mkfg', checkIfExists: true) input[2] = [] """ } diff --git a/modules/nf-core/sratools/prefetch/tests/main.nf.test b/modules/nf-core/sratools/prefetch/tests/main.nf.test index 1001ecf5..d88c1b67 100644 --- a/modules/nf-core/sratools/prefetch/tests/main.nf.test +++ b/modules/nf-core/sratools/prefetch/tests/main.nf.test @@ -16,7 +16,7 @@ nextflow_process { process { """ input[0] = Channel.of([ [ id:'test', single_end:false ], 'DRR000774' ]) - input[1] = file(params.modules_test_data_base + '/data/generic/config/ncbi_user_settings.mkfg', checkIfExists: true) + input[1] = file(params.testdata_base_path + '/generic/config/ncbi_user_settings.mkfg', checkIfExists: true) input[2] = [] """ } @@ -39,7 +39,7 @@ nextflow_process { process { """ input[0] = Channel.of([ [ id:'test', single_end:false ], 'SRR1170046' ]) - input[1] = file(params.modules_test_data_base + '/data/generic/config/ncbi_user_settings.mkfg', checkIfExists: true) + input[1] = file(params.testdata_base_path + '/generic/config/ncbi_user_settings.mkfg', checkIfExists: true) input[2] = [] """ } diff --git a/modules/nf-core/untar/tests/main.nf.test b/modules/nf-core/untar/tests/main.nf.test index 8d8cdcc0..bcf09a00 100644 --- a/modules/nf-core/untar/tests/main.nf.test +++ b/modules/nf-core/untar/tests/main.nf.test @@ -16,7 +16,7 @@ nextflow_process { } process { """ - input[0] = [ [], file(params.modules_test_data_base + '/data/genomics/sarscov2/genome/db/kraken2.tar.gz', checkIfExists: true) ] + input[0] = [ [], file(params.testdata_base_path + 'genomics/sarscov2/genome/db/kraken2.tar.gz', checkIfExists: true) ] """ } } @@ -38,7 +38,7 @@ nextflow_process { } process { """ - input[0] = [ [], file(params.modules_test_data_base + '/data/generic/tar/hello.tar.gz', checkIfExists: true) ] + input[0] = [ [], file(params.testdata_base_path + 'generic/tar/hello.tar.gz', checkIfExists: true) ] """ } } diff --git a/tests/nextflow.config b/tests/nextflow.config index 4533e874..09f04f68 100644 --- a/tests/nextflow.config +++ b/tests/nextflow.config @@ -1,6 +1,6 @@ params { // Base directory for nf-core/modules test data - modules_test_data_base = 'https://raw.githubusercontent.com/nf-core/test-datasets/3e79d4b5fbed8c6ef7546d50696b343ab9a95fbe/' + testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/3e79d4b5fbed8c6ef7546d50696b343ab9a95fbe/' // Base directory for pipeline test data pipelines_test_data_base = 'https://raw.githubusercontent.com/nf-core/test-datasets/2732b911c57e607fa7aea5ba0c3d91b25bafb662/' From a46c1dd8e9052f66f0dd1a3b42c59c69ff9ca86d Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Fri, 12 Jan 2024 14:55:39 +0000 Subject: [PATCH 662/852] Replace base path with s3 --- tests/nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/nextflow.config b/tests/nextflow.config index 09f04f68..a4a5b829 100644 --- a/tests/nextflow.config +++ b/tests/nextflow.config @@ -1,6 +1,6 @@ params { // Base directory for nf-core/modules test data - testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/3e79d4b5fbed8c6ef7546d50696b343ab9a95fbe/' + testdata_base_path = 's3://ngi-igenomes/testdata/nf-core/modules/' // Base directory for pipeline test data pipelines_test_data_base = 'https://raw.githubusercontent.com/nf-core/test-datasets/2732b911c57e607fa7aea5ba0c3d91b25bafb662/' From 84adb514288ba50c1c3ceb539b16b172fffef511 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 12 Jan 2024 16:51:22 +0100 Subject: [PATCH 663/852] update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c354cd3f..72db7563 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements - [PR #242](https://github.com/nf-core/fetchngs/pull/242) - Template update for nf-core/tools v2.11 - [PR #243](https://github.com/nf-core/fetchngs/pull/243) - Fixes for [PR #238](https://github.com/nf-core/fetchngs/pull/238) - [PR #246](https://github.com/nf-core/fetchngs/pull/246) - Handle dark/light mode for logo in GitHub README properly +- [PR #248](https://github.com/nf-core/fetchngs/pull/248) - Update pipeline level test data path to use mirror on s3 ### Software dependencies From 3394b61fb01510dc2bb03ced700ae0a40147c0b9 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Fri, 12 Jan 2024 17:30:07 +0000 Subject: [PATCH 664/852] Remove file checks for files that do not exist in tests any more --- tests/main.nf.test | 39 +++++++++++++++++---------------------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/tests/main.nf.test b/tests/main.nf.test index 21c6ac8b..8bfd4af2 100644 --- a/tests/main.nf.test +++ b/tests/main.nf.test @@ -23,28 +23,6 @@ nextflow_pipeline { { assert new File("$outputDir/samplesheet/samplesheet.csv").readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX024467"', '"DRX026011"', '"ERX1234253"', '"SRX10940790"', '"SRX11047067"', '"SRX17709227"', '"SRX17709228"', '"SRX6725035"', '"SRX9315476"', '"SRX9504942"', '"SRX9504942"', '"SRX9504942"', '"SRX9504942"', '"SRX9626017"'] }, { assert new File("$outputDir/samplesheet/samplesheet.csv").text.contains('Illumina HiSeq 2500') }, { assert new File("$outputDir/custom/user-settings.mkfg").exists() }, - { assert new File("$outputDir/fastq/DRX024467_DRR026872.fastq.gz").exists() }, - { assert new File("$outputDir/fastq/DRX026011_DRR028935_1.fastq.gz").exists() }, - { assert new File("$outputDir/fastq/DRX026011_DRR028935_2.fastq.gz").exists() }, - { assert new File("$outputDir/fastq/ERX1234253_ERR1160846.fastq.gz").exists() }, - { assert new File("$outputDir/fastq/SRX10940790_SRR14593545_1.fastq.gz").exists() }, - { assert new File("$outputDir/fastq/SRX10940790_SRR14593545_2.fastq.gz").exists() }, - { assert new File("$outputDir/fastq/SRX11047067_SRR14709033.fastq.gz").exists() }, - { assert new File("$outputDir/fastq/SRX17709227_SRR21711856.fastq.gz").exists() }, - { assert new File("$outputDir/fastq/SRX17709228_SRR21711855.fastq.gz").exists() }, - { assert new File("$outputDir/fastq/SRX6725035_SRR9984183.fastq.gz").exists() }, - { assert new File("$outputDir/fastq/SRX9315476_SRR12848126_1.fastq.gz").exists() }, - { assert new File("$outputDir/fastq/SRX9315476_SRR12848126_2.fastq.gz").exists() }, - { assert new File("$outputDir/fastq/SRX9504942_SRR13055517_1.fastq.gz").exists() }, - { assert new File("$outputDir/fastq/SRX9504942_SRR13055517_2.fastq.gz").exists() }, - { assert new File("$outputDir/fastq/SRX9504942_SRR13055518_1.fastq.gz").exists() }, - { assert new File("$outputDir/fastq/SRX9504942_SRR13055518_2.fastq.gz").exists() }, - { assert new File("$outputDir/fastq/SRX9504942_SRR13055519_1.fastq.gz").exists() }, - { assert new File("$outputDir/fastq/SRX9504942_SRR13055519_2.fastq.gz").exists() }, - { assert new File("$outputDir/fastq/SRX9504942_SRR13055520_1.fastq.gz").exists() }, - { assert new File("$outputDir/fastq/SRX9504942_SRR13055520_2.fastq.gz").exists() }, - { assert new File("$outputDir/fastq/SRX9626017_SRR13191702_1.fastq.gz").exists() }, - { assert new File("$outputDir/fastq/SRX9626017_SRR13191702_2.fastq.gz").exists() }, { assert new File("$outputDir/fastq/md5/DRX024467_DRR026872.fastq.gz.md5").exists() }, { assert new File("$outputDir/fastq/md5/DRX026011_DRR028935_1.fastq.gz.md5").exists() }, { assert new File("$outputDir/fastq/md5/DRX026011_DRR028935_2.fastq.gz.md5").exists() }, @@ -62,6 +40,23 @@ nextflow_pipeline { { assert new File("$outputDir/fastq/md5/SRX9504942_SRR13055520_2.fastq.gz.md5").exists() }, { assert new File("$outputDir/fastq/md5/SRX9626017_SRR13191702_1.fastq.gz.md5").exists() }, { assert new File("$outputDir/fastq/md5/SRX9626017_SRR13191702_2.fastq.gz.md5").exists() }, + { assert new File("$outputDir/fastq/DRX024467_DRR026872.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/DRX026011_DRR028935_1.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/DRX026011_DRR028935_2.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/ERX1234253_ERR1160846.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/SRX17709227_SRR21711856.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/SRX17709228_SRR21711855.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/SRX6725035_SRR9984183.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/SRX9504942_SRR13055517_1.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/SRX9504942_SRR13055517_2.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/SRX9504942_SRR13055518_1.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/SRX9504942_SRR13055518_2.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/SRX9504942_SRR13055519_1.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/SRX9504942_SRR13055519_2.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/SRX9504942_SRR13055520_1.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/SRX9504942_SRR13055520_2.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/SRX9626017_SRR13191702_1.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/SRX9626017_SRR13191702_2.fastq.gz").exists() }, { assert new File("$outputDir/metadata/DRR026872.runinfo_ftp.tsv").exists() }, { assert new File("$outputDir/metadata/DRR028935.runinfo_ftp.tsv").exists() }, { assert new File("$outputDir/metadata/ERR1160846.runinfo_ftp.tsv").exists() }, From 966bd415c5f85e41fb265ec9672702ef3daeb5bf Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Fri, 12 Jan 2024 17:35:25 +0000 Subject: [PATCH 665/852] Update subworkflows --- modules.json | 2 +- .../nf-core/utils_nfcore_pipeline/main.nf | 119 +++++++++--------- .../tests/main.function.nf.test | 30 +++-- .../tests/main.function.nf.test.snap | 102 +++++++++++---- .../tests/main.workflow.nf.test | 3 +- 5 files changed, 164 insertions(+), 92 deletions(-) diff --git a/modules.json b/modules.json index 4b37d239..f7829fdd 100644 --- a/modules.json +++ b/modules.json @@ -41,7 +41,7 @@ }, "utils_nfcore_pipeline": { "branch": "master", - "git_sha": "c81784b47d44464b35e04220e00051bb5be27524", + "git_sha": "524ccbab145985b26eb7daa6e551af486dab2100", "installed_by": ["subworkflows"] }, "utils_nfvalidation_plugin": { diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf index d88aeebe..5716198c 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf +++ b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf @@ -10,6 +10,9 @@ workflow UTILS_NFCORE_PIPELINE { + take: + monochrome_logs // boolean: Disable ANSI colour codes in log output + main: checkConfigProvided() @@ -54,18 +57,18 @@ def workflowCitation() { // // nf-core logo // -def nfCoreLogo(workflow_version) { - Map colors = logColours() +def nfCoreLogo(workflow_version, monochrome_logs = true) { + Map colors = logColours(monochrome_logs) String.format( """\n - ${dashedLine()} + ${dashedLine(monochrome_logs)} ${colors.green},--.${colors.black}/${colors.green},-.${colors.reset} ${colors.blue} ___ __ __ __ ___ ${colors.green}/,-._.--~\'${colors.reset} ${colors.blue} |\\ | |__ __ / ` / \\ |__) |__ ${colors.yellow}} {${colors.reset} ${colors.blue} | \\| | \\__, \\__/ | \\ |___ ${colors.green}\\`-._,-`-,${colors.reset} ${colors.green}`._,._,\'${colors.reset} ${colors.purple} ${workflow.manifest.name} ${workflow_version}${colors.reset} - ${dashedLine()} + ${dashedLine(monochrome_logs)} """.stripIndent() ) } @@ -73,75 +76,75 @@ def nfCoreLogo(workflow_version) { // // Return dashed line // -def dashedLine() { - Map colors = logColours() +def dashedLine(monochrome_logs = true) { + Map colors = logColours(monochrome_logs) return "-${colors.dim}----------------------------------------------------${colors.reset}-" } // // ANSII colours used for terminal logging // -def logColours() { +def logColours(monochrome_logs = true) { Map colorcodes = [:] // Reset / Meta - colorcodes['reset'] = params.monochrome_logs ? '' : "\033[0m" - colorcodes['bold'] = params.monochrome_logs ? '' : "\033[1m" - colorcodes['dim'] = params.monochrome_logs ? '' : "\033[2m" - colorcodes['underlined'] = params.monochrome_logs ? '' : "\033[4m" - colorcodes['blink'] = params.monochrome_logs ? '' : "\033[5m" - colorcodes['reverse'] = params.monochrome_logs ? '' : "\033[7m" - colorcodes['hidden'] = params.monochrome_logs ? '' : "\033[8m" + colorcodes['reset'] = monochrome_logs ? '' : "\033[0m" + colorcodes['bold'] = monochrome_logs ? '' : "\033[1m" + colorcodes['dim'] = monochrome_logs ? '' : "\033[2m" + colorcodes['underlined'] = monochrome_logs ? '' : "\033[4m" + colorcodes['blink'] = monochrome_logs ? '' : "\033[5m" + colorcodes['reverse'] = monochrome_logs ? '' : "\033[7m" + colorcodes['hidden'] = monochrome_logs ? '' : "\033[8m" // Regular Colors - colorcodes['black'] = params.monochrome_logs ? '' : "\033[0;30m" - colorcodes['red'] = params.monochrome_logs ? '' : "\033[0;31m" - colorcodes['green'] = params.monochrome_logs ? '' : "\033[0;32m" - colorcodes['yellow'] = params.monochrome_logs ? '' : "\033[0;33m" - colorcodes['blue'] = params.monochrome_logs ? '' : "\033[0;34m" - colorcodes['purple'] = params.monochrome_logs ? '' : "\033[0;35m" - colorcodes['cyan'] = params.monochrome_logs ? '' : "\033[0;36m" - colorcodes['white'] = params.monochrome_logs ? '' : "\033[0;37m" + colorcodes['black'] = monochrome_logs ? '' : "\033[0;30m" + colorcodes['red'] = monochrome_logs ? '' : "\033[0;31m" + colorcodes['green'] = monochrome_logs ? '' : "\033[0;32m" + colorcodes['yellow'] = monochrome_logs ? '' : "\033[0;33m" + colorcodes['blue'] = monochrome_logs ? '' : "\033[0;34m" + colorcodes['purple'] = monochrome_logs ? '' : "\033[0;35m" + colorcodes['cyan'] = monochrome_logs ? '' : "\033[0;36m" + colorcodes['white'] = monochrome_logs ? '' : "\033[0;37m" // Bold - colorcodes['bblack'] = params.monochrome_logs ? '' : "\033[1;30m" - colorcodes['bred'] = params.monochrome_logs ? '' : "\033[1;31m" - colorcodes['bgreen'] = params.monochrome_logs ? '' : "\033[1;32m" - colorcodes['byellow'] = params.monochrome_logs ? '' : "\033[1;33m" - colorcodes['bblue'] = params.monochrome_logs ? '' : "\033[1;34m" - colorcodes['bpurple'] = params.monochrome_logs ? '' : "\033[1;35m" - colorcodes['bcyan'] = params.monochrome_logs ? '' : "\033[1;36m" - colorcodes['bwhite'] = params.monochrome_logs ? '' : "\033[1;37m" + colorcodes['bblack'] = monochrome_logs ? '' : "\033[1;30m" + colorcodes['bred'] = monochrome_logs ? '' : "\033[1;31m" + colorcodes['bgreen'] = monochrome_logs ? '' : "\033[1;32m" + colorcodes['byellow'] = monochrome_logs ? '' : "\033[1;33m" + colorcodes['bblue'] = monochrome_logs ? '' : "\033[1;34m" + colorcodes['bpurple'] = monochrome_logs ? '' : "\033[1;35m" + colorcodes['bcyan'] = monochrome_logs ? '' : "\033[1;36m" + colorcodes['bwhite'] = monochrome_logs ? '' : "\033[1;37m" // Underline - colorcodes['ublack'] = params.monochrome_logs ? '' : "\033[4;30m" - colorcodes['ured'] = params.monochrome_logs ? '' : "\033[4;31m" - colorcodes['ugreen'] = params.monochrome_logs ? '' : "\033[4;32m" - colorcodes['uyellow'] = params.monochrome_logs ? '' : "\033[4;33m" - colorcodes['ublue'] = params.monochrome_logs ? '' : "\033[4;34m" - colorcodes['upurple'] = params.monochrome_logs ? '' : "\033[4;35m" - colorcodes['ucyan'] = params.monochrome_logs ? '' : "\033[4;36m" - colorcodes['uwhite'] = params.monochrome_logs ? '' : "\033[4;37m" + colorcodes['ublack'] = monochrome_logs ? '' : "\033[4;30m" + colorcodes['ured'] = monochrome_logs ? '' : "\033[4;31m" + colorcodes['ugreen'] = monochrome_logs ? '' : "\033[4;32m" + colorcodes['uyellow'] = monochrome_logs ? '' : "\033[4;33m" + colorcodes['ublue'] = monochrome_logs ? '' : "\033[4;34m" + colorcodes['upurple'] = monochrome_logs ? '' : "\033[4;35m" + colorcodes['ucyan'] = monochrome_logs ? '' : "\033[4;36m" + colorcodes['uwhite'] = monochrome_logs ? '' : "\033[4;37m" // High Intensity - colorcodes['iblack'] = params.monochrome_logs ? '' : "\033[0;90m" - colorcodes['ired'] = params.monochrome_logs ? '' : "\033[0;91m" - colorcodes['igreen'] = params.monochrome_logs ? '' : "\033[0;92m" - colorcodes['iyellow'] = params.monochrome_logs ? '' : "\033[0;93m" - colorcodes['iblue'] = params.monochrome_logs ? '' : "\033[0;94m" - colorcodes['ipurple'] = params.monochrome_logs ? '' : "\033[0;95m" - colorcodes['icyan'] = params.monochrome_logs ? '' : "\033[0;96m" - colorcodes['iwhite'] = params.monochrome_logs ? '' : "\033[0;97m" + colorcodes['iblack'] = monochrome_logs ? '' : "\033[0;90m" + colorcodes['ired'] = monochrome_logs ? '' : "\033[0;91m" + colorcodes['igreen'] = monochrome_logs ? '' : "\033[0;92m" + colorcodes['iyellow'] = monochrome_logs ? '' : "\033[0;93m" + colorcodes['iblue'] = monochrome_logs ? '' : "\033[0;94m" + colorcodes['ipurple'] = monochrome_logs ? '' : "\033[0;95m" + colorcodes['icyan'] = monochrome_logs ? '' : "\033[0;96m" + colorcodes['iwhite'] = monochrome_logs ? '' : "\033[0;97m" // Bold High Intensity - colorcodes['biblack'] = params.monochrome_logs ? '' : "\033[1;90m" - colorcodes['bired'] = params.monochrome_logs ? '' : "\033[1;91m" - colorcodes['bigreen'] = params.monochrome_logs ? '' : "\033[1;92m" - colorcodes['biyellow'] = params.monochrome_logs ? '' : "\033[1;93m" - colorcodes['biblue'] = params.monochrome_logs ? '' : "\033[1;94m" - colorcodes['bipurple'] = params.monochrome_logs ? '' : "\033[1;95m" - colorcodes['bicyan'] = params.monochrome_logs ? '' : "\033[1;96m" - colorcodes['biwhite'] = params.monochrome_logs ? '' : "\033[1;97m" + colorcodes['biblack'] = monochrome_logs ? '' : "\033[1;90m" + colorcodes['bired'] = monochrome_logs ? '' : "\033[1;91m" + colorcodes['bigreen'] = monochrome_logs ? '' : "\033[1;92m" + colorcodes['biyellow'] = monochrome_logs ? '' : "\033[1;93m" + colorcodes['biblue'] = monochrome_logs ? '' : "\033[1;94m" + colorcodes['bipurple'] = monochrome_logs ? '' : "\033[1;95m" + colorcodes['bicyan'] = monochrome_logs ? '' : "\033[1;96m" + colorcodes['biwhite'] = monochrome_logs ? '' : "\033[1;97m" return colorcodes } @@ -149,7 +152,7 @@ def logColours() { // // Construct and send completion email // -def completionEmail(summary_params) { +def completionEmail(summary_params, monochrome_logs = true) { // Set up the e-mail variables def subject = "[$workflow.manifest.name] Successful: $workflow.runName" @@ -211,7 +214,7 @@ def completionEmail(summary_params) { def sendmail_html = sendmail_template.toString() // Send the HTML e-mail - Map colors = logColours() + Map colors = logColours(monochrome_logs) if (email_address) { try { if (params.plaintext_email) { throw GroovyException('Send plaintext e-mail, not HTML') } @@ -240,8 +243,8 @@ def completionEmail(summary_params) { // // Print pipeline summary on completion // -def completionSummary() { - Map colors = logColours() +def completionSummary(monochrome_logs = true) { + Map colors = logColours(monochrome_logs) if (workflow.success) { if (workflow.stats.ignoredCount == 0) { log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Pipeline completed successfully${colors.reset}-" diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test index 63988b1b..c4f71aeb 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test @@ -16,7 +16,6 @@ nextflow_function { when { function { """ - // define inputs of the function here. Example: // input[0] = 1 """ } @@ -38,7 +37,6 @@ nextflow_function { when { function { """ - // define inputs of the function here. Example: // input[0] = 1 """ } @@ -61,6 +59,7 @@ nextflow_function { function { """ input[0] = "9.9.9" + input[1] = false """ } } @@ -83,8 +82,7 @@ nextflow_function { when { function { """ - // define inputs of the function here. Example: - // input[0] = 1 + input[0] = false """ } } @@ -100,15 +98,14 @@ nextflow_function { - test("Test Function logColours") { + test("Test Function without logColours") { function "logColours" when { function { """ - // define inputs of the function here. Example: - // input[0] = 1 + input[0] = true """ } } @@ -121,4 +118,23 @@ nextflow_function { } } + + test("Test Function with logColours") { + function "logColours" + + when { + function { + """ + input[0] = false + """ + } + } + + then { + assertAll ( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + } } \ No newline at end of file diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test.snap b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test.snap index 3ea51f68..bdf71d41 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test.snap +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test.snap @@ -1,5 +1,81 @@ { - "Test Function logColours": { + "Test Function checkConfigProvided": { + "content": null, + "timestamp": "2023-10-16T14:27:01.415849" + }, + "Test Function nfCoreLogo": { + "content": [ + "\n\n-\u001b[2m----------------------------------------------------\u001b[0m-\n \u001b[0;32m,--.\u001b[0;30m/\u001b[0;32m,-.\u001b[0m\n\u001b[0;34m ___ __ __ __ ___ \u001b[0;32m/,-._.--~'\u001b[0m\n\u001b[0;34m |\\ | |__ __ / ` / \\ |__) |__ \u001b[0;33m} {\u001b[0m\n\u001b[0;34m | \\| | \\__, \\__/ | \\ |___ \u001b[0;32m\\`-._,-`-,\u001b[0m\n \u001b[0;32m`._,._,'\u001b[0m\n\u001b[0;35m nextflow_workflow 9.9.9\u001b[0m\n-\u001b[2m----------------------------------------------------\u001b[0m-\n" + ], + "timestamp": "2023-10-16T14:27:51.566211" + }, + "Test Function workflowCitation": { + "content": [ + "If you use nextflow_workflow for your analysis please cite:\n\n* The pipeline\n https://doi.org/10.5281/zenodo.5070524\n\n* The nf-core framework\n https://doi.org/10.1038/s41587-020-0439-x\n\n* Software dependencies\n https://github.com/nextflow_workflow/blob/master/CITATIONS.md" + ], + "timestamp": "2023-10-16T14:27:03.505737" + }, + "Test Function without logColours": { + "content": [ + { + "reset": "", + "bold": "", + "dim": "", + "underlined": "", + "blink": "", + "reverse": "", + "hidden": "", + "black": "", + "red": "", + "green": "", + "yellow": "", + "blue": "", + "purple": "", + "cyan": "", + "white": "", + "bblack": "", + "bred": "", + "bgreen": "", + "byellow": "", + "bblue": "", + "bpurple": "", + "bcyan": "", + "bwhite": "", + "ublack": "", + "ured": "", + "ugreen": "", + "uyellow": "", + "ublue": "", + "upurple": "", + "ucyan": "", + "uwhite": "", + "iblack": "", + "ired": "", + "igreen": "", + "iyellow": "", + "iblue": "", + "ipurple": "", + "icyan": "", + "iwhite": "", + "biblack": "", + "bired": "", + "bigreen": "", + "biyellow": "", + "biblue": "", + "bipurple": "", + "bicyan": "", + "biwhite": "" + } + ], + "timestamp": "2023-12-20T10:04:29.095368" + }, + "Test Function dashedLine": { + "content": [ + "-\u001b[2m----------------------------------------------------\u001b[0m-" + ], + "timestamp": "2023-10-16T14:27:07.721916" + }, + "Test Function with logColours": { "content": [ { "reset": "\u001b[0m", @@ -51,28 +127,6 @@ "biwhite": "\u001b[1;97m" } ], - "timestamp": "2023-10-16T14:27:09.843064" - }, - "Test Function checkConfigProvided": { - "content": null, - "timestamp": "2023-10-16T14:27:01.415849" - }, - "Test Function nfCoreLogo": { - "content": [ - "\n\n-\u001b[2m----------------------------------------------------\u001b[0m-\n \u001b[0;32m,--.\u001b[0;30m/\u001b[0;32m,-.\u001b[0m\n\u001b[0;34m ___ __ __ __ ___ \u001b[0;32m/,-._.--~'\u001b[0m\n\u001b[0;34m |\\ | |__ __ / ` / \\ |__) |__ \u001b[0;33m} {\u001b[0m\n\u001b[0;34m | \\| | \\__, \\__/ | \\ |___ \u001b[0;32m\\`-._,-`-,\u001b[0m\n \u001b[0;32m`._,._,'\u001b[0m\n\u001b[0;35m nextflow_workflow 9.9.9\u001b[0m\n-\u001b[2m----------------------------------------------------\u001b[0m-\n" - ], - "timestamp": "2023-10-16T14:27:51.566211" - }, - "Test Function workflowCitation": { - "content": [ - "If you use nextflow_workflow for your analysis please cite:\n\n* The pipeline\n https://doi.org/10.5281/zenodo.5070524\n\n* The nf-core framework\n https://doi.org/10.1038/s41587-020-0439-x\n\n* Software dependencies\n https://github.com/nextflow_workflow/blob/master/CITATIONS.md" - ], - "timestamp": "2023-10-16T14:27:03.505737" - }, - "Test Function dashedLine": { - "content": [ - "-\u001b[2m----------------------------------------------------\u001b[0m-" - ], - "timestamp": "2023-10-16T14:27:07.721916" + "timestamp": "2023-12-20T10:04:31.258856" } } \ No newline at end of file diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test index 637a416d..3b1d4c93 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test @@ -18,8 +18,7 @@ nextflow_workflow { } workflow { """ - // define inputs of the workflow here. Example: - // input[0] = file("test-file.txt") + input[0] = true """ } } From 30031c033d267c04f30d2e419550bf6b5f7f42d2 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Fri, 12 Jan 2024 17:38:54 +0000 Subject: [PATCH 666/852] Use monochrome_logs parameter correctly --- subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf b/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf index 42e115f8..aa852a5b 100644 --- a/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf @@ -58,7 +58,7 @@ workflow PIPELINE_INITIALISATION { // // Check config provided to the pipeline // - UTILS_NFCORE_PIPELINE () + UTILS_NFCORE_PIPELINE ( params.monochrome_logs ) // // Auto-detect input id type From b00799025be470f30b96cae784e9a6f0f9b6c05e Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 14 Jan 2024 20:58:51 +0000 Subject: [PATCH 667/852] Remove modules/ suffix from params.testdata_base_path --- .../local/multiqc_mappings_config/tests/main.nf.test | 2 +- modules/local/sra_runinfo_to_ftp/tests/main.nf.test | 2 +- .../custom/sratoolsncbisettings/tests/main.nf.test | 2 +- modules/nf-core/sratools/fasterqdump/nextflow.config | 10 ++++++++++ .../nf-core/sratools/fasterqdump/tests/main.nf.test | 8 ++++---- modules/nf-core/sratools/prefetch/nextflow.config | 8 ++++++++ modules/nf-core/sratools/prefetch/tests/main.nf.test | 4 ++-- modules/nf-core/untar/tests/main.nf.test | 4 ++-- .../local/utils_nfcore_fetchngs_pipeline/main.nf | 4 +++- .../nextflow.config | 2 ++ tests/main.nf.test | 10 ++++++++++ tests/nextflow.config | 7 ++----- workflows/sra/nextflow.config | 2 ++ 13 files changed, 48 insertions(+), 17 deletions(-) create mode 100644 modules/nf-core/sratools/fasterqdump/nextflow.config create mode 100644 modules/nf-core/sratools/prefetch/nextflow.config create mode 100644 subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/nextflow.config diff --git a/modules/local/multiqc_mappings_config/tests/main.nf.test b/modules/local/multiqc_mappings_config/tests/main.nf.test index c1b2c5df..9a9b396f 100644 --- a/modules/local/multiqc_mappings_config/tests/main.nf.test +++ b/modules/local/multiqc_mappings_config/tests/main.nf.test @@ -16,7 +16,7 @@ nextflow_process { process { """ - input[0] = file(params.pipelines_test_data_base + 'modules/local/multiqc_mappings_config/SRX9626017_SRR13191702.mappings.csv', checkIfExists: true) + input[0] = file(params.testdata_base_path + 'pipelines/fetchngs/1.15.0/modules/local/multiqc_mappings_config/SRX9626017_SRR13191702.mappings.csv', checkIfExists: true) """ } } diff --git a/modules/local/sra_runinfo_to_ftp/tests/main.nf.test b/modules/local/sra_runinfo_to_ftp/tests/main.nf.test index 31224dab..941ebd6b 100644 --- a/modules/local/sra_runinfo_to_ftp/tests/main.nf.test +++ b/modules/local/sra_runinfo_to_ftp/tests/main.nf.test @@ -16,7 +16,7 @@ nextflow_process { process { """ - input[0] = file(params.pipelines_test_data_base + 'modules/local/sra_runinfo_to_ftp/SRR13191702.runinfo.tsv', checkIfExists: true) + input[0] = file(params.testdata_base_path + 'pipelines/fetchngs/1.15.0/modules/local/sra_runinfo_to_ftp/SRR13191702.runinfo.tsv', checkIfExists: true) """ } } diff --git a/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test b/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test index 883a8d1e..bb298eec 100644 --- a/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test +++ b/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test @@ -21,7 +21,7 @@ nextflow_process { process { """ file(params.settings_path).mkdirs() - def settings = file(params.testdata_base_path + '/generic/config/ncbi_user_settings.mkfg', checkIfExists: true) + def settings = file(params.testdata_base_path + 'modules/generic/config/ncbi_user_settings.mkfg', checkIfExists: true) settings.copyTo(params.settings_file) """ } diff --git a/modules/nf-core/sratools/fasterqdump/nextflow.config b/modules/nf-core/sratools/fasterqdump/nextflow.config new file mode 100644 index 00000000..f98b140d --- /dev/null +++ b/modules/nf-core/sratools/fasterqdump/nextflow.config @@ -0,0 +1,10 @@ +process { + withName: SRATOOLS_FASTERQDUMP { + ext.args = '--split-files --include-technical' + publishDir = [ + path: { "${params.outdir}/fastq" }, + mode: params.publish_dir_mode, + pattern: "*.fastq.gz" + ] + } +} \ No newline at end of file diff --git a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test index af6b26d8..1f6ed26c 100644 --- a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test +++ b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test @@ -15,7 +15,7 @@ nextflow_process { script "modules/nf-core/untar/main.nf" process { """ - input[0] = Channel.of([ [], file(params.testdata_base_path + 'genomics/sarscov2/illumina/sra/SRR13255544.tar.gz', checkIfExists: true) ]) + input[0] = Channel.of([ [], file(params.testdata_base_path + 'modules/genomics/sarscov2/illumina/sra/SRR13255544.tar.gz', checkIfExists: true) ]) """ } } @@ -25,7 +25,7 @@ nextflow_process { process { """ input[0] = UNTAR.out.untar.map{ meta, files -> [ [ id:'test_single_end', single_end:true ], files]} - input[1] = file(params.testdata_base_path + 'generic/config/ncbi_user_settings.mkfg', checkIfExists: true) + input[1] = file(params.testdata_base_path + 'modules/generic/config/ncbi_user_settings.mkfg', checkIfExists: true) input[2] = [] """ } @@ -46,7 +46,7 @@ nextflow_process { script "modules/nf-core/untar/main.nf" process { """ - input[0] = Channel.of([ [], file(params.testdata_base_path + 'genomics/sarscov2/illumina/sra/SRR11140744.tar.gz', checkIfExists: true) ]) + input[0] = Channel.of([ [], file(params.testdata_base_path + 'modules/genomics/sarscov2/illumina/sra/SRR11140744.tar.gz', checkIfExists: true) ]) """ } } @@ -56,7 +56,7 @@ nextflow_process { process { """ input[0] = UNTAR.out.untar.map{ meta, files -> [ [ id:'test_paired_end', single_end:false ], files]} - input[1] = file(params.testdata_base_path + 'generic/config/ncbi_user_settings.mkfg', checkIfExists: true) + input[1] = file(params.testdata_base_path + 'modules/generic/config/ncbi_user_settings.mkfg', checkIfExists: true) input[2] = [] """ } diff --git a/modules/nf-core/sratools/prefetch/nextflow.config b/modules/nf-core/sratools/prefetch/nextflow.config new file mode 100644 index 00000000..a2ca8848 --- /dev/null +++ b/modules/nf-core/sratools/prefetch/nextflow.config @@ -0,0 +1,8 @@ +process { + withName: SRATOOLS_PREFETCH { + publishDir = [ + path: { "${params.outdir}/sra" }, + enabled: false + ] + } +} \ No newline at end of file diff --git a/modules/nf-core/sratools/prefetch/tests/main.nf.test b/modules/nf-core/sratools/prefetch/tests/main.nf.test index d88c1b67..99662cdc 100644 --- a/modules/nf-core/sratools/prefetch/tests/main.nf.test +++ b/modules/nf-core/sratools/prefetch/tests/main.nf.test @@ -16,7 +16,7 @@ nextflow_process { process { """ input[0] = Channel.of([ [ id:'test', single_end:false ], 'DRR000774' ]) - input[1] = file(params.testdata_base_path + '/generic/config/ncbi_user_settings.mkfg', checkIfExists: true) + input[1] = file(params.testdata_base_path + 'modules/generic/config/ncbi_user_settings.mkfg', checkIfExists: true) input[2] = [] """ } @@ -39,7 +39,7 @@ nextflow_process { process { """ input[0] = Channel.of([ [ id:'test', single_end:false ], 'SRR1170046' ]) - input[1] = file(params.testdata_base_path + '/generic/config/ncbi_user_settings.mkfg', checkIfExists: true) + input[1] = file(params.testdata_base_path + 'modules/generic/config/ncbi_user_settings.mkfg', checkIfExists: true) input[2] = [] """ } diff --git a/modules/nf-core/untar/tests/main.nf.test b/modules/nf-core/untar/tests/main.nf.test index bcf09a00..f57234f6 100644 --- a/modules/nf-core/untar/tests/main.nf.test +++ b/modules/nf-core/untar/tests/main.nf.test @@ -16,7 +16,7 @@ nextflow_process { } process { """ - input[0] = [ [], file(params.testdata_base_path + 'genomics/sarscov2/genome/db/kraken2.tar.gz', checkIfExists: true) ] + input[0] = [ [], file(params.testdata_base_path + 'modules/genomics/sarscov2/genome/db/kraken2.tar.gz', checkIfExists: true) ] """ } } @@ -38,7 +38,7 @@ nextflow_process { } process { """ - input[0] = [ [], file(params.testdata_base_path + 'generic/tar/hello.tar.gz', checkIfExists: true) ] + input[0] = [ [], file(params.testdata_base_path + 'modules/generic/tar/hello.tar.gz', checkIfExists: true) ] """ } } diff --git a/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf b/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf index aa852a5b..b36c6a24 100644 --- a/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf @@ -58,7 +58,9 @@ workflow PIPELINE_INITIALISATION { // // Check config provided to the pipeline // - UTILS_NFCORE_PIPELINE ( params.monochrome_logs ) + UTILS_NFCORE_PIPELINE ( + params.monochrome_logs + ) // // Auto-detect input id type diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/nextflow.config b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/nextflow.config new file mode 100644 index 00000000..b11c499f --- /dev/null +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/nextflow.config @@ -0,0 +1,2 @@ +includeConfig '../../../modules/nf-core/sratools/prefetch/nextflow.config' +includeConfig '../../../modules/nf-core/sratools/fasterqdump/nextflow.config' \ No newline at end of file diff --git a/tests/main.nf.test b/tests/main.nf.test index 8bfd4af2..2e2dd509 100644 --- a/tests/main.nf.test +++ b/tests/main.nf.test @@ -27,9 +27,14 @@ nextflow_pipeline { { assert new File("$outputDir/fastq/md5/DRX026011_DRR028935_1.fastq.gz.md5").exists() }, { assert new File("$outputDir/fastq/md5/DRX026011_DRR028935_2.fastq.gz.md5").exists() }, { assert new File("$outputDir/fastq/md5/ERX1234253_ERR1160846.fastq.gz.md5").exists() }, + { assert new File("$outputDir/fastq/md5/SRX10940790_SRR14593545_1.fastq.gz.md5").exists() }, + { assert new File("$outputDir/fastq/md5/SRX10940790_SRR14593545_2.fastq.gz.md5").exists() }, + { assert new File("$outputDir/fastq/md5/SRX11047067_SRR14709033.fastq.gz.md5").exists() }, { assert new File("$outputDir/fastq/md5/SRX17709227_SRR21711856.fastq.gz.md5").exists() }, { assert new File("$outputDir/fastq/md5/SRX17709228_SRR21711855.fastq.gz.md5").exists() }, { assert new File("$outputDir/fastq/md5/SRX6725035_SRR9984183.fastq.gz.md5").exists() }, + { assert new File("$outputDir/fastq/md5/SRX9315476_SRR12848126_1.fastq.gz.md5").exists() }, + { assert new File("$outputDir/fastq/md5/SRX9315476_SRR12848126_2.fastq.gz.md5").exists() }, { assert new File("$outputDir/fastq/md5/SRX9504942_SRR13055517_1.fastq.gz.md5").exists() }, { assert new File("$outputDir/fastq/md5/SRX9504942_SRR13055517_2.fastq.gz.md5").exists() }, { assert new File("$outputDir/fastq/md5/SRX9504942_SRR13055518_1.fastq.gz.md5").exists() }, @@ -44,9 +49,14 @@ nextflow_pipeline { { assert new File("$outputDir/fastq/DRX026011_DRR028935_1.fastq.gz").exists() }, { assert new File("$outputDir/fastq/DRX026011_DRR028935_2.fastq.gz").exists() }, { assert new File("$outputDir/fastq/ERX1234253_ERR1160846.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/SRX10940790_SRR14593545_1.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/SRX10940790_SRR14593545_2.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/SRX11047067_SRR14709033.fastq.gz").exists() }, { assert new File("$outputDir/fastq/SRX17709227_SRR21711856.fastq.gz").exists() }, { assert new File("$outputDir/fastq/SRX17709228_SRR21711855.fastq.gz").exists() }, { assert new File("$outputDir/fastq/SRX6725035_SRR9984183.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/SRX9315476_SRR12848126_1.fastq.gz").exists() }, + { assert new File("$outputDir/fastq/SRX9315476_SRR12848126_2.fastq.gz").exists() }, { assert new File("$outputDir/fastq/SRX9504942_SRR13055517_1.fastq.gz").exists() }, { assert new File("$outputDir/fastq/SRX9504942_SRR13055517_2.fastq.gz").exists() }, { assert new File("$outputDir/fastq/SRX9504942_SRR13055518_1.fastq.gz").exists() }, diff --git a/tests/nextflow.config b/tests/nextflow.config index 9748de91..19bfb263 100644 --- a/tests/nextflow.config +++ b/tests/nextflow.config @@ -1,9 +1,6 @@ params { - // Base directory for nf-core/modules test data - testdata_base_path = 's3://ngi-igenomes/testdata/nf-core/modules/' - - // Base directory for pipeline test data - pipelines_test_data_base = 's3://ngi-igenomes/testdata/nf-core/pipelines/fetchngs/1.15.0/' + // Base directory for nf-core/modules and pipeline test data + testdata_base_path = 's3://ngi-igenomes/testdata/nf-core/' } // Impose sensible resource limits for testing diff --git a/workflows/sra/nextflow.config b/workflows/sra/nextflow.config index b053d8a9..a48bcb73 100644 --- a/workflows/sra/nextflow.config +++ b/workflows/sra/nextflow.config @@ -3,3 +3,5 @@ includeConfig "../../modules/local/sra_fastq_ftp/nextflow.config" includeConfig "../../modules/local/sra_ids_to_runinfo/nextflow.config" includeConfig "../../modules/local/sra_runinfo_to_ftp/nextflow.config" includeConfig "../../modules/local/sra_to_samplesheet/nextflow.config" +includeConfig "../../modules/nf-core/sratools/prefetch/nextflow.config" +includeConfig "../../subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/nextflow.config" \ No newline at end of file From eadfda5b8bd50b0beb5fc99557514f17eaf7f6aa Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 14 Jan 2024 22:10:32 +0000 Subject: [PATCH 668/852] Fix pipeline tests --- tests/main.nf.test | 5 ----- 1 file changed, 5 deletions(-) diff --git a/tests/main.nf.test b/tests/main.nf.test index 2e2dd509..1ab2f73a 100644 --- a/tests/main.nf.test +++ b/tests/main.nf.test @@ -27,14 +27,9 @@ nextflow_pipeline { { assert new File("$outputDir/fastq/md5/DRX026011_DRR028935_1.fastq.gz.md5").exists() }, { assert new File("$outputDir/fastq/md5/DRX026011_DRR028935_2.fastq.gz.md5").exists() }, { assert new File("$outputDir/fastq/md5/ERX1234253_ERR1160846.fastq.gz.md5").exists() }, - { assert new File("$outputDir/fastq/md5/SRX10940790_SRR14593545_1.fastq.gz.md5").exists() }, - { assert new File("$outputDir/fastq/md5/SRX10940790_SRR14593545_2.fastq.gz.md5").exists() }, - { assert new File("$outputDir/fastq/md5/SRX11047067_SRR14709033.fastq.gz.md5").exists() }, { assert new File("$outputDir/fastq/md5/SRX17709227_SRR21711856.fastq.gz.md5").exists() }, { assert new File("$outputDir/fastq/md5/SRX17709228_SRR21711855.fastq.gz.md5").exists() }, { assert new File("$outputDir/fastq/md5/SRX6725035_SRR9984183.fastq.gz.md5").exists() }, - { assert new File("$outputDir/fastq/md5/SRX9315476_SRR12848126_1.fastq.gz.md5").exists() }, - { assert new File("$outputDir/fastq/md5/SRX9315476_SRR12848126_2.fastq.gz.md5").exists() }, { assert new File("$outputDir/fastq/md5/SRX9504942_SRR13055517_1.fastq.gz.md5").exists() }, { assert new File("$outputDir/fastq/md5/SRX9504942_SRR13055517_2.fastq.gz.md5").exists() }, { assert new File("$outputDir/fastq/md5/SRX9504942_SRR13055518_1.fastq.gz.md5").exists() }, From 6cbcd6454ca8241537e9807be8f86b3a9d733c81 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 14 Jan 2024 22:40:41 +0000 Subject: [PATCH 669/852] Add config to fasterqdump tests to reset ext.args set in fetchngs --- .../nf-core/sratools/fasterqdump/tests/main.nf.test | 10 +++++++++- .../nf-core/sratools/fasterqdump/tests/nextflow.config | 5 +++++ 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 modules/nf-core/sratools/fasterqdump/tests/nextflow.config diff --git a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test index 1f6ed26c..c341b359 100644 --- a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test +++ b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test @@ -1,6 +1,7 @@ nextflow_process { name "Test Process SRATOOLS_FASTERQDUMP" script "../main.nf" + config "./nextflow.config" process "SRATOOLS_FASTERQDUMP" tag "modules" tag "modules_nfcore" @@ -9,7 +10,6 @@ nextflow_process { tag "sratools/fasterqdump" test("Single-end") { - setup { run("UNTAR") { script "modules/nf-core/untar/main.nf" @@ -22,6 +22,10 @@ nextflow_process { } when { + params { + outdir = "$outputDir" + } + process { """ input[0] = UNTAR.out.untar.map{ meta, files -> [ [ id:'test_single_end', single_end:true ], files]} @@ -53,6 +57,10 @@ nextflow_process { } when { + params { + outdir = "$outputDir" + } + process { """ input[0] = UNTAR.out.untar.map{ meta, files -> [ [ id:'test_paired_end', single_end:false ], files]} diff --git a/modules/nf-core/sratools/fasterqdump/tests/nextflow.config b/modules/nf-core/sratools/fasterqdump/tests/nextflow.config new file mode 100644 index 00000000..23e4100b --- /dev/null +++ b/modules/nf-core/sratools/fasterqdump/tests/nextflow.config @@ -0,0 +1,5 @@ +process { + withName: SRATOOLS_FASTERQDUMP { + ext.args = '' + } +} \ No newline at end of file From 5b7349f9681fd5be3ce552c3d987d4b26b1b9336 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 14 Jan 2024 22:52:14 +0000 Subject: [PATCH 670/852] Update all nf-core modules and subworkflows --- modules.json | 8 ++++---- modules/nf-core/sratools/fasterqdump/tests/main.nf.test | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/modules.json b/modules.json index f7829fdd..a10eaf6b 100644 --- a/modules.json +++ b/modules.json @@ -7,22 +7,22 @@ "nf-core": { "custom/sratoolsncbisettings": { "branch": "master", - "git_sha": "20e78a9868eaa69c8cac91152397def32374b807", + "git_sha": "8e6960947b6647952b97667173805b34b40f25d6", "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] }, "sratools/fasterqdump": { "branch": "master", - "git_sha": "20e78a9868eaa69c8cac91152397def32374b807", + "git_sha": "8e6960947b6647952b97667173805b34b40f25d6", "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] }, "sratools/prefetch": { "branch": "master", - "git_sha": "20e78a9868eaa69c8cac91152397def32374b807", + "git_sha": "8e6960947b6647952b97667173805b34b40f25d6", "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] }, "untar": { "branch": "master", - "git_sha": "20e78a9868eaa69c8cac91152397def32374b807", + "git_sha": "8e6960947b6647952b97667173805b34b40f25d6", "installed_by": ["modules"] } } diff --git a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test index c341b359..3b9ed965 100644 --- a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test +++ b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test @@ -10,6 +10,7 @@ nextflow_process { tag "sratools/fasterqdump" test("Single-end") { + setup { run("UNTAR") { script "modules/nf-core/untar/main.nf" From fdaf417fd487790b32d6caceeeb09c5e3a34c7e4 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 15 Jan 2024 15:42:31 +0000 Subject: [PATCH 671/852] Split --testdata_base_path into --modules_testdata_base_path and --pipelines_testdata_base_path --- modules/local/multiqc_mappings_config/tests/main.nf.test | 2 +- modules/local/sra_runinfo_to_ftp/tests/main.nf.test | 2 +- .../custom/sratoolsncbisettings/tests/main.nf.test | 2 +- modules/nf-core/sratools/fasterqdump/tests/main.nf.test | 8 ++++---- modules/nf-core/sratools/prefetch/tests/main.nf.test | 4 ++-- modules/nf-core/untar/tests/main.nf.test | 4 ++-- tests/nextflow.config | 7 +++++-- 7 files changed, 16 insertions(+), 13 deletions(-) diff --git a/modules/local/multiqc_mappings_config/tests/main.nf.test b/modules/local/multiqc_mappings_config/tests/main.nf.test index 9a9b396f..cfb43166 100644 --- a/modules/local/multiqc_mappings_config/tests/main.nf.test +++ b/modules/local/multiqc_mappings_config/tests/main.nf.test @@ -16,7 +16,7 @@ nextflow_process { process { """ - input[0] = file(params.testdata_base_path + 'pipelines/fetchngs/1.15.0/modules/local/multiqc_mappings_config/SRX9626017_SRR13191702.mappings.csv', checkIfExists: true) + input[0] = file(params.pipelines_testdata_base_path + 'csv/SRX9626017_SRR13191702.mappings.csv', checkIfExists: true) """ } } diff --git a/modules/local/sra_runinfo_to_ftp/tests/main.nf.test b/modules/local/sra_runinfo_to_ftp/tests/main.nf.test index 941ebd6b..347e3392 100644 --- a/modules/local/sra_runinfo_to_ftp/tests/main.nf.test +++ b/modules/local/sra_runinfo_to_ftp/tests/main.nf.test @@ -16,7 +16,7 @@ nextflow_process { process { """ - input[0] = file(params.testdata_base_path + 'pipelines/fetchngs/1.15.0/modules/local/sra_runinfo_to_ftp/SRR13191702.runinfo.tsv', checkIfExists: true) + input[0] = file(params.pipelines_testdata_base_path + 'tsv/SRR13191702.runinfo.tsv', checkIfExists: true) """ } } diff --git a/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test b/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test index bb298eec..9f178678 100644 --- a/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test +++ b/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test @@ -21,7 +21,7 @@ nextflow_process { process { """ file(params.settings_path).mkdirs() - def settings = file(params.testdata_base_path + 'modules/generic/config/ncbi_user_settings.mkfg', checkIfExists: true) + def settings = file(params.modules_testdata_base_path + 'generic/config/ncbi_user_settings.mkfg', checkIfExists: true) settings.copyTo(params.settings_file) """ } diff --git a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test index 3b9ed965..48722e4e 100644 --- a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test +++ b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test @@ -16,7 +16,7 @@ nextflow_process { script "modules/nf-core/untar/main.nf" process { """ - input[0] = Channel.of([ [], file(params.testdata_base_path + 'modules/genomics/sarscov2/illumina/sra/SRR13255544.tar.gz', checkIfExists: true) ]) + input[0] = Channel.of([ [], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/sra/SRR13255544.tar.gz', checkIfExists: true) ]) """ } } @@ -30,7 +30,7 @@ nextflow_process { process { """ input[0] = UNTAR.out.untar.map{ meta, files -> [ [ id:'test_single_end', single_end:true ], files]} - input[1] = file(params.testdata_base_path + 'modules/generic/config/ncbi_user_settings.mkfg', checkIfExists: true) + input[1] = file(params.modules_testdata_base_path + 'generic/config/ncbi_user_settings.mkfg', checkIfExists: true) input[2] = [] """ } @@ -51,7 +51,7 @@ nextflow_process { script "modules/nf-core/untar/main.nf" process { """ - input[0] = Channel.of([ [], file(params.testdata_base_path + 'modules/genomics/sarscov2/illumina/sra/SRR11140744.tar.gz', checkIfExists: true) ]) + input[0] = Channel.of([ [], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/sra/SRR11140744.tar.gz', checkIfExists: true) ]) """ } } @@ -65,7 +65,7 @@ nextflow_process { process { """ input[0] = UNTAR.out.untar.map{ meta, files -> [ [ id:'test_paired_end', single_end:false ], files]} - input[1] = file(params.testdata_base_path + 'modules/generic/config/ncbi_user_settings.mkfg', checkIfExists: true) + input[1] = file(params.modules_testdata_base_path + 'generic/config/ncbi_user_settings.mkfg', checkIfExists: true) input[2] = [] """ } diff --git a/modules/nf-core/sratools/prefetch/tests/main.nf.test b/modules/nf-core/sratools/prefetch/tests/main.nf.test index 99662cdc..ed710ba0 100644 --- a/modules/nf-core/sratools/prefetch/tests/main.nf.test +++ b/modules/nf-core/sratools/prefetch/tests/main.nf.test @@ -16,7 +16,7 @@ nextflow_process { process { """ input[0] = Channel.of([ [ id:'test', single_end:false ], 'DRR000774' ]) - input[1] = file(params.testdata_base_path + 'modules/generic/config/ncbi_user_settings.mkfg', checkIfExists: true) + input[1] = file(params.modules_testdata_base_path + 'generic/config/ncbi_user_settings.mkfg', checkIfExists: true) input[2] = [] """ } @@ -39,7 +39,7 @@ nextflow_process { process { """ input[0] = Channel.of([ [ id:'test', single_end:false ], 'SRR1170046' ]) - input[1] = file(params.testdata_base_path + 'modules/generic/config/ncbi_user_settings.mkfg', checkIfExists: true) + input[1] = file(params.modules_testdata_base_path + 'generic/config/ncbi_user_settings.mkfg', checkIfExists: true) input[2] = [] """ } diff --git a/modules/nf-core/untar/tests/main.nf.test b/modules/nf-core/untar/tests/main.nf.test index f57234f6..679e83c7 100644 --- a/modules/nf-core/untar/tests/main.nf.test +++ b/modules/nf-core/untar/tests/main.nf.test @@ -16,7 +16,7 @@ nextflow_process { } process { """ - input[0] = [ [], file(params.testdata_base_path + 'modules/genomics/sarscov2/genome/db/kraken2.tar.gz', checkIfExists: true) ] + input[0] = [ [], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/db/kraken2.tar.gz', checkIfExists: true) ] """ } } @@ -38,7 +38,7 @@ nextflow_process { } process { """ - input[0] = [ [], file(params.testdata_base_path + 'modules/generic/tar/hello.tar.gz', checkIfExists: true) ] + input[0] = [ [], file(params.modules_testdata_base_path + 'generic/tar/hello.tar.gz', checkIfExists: true) ] """ } } diff --git a/tests/nextflow.config b/tests/nextflow.config index 19bfb263..d75ad44b 100644 --- a/tests/nextflow.config +++ b/tests/nextflow.config @@ -1,6 +1,9 @@ params { - // Base directory for nf-core/modules and pipeline test data - testdata_base_path = 's3://ngi-igenomes/testdata/nf-core/' + // Base directory for nf-core/modules test data + modules_testdata_base_path = 's3://ngi-igenomes/testdata/nf-core/modules/' + + // Base directory for nf-core/fetchngs test data + pipelines_testdata_base_path = 's3://ngi-igenomes/testdata/nf-core/pipelines/fetchngs/1.15.0/' } // Impose sensible resource limits for testing From 3f58f32652db24600a1f04a8edc7b24c82296931 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 15 Jan 2024 16:59:46 +0000 Subject: [PATCH 672/852] Update all nf-core modules and subworkflows --- modules.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules.json b/modules.json index a10eaf6b..66aac80d 100644 --- a/modules.json +++ b/modules.json @@ -7,22 +7,22 @@ "nf-core": { "custom/sratoolsncbisettings": { "branch": "master", - "git_sha": "8e6960947b6647952b97667173805b34b40f25d6", + "git_sha": "e719354ba77df0a1bd310836aa2039b45c29d620", "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] }, "sratools/fasterqdump": { "branch": "master", - "git_sha": "8e6960947b6647952b97667173805b34b40f25d6", + "git_sha": "e719354ba77df0a1bd310836aa2039b45c29d620", "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] }, "sratools/prefetch": { "branch": "master", - "git_sha": "8e6960947b6647952b97667173805b34b40f25d6", + "git_sha": "e719354ba77df0a1bd310836aa2039b45c29d620", "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] }, "untar": { "branch": "master", - "git_sha": "8e6960947b6647952b97667173805b34b40f25d6", + "git_sha": "e719354ba77df0a1bd310836aa2039b45c29d620", "installed_by": ["modules"] } } From dfa87b9f9590cc9fe902f791cf5a3ee118755485 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 17 Jan 2024 12:57:27 +0000 Subject: [PATCH 673/852] Refactor how versions are handled in pipeline --- main.nf | 17 ++-- .../utils_nfcore_fetchngs_pipeline/main.nf | 63 ++++++-------- .../nf-core/utils_nfcore_pipeline/main.nf | 82 +++++++++++++++---- workflows/sra/main.nf | 12 +++ workflows/synapse/main.nf | 12 +++ 5 files changed, 120 insertions(+), 66 deletions(-) diff --git a/main.nf b/main.nf index 2fe0061e..a2e5f701 100644 --- a/main.nf +++ b/main.nf @@ -30,25 +30,19 @@ workflow NFCORE_FETCHNGS { main: - ch_versions = Channel.empty() - // // WORKFLOW: Download FastQ files for SRA / ENA / GEO / DDBJ ids // if (params.input_type == 'sra') { SRA ( ids ) - ch_versions = SRA.out.versions // // WORKFLOW: Download FastQ files for Synapse ids // } else if (params.input_type == 'synapse') { SYNAPSE ( ids ) - ch_versions = SYNAPSE.out.versions } - emit: - versions = ch_versions } /* @@ -73,20 +67,21 @@ workflow { // // WORKFLOW: Run primary workflows for the pipeline // - NFCORE_FETCHNGS ( - PIPELINE_INITIALISATION.out.ids + NFCORE_FETCHNGS ( + PIPELINE_INITIALISATION.out.ids ) // // SUBWORKFLOW: Run completion tasks // PIPELINE_COMPLETION ( - NFCORE_FETCHNGS.out.versions, params.input_type, params.email, params.email_on_fail, - params.hook_url, - PIPELINE_INITIALISATION.out.summary_params + params.plaintext_email, + params.outdir, + params.monochrome_logs, + params.hook_url ) } diff --git a/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf b/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf index b36c6a24..27527f93 100644 --- a/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf @@ -8,17 +8,17 @@ ======================================================================================== */ -include { UTILS_NEXTFLOW_PIPELINE; getWorkflowVersion } from '../../nf-core/utils_nextflow_pipeline' -include { UTILS_NFVALIDATION_PLUGIN } from '../../nf-core/utils_nfvalidation_plugin' -include { - UTILS_NFCORE_PIPELINE; - workflowCitation; - nfCoreLogo; - dashedLine; - completionEmail; - completionSummary; - imNotification -} from '../../nf-core/utils_nfcore_pipeline' +include { UTILS_NEXTFLOW_PIPELINE } from '../../nf-core/utils_nextflow_pipeline' +include { getWorkflowVersion } from '../../nf-core/utils_nextflow_pipeline' +include { UTILS_NFVALIDATION_PLUGIN } from '../../nf-core/utils_nfvalidation_plugin' +include { paramsSummaryMap } from 'plugin/nf-validation' +include { UTILS_NFCORE_PIPELINE } from '../../nf-core/utils_nfcore_pipeline' +include { workflowCitation } from '../../nf-core/utils_nfcore_pipeline' +include { nfCoreLogo } from '../../nf-core/utils_nfcore_pipeline' +include { dashedLine } from '../../nf-core/utils_nfcore_pipeline' +include { completionEmail } from '../../nf-core/utils_nfcore_pipeline' +include { completionSummary } from '../../nf-core/utils_nfcore_pipeline' +include { imNotification } from '../../nf-core/utils_nfcore_pipeline' /* ======================================================================================== @@ -43,8 +43,8 @@ workflow PIPELINE_INITIALISATION { // // Validate parameters and generate parameter summary to stdout // - def pre_help_text = nfCoreLogo(getWorkflowVersion()) - def post_help_text = '\n' + workflowCitation() + '\n' + dashedLine() + def pre_help_text = nfCoreLogo(getWorkflowVersion(), params.monochrome_logs) + def post_help_text = '\n' + workflowCitation() + '\n' + dashedLine(params.monochrome_logs) def String workflow_command = "nextflow run ${workflow.manifest.name} -profile --input ids.csv --outdir " UTILS_NFVALIDATION_PLUGIN ( params.help, @@ -58,9 +58,7 @@ workflow PIPELINE_INITIALISATION { // // Check config provided to the pipeline // - UTILS_NFCORE_PIPELINE ( - params.monochrome_logs - ) + UTILS_NFCORE_PIPELINE () // // Auto-detect input id type @@ -89,8 +87,7 @@ workflow PIPELINE_INITIALISATION { .set { ch_ids } emit: - ids = ch_ids - summary_params = UTILS_NFVALIDATION_PLUGIN.out.summary_params + ids = ch_ids } /* @@ -102,38 +99,30 @@ workflow PIPELINE_INITIALISATION { workflow PIPELINE_COMPLETION { take: - versions // channel: software tools versions - input_type // string: 'sra' or 'synapse' - email // string: email address - email_on_fail // string: email address sent on pipeline failure - hook_url // string: hook URL for notifications - summary_params // map: Groovy map of the parameters used in the pipeline + input_type // string: 'sra' or 'synapse' + email // string: email address + email_on_fail // string: email address sent on pipeline failure + plaintext_email // boolean: Send plain-text email instead of HTML + outdir // path: Path to output directory where results will be published + monochrome_logs // boolean: Disable ANSI colour codes in log output + hook_url // string: hook URL for notifications main: - // - // MODULE: Dump software versions for all tools used in the workflow - // - pipeline_version_info = Channel.of("""\"workflow\": - nextflow: ${workflow.nextflow.version} - ${workflow.manifest.name}: ${workflow.manifest.version} - """.stripIndent()) - - versions = versions.mix(pipeline_version_info) - versions.collectFile(name: 'fetchngs_mqc_versions.yml', storeDir: "${params.outdir}/pipeline_info") + summary_params = paramsSummaryMap(workflow, parameters_schema: "nextflow_schema.json") // // Completion email and summary // workflow.onComplete { if (email || email_on_fail) { - completionEmail(summary_params) + completionEmail(summary_params, getWorkflowVersion(), email, email_on_fail, plaintext_email, outdir, monochrome_logs) } - completionSummary() + completionSummary(monochrome_logs) if (hook_url) { - imNotification(summary_params) + imNotification(summary_params, getWorkflowVersion(), hook_url) } if (input_type == 'sra') { diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf index 5716198c..49063e0c 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf +++ b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf @@ -2,6 +2,8 @@ // Subworkflow with utility functions specific to the nf-core pipeline template // +import org.yaml.snakeyaml.Yaml + /* ======================================================================================== SUBWORKFLOW DEFINITION @@ -10,9 +12,6 @@ workflow UTILS_NFCORE_PIPELINE { - take: - monochrome_logs // boolean: Disable ANSI colour codes in log output - main: checkConfigProvided() @@ -54,10 +53,59 @@ def workflowCitation() { " https://github.com/${workflow.manifest.name}/blob/master/CITATIONS.md" } +// +// Get software versions for pipeline +// +def processVersionsFromYAML(yaml_file) { + Yaml parser = new Yaml() + versions = parser.load(yaml_file).collectEntries { k,v -> [ k.tokenize(':')[-1], v ] } + Yaml yaml = new Yaml() + return yaml.dumpAsMap(versions).trim() +} + +// +// Get workflow version for pipeline +// +def workflowVersionToYAML(workflow_version) { + return """ + 'Workflow': + "Nextflow": "$workflow.nextflow.version" + "$workflow.manifest.name": "${workflow_version}" + """.stripIndent().trim() +} + +// +// Get workflow summary for MultiQC +// +def paramsSummaryMultiqc(summary_params) { + def summary_section = '' + for (group in summary_params.keySet()) { + def group_params = summary_params.get(group) // This gets the parameters of that particular group + if (group_params) { + summary_section += "

$group

\n" + summary_section += "
\n" + for (param in group_params.keySet()) { + summary_section += "
$param
${group_params.get(param) ?: 'N/A'}
\n" + } + summary_section += "
\n" + } + } + + String yaml_file_text = "id: '${workflow.manifest.name.replace('/','-')}-summary'\n" + yaml_file_text += "description: ' - this information is collected when the pipeline is started.'\n" + yaml_file_text += "section_name: '${workflow.manifest.name} Workflow Summary'\n" + yaml_file_text += "section_href: 'https://github.com/${workflow.manifest.name}'\n" + yaml_file_text += "plot_type: 'html'\n" + yaml_file_text += "data: |\n" + yaml_file_text += "${summary_section}" + + return yaml_file_text +} + // // nf-core logo // -def nfCoreLogo(workflow_version, monochrome_logs = true) { +def nfCoreLogo(workflow_version, monochrome_logs=true) { Map colors = logColours(monochrome_logs) String.format( """\n @@ -76,7 +124,7 @@ def nfCoreLogo(workflow_version, monochrome_logs = true) { // // Return dashed line // -def dashedLine(monochrome_logs = true) { +def dashedLine(monochrome_logs=true) { Map colors = logColours(monochrome_logs) return "-${colors.dim}----------------------------------------------------${colors.reset}-" } @@ -84,7 +132,7 @@ def dashedLine(monochrome_logs = true) { // // ANSII colours used for terminal logging // -def logColours(monochrome_logs = true) { +def logColours(monochrome_logs=true) { Map colorcodes = [:] // Reset / Meta @@ -152,7 +200,7 @@ def logColours(monochrome_logs = true) { // // Construct and send completion email // -def completionEmail(summary_params, monochrome_logs = true) { +def completionEmail(summary_params, workflow_version, email, email_on_fail, plaintext_email, outdir, monochrome_logs=true) { // Set up the e-mail variables def subject = "[$workflow.manifest.name] Successful: $workflow.runName" @@ -178,7 +226,7 @@ def completionEmail(summary_params, monochrome_logs = true) { misc_fields['Nextflow Compile Timestamp'] = workflow.nextflow.timestamp def email_fields = [:] - email_fields['version'] = NfcoreTemplate.version(workflow) + email_fields['version'] = workflow_version email_fields['runName'] = workflow.runName email_fields['success'] = workflow.success email_fields['dateComplete'] = workflow.complete @@ -191,9 +239,9 @@ def completionEmail(summary_params, monochrome_logs = true) { email_fields['summary'] = summary << misc_fields // Check if we are only sending emails on failure - def email_address = params.email - if (!params.email && params.email_on_fail && !workflow.success) { - email_address = params.email_on_fail + def email_address = email + if (!email && email_on_fail && !workflow.success) { + email_address = email_on_fail } // Render the TXT template @@ -217,7 +265,7 @@ def completionEmail(summary_params, monochrome_logs = true) { Map colors = logColours(monochrome_logs) if (email_address) { try { - if (params.plaintext_email) { throw GroovyException('Send plaintext e-mail, not HTML') } + if (plaintext_email) { throw GroovyException('Send plaintext e-mail, not HTML') } // Try to send HTML e-mail using sendmail [ 'sendmail', '-t' ].execute() << sendmail_html log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Sent summary e-mail to $email_address (sendmail)-" @@ -230,7 +278,7 @@ def completionEmail(summary_params, monochrome_logs = true) { } // Write summary e-mail HTML to a file - def output_d = new File("${params.outdir}/pipeline_info/") + def output_d = new File("${outdir}/pipeline_info/") if (!output_d.exists()) { output_d.mkdirs() } @@ -243,7 +291,7 @@ def completionEmail(summary_params, monochrome_logs = true) { // // Print pipeline summary on completion // -def completionSummary(monochrome_logs = true) { +def completionSummary(monochrome_logs=true) { Map colors = logColours(monochrome_logs) if (workflow.success) { if (workflow.stats.ignoredCount == 0) { @@ -259,9 +307,7 @@ def completionSummary(monochrome_logs = true) { // // Construct and send a notification to a web server as JSON e.g. Microsoft Teams and Slack // -def imNotification(summary_params) { - def hook_url = params.hook_url - +def imNotification(summary_params, workflow_version, hook_url) { def summary = [:] for (group in summary_params.keySet()) { summary << summary_params[group] @@ -280,7 +326,7 @@ def imNotification(summary_params) { misc_fields['nxf_timestamp'] = workflow.nextflow.timestamp def msg_fields = [:] - msg_fields['version'] = NfcoreTemplate.version(workflow) + msg_fields['version'] = workflow_version msg_fields['runName'] = workflow.runName msg_fields['success'] = workflow.success msg_fields['dateComplete'] = workflow.complete diff --git a/workflows/sra/main.nf b/workflows/sra/main.nf index 3d487431..f1603c37 100644 --- a/workflows/sra/main.nf +++ b/workflows/sra/main.nf @@ -9,6 +9,9 @@ include { SRA_FASTQ_FTP } from '../../modules/local/sra_fastq_ftp' include { SRA_IDS_TO_RUNINFO } from '../../modules/local/sra_ids_to_runinfo' include { SRA_RUNINFO_TO_FTP } from '../../modules/local/sra_runinfo_to_ftp' include { SRA_TO_SAMPLESHEET } from '../../modules/local/sra_to_samplesheet' +include { getWorkflowVersion } from '../../subworkflows/nf-core/utils_nextflow_pipeline' +include { processVersionsFromYAML } from '../../subworkflows/nf-core/utils_nfcore_pipeline' +include { workflowVersionToYAML } from '../../subworkflows/nf-core/utils_nfcore_pipeline' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -150,6 +153,15 @@ workflow SRA { ch_sample_mappings_yml = MULTIQC_MAPPINGS_CONFIG.out.yml } + // + // Collate and save software versions + // + ch_versions + .unique() + .map { processVersionsFromYAML(it) } + .mix(Channel.of(workflowVersionToYAML(getWorkflowVersion()))) + .collectFile(storeDir: "${params.outdir}/pipeline_info", name: 'collated_software_mqc_versions.yml', newLine: true) + emit: samplesheet = ch_samplesheet mappings = ch_mappings diff --git a/workflows/synapse/main.nf b/workflows/synapse/main.nf index 6b5ea02c..54670057 100644 --- a/workflows/synapse/main.nf +++ b/workflows/synapse/main.nf @@ -9,6 +9,9 @@ include { SYNAPSE_SHOW } from '../../modules/local/synapse_show' include { SYNAPSE_GET } from '../../modules/local/synapse_get' include { SYNAPSE_TO_SAMPLESHEET } from '../../modules/local/synapse_to_samplesheet' include { SYNAPSE_MERGE_SAMPLESHEET } from '../../modules/local/synapse_merge_samplesheet' +include { getWorkflowVersion } from '../../subworkflows/nf-core/utils_nextflow_pipeline' +include { processVersionsFromYAML } from '../../subworkflows/nf-core/utils_nfcore_pipeline' +include { workflowVersionToYAML } from '../../subworkflows/nf-core/utils_nfcore_pipeline' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -105,6 +108,15 @@ workflow SYNAPSE { ) ch_versions = ch_versions.mix(SYNAPSE_MERGE_SAMPLESHEET.out.versions) + // + // Collate and save software versions + // + ch_versions + .unique() + .map { processVersionsFromYAML(it) } + .mix(Channel.of(workflowVersionToYAML(getWorkflowVersion()))) + .collectFile(storeDir: "${params.outdir}/pipeline_info", name: 'collated_software_mqc_versions.yml', newLine: true) + emit: fastq = ch_fastq samplesheet = SYNAPSE_MERGE_SAMPLESHEET.out.samplesheet From 775141dc50bf426251254e66795e08734bc6abc2 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 17 Jan 2024 13:28:40 +0000 Subject: [PATCH 674/852] Update CHANGELOG --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 04264a5f..d512d75c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,8 +9,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 Special thanks to the following for their contributions to the release: +- [Adam Talbot](https://github.com/adamrtalbot) - [Alexandru Mizeranschi](https://github.com/nicolae06) - [Alexander Blaessle](https://github.com/alexblaessle) +- [Maxime Garcia](https://github.com/maxulysse) - [Sebastian Uhrig](https://github.com/suhrig) Thank you to everyone else that has contributed by reporting bugs, enhancements or in any other way, shape or form. @@ -18,9 +20,10 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements ### Enhancements & fixes - [PR #238](https://github.com/nf-core/fetchngs/pull/238) - Resolved bug when prefetching large studies ([#236](https://github.com/nf-core/fetchngs/issues/236)) -- [PR #241](https://github.com/nf-core/fetchngs/pull/241) - Download of big files time out and don't resume ([#169](https://github.com/nf-core/fetchngs/issues/169)) +- [PR #241](https://github.com/nf-core/fetchngs/pull/241) - Use wget instead of curl to download files from FTP ([#169](https://github.com/nf-core/fetchngs/issues/169), [#194](https://github.com/nf-core/fetchngs/issues/194)) - [PR #242](https://github.com/nf-core/fetchngs/pull/242) - Template update for nf-core/tools v2.11 - [PR #243](https://github.com/nf-core/fetchngs/pull/243) - Fixes for [PR #238](https://github.com/nf-core/fetchngs/pull/238) +- [PR #245](https://github.com/nf-core/fetchngs/pull/246) - Refactor nf-test CI and test and other pre-release fixes ([#233](https://github.com/nf-core/fetchngs/issues/233)) - [PR #246](https://github.com/nf-core/fetchngs/pull/246) - Handle dark/light mode for logo in GitHub README properly - [PR #248](https://github.com/nf-core/fetchngs/pull/248) - Update pipeline level test data path to use mirror on s3 - [PR #249](https://github.com/nf-core/fetchngs/pull/249) - Update modules which includes absolute paths for test data, making module level test compatible within the pipeline. From 790124a8b58b760d79237250c1494e0b69cb708f Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 17 Jan 2024 13:32:45 +0000 Subject: [PATCH 675/852] Fix ECLint --- main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main.nf b/main.nf index a2e5f701..64bc75cf 100644 --- a/main.nf +++ b/main.nf @@ -67,8 +67,8 @@ workflow { // // WORKFLOW: Run primary workflows for the pipeline // - NFCORE_FETCHNGS ( - PIPELINE_INITIALISATION.out.ids + NFCORE_FETCHNGS ( + PIPELINE_INITIALISATION.out.ids ) // From 5114f76fa063b43c3c02c4d3cb0a6386f46b721e Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Wed, 17 Jan 2024 13:36:12 +0000 Subject: [PATCH 676/852] [automated] Fix linting with Prettier --- .devcontainer/devcontainer.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 4ecfbfe3..4a9bc5c7 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -18,11 +18,11 @@ "python.linting.flake8Path": "/opt/conda/bin/flake8", "python.linting.pycodestylePath": "/opt/conda/bin/pycodestyle", "python.linting.pydocstylePath": "/opt/conda/bin/pydocstyle", - "python.linting.pylintPath": "/opt/conda/bin/pylint" + "python.linting.pylintPath": "/opt/conda/bin/pylint", }, // Add the IDs of extensions you want installed when the container is created. - "extensions": ["ms-python.python", "ms-python.vscode-pylance", "nf-core.nf-core-extensionpack"] - } - } + "extensions": ["ms-python.python", "ms-python.vscode-pylance", "nf-core.nf-core-extensionpack"], + }, + }, } From ca88a5e368fc68d4734ac513a7d6836b83809fc2 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 17 Jan 2024 15:19:27 +0100 Subject: [PATCH 677/852] Update subworkflows/nf-core/utils_nfcore_pipeline/main.nf Co-authored-by: Robert Syme --- subworkflows/nf-core/utils_nfcore_pipeline/main.nf | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf index 49063e0c..77086031 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf +++ b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf @@ -57,9 +57,8 @@ def workflowCitation() { // Get software versions for pipeline // def processVersionsFromYAML(yaml_file) { - Yaml parser = new Yaml() - versions = parser.load(yaml_file).collectEntries { k,v -> [ k.tokenize(':')[-1], v ] } Yaml yaml = new Yaml() + versions = yaml.load(yaml_file).collectEntries { k,v -> [ k.tokenize(':')[-1], v ] } return yaml.dumpAsMap(versions).trim() } From 9cee7471d9d8aa75ee39c838135e02bd96f802ad Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 17 Jan 2024 16:45:32 +0000 Subject: [PATCH 678/852] Sort includes alphabetically --- .../local/utils_nfcore_fetchngs_pipeline/main.nf | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf b/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf index 27527f93..23bf3ebd 100644 --- a/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf @@ -8,17 +8,17 @@ ======================================================================================== */ -include { UTILS_NEXTFLOW_PIPELINE } from '../../nf-core/utils_nextflow_pipeline' -include { getWorkflowVersion } from '../../nf-core/utils_nextflow_pipeline' include { UTILS_NFVALIDATION_PLUGIN } from '../../nf-core/utils_nfvalidation_plugin' include { paramsSummaryMap } from 'plugin/nf-validation' -include { UTILS_NFCORE_PIPELINE } from '../../nf-core/utils_nfcore_pipeline' -include { workflowCitation } from '../../nf-core/utils_nfcore_pipeline' -include { nfCoreLogo } from '../../nf-core/utils_nfcore_pipeline' -include { dashedLine } from '../../nf-core/utils_nfcore_pipeline' +include { getWorkflowVersion } from '../../nf-core/utils_nextflow_pipeline' +include { UTILS_NEXTFLOW_PIPELINE } from '../../nf-core/utils_nextflow_pipeline' include { completionEmail } from '../../nf-core/utils_nfcore_pipeline' include { completionSummary } from '../../nf-core/utils_nfcore_pipeline' +include { dashedLine } from '../../nf-core/utils_nfcore_pipeline' +include { nfCoreLogo } from '../../nf-core/utils_nfcore_pipeline' include { imNotification } from '../../nf-core/utils_nfcore_pipeline' +include { UTILS_NFCORE_PIPELINE } from '../../nf-core/utils_nfcore_pipeline' +include { workflowCitation } from '../../nf-core/utils_nfcore_pipeline' /* ======================================================================================== From 66cb0bad45fbb4e082615d18502abd91a7c77cf2 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 17 Jan 2024 17:09:21 +0000 Subject: [PATCH 679/852] Simplify test for utils_nfcore_pipeline --- .../nf-core/utils_nfcore_pipeline/main.nf | 19 +++++++++++++++---- .../tests/main.workflow.nf.test | 13 ------------- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf index 77086031..261a1651 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf +++ b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf @@ -14,10 +14,6 @@ workflow UTILS_NFCORE_PIPELINE { main: checkConfigProvided() - - emit: - success = true - } /* @@ -73,6 +69,21 @@ def workflowVersionToYAML(workflow_version) { """.stripIndent().trim() } +// +// Get channel of software versions used in pipeline in YAML format +// +def softwareVersionsToYAML(ch_versions, workflow_version) { + + return + ch_versions + .unique() + .map { processVersionsFromYAML(it) } + .mix(Channel.of(workflowVersionToYAML(workflow_version))) + // .set { ch_software_versions } + // return ch_software_versions +} + + // // Get workflow summary for MultiQC // diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test index 3b1d4c93..b16445da 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test @@ -10,19 +10,6 @@ nextflow_workflow { tag "subworkflows/utils_nfcore_pipeline" test("Should run without failures") { - - when { - params { - // define parameters here. Example: - // outdir = "tests/results" - } - workflow { - """ - input[0] = true - """ - } - } - then { assert workflow.success } From 7e79d0422a835c6adc871ac2b8b5d51371439500 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 17 Jan 2024 17:36:00 +0000 Subject: [PATCH 680/852] Refactor how getWorkflowVersion function is called within pipeline --- .../utils_nfcore_fetchngs_pipeline/main.nf | 7 ++- .../nf-core/utils_nfcore_pipeline/main.nf | 53 ++++++++++++------- workflows/sra/main.nf | 12 ++--- workflows/synapse/main.nf | 11 ++-- 4 files changed, 43 insertions(+), 40 deletions(-) diff --git a/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf b/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf index 23bf3ebd..1681c0e4 100644 --- a/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf @@ -10,7 +10,6 @@ include { UTILS_NFVALIDATION_PLUGIN } from '../../nf-core/utils_nfvalidation_plugin' include { paramsSummaryMap } from 'plugin/nf-validation' -include { getWorkflowVersion } from '../../nf-core/utils_nextflow_pipeline' include { UTILS_NEXTFLOW_PIPELINE } from '../../nf-core/utils_nextflow_pipeline' include { completionEmail } from '../../nf-core/utils_nfcore_pipeline' include { completionSummary } from '../../nf-core/utils_nfcore_pipeline' @@ -43,7 +42,7 @@ workflow PIPELINE_INITIALISATION { // // Validate parameters and generate parameter summary to stdout // - def pre_help_text = nfCoreLogo(getWorkflowVersion(), params.monochrome_logs) + def pre_help_text = nfCoreLogo(params.monochrome_logs) def post_help_text = '\n' + workflowCitation() + '\n' + dashedLine(params.monochrome_logs) def String workflow_command = "nextflow run ${workflow.manifest.name} -profile --input ids.csv --outdir " UTILS_NFVALIDATION_PLUGIN ( @@ -116,13 +115,13 @@ workflow PIPELINE_COMPLETION { // workflow.onComplete { if (email || email_on_fail) { - completionEmail(summary_params, getWorkflowVersion(), email, email_on_fail, plaintext_email, outdir, monochrome_logs) + completionEmail(summary_params, email, email_on_fail, plaintext_email, outdir, monochrome_logs) } completionSummary(monochrome_logs) if (hook_url) { - imNotification(summary_params, getWorkflowVersion(), hook_url) + imNotification(summary_params, hook_url) } if (input_type == 'sra') { diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf index 261a1651..fd4eddfd 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf +++ b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf @@ -49,6 +49,24 @@ def workflowCitation() { " https://github.com/${workflow.manifest.name}/blob/master/CITATIONS.md" } +// +// Generate workflow version string +// +def getWorkflowVersion() { + String version_string = "" + if (workflow.manifest.version) { + def prefix_v = workflow.manifest.version[0] != 'v' ? 'v' : '' + version_string += "${prefix_v}${workflow.manifest.version}" + } + + if (workflow.commitId) { + def git_shortsha = workflow.commitId.substring(0, 7) + version_string += "-g${git_shortsha}" + } + + return version_string +} + // // Get software versions for pipeline // @@ -61,29 +79,24 @@ def processVersionsFromYAML(yaml_file) { // // Get workflow version for pipeline // -def workflowVersionToYAML(workflow_version) { +def workflowVersionToYAML() { return """ - 'Workflow': - "Nextflow": "$workflow.nextflow.version" - "$workflow.manifest.name": "${workflow_version}" + Workflow: + $workflow.manifest.name: ${getWorkflowVersion()} + Nextflow: $workflow.nextflow.version """.stripIndent().trim() } // // Get channel of software versions used in pipeline in YAML format // -def softwareVersionsToYAML(ch_versions, workflow_version) { - - return - ch_versions - .unique() - .map { processVersionsFromYAML(it) } - .mix(Channel.of(workflowVersionToYAML(workflow_version))) - // .set { ch_software_versions } - // return ch_software_versions +def softwareVersionsToYAML(ch_versions) { + return ch_versions + .unique() + .map { processVersionsFromYAML(it) } + .mix(Channel.of(workflowVersionToYAML())) } - // // Get workflow summary for MultiQC // @@ -115,7 +128,7 @@ def paramsSummaryMultiqc(summary_params) { // // nf-core logo // -def nfCoreLogo(workflow_version, monochrome_logs=true) { +def nfCoreLogo(monochrome_logs=true) { Map colors = logColours(monochrome_logs) String.format( """\n @@ -125,7 +138,7 @@ def nfCoreLogo(workflow_version, monochrome_logs=true) { ${colors.blue} |\\ | |__ __ / ` / \\ |__) |__ ${colors.yellow}} {${colors.reset} ${colors.blue} | \\| | \\__, \\__/ | \\ |___ ${colors.green}\\`-._,-`-,${colors.reset} ${colors.green}`._,._,\'${colors.reset} - ${colors.purple} ${workflow.manifest.name} ${workflow_version}${colors.reset} + ${colors.purple} ${workflow.manifest.name} ${getWorkflowVersion()}${colors.reset} ${dashedLine(monochrome_logs)} """.stripIndent() ) @@ -210,7 +223,7 @@ def logColours(monochrome_logs=true) { // // Construct and send completion email // -def completionEmail(summary_params, workflow_version, email, email_on_fail, plaintext_email, outdir, monochrome_logs=true) { +def completionEmail(summary_params, email, email_on_fail, plaintext_email, outdir, monochrome_logs=true) { // Set up the e-mail variables def subject = "[$workflow.manifest.name] Successful: $workflow.runName" @@ -236,7 +249,7 @@ def completionEmail(summary_params, workflow_version, email, email_on_fail, plai misc_fields['Nextflow Compile Timestamp'] = workflow.nextflow.timestamp def email_fields = [:] - email_fields['version'] = workflow_version + email_fields['version'] = getWorkflowVersion() email_fields['runName'] = workflow.runName email_fields['success'] = workflow.success email_fields['dateComplete'] = workflow.complete @@ -317,7 +330,7 @@ def completionSummary(monochrome_logs=true) { // // Construct and send a notification to a web server as JSON e.g. Microsoft Teams and Slack // -def imNotification(summary_params, workflow_version, hook_url) { +def imNotification(summary_params, hook_url) { def summary = [:] for (group in summary_params.keySet()) { summary << summary_params[group] @@ -336,7 +349,7 @@ def imNotification(summary_params, workflow_version, hook_url) { misc_fields['nxf_timestamp'] = workflow.nextflow.timestamp def msg_fields = [:] - msg_fields['version'] = workflow_version + msg_fields['version'] = getWorkflowVersion() msg_fields['runName'] = workflow.runName msg_fields['success'] = workflow.success msg_fields['dateComplete'] = workflow.complete diff --git a/workflows/sra/main.nf b/workflows/sra/main.nf index f1603c37..62d8c577 100644 --- a/workflows/sra/main.nf +++ b/workflows/sra/main.nf @@ -9,9 +9,7 @@ include { SRA_FASTQ_FTP } from '../../modules/local/sra_fastq_ftp' include { SRA_IDS_TO_RUNINFO } from '../../modules/local/sra_ids_to_runinfo' include { SRA_RUNINFO_TO_FTP } from '../../modules/local/sra_runinfo_to_ftp' include { SRA_TO_SAMPLESHEET } from '../../modules/local/sra_to_samplesheet' -include { getWorkflowVersion } from '../../subworkflows/nf-core/utils_nextflow_pipeline' -include { processVersionsFromYAML } from '../../subworkflows/nf-core/utils_nfcore_pipeline' -include { workflowVersionToYAML } from '../../subworkflows/nf-core/utils_nfcore_pipeline' +include { softwareVersionsToYAML } from '../../subworkflows/nf-core/utils_nfcore_pipeline' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -156,11 +154,9 @@ workflow SRA { // // Collate and save software versions // - ch_versions - .unique() - .map { processVersionsFromYAML(it) } - .mix(Channel.of(workflowVersionToYAML(getWorkflowVersion()))) - .collectFile(storeDir: "${params.outdir}/pipeline_info", name: 'collated_software_mqc_versions.yml', newLine: true) + softwareVersionsToYAML(ch_versions) + .collectFile(storeDir: "${params.outdir}/pipeline_info", name: 'nf_core_fetchngs_software_mqc_versions.yml', sort: true, newLine: true) + emit: samplesheet = ch_samplesheet diff --git a/workflows/synapse/main.nf b/workflows/synapse/main.nf index 54670057..38071b60 100644 --- a/workflows/synapse/main.nf +++ b/workflows/synapse/main.nf @@ -9,9 +9,7 @@ include { SYNAPSE_SHOW } from '../../modules/local/synapse_show' include { SYNAPSE_GET } from '../../modules/local/synapse_get' include { SYNAPSE_TO_SAMPLESHEET } from '../../modules/local/synapse_to_samplesheet' include { SYNAPSE_MERGE_SAMPLESHEET } from '../../modules/local/synapse_merge_samplesheet' -include { getWorkflowVersion } from '../../subworkflows/nf-core/utils_nextflow_pipeline' -include { processVersionsFromYAML } from '../../subworkflows/nf-core/utils_nfcore_pipeline' -include { workflowVersionToYAML } from '../../subworkflows/nf-core/utils_nfcore_pipeline' +include { softwareVersionsToYAML } from '../../subworkflows/nf-core/utils_nfcore_pipeline' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -111,11 +109,8 @@ workflow SYNAPSE { // // Collate and save software versions // - ch_versions - .unique() - .map { processVersionsFromYAML(it) } - .mix(Channel.of(workflowVersionToYAML(getWorkflowVersion()))) - .collectFile(storeDir: "${params.outdir}/pipeline_info", name: 'collated_software_mqc_versions.yml', newLine: true) + softwareVersionsToYAML(ch_versions) + .collectFile(storeDir: "${params.outdir}/pipeline_info", name: 'nf_core_fetchngs_software_mqc_versions.yml', sort: true, newLine: true) emit: fastq = ch_fastq From 57efad7f77a592c91fde9e785fa2a9e5c11c05f1 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 17 Jan 2024 17:44:03 +0000 Subject: [PATCH 681/852] Remove emit of summary_params from utils_nfvalidation_plugin subworkflow --- .../nf-core/utils_nfvalidation_plugin/main.nf | 73 +++++++++---------- .../utils_nfvalidation_plugin/meta.yml | 8 -- 2 files changed, 35 insertions(+), 46 deletions(-) diff --git a/subworkflows/nf-core/utils_nfvalidation_plugin/main.nf b/subworkflows/nf-core/utils_nfvalidation_plugin/main.nf index 43c57187..9ec7226f 100644 --- a/subworkflows/nf-core/utils_nfvalidation_plugin/main.nf +++ b/subworkflows/nf-core/utils_nfvalidation_plugin/main.nf @@ -8,7 +8,9 @@ ======================================================================================== */ -include { paramsHelp; paramsSummaryLog; paramsSummaryMap; validateParameters } from 'plugin/nf-validation' +include { paramsHelp } from 'plugin/nf-validation' +include { paramsSummaryLog } from 'plugin/nf-validation' +include { validateParameters } from 'plugin/nf-validation' /* ======================================================================================== @@ -19,44 +21,39 @@ include { paramsHelp; paramsSummaryLog; paramsSummaryMap; validateParameters } f workflow UTILS_NFVALIDATION_PLUGIN { take: - print_help // bool - workflow_command // string: default commmand used to run pipeline - pre_help_text // string: string to be printed before help text and summary log - post_help_text // string: string to be printed after help text and summary log - validate_params // bool: Validate parameters - schema_filename // path: JSON schema file, null to use default value + print_help // bool + workflow_command // string: default commmand used to run pipeline + pre_help_text // string: string to be printed before help text and summary log + post_help_text // string: string to be printed after help text and summary log + validate_params // bool: Validate parameters + schema_filename // path: JSON schema file, null to use default value main: - log.debug "Using schema file: ${schema_filename}" - - // Default values for strings - pre_help_text = pre_help_text ?: '' - post_help_text = post_help_text ?: '' - workflow_command = workflow_command ?: '' - - // - // Print help message if needed - // - if (print_help) { - log.info pre_help_text + paramsHelp(workflow_command, parameters_schema: schema_filename) + post_help_text - System.exit(0) - } - - // - // Print parameter summary to stdout - // - log.info pre_help_text + paramsSummaryLog(workflow, parameters_schema: schema_filename) + post_help_text - - // - // Validate parameters relative to the parameter JSON schema - // - if (validate_params){ - validateParameters(parameters_schema: schema_filename) - } - - summary_params = paramsSummaryMap(workflow, parameters_schema: schema_filename) - - emit: - summary_params = summary_params + log.debug "Using schema file: ${schema_filename}" + + // Default values for strings + pre_help_text = pre_help_text ?: '' + post_help_text = post_help_text ?: '' + workflow_command = workflow_command ?: '' + + // + // Print help message if needed + // + if (print_help) { + log.info pre_help_text + paramsHelp(workflow_command, parameters_schema: schema_filename) + post_help_text + System.exit(0) + } + + // + // Print parameter summary to stdout + // + log.info pre_help_text + paramsSummaryLog(workflow, parameters_schema: schema_filename) + post_help_text + + // + // Validate parameters relative to the parameter JSON schema + // + if (validate_params){ + validateParameters(parameters_schema: schema_filename) + } } diff --git a/subworkflows/nf-core/utils_nfvalidation_plugin/meta.yml b/subworkflows/nf-core/utils_nfvalidation_plugin/meta.yml index 80438ccf..1ec5f98e 100644 --- a/subworkflows/nf-core/utils_nfvalidation_plugin/meta.yml +++ b/subworkflows/nf-core/utils_nfvalidation_plugin/meta.yml @@ -32,14 +32,6 @@ input: type: string description: | The filename of the schema to validate against. - -output: - - summary_params: - type: file - description: | - A Groovy map constructed from parameters. - Structure: [ val(meta), path(bam) ] - pattern: "*.bam" authors: - "@adamrtalbot" maintainers: From d2fac84715db4b925e54a6cfdda4360d057459c8 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 17 Jan 2024 18:08:52 +0000 Subject: [PATCH 682/852] Use nf-validation plugin to validate and read in samplesheet --- assets/schema_input.json | 2 +- .../utils_nfcore_fetchngs_pipeline/main.nf | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/assets/schema_input.json b/assets/schema_input.json index d451f9e9..13044b1b 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -7,7 +7,7 @@ "items": { "type": "object", "properties": { - "id": { + "": { "type": "string", "pattern": "^(((SR|ER|DR)[APRSX])|(SAM(N|EA|D))|(PRJ(NA|EB|DB))|(GS[EM])|(syn))(\\d+)$", "errorMessage": "Please provide a valid SRA, ENA, DDBJ or GEO identifier" diff --git a/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf b/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf index 1681c0e4..2ed66470 100644 --- a/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf @@ -9,6 +9,7 @@ */ include { UTILS_NFVALIDATION_PLUGIN } from '../../nf-core/utils_nfvalidation_plugin' +include { fromSamplesheet } from 'plugin/nf-validation' include { paramsSummaryMap } from 'plugin/nf-validation' include { UTILS_NEXTFLOW_PIPELINE } from '../../nf-core/utils_nextflow_pipeline' include { completionEmail } from '../../nf-core/utils_nfcore_pipeline' @@ -59,6 +60,15 @@ workflow PIPELINE_INITIALISATION { // UTILS_NFCORE_PIPELINE () + // + // Read in ids from --input file via nf-validation plugin + // + Channel + .fromSamplesheet("input", skip_duplicate_check: true) + .map { it[0] } + .unique() + .set { ch_ids } + // // Auto-detect input id type // @@ -77,14 +87,6 @@ workflow PIPELINE_INITIALISATION { error("Ids auto-detected as ${input_type}. Please provide '--input_type ${input_type}' as a parameter to the pipeline!") } - // Read in ids from --input file - Channel - .from(ch_input) - .splitCsv(header:false, sep:'', strip:true) - .map { it[0] } - .unique() - .set { ch_ids } - emit: ids = ch_ids } From a3c627c2bfb18973de260f8837dde515c17c0c29 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 17 Jan 2024 18:12:42 +0000 Subject: [PATCH 683/852] Revert nf-validation plugin to validate and read in samplesheet --- .../utils_nfcore_fetchngs_pipeline/main.nf | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf b/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf index 2ed66470..6cd1c6c6 100644 --- a/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf @@ -60,15 +60,6 @@ workflow PIPELINE_INITIALISATION { // UTILS_NFCORE_PIPELINE () - // - // Read in ids from --input file via nf-validation plugin - // - Channel - .fromSamplesheet("input", skip_duplicate_check: true) - .map { it[0] } - .unique() - .set { ch_ids } - // // Auto-detect input id type // @@ -87,6 +78,14 @@ workflow PIPELINE_INITIALISATION { error("Ids auto-detected as ${input_type}. Please provide '--input_type ${input_type}' as a parameter to the pipeline!") } + // Read in ids from --input file + Channel + .from(ch_input) + .splitCsv(header:false, sep:'', strip:true) + .map { it[0] } + .unique() + .set { ch_ids } + emit: ids = ch_ids } From 73a831bd162f8fd200399f228c235c168b42febc Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 17 Jan 2024 18:39:10 +0000 Subject: [PATCH 684/852] Sync email function with nf-core pipeline template --- assets/email_template.html | 2 +- assets/email_template.txt | 2 +- .../nf-core/utils_nfcore_pipeline/main.nf | 17 +++++++++++------ 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/assets/email_template.html b/assets/email_template.html index 1848021d..6e593a53 100644 --- a/assets/email_template.html +++ b/assets/email_template.html @@ -12,7 +12,7 @@ -

nf-core/fetchngs v${version}

+

nf-core/fetchngs ${version}

Run Name: $runName

<% if (!success){ diff --git a/assets/email_template.txt b/assets/email_template.txt index f9393aa8..e9f8bcc6 100644 --- a/assets/email_template.txt +++ b/assets/email_template.txt @@ -4,7 +4,7 @@ |\\ | |__ __ / ` / \\ |__) |__ } { | \\| | \\__, \\__/ | \\ |___ \\`-._,-`-, `._,._,' - nf-core/fetchngs v${version} + nf-core/fetchngs ${version} ---------------------------------------------------- Run Name: $runName diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf index fd4eddfd..7735ec89 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf +++ b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf @@ -3,6 +3,7 @@ // import org.yaml.snakeyaml.Yaml +import nextflow.extension.FilesEx /* ======================================================================================== @@ -290,6 +291,8 @@ def completionEmail(summary_params, email, email_on_fail, plaintext_email, outdi try { if (plaintext_email) { throw GroovyException('Send plaintext e-mail, not HTML') } // Try to send HTML e-mail using sendmail + def sendmail_tf = new File(workflow.launchDir.toString(), ".sendmail_tmp.html") + sendmail_tf.withWriter { w -> w << sendmail_html } [ 'sendmail', '-t' ].execute() << sendmail_html log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Sent summary e-mail to $email_address (sendmail)-" } catch (all) { @@ -301,14 +304,16 @@ def completionEmail(summary_params, email, email_on_fail, plaintext_email, outdi } // Write summary e-mail HTML to a file - def output_d = new File("${outdir}/pipeline_info/") - if (!output_d.exists()) { - output_d.mkdirs() - } - def output_hf = new File(output_d, "pipeline_report.html") + def output_hf = new File(workflow.launchDir.toString(), ".pipeline_report.html") output_hf.withWriter { w -> w << email_html } - def output_tf = new File(output_d, "pipeline_report.txt") + FilesEx.copyTo(output_hf.toPath(), "${outdir}/pipeline_info/pipeline_report.html"); + output_hf.delete() + + // Write summary e-mail TXT to a file + def output_tf = new File(workflow.launchDir.toString(), ".pipeline_report.txt") output_tf.withWriter { w -> w << email_txt } + FilesEx.copyTo(output_tf.toPath(), "${outdir}/pipeline_info/pipeline_report.txt"); + output_tf.delete() } // From 65efde1801c168cd7125e405f9490bfad6ac3c10 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 17 Jan 2024 20:22:39 +0000 Subject: [PATCH 685/852] Sync dumpParametersToJSON function with nf-core pipeline template --- .../nf-core/utils_nextflow_pipeline/main.nf | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/main.nf b/subworkflows/nf-core/utils_nextflow_pipeline/main.nf index 9dbb86c7..005a0340 100644 --- a/subworkflows/nf-core/utils_nextflow_pipeline/main.nf +++ b/subworkflows/nf-core/utils_nextflow_pipeline/main.nf @@ -4,6 +4,7 @@ import org.yaml.snakeyaml.Yaml import groovy.json.JsonOutput +import nextflow.extension.FilesEx /* ======================================================================================== @@ -74,16 +75,15 @@ def getWorkflowVersion() { // // Dump pipeline parameters to a JSON file // -def dumpParametersToJSON(output_directory) { - def output_d = new File("${output_directory}/pipeline_info/") - if (!output_d.exists()) { - output_d.mkdirs() - } - +def dumpParametersToJSON(outdir) { def timestamp = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss') - def output_pf = new File(output_d, "params_${timestamp}.json") + def filename = "params_${timestamp}.json" + def temp_pf = new File(workflow.launchDir.toString(), ".${filename}") def jsonStr = JsonOutput.toJson(params) - output_pf.text = JsonOutput.prettyPrint(jsonStr) + temp_pf.text = JsonOutput.prettyPrint(jsonStr) + + FilesEx.copyTo(temp_pf.toPath(), "${outdir}/pipeline_info/params_${timestamp}.json") + temp_pf.delete() } // From f7be8ce2516eff68be5c2d26893a53797abad933 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 17 Jan 2024 20:35:23 +0000 Subject: [PATCH 686/852] Fix tests for utils_nfcore_pipeline subworkflow --- .../tests/main.function.nf.test | 19 +------------------ .../tests/main.function.nf.test.snap | 14 +++++++------- 2 files changed, 8 insertions(+), 25 deletions(-) diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test index c4f71aeb..f57980c7 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test @@ -13,14 +13,6 @@ nextflow_function { function "checkConfigProvided" - when { - function { - """ - // input[0] = 1 - """ - } - } - then { assertAll ( { assert function.success }, @@ -34,14 +26,6 @@ nextflow_function { function "workflowCitation" - when { - function { - """ - // input[0] = 1 - """ - } - } - then { assertAll ( { assert function.success }, @@ -58,8 +42,7 @@ nextflow_function { when { function { """ - input[0] = "9.9.9" - input[1] = false + input[0] = false """ } } diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test.snap b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test.snap index bdf71d41..e95e2eec 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test.snap +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test.snap @@ -1,19 +1,19 @@ { "Test Function checkConfigProvided": { "content": null, - "timestamp": "2023-10-16T14:27:01.415849" + "timestamp": "2024-01-17T20:34:16.220739" }, "Test Function nfCoreLogo": { "content": [ - "\n\n-\u001b[2m----------------------------------------------------\u001b[0m-\n \u001b[0;32m,--.\u001b[0;30m/\u001b[0;32m,-.\u001b[0m\n\u001b[0;34m ___ __ __ __ ___ \u001b[0;32m/,-._.--~'\u001b[0m\n\u001b[0;34m |\\ | |__ __ / ` / \\ |__) |__ \u001b[0;33m} {\u001b[0m\n\u001b[0;34m | \\| | \\__, \\__/ | \\ |___ \u001b[0;32m\\`-._,-`-,\u001b[0m\n \u001b[0;32m`._,._,'\u001b[0m\n\u001b[0;35m nextflow_workflow 9.9.9\u001b[0m\n-\u001b[2m----------------------------------------------------\u001b[0m-\n" + "\n\n-\u001b[2m----------------------------------------------------\u001b[0m-\n \u001b[0;32m,--.\u001b[0;30m/\u001b[0;32m,-.\u001b[0m\n\u001b[0;34m ___ __ __ __ ___ \u001b[0;32m/,-._.--~'\u001b[0m\n\u001b[0;34m |\\ | |__ __ / ` / \\ |__) |__ \u001b[0;33m} {\u001b[0m\n\u001b[0;34m | \\| | \\__, \\__/ | \\ |___ \u001b[0;32m\\`-._,-`-,\u001b[0m\n \u001b[0;32m`._,._,'\u001b[0m\n\u001b[0;35m nextflow_workflow v9.9.9\u001b[0m\n-\u001b[2m----------------------------------------------------\u001b[0m-\n" ], - "timestamp": "2023-10-16T14:27:51.566211" + "timestamp": "2024-01-17T20:34:23.89764" }, "Test Function workflowCitation": { "content": [ "If you use nextflow_workflow for your analysis please cite:\n\n* The pipeline\n https://doi.org/10.5281/zenodo.5070524\n\n* The nf-core framework\n https://doi.org/10.1038/s41587-020-0439-x\n\n* Software dependencies\n https://github.com/nextflow_workflow/blob/master/CITATIONS.md" ], - "timestamp": "2023-10-16T14:27:03.505737" + "timestamp": "2024-01-17T20:34:20.063846" }, "Test Function without logColours": { "content": [ @@ -67,13 +67,13 @@ "biwhite": "" } ], - "timestamp": "2023-12-20T10:04:29.095368" + "timestamp": "2024-01-17T20:34:31.622874" }, "Test Function dashedLine": { "content": [ "-\u001b[2m----------------------------------------------------\u001b[0m-" ], - "timestamp": "2023-10-16T14:27:07.721916" + "timestamp": "2024-01-17T20:34:27.729247" }, "Test Function with logColours": { "content": [ @@ -127,6 +127,6 @@ "biwhite": "\u001b[1;97m" } ], - "timestamp": "2023-12-20T10:04:31.258856" + "timestamp": "2024-01-17T20:34:35.549447" } } \ No newline at end of file From d58cef7c4ac9f85e4b0547997a2c86c4a52f4aee Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 17 Jan 2024 20:38:46 +0000 Subject: [PATCH 687/852] Fix tests for pipeline --- tests/main.nf.test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/main.nf.test b/tests/main.nf.test index 1ab2f73a..3c36cd06 100644 --- a/tests/main.nf.test +++ b/tests/main.nf.test @@ -72,7 +72,7 @@ nextflow_pipeline { { assert new File("$outputDir/metadata/SRR14593545.runinfo_ftp.tsv").exists() }, { assert new File("$outputDir/metadata/SRR14709033.runinfo_ftp.tsv").exists() }, { assert new File("$outputDir/metadata/SRR9984183.runinfo_ftp.tsv").exists() }, - { assert new File("$outputDir/pipeline_info/fetchngs_mqc_versions.yml").exists() }, + { assert new File("$outputDir/pipeline_info/nf_core_fetchngs_software_mqc_versions.yml").exists() }, { assert new File("$outputDir/samplesheet/id_mappings.csv").exists() }, { assert new File("$outputDir/samplesheet/multiqc_config.yml").exists() }, { assert new File("$outputDir/samplesheet/samplesheet.csv").exists() } From 90973f4518c9c966b77de8a721d613d97a9ae132 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 17 Jan 2024 20:48:47 +0000 Subject: [PATCH 688/852] Fix tests for utils_nextflow_pipeline subworkflow --- .../tests/main.functions.nf.test | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.functions.nf.test b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.functions.nf.test index 05f54930..9b18004b 100644 --- a/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.functions.nf.test +++ b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.functions.nf.test @@ -12,14 +12,6 @@ nextflow_function { function "getWorkflowVersion" - when { - function { - """ - // no inputs - """ - } - } - then { assert function.success assert snapshot(function.result).match() @@ -43,8 +35,6 @@ nextflow_function { then { assert function.success - assert function.result =~ /publish_dir_mode/ - assert function.result =~ /copy/ } } @@ -53,14 +43,6 @@ nextflow_function { function "checkCondaChannels" - when { - function { - """ - // no inputs - """ - } - } - then { assert function.success assert snapshot(function.result).match() From 6bae5519a39243138e16b8c05cca52a7bce17dfd Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 17 Jan 2024 20:50:19 +0000 Subject: [PATCH 689/852] Fix nf-core lint --- .nf-core.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.nf-core.yml b/.nf-core.yml index 51a92309..512c2bb7 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -9,4 +9,6 @@ lint: - lib/nfcore_external_java_deps.jar files_unchanged: - .gitignore - - assets/sendmail_template.txt + - assets/email_template.html + - assets/email_template.txt + - assets/sendmail_template.txt \ No newline at end of file From b74cbbb44bf8a94d929b80d71f1b258a17f6a6b9 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 17 Jan 2024 20:52:20 +0000 Subject: [PATCH 690/852] Fix Prettier --- .nf-core.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.nf-core.yml b/.nf-core.yml index 512c2bb7..793cb80d 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -11,4 +11,4 @@ lint: - .gitignore - assets/email_template.html - assets/email_template.txt - - assets/sendmail_template.txt \ No newline at end of file + - assets/sendmail_template.txt From e3d81da26f75022503bf2f8e469b636ad40a75b7 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 18 Jan 2024 09:44:16 +0000 Subject: [PATCH 691/852] Move params to take block in utils_nfcore_fetchngs_pipeline subworkflow --- main.nf | 11 ++++- .../utils_nfcore_fetchngs_pipeline/main.nf | 44 ++++++++++++------- .../nf-core/utils_nextflow_pipeline/main.nf | 9 ++-- .../tests/main.workflow.nf.test | 3 -- .../tests/main.workflow.nf.test.snap | 44 ------------------- 5 files changed, 40 insertions(+), 71 deletions(-) delete mode 100644 subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test.snap diff --git a/main.nf b/main.nf index 64bc75cf..d3779d16 100644 --- a/main.nf +++ b/main.nf @@ -62,7 +62,16 @@ workflow { // // SUBWORKFLOW: Run initialisation tasks // - PIPELINE_INITIALISATION () + PIPELINE_INITIALISATION ( + params.version, + params.help, + params.validate_params, + params.monochrome_logs, + params.outdir, + params.input, + params.input_type, + params.ena_metadata_fields + ) // // WORKFLOW: Run primary workflows for the pipeline diff --git a/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf b/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf index 6cd1c6c6..21249dd7 100644 --- a/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf @@ -28,30 +28,40 @@ include { workflowCitation } from '../../nf-core/utils_nfcore_pipeline' workflow PIPELINE_INITIALISATION { + take: + version // boolean: Display version and exit + help // boolean: Display help text + validate_params // boolean: Boolean whether to validate parameters against the schema at runtime + monochrome_logs // boolean: Do not use coloured log outputs + outdir // string: The output directory where the results will be saved + input // string: File containing SRA/ENA/GEO/DDBJ identifiers one per line to download their associated metadata and FastQ files + input_type // string: Specifies the type of identifier provided via `--input` - available options are 'sra' and 'synapse' + ena_metadata_fields // string: Comma-separated list of ENA metadata fields to fetch before downloading data + main: // // Print version and exit if required and dump pipeline parameters to JSON file // UTILS_NEXTFLOW_PIPELINE ( - params.version, + version, true, - params.outdir, + outdir, workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1 ) // // Validate parameters and generate parameter summary to stdout // - def pre_help_text = nfCoreLogo(params.monochrome_logs) - def post_help_text = '\n' + workflowCitation() + '\n' + dashedLine(params.monochrome_logs) + def pre_help_text = nfCoreLogo(monochrome_logs) + def post_help_text = '\n' + workflowCitation() + '\n' + dashedLine(monochrome_logs) def String workflow_command = "nextflow run ${workflow.manifest.name} -profile --input ids.csv --outdir " UTILS_NFVALIDATION_PLUGIN ( - params.help, + help, workflow_command, pre_help_text, post_help_text, - params.validate_params, + validate_params, "nextflow_schema.json" ) @@ -63,19 +73,19 @@ workflow PIPELINE_INITIALISATION { // // Auto-detect input id type // - ch_input = file(params.input) - def input_type = '' + ch_input = file(input) + def inferred_input_type = '' if (isSraId(ch_input)) { - input_type = 'sra' - sraCheckENAMetadataFields() + inferred_input_type = 'sra' + sraCheckENAMetadataFields(ena_metadata_fields) } else if (isSynapseId(ch_input)) { - input_type = 'synapse' + inferred_input_type = 'synapse' } else { error('Ids provided via --input not recognised please make sure they are either SRA / ENA / GEO / DDBJ or Synapse ids!') } - if (params.input_type != input_type) { - error("Ids auto-detected as ${input_type}. Please provide '--input_type ${input_type}' as a parameter to the pipeline!") + if (input_type != inferred_input_type) { + error("Ids auto-detected as ${inferred_input_type}. Please provide '--input_type ${inferred_input_type}' as a parameter to the pipeline!") } // Read in ids from --input file @@ -194,12 +204,12 @@ def isSynapseId(input) { // // Check and validate parameters // -def sraCheckENAMetadataFields() { +def sraCheckENAMetadataFields(ena_metadata_fields) { // Check minimal ENA fields are provided to download FastQ files def valid_ena_metadata_fields = ['run_accession', 'experiment_accession', 'library_layout', 'fastq_ftp', 'fastq_md5'] - def ena_metadata_fields = params.ena_metadata_fields ? params.ena_metadata_fields.split(',').collect{ it.trim().toLowerCase() } : valid_ena_metadata_fields - if (!ena_metadata_fields.containsAll(valid_ena_metadata_fields)) { - error("Invalid option: '${params.ena_metadata_fields}'. Minimally required fields for '--ena_metadata_fields': '${valid_ena_metadata_fields.join(',')}'") + def actual_ena_metadata_fields = ena_metadata_fields ? ena_metadata_fields.split(',').collect{ it.trim().toLowerCase() } : valid_ena_metadata_fields + if (!actual_ena_metadata_fields.containsAll(valid_ena_metadata_fields)) { + error("Invalid option: '${ena_metadata_fields}'. Minimally required fields for '--ena_metadata_fields': '${valid_ena_metadata_fields.join(',')}'") } } diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/main.nf b/subworkflows/nf-core/utils_nextflow_pipeline/main.nf index 005a0340..e89a57ab 100644 --- a/subworkflows/nf-core/utils_nextflow_pipeline/main.nf +++ b/subworkflows/nf-core/utils_nextflow_pipeline/main.nf @@ -17,7 +17,7 @@ workflow UTILS_NEXTFLOW_PIPELINE { take: print_version // bool dump_parameters // bool - output_directory // path: base directory used to publish pipeline results + outdir // path: base directory used to publish pipeline results check_conda_channels // bool main: @@ -33,8 +33,8 @@ workflow UTILS_NEXTFLOW_PIPELINE { // // Dump pipeline parameters to a JSON file // - if (dump_parameters && output_directory) { - dumpParametersToJSON(output_directory) + if (dump_parameters && outdir) { + dumpParametersToJSON(outdir) } // @@ -43,9 +43,6 @@ workflow UTILS_NEXTFLOW_PIPELINE { if (check_conda_channels) { checkCondaChannels() } - - emit: - out = true } /* diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test index 583f6a84..e2fa5b6c 100644 --- a/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test +++ b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test @@ -26,7 +26,6 @@ nextflow_workflow { then { assert workflow.success - assert snapshot(workflow.out).match() } } @@ -73,7 +72,6 @@ nextflow_workflow { then { assert workflow.success - assert snapshot(workflow.out).match() } } @@ -96,7 +94,6 @@ nextflow_workflow { then { assert workflow.success - assert snapshot(workflow.out, path(params.outdir).list()).match() } } diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test.snap b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test.snap deleted file mode 100644 index 08040fd4..00000000 --- a/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test.snap +++ /dev/null @@ -1,44 +0,0 @@ -{ - "Should not create params JSON if no output directory": { - "content": [ - { - "0": [ - true - ], - "out": [ - true - ] - }, - [ - - ] - ], - "timestamp": "2023-10-13T11:55:54.576748" - }, - "Should dump params": { - "content": [ - { - "0": [ - true - ], - "out": [ - true - ] - } - ], - "timestamp": "2023-10-13T11:55:52.711329" - }, - "Should run no inputs": { - "content": [ - { - "0": [ - true - ], - "out": [ - true - ] - } - ], - "timestamp": "2023-10-13T11:55:49.048315" - } -} \ No newline at end of file From 61e7662019c4076b4c760e1eaa91243273a46277 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Thu, 18 Jan 2024 12:27:29 +0000 Subject: [PATCH 692/852] Replace tag strategy for testing Changes: - All modules, subworkflows and workflows include their own name as a tag - All subworkflows and workflows include their dependencies as a tag - By detecting tags with `nf-test list --tags` we can extract all tags - Should be able to flag changed modules and dependent workflows without using a tags.yml file --- .../multiqc_mappings_config/tests/main.nf.test | 5 ++--- modules/local/sra_fastq_ftp/tests/main.nf.test | 5 ++--- .../local/sra_ids_to_runinfo/tests/main.nf.test | 5 ++--- .../local/sra_runinfo_to_ftp/tests/main.nf.test | 5 ++--- .../local/sra_to_samplesheet/tests/main.nf.test | 5 ++--- .../custom/sratoolsncbisettings/tests/main.nf.test | 6 ++---- .../sratools/fasterqdump/tests/main.nf.test | 8 +++----- .../nf-core/sratools/prefetch/tests/main.nf.test | 6 ++---- modules/nf-core/untar/tests/main.nf.test | 4 +--- .../tests/main.nf.test | 11 +++++------ .../tests/main.functions.nf.test | 5 ++--- .../tests/main.function.nf.test | 6 ++---- .../tests/main.workflow.nf.test | 6 ++---- .../utils_nfvalidation_plugin/tests/main.nf.test | 8 ++------ tests/main.nf.test | 6 ++++-- workflows/sra/tests/main.nf.test | 14 ++++++++++---- .../tests/sra_custom_ena_metadata_fields.nf.test | 14 ++++++++++---- .../sra/tests/sra_force_sratools_download.nf.test | 14 ++++++++++---- .../sra/tests/sra_nf_core_pipeline_atacseq.nf.test | 14 ++++++++++---- .../sra/tests/sra_nf_core_pipeline_rnaseq.nf.test | 14 ++++++++++---- .../tests/sra_nf_core_pipeline_taxprofiler.nf.test | 14 ++++++++++---- .../tests/sra_nf_core_pipeline_viralrecon.nf.test | 14 ++++++++++---- .../sra/tests/sra_skip_fastq_download.nf.test | 14 ++++++++++---- 23 files changed, 115 insertions(+), 88 deletions(-) diff --git a/modules/local/multiqc_mappings_config/tests/main.nf.test b/modules/local/multiqc_mappings_config/tests/main.nf.test index cfb43166..e782116e 100644 --- a/modules/local/multiqc_mappings_config/tests/main.nf.test +++ b/modules/local/multiqc_mappings_config/tests/main.nf.test @@ -3,9 +3,8 @@ nextflow_process { name "Test process: MULTIQC_MAPPINGS_CONFIG" script "../main.nf" process "MULTIQC_MAPPINGS_CONFIG" - tag "modules" - tag "modules_local" - tag "multiqc_mappings_config" + + tag "MULTIQC_MAPPINGS_CONFIG" test("Should run without failures") { diff --git a/modules/local/sra_fastq_ftp/tests/main.nf.test b/modules/local/sra_fastq_ftp/tests/main.nf.test index 33f4be9f..27329cd9 100644 --- a/modules/local/sra_fastq_ftp/tests/main.nf.test +++ b/modules/local/sra_fastq_ftp/tests/main.nf.test @@ -3,9 +3,8 @@ nextflow_process { name "Test process: SRA_FASTQ_FTP" script "../main.nf" process "SRA_FASTQ_FTP" - tag "modules" - tag "modules_local" - tag "sra_fastq_ftp" + + tag "SRA_FASTQ_FTP" test("Should run without failures") { diff --git a/modules/local/sra_ids_to_runinfo/tests/main.nf.test b/modules/local/sra_ids_to_runinfo/tests/main.nf.test index 087f9069..cc0d6de9 100644 --- a/modules/local/sra_ids_to_runinfo/tests/main.nf.test +++ b/modules/local/sra_ids_to_runinfo/tests/main.nf.test @@ -3,9 +3,8 @@ nextflow_process { name "Test process: SRA_IDS_TO_RUNINFO" script "../main.nf" process "SRA_IDS_TO_RUNINFO" - tag "modules" - tag "modules_local" - tag "sra_ids_to_runinfo" + + tag "SRA_IDS_TO_RUNINFO" test("Should run without failures") { diff --git a/modules/local/sra_runinfo_to_ftp/tests/main.nf.test b/modules/local/sra_runinfo_to_ftp/tests/main.nf.test index 347e3392..1060b394 100644 --- a/modules/local/sra_runinfo_to_ftp/tests/main.nf.test +++ b/modules/local/sra_runinfo_to_ftp/tests/main.nf.test @@ -3,9 +3,8 @@ nextflow_process { name "Test process: SRA_RUNINFO_TO_FTP" script "../main.nf" process "SRA_RUNINFO_TO_FTP" - tag "modules" - tag "modules_local" - tag "sra_runinfo_to_ftp" + + tag "SRA_RUNINFO_TO_FTP" test("Should run without failures") { diff --git a/modules/local/sra_to_samplesheet/tests/main.nf.test b/modules/local/sra_to_samplesheet/tests/main.nf.test index 6094717b..7b7a52a8 100644 --- a/modules/local/sra_to_samplesheet/tests/main.nf.test +++ b/modules/local/sra_to_samplesheet/tests/main.nf.test @@ -3,9 +3,8 @@ nextflow_process { name "Test process: SRA_TO_SAMPLESHEET" script "../main.nf" process "SRA_TO_SAMPLESHEET" - tag "modules" - tag "modules_local" - tag "sra_to_samplesheet" + + tag "SRA_TO_SAMPLESHEET" test("Should run without failures") { diff --git a/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test b/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test index 9f178678..6fde77c6 100644 --- a/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test +++ b/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test @@ -4,10 +4,8 @@ nextflow_process { script "../main.nf" process "CUSTOM_SRATOOLSNCBISETTINGS" config "modules/nf-core/custom/sratoolsncbisettings/tests/nextflow.config" - tag "modules" - tag "modules_nfcore" - tag "custom" - tag "custom/sratoolsncbisettings" + + tag "CUSTOM_SRATOOLSNCBISETTINGS" test("Should run without failures") { diff --git a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test index 48722e4e..15277dbc 100644 --- a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test +++ b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test @@ -3,11 +3,9 @@ nextflow_process { script "../main.nf" config "./nextflow.config" process "SRATOOLS_FASTERQDUMP" - tag "modules" - tag "modules_nfcore" - tag "untar" - tag "sratools" - tag "sratools/fasterqdump" + + tag "UNTAR" + tag "SRATOOLS_FASTERQDUMP" test("Single-end") { diff --git a/modules/nf-core/sratools/prefetch/tests/main.nf.test b/modules/nf-core/sratools/prefetch/tests/main.nf.test index ed710ba0..0c210f9a 100644 --- a/modules/nf-core/sratools/prefetch/tests/main.nf.test +++ b/modules/nf-core/sratools/prefetch/tests/main.nf.test @@ -2,10 +2,8 @@ nextflow_process { name "Test Process SRATOOLS_PREFETCH" script "../main.nf" process "SRATOOLS_PREFETCH" - tag "modules" - tag "modules_nfcore" - tag "sratools" - tag "sratools/prefetch" + + tag "SRATOOLS_PREFETCH" test("sratools/prefetch") { diff --git a/modules/nf-core/untar/tests/main.nf.test b/modules/nf-core/untar/tests/main.nf.test index 679e83c7..e85ec082 100644 --- a/modules/nf-core/untar/tests/main.nf.test +++ b/modules/nf-core/untar/tests/main.nf.test @@ -4,9 +4,7 @@ nextflow_process { script "../main.nf" process "UNTAR" - tag "modules" - tag "modules_nfcore" - tag "untar" + tag "UNTAR" test("test_untar") { diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test index 2a16d1ef..b3d65c79 100644 --- a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test @@ -3,12 +3,11 @@ nextflow_workflow { name "Test workflow: fastq_download_prefetch_fasterqdump_sratools/main.nf" script "../main.nf" workflow "FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS" - tag "subworkflows" - tag "subworkflows_nfcore" - tag "custom/sratoolsncbisettings" - tag "sratools/prefetch" - tag "sratools/fasterqdump" - tag "subworkflows/fastq_download_prefetch_fasterqdump_sratools" + + tag "CUSTOM_SRATOOLSNCBISETTINGS" + tag "SRATOOLS_PREFETCH" + tag "SRATOOLS_FASTERQDUMP" + tag "SUBWORKFLOWS_FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS" test("Parameters: default") { diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.functions.nf.test b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.functions.nf.test index 9b18004b..50c90208 100644 --- a/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.functions.nf.test +++ b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.functions.nf.test @@ -4,9 +4,8 @@ nextflow_function { name "Test Functions" script "subworkflows/nf-core/utils_nextflow_pipeline/main.nf" config "subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config" - tag 'subworkflows' - tag 'utils_nextflow_pipeline' - tag 'subworkflows/utils_nextflow_pipeline' + + tag 'UTILS_NEXTFLOW_PIPELINE' test("Test Function getWorkflowVersion") { diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test index f57980c7..6176bb55 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test @@ -4,10 +4,8 @@ nextflow_function { name "Test Functions" script "../main.nf" config "subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config" - tag "subworkflows" - tag "subworkflows_nfcore" - tag "utils_nfcore_pipeline" - tag "subworkflows/utils_nfcore_pipeline" + + tag "UTILS_NFCORE_PIPELINE" test("Test Function checkConfigProvided") { diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test index b16445da..de513d78 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test @@ -4,10 +4,8 @@ nextflow_workflow { script "../main.nf" config "subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config" workflow "UTILS_NFCORE_PIPELINE" - tag "subworkflows" - tag "subworkflows_nfcore" - tag "utils_nfcore_pipeline" - tag "subworkflows/utils_nfcore_pipeline" + + tag "UTILS_NFCORE_PIPELINE" test("Should run without failures") { then { diff --git a/subworkflows/nf-core/utils_nfvalidation_plugin/tests/main.nf.test b/subworkflows/nf-core/utils_nfvalidation_plugin/tests/main.nf.test index 904f97be..47bfe461 100644 --- a/subworkflows/nf-core/utils_nfvalidation_plugin/tests/main.nf.test +++ b/subworkflows/nf-core/utils_nfvalidation_plugin/tests/main.nf.test @@ -3,12 +3,8 @@ nextflow_workflow { name "Test Workflow UTILS_NFVALIDATION_PLUGIN" script "../main.nf" workflow "UTILS_NFVALIDATION_PLUGIN" - tag "subworkflows" - tag "subworkflows_nfcore" - tag "plugin/nf-validation" - tag "'plugin/nf-validation'" - tag "utils_nfvalidation_plugin" - tag "subworkflows/utils_nfvalidation_plugin" + + tag "UTILS_NFVALIDATION_PLUGIN" test("Should run nothing") { diff --git a/tests/main.nf.test b/tests/main.nf.test index 3c36cd06..4e664778 100644 --- a/tests/main.nf.test +++ b/tests/main.nf.test @@ -2,8 +2,10 @@ nextflow_pipeline { name "Test pipeline" script "../main.nf" - tag "pipeline" - tag "pipeline_fetchngs" + + tag "SRA" + + tag "FETCHNGS" test("Run with profile test") { diff --git a/workflows/sra/tests/main.nf.test b/workflows/sra/tests/main.nf.test index 902debe6..1d63d8d8 100644 --- a/workflows/sra/tests/main.nf.test +++ b/workflows/sra/tests/main.nf.test @@ -3,10 +3,16 @@ nextflow_workflow { name "Test workflow: sra/main.nf" script "../main.nf" workflow "SRA" - tag "workflows" - tag "workflows_sra" - tag "multiqc_mappings_config" - tag "sra_default_parameters" + + // Modules + tag "MULTIQC_MAPPINGS_CONFIG" + tag "SRA_FASTQ_FTP" + tag "SRA_IDS_TO_RUNINFO" + tag "SRA_RUNINFO_TO_FTP" + tag "SRA_TO_SAMPLESHEET" + + // Subworkflows + tag "SRA" test("Parameters: default") { diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test index 433288f9..b0f9e4f4 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test @@ -3,10 +3,16 @@ nextflow_workflow { name "Test workflow: sra/main.nf" script "../main.nf" workflow "SRA" - tag "workflows" - tag "workflows_sra" - tag "multiqc_mappings_config" - tag "sra_custom_ena_metadata_fields" + + // Modules + tag "MULTIQC_MAPPINGS_CONFIG" + tag "SRA_FASTQ_FTP" + tag "SRA_IDS_TO_RUNINFO" + tag "SRA_RUNINFO_TO_FTP" + tag "SRA_TO_SAMPLESHEET" + + // Subworkflows + tag "SRA" test("Parameters: --nf_core_pipeline rnaseq --ena_metadata_fields ... --sample_mapping_fields ...") { diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test b/workflows/sra/tests/sra_force_sratools_download.nf.test index 2019be08..78658b7c 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test @@ -3,10 +3,16 @@ nextflow_workflow { name "Test workflow: sra/main.nf" script "../main.nf" workflow "SRA" - tag "workflows" - tag "workflows_sra" - tag "multiqc_mappings_config" - tag "sra_force_sratools_download" + + // Modules + tag "MULTIQC_MAPPINGS_CONFIG" + tag "SRA_FASTQ_FTP" + tag "SRA_IDS_TO_RUNINFO" + tag "SRA_RUNINFO_TO_FTP" + tag "SRA_TO_SAMPLESHEET" + + // Subworkflows + tag "SRA" test("Parameters: --force_sratools_download") { diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test index 46e4eed8..816235ef 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test @@ -3,10 +3,16 @@ nextflow_workflow { name "Test workflow: sra/main.nf" script "../main.nf" workflow "SRA" - tag "workflows" - tag "workflows_sra" - tag "multiqc_mappings_config" - tag "sra_nf_core_pipeline_atacseq" + + // Modules + tag "MULTIQC_MAPPINGS_CONFIG" + tag "SRA_FASTQ_FTP" + tag "SRA_IDS_TO_RUNINFO" + tag "SRA_RUNINFO_TO_FTP" + tag "SRA_TO_SAMPLESHEET" + + // Subworkflows + tag "SRA" test("Parameters: --nf_core_pipeline atacseq") { diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test index f24d2648..dd3b55d0 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test @@ -3,10 +3,16 @@ nextflow_workflow { name "Test workflow: sra/main.nf" script "../main.nf" workflow "SRA" - tag "workflows" - tag "workflows_sra" - tag "multiqc_mappings_config" - tag "sra_nf_core_pipeline_rnaseq" + + // Modules + tag "MULTIQC_MAPPINGS_CONFIG" + tag "SRA_FASTQ_FTP" + tag "SRA_IDS_TO_RUNINFO" + tag "SRA_RUNINFO_TO_FTP" + tag "SRA_TO_SAMPLESHEET" + + // Subworkflows + tag "SRA" test("Parameters: --nf_core_pipeline rnaseq") { diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test index 447e8c6e..fe907dc6 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test @@ -3,10 +3,16 @@ nextflow_workflow { name "Test workflow: sra/main.nf" script "../main.nf" workflow "SRA" - tag "workflows" - tag "workflows_sra" - tag "multiqc_mappings_config" - tag "sra_nf_core_pipeline_taxprofiler" + + // Modules + tag "MULTIQC_MAPPINGS_CONFIG" + tag "SRA_FASTQ_FTP" + tag "SRA_IDS_TO_RUNINFO" + tag "SRA_RUNINFO_TO_FTP" + tag "SRA_TO_SAMPLESHEET" + + // Subworkflows + tag "SRA" test("Parameters: --nf_core_pipeline taxprofiler") { diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test index 9b27c0a5..938edc00 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test @@ -3,10 +3,16 @@ nextflow_workflow { name "Test workflow: sra/main.nf" script "../main.nf" workflow "SRA" - tag "workflows" - tag "workflows_sra" - tag "multiqc_mappings_config" - tag "sra_nf_core_pipeline_viralrecon" + + // Modules + tag "MULTIQC_MAPPINGS_CONFIG" + tag "SRA_FASTQ_FTP" + tag "SRA_IDS_TO_RUNINFO" + tag "SRA_RUNINFO_TO_FTP" + tag "SRA_TO_SAMPLESHEET" + + // Subworkflows + tag "SRA" test("Parameters: --nf_core_pipeline viralrecon") { diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test b/workflows/sra/tests/sra_skip_fastq_download.nf.test index 1a3ab733..63ec1be0 100644 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test @@ -3,10 +3,16 @@ nextflow_workflow { name "Test workflow: sra/main.nf" script "../main.nf" workflow "SRA" - tag "workflows" - tag "workflows_sra" - tag "multiqc_mappings_config" - tag "sra_skip_fastq_download" + + // Modules + tag "MULTIQC_MAPPINGS_CONFIG" + tag "SRA_FASTQ_FTP" + tag "SRA_IDS_TO_RUNINFO" + tag "SRA_RUNINFO_TO_FTP" + tag "SRA_TO_SAMPLESHEET" + + // Subworkflows + tag "SRA" test("Parameters: --skip_fastq_download") { From 34baed6a6443f00c17981bcc872d767a4080c581 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Thu, 18 Jan 2024 12:31:10 +0000 Subject: [PATCH 693/852] Remove all tags.yml files --- .../local/multiqc_mappings_config/tests/tags.yml | 2 -- modules/local/sra_fastq_ftp/tests/tags.yml | 2 -- modules/local/sra_ids_to_runinfo/tests/tags.yml | 2 -- modules/local/sra_runinfo_to_ftp/tests/tags.yml | 2 -- modules/local/sra_to_samplesheet/tests/tags.yml | 2 -- .../custom/sratoolsncbisettings/tests/tags.yml | 2 -- .../nf-core/sratools/fasterqdump/tests/tags.yml | 2 -- modules/nf-core/sratools/prefetch/tests/tags.yml | 2 -- modules/nf-core/untar/tests/tags.yml | 2 -- .../tests/tags.yml | 2 -- .../utils_nextflow_pipeline/tests/tags.yml | 2 -- .../nf-core/utils_nfcore_pipeline/tests/tags.yml | 2 -- .../utils_nfvalidation_plugin/tests/tags.yml | 2 -- tests/tags.yml | 5 ----- workflows/sra/tests/tags.yml | 16 ---------------- 15 files changed, 47 deletions(-) delete mode 100644 modules/local/multiqc_mappings_config/tests/tags.yml delete mode 100644 modules/local/sra_fastq_ftp/tests/tags.yml delete mode 100644 modules/local/sra_ids_to_runinfo/tests/tags.yml delete mode 100644 modules/local/sra_runinfo_to_ftp/tests/tags.yml delete mode 100644 modules/local/sra_to_samplesheet/tests/tags.yml delete mode 100644 modules/nf-core/custom/sratoolsncbisettings/tests/tags.yml delete mode 100644 modules/nf-core/sratools/fasterqdump/tests/tags.yml delete mode 100644 modules/nf-core/sratools/prefetch/tests/tags.yml delete mode 100644 modules/nf-core/untar/tests/tags.yml delete mode 100644 subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/tags.yml delete mode 100644 subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml delete mode 100644 subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml delete mode 100644 subworkflows/nf-core/utils_nfvalidation_plugin/tests/tags.yml delete mode 100644 tests/tags.yml delete mode 100644 workflows/sra/tests/tags.yml diff --git a/modules/local/multiqc_mappings_config/tests/tags.yml b/modules/local/multiqc_mappings_config/tests/tags.yml deleted file mode 100644 index 595e2e31..00000000 --- a/modules/local/multiqc_mappings_config/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -multiqc_mappings_config: - - modules/local/multiqc_mappings_config/** diff --git a/modules/local/sra_fastq_ftp/tests/tags.yml b/modules/local/sra_fastq_ftp/tests/tags.yml deleted file mode 100644 index e7474bef..00000000 --- a/modules/local/sra_fastq_ftp/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -sra_fastq_ftp: - - modules/local/sra_fastq_ftp/** diff --git a/modules/local/sra_ids_to_runinfo/tests/tags.yml b/modules/local/sra_ids_to_runinfo/tests/tags.yml deleted file mode 100644 index 63ea7db3..00000000 --- a/modules/local/sra_ids_to_runinfo/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -sra_ids_to_runinfo: - - modules/local/sra_ids_to_runinfo/** diff --git a/modules/local/sra_runinfo_to_ftp/tests/tags.yml b/modules/local/sra_runinfo_to_ftp/tests/tags.yml deleted file mode 100644 index 0987a1e6..00000000 --- a/modules/local/sra_runinfo_to_ftp/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -sra_runinfo_to_ftp: - - modules/local/sra_runinfo_to_ftp/** diff --git a/modules/local/sra_to_samplesheet/tests/tags.yml b/modules/local/sra_to_samplesheet/tests/tags.yml deleted file mode 100644 index 2f2d527b..00000000 --- a/modules/local/sra_to_samplesheet/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -sra_to_samplesheet: - - modules/local/sra_to_samplesheet/** diff --git a/modules/nf-core/custom/sratoolsncbisettings/tests/tags.yml b/modules/nf-core/custom/sratoolsncbisettings/tests/tags.yml deleted file mode 100644 index fb4a08a7..00000000 --- a/modules/nf-core/custom/sratoolsncbisettings/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -custom/sratoolsncbisettings: - - modules/nf-core/custom/sratoolsncbisettings/** diff --git a/modules/nf-core/sratools/fasterqdump/tests/tags.yml b/modules/nf-core/sratools/fasterqdump/tests/tags.yml deleted file mode 100644 index 5d1ddcb3..00000000 --- a/modules/nf-core/sratools/fasterqdump/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -sratools/fasterqdump: - - modules/nf-core/sratools/fasterqdump/** diff --git a/modules/nf-core/sratools/prefetch/tests/tags.yml b/modules/nf-core/sratools/prefetch/tests/tags.yml deleted file mode 100644 index 52110bfd..00000000 --- a/modules/nf-core/sratools/prefetch/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -sratools/prefetch: - - modules/nf-core/sratools/prefetch/** diff --git a/modules/nf-core/untar/tests/tags.yml b/modules/nf-core/untar/tests/tags.yml deleted file mode 100644 index feb6f15c..00000000 --- a/modules/nf-core/untar/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -untar: - - modules/nf-core/untar/** diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/tags.yml b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/tags.yml deleted file mode 100644 index 03028c32..00000000 --- a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -subworkflows/fastq_download_prefetch_fasterqdump_sratools: - - subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/** diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml b/subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml deleted file mode 100644 index f8476112..00000000 --- a/subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -subworkflows/utils_nextflow_pipeline: - - subworkflows/nf-core/utils_nextflow_pipeline/** diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml b/subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml deleted file mode 100644 index ac8523c9..00000000 --- a/subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -subworkflows/utils_nfcore_pipeline: - - subworkflows/nf-core/utils_nfcore_pipeline/** diff --git a/subworkflows/nf-core/utils_nfvalidation_plugin/tests/tags.yml b/subworkflows/nf-core/utils_nfvalidation_plugin/tests/tags.yml deleted file mode 100644 index 60b1cfff..00000000 --- a/subworkflows/nf-core/utils_nfvalidation_plugin/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -subworkflows/utils_nfvalidation_plugin: - - subworkflows/nf-core/utils_nfvalidation_plugin/** diff --git a/tests/tags.yml b/tests/tags.yml deleted file mode 100644 index 80e5fd75..00000000 --- a/tests/tags.yml +++ /dev/null @@ -1,5 +0,0 @@ -pipeline_fetchngs: - - "**.nf" - - "**.config" - - "**.nf.test" - - "**.json" diff --git a/workflows/sra/tests/tags.yml b/workflows/sra/tests/tags.yml deleted file mode 100644 index ae41e37d..00000000 --- a/workflows/sra/tests/tags.yml +++ /dev/null @@ -1,16 +0,0 @@ -sra_custom_ena_metadata_fields: - - workflows/sra/** -sra_default_parameters: - - workflows/sra/** -sra_force_sratools_download: - - workflows/sra/** -sra_nf_core_pipeline_atacseq: - - workflows/sra/** -sra_nf_core_pipeline_rnaseq: - - workflows/sra/** -sra_nf_core_pipeline_taxprofiler: - - workflows/sra/** -sra_nf_core_pipeline_viralrecon: - - workflows/sra/** -sra_skip_fastq_download: - - workflows/sra/** From a6c34fcd769b361832071e1f2e8343bc657d0d25 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Thu, 18 Jan 2024 15:56:31 +0000 Subject: [PATCH 694/852] Tag order changed --- modules/nf-core/sratools/fasterqdump/tests/main.nf.test | 3 ++- tests/main.nf.test | 4 ++-- workflows/sra/tests/main.nf.test | 6 ++++-- workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test | 6 +++--- workflows/sra/tests/sra_force_sratools_download.nf.test | 6 +++--- workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test | 6 +++--- workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test | 6 +++--- .../sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test | 6 +++--- workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test | 6 +++--- workflows/sra/tests/sra_skip_fastq_download.nf.test | 6 +++--- 10 files changed, 29 insertions(+), 26 deletions(-) diff --git a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test index 15277dbc..18f9b925 100644 --- a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test +++ b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test @@ -3,9 +3,10 @@ nextflow_process { script "../main.nf" config "./nextflow.config" process "SRATOOLS_FASTERQDUMP" + + tag "SRATOOLS_FASTERQDUMP" tag "UNTAR" - tag "SRATOOLS_FASTERQDUMP" test("Single-end") { diff --git a/tests/main.nf.test b/tests/main.nf.test index 4e664778..7857a11a 100644 --- a/tests/main.nf.test +++ b/tests/main.nf.test @@ -3,9 +3,9 @@ nextflow_pipeline { name "Test pipeline" script "../main.nf" - tag "SRA" - tag "FETCHNGS" + + tag "SRA" test("Run with profile test") { diff --git a/workflows/sra/tests/main.nf.test b/workflows/sra/tests/main.nf.test index 1d63d8d8..3b452564 100644 --- a/workflows/sra/tests/main.nf.test +++ b/workflows/sra/tests/main.nf.test @@ -4,6 +4,10 @@ nextflow_workflow { script "../main.nf" workflow "SRA" + + // Subworkflows + tag "SRA" + // Modules tag "MULTIQC_MAPPINGS_CONFIG" tag "SRA_FASTQ_FTP" @@ -11,8 +15,6 @@ nextflow_workflow { tag "SRA_RUNINFO_TO_FTP" tag "SRA_TO_SAMPLESHEET" - // Subworkflows - tag "SRA" test("Parameters: default") { diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test index b0f9e4f4..0724b4fb 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test @@ -4,6 +4,9 @@ nextflow_workflow { script "../main.nf" workflow "SRA" + // Subworkflows + tag "SRA" + // Modules tag "MULTIQC_MAPPINGS_CONFIG" tag "SRA_FASTQ_FTP" @@ -11,9 +14,6 @@ nextflow_workflow { tag "SRA_RUNINFO_TO_FTP" tag "SRA_TO_SAMPLESHEET" - // Subworkflows - tag "SRA" - test("Parameters: --nf_core_pipeline rnaseq --ena_metadata_fields ... --sample_mapping_fields ...") { when { diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test b/workflows/sra/tests/sra_force_sratools_download.nf.test index 78658b7c..2d01c694 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test @@ -4,6 +4,9 @@ nextflow_workflow { script "../main.nf" workflow "SRA" + // Subworkflows + tag "SRA" + // Modules tag "MULTIQC_MAPPINGS_CONFIG" tag "SRA_FASTQ_FTP" @@ -11,9 +14,6 @@ nextflow_workflow { tag "SRA_RUNINFO_TO_FTP" tag "SRA_TO_SAMPLESHEET" - // Subworkflows - tag "SRA" - test("Parameters: --force_sratools_download") { when { diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test index 816235ef..d792e09f 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test @@ -4,6 +4,9 @@ nextflow_workflow { script "../main.nf" workflow "SRA" + // Subworkflows + tag "SRA" + // Modules tag "MULTIQC_MAPPINGS_CONFIG" tag "SRA_FASTQ_FTP" @@ -11,9 +14,6 @@ nextflow_workflow { tag "SRA_RUNINFO_TO_FTP" tag "SRA_TO_SAMPLESHEET" - // Subworkflows - tag "SRA" - test("Parameters: --nf_core_pipeline atacseq") { when { diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test index dd3b55d0..7f2603f6 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test @@ -4,6 +4,9 @@ nextflow_workflow { script "../main.nf" workflow "SRA" + // Subworkflows + tag "SRA" + // Modules tag "MULTIQC_MAPPINGS_CONFIG" tag "SRA_FASTQ_FTP" @@ -11,9 +14,6 @@ nextflow_workflow { tag "SRA_RUNINFO_TO_FTP" tag "SRA_TO_SAMPLESHEET" - // Subworkflows - tag "SRA" - test("Parameters: --nf_core_pipeline rnaseq") { when { diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test index fe907dc6..7d4fcb23 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test @@ -4,6 +4,9 @@ nextflow_workflow { script "../main.nf" workflow "SRA" + // Subworkflows + tag "SRA" + // Modules tag "MULTIQC_MAPPINGS_CONFIG" tag "SRA_FASTQ_FTP" @@ -11,9 +14,6 @@ nextflow_workflow { tag "SRA_RUNINFO_TO_FTP" tag "SRA_TO_SAMPLESHEET" - // Subworkflows - tag "SRA" - test("Parameters: --nf_core_pipeline taxprofiler") { when { diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test index 938edc00..89f8f370 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test @@ -4,6 +4,9 @@ nextflow_workflow { script "../main.nf" workflow "SRA" + // Subworkflows + tag "SRA" + // Modules tag "MULTIQC_MAPPINGS_CONFIG" tag "SRA_FASTQ_FTP" @@ -11,9 +14,6 @@ nextflow_workflow { tag "SRA_RUNINFO_TO_FTP" tag "SRA_TO_SAMPLESHEET" - // Subworkflows - tag "SRA" - test("Parameters: --nf_core_pipeline viralrecon") { when { diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test b/workflows/sra/tests/sra_skip_fastq_download.nf.test index 63ec1be0..b3fdd883 100644 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test @@ -4,6 +4,9 @@ nextflow_workflow { script "../main.nf" workflow "SRA" + // Subworkflows + tag "SRA" + // Modules tag "MULTIQC_MAPPINGS_CONFIG" tag "SRA_FASTQ_FTP" @@ -11,9 +14,6 @@ nextflow_workflow { tag "SRA_RUNINFO_TO_FTP" tag "SRA_TO_SAMPLESHEET" - // Subworkflows - tag "SRA" - test("Parameters: --skip_fastq_download") { when { From 76095d3f89d178a86c73821151ad7e0318f33c7b Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Thu, 18 Jan 2024 17:47:53 +0000 Subject: [PATCH 695/852] Replace tag logic in Github Action testing workflow --- .github/workflows/ci.yml | 50 ++++++++++++++++++++++++++++++---------- 1 file changed, 38 insertions(+), 12 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9034d1db..170fc852 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,19 +27,45 @@ jobs: name: Check for changes runs-on: ubuntu-latest outputs: - # Expose matched filters as job 'tags' output variable - tags: ${{ steps.filter.outputs.changes }} + n_changes: ${{ steps.changed_files.outputs.all_modified_files_count }} + tags: ${{ steps.changed_files.outputs.all_changed_files }} steps: + - name: Install Nextflow + uses: nf-core/setup-nextflow@v1 + with: + version: "${{ matrix.NXF_VER }}" + + - name: Cache nf-test installation + id: cache-software + uses: actions/cache@v3 + with: + path: | + /usr/local/bin/nf-test + /home/runner/.nf-test/nf-test.jar + key: ${{ runner.os }}-${{ env.NFT_VER }}-nftest + + - name: Install nf-test + if: steps.cache-software.outputs.cache-hit != 'true' + run: | + wget -qO- https://code.askimed.com/install/nf-test | bash + sudo mv nf-test /usr/local/bin/ + - uses: actions/checkout@v3 - - name: Combine all tags.yml files - id: get_username - run: find . -name "tags.yml" -not -path "./.github/*" -exec cat {} + > .github/tags.yml - - name: debug - run: cat .github/tags.yml - - uses: dorny/paths-filter@v2 - id: filter with: - filters: ".github/tags.yml" + fetch-depth: 0 + + - uses: tj-actions/changed-files@v42 + id: changed_files + with: + dir_names: "true" + + - name: nf-test list tags + id: list + if: ${{ steps.changed_files.outputs.all_modified_files_count > 0 }} + run: nf-test list --silent --tags --format json ${{ steps.changed_files.outputs.all_changed_files }} | paste -sd, - + + - name: debug + run: echo ${{ steps.changed_files.outputs }} define_nxf_versions: name: Choose nextflow versions to test against depending on target branch @@ -56,9 +82,9 @@ jobs: fi test: - name: ${{ matrix.tags }} ${{ matrix.profile }} NF ${{ matrix.NXF_VER }} + name: ${{ matrix.tags }} ${{ matrix.profile }} NF-${{ matrix.NXF_VER }} needs: [changes, define_nxf_versions] - if: needs.changes.outputs.tags != '[]' + if: needs.changes.outputs.n_changes > 0 runs-on: ubuntu-latest strategy: fail-fast: false From c325d8d8e20c44c6dc5274ebf39cc20e9c709288 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Thu, 18 Jan 2024 17:53:15 +0000 Subject: [PATCH 696/852] Fixup CI --- .github/workflows/ci.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 170fc852..1d522263 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,8 +27,8 @@ jobs: name: Check for changes runs-on: ubuntu-latest outputs: - n_changes: ${{ steps.changed_files.outputs.all_modified_files_count }} - tags: ${{ steps.changed_files.outputs.all_changed_files }} + changes: ${{ steps.changed_files.outputs.any_modified }} + tags: ${{ steps.list.outputs.tags }} steps: - name: Install Nextflow uses: nf-core/setup-nextflow@v1 @@ -61,8 +61,8 @@ jobs: - name: nf-test list tags id: list - if: ${{ steps.changed_files.outputs.all_modified_files_count > 0 }} - run: nf-test list --silent --tags --format json ${{ steps.changed_files.outputs.all_changed_files }} | paste -sd, - + if: ${{ steps.changed_files.outputs.any_modified }} + run: echo tags=$(nf-test list --silent --tags --format json ${{ steps.changed_files.outputs.all_changed_files }}) >> $GITHUB_OUTPUT - name: debug run: echo ${{ steps.changed_files.outputs }} @@ -84,7 +84,7 @@ jobs: test: name: ${{ matrix.tags }} ${{ matrix.profile }} NF-${{ matrix.NXF_VER }} needs: [changes, define_nxf_versions] - if: needs.changes.outputs.n_changes > 0 + if: needs.changes.outputs.changes runs-on: ubuntu-latest strategy: fail-fast: false From fe432bc7e475da5e618d6938eba5b6880164fb69 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Thu, 18 Jan 2024 17:58:03 +0000 Subject: [PATCH 697/852] Correct UTILS_NEXTFLOW_PIPELINE tag --- .github/workflows/ci.yml | 3 --- .../utils_nextflow_pipeline/tests/main.functions.nf.test | 2 +- .../utils_nextflow_pipeline/tests/main.workflow.nf.test | 5 ++--- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1d522263..d39fbb6b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -64,9 +64,6 @@ jobs: if: ${{ steps.changed_files.outputs.any_modified }} run: echo tags=$(nf-test list --silent --tags --format json ${{ steps.changed_files.outputs.all_changed_files }}) >> $GITHUB_OUTPUT - - name: debug - run: echo ${{ steps.changed_files.outputs }} - define_nxf_versions: name: Choose nextflow versions to test against depending on target branch runs-on: ubuntu-latest diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.functions.nf.test b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.functions.nf.test index 50c90208..81f5ba45 100644 --- a/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.functions.nf.test +++ b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.functions.nf.test @@ -5,7 +5,7 @@ nextflow_function { script "subworkflows/nf-core/utils_nextflow_pipeline/main.nf" config "subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config" - tag 'UTILS_NEXTFLOW_PIPELINE' + tag "UTILS_NEXTFLOW_PIPELINE" test("Test Function getWorkflowVersion") { diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test index e2fa5b6c..007606ef 100644 --- a/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test +++ b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test @@ -4,9 +4,8 @@ nextflow_workflow { script "../main.nf" config "subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config" workflow "UTILS_NEXTFLOW_PIPELINE" - tag 'subworkflows' - tag 'utils_nextflow_pipeline' - tag 'subworkflows/utils_nextflow_pipeline' + + tag "UTILS_NEXTFLOW_PIPELINE" test("Should run no inputs") { From bcae51ab541155e0bcc31cdd4e3d937beda0677e Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Thu, 18 Jan 2024 18:02:07 +0000 Subject: [PATCH 698/852] ECLint --- modules/local/sra_to_samplesheet/tests/main.nf.test | 2 +- tests/main.nf.test | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/local/sra_to_samplesheet/tests/main.nf.test b/modules/local/sra_to_samplesheet/tests/main.nf.test index 7b7a52a8..999864b8 100644 --- a/modules/local/sra_to_samplesheet/tests/main.nf.test +++ b/modules/local/sra_to_samplesheet/tests/main.nf.test @@ -3,7 +3,7 @@ nextflow_process { name "Test process: SRA_TO_SAMPLESHEET" script "../main.nf" process "SRA_TO_SAMPLESHEET" - + tag "SRA_TO_SAMPLESHEET" test("Should run without failures") { diff --git a/tests/main.nf.test b/tests/main.nf.test index 7857a11a..8331d376 100644 --- a/tests/main.nf.test +++ b/tests/main.nf.test @@ -4,7 +4,7 @@ nextflow_pipeline { script "../main.nf" tag "FETCHNGS" - + tag "SRA" test("Run with profile test") { From b1b117daf7538a293c2423dcf4155c89e2d84ad8 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Fri, 19 Jan 2024 11:35:58 +0000 Subject: [PATCH 699/852] Use PIPELINE tag --- tests/main.nf.test | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tests/main.nf.test b/tests/main.nf.test index 8331d376..c49d70f9 100644 --- a/tests/main.nf.test +++ b/tests/main.nf.test @@ -1,9 +1,8 @@ -nextflow_pipeline { +nextflow_pipeline name "Test pipeline" script "../main.nf" - - tag "FETCHNGS" + tag "PIPELINE" tag "SRA" @@ -81,4 +80,4 @@ nextflow_pipeline { ) } } -} + From 7d889625916f3acd507ec53dedbfad32d16ddc34 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Fri, 19 Jan 2024 11:36:12 +0000 Subject: [PATCH 700/852] Add exclusion statments for linting files --- .github/workflows/ci.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d39fbb6b..04519dee 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -58,6 +58,20 @@ jobs: id: changed_files with: dir_names: "true" + files_ignore: | + .git* + .gitpod.yml + .prettierignore + .prettierrc.yml + **.md + **.png + pyproject.toml + tower.yml + + - name: debug + run: | + echo ${{ steps.changed_files.outputs.any_modified }} + echo ${{ steps.changed_files.outputs.all_changed_files }} - name: nf-test list tags id: list From c36a8aa4c2373fb225e78453c0c711692fa1de46 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Fri, 19 Jan 2024 11:41:26 +0000 Subject: [PATCH 701/852] Add renamed files as deleted and added --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 04519dee..9e3dc48f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -58,6 +58,7 @@ jobs: id: changed_files with: dir_names: "true" + output_renamed_files_as_deleted_and_added: "true" files_ignore: | .git* .gitpod.yml From 412b0594f4e49d1fd272f90935f7fa5004721059 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Fri, 19 Jan 2024 11:45:06 +0000 Subject: [PATCH 702/852] Add another debugging step --- .github/workflows/ci.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9e3dc48f..81000541 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -79,6 +79,10 @@ jobs: if: ${{ steps.changed_files.outputs.any_modified }} run: echo tags=$(nf-test list --silent --tags --format json ${{ steps.changed_files.outputs.all_changed_files }}) >> $GITHUB_OUTPUT + - name: debug2 + run: | + echo ${{ steps.list.outputs.tags }} + define_nxf_versions: name: Choose nextflow versions to test against depending on target branch runs-on: ubuntu-latest From 2f6a78ab6a1eead34072bea76dc8796a983efd57 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Fri, 19 Jan 2024 11:46:48 +0000 Subject: [PATCH 703/852] Revert "Use PIPELINE tag" This reverts commit b1b117daf7538a293c2423dcf4155c89e2d84ad8. --- tests/main.nf.test | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/main.nf.test b/tests/main.nf.test index c49d70f9..8331d376 100644 --- a/tests/main.nf.test +++ b/tests/main.nf.test @@ -1,8 +1,9 @@ -nextflow_pipeline +nextflow_pipeline { name "Test pipeline" script "../main.nf" - tag "PIPELINE" + + tag "FETCHNGS" tag "SRA" @@ -80,4 +81,4 @@ nextflow_pipeline ) } } - +} From f28a3365bf99a1469cac845252def0167aa7651b Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Fri, 19 Jan 2024 11:49:18 +0000 Subject: [PATCH 704/852] Use PIPELINE tag --- tests/main.nf.test | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/main.nf.test b/tests/main.nf.test index 8331d376..3a88b84e 100644 --- a/tests/main.nf.test +++ b/tests/main.nf.test @@ -2,8 +2,7 @@ nextflow_pipeline { name "Test pipeline" script "../main.nf" - - tag "FETCHNGS" + tag "PIPELINE" tag "SRA" From a97290123b6d7cebd42f77c007249f1cbbfb9df8 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 19 Jan 2024 13:23:03 +0100 Subject: [PATCH 705/852] first tests --- .../tests/main.function.nf.test | 35 +++++++++++++++++++ .../tests/main.function.nf.test.snap | 10 ++++++ .../tests/tags.yml | 2 ++ 3 files changed, 47 insertions(+) create mode 100644 subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.function.nf.test create mode 100644 subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.function.nf.test.snap create mode 100644 subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/tags.yml diff --git a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.function.nf.test b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.function.nf.test new file mode 100644 index 00000000..e6f11432 --- /dev/null +++ b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.function.nf.test @@ -0,0 +1,35 @@ + +nextflow_function { + + name "Test Functions" + script "subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf" + tag 'subworkflows' + tag 'utils_nfcore_fetchngs_pipeline' + tag 'subworkflows/utils_nfcore_fetchngs_pipeline' + +// isSraId(input) +// isSynapseId(input) +// sraCheckENAMetadataFields(ena_metadata_fields) +// synapseShowToMap(synapse_file) +// synapseSampleNameFromFastQ(input_file, pattern) + + test("Function sraCurateSamplesheetWarn") { + + function "sraCurateSamplesheetWarn" + + then { + assert function.success + assert snapshot(function.result).match() + } + } + + test("Function synapseCurateSamplesheetWarn") { + + function "synapseCurateSamplesheetWarn" + + then { + assert function.success + assert snapshot(function.result).match() + } + } +} diff --git a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.function.nf.test.snap b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.function.nf.test.snap new file mode 100644 index 00000000..0dda851c --- /dev/null +++ b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.function.nf.test.snap @@ -0,0 +1,10 @@ +{ + "Function sraCurateSamplesheetWarn": { + "content": null, + "timestamp": "2024-01-19T13:21:43.405877" + }, + "Function synapseCurateSamplesheetWarn": { + "content": null, + "timestamp": "2024-01-19T13:21:50.818169" + } +} \ No newline at end of file diff --git a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/tags.yml b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/tags.yml new file mode 100644 index 00000000..944508d1 --- /dev/null +++ b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/tags.yml @@ -0,0 +1,2 @@ +subworkflows/utils_nfcore_fetchngs_pipeline: + - subworkflows/local/utils_nfcore_fetchngs_pipeline/** From 5dcc751d2a6a0bc050f68787d115b9789a092b91 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 19 Jan 2024 16:37:51 +0100 Subject: [PATCH 706/852] update function tests + snap --- .../tests/main.function.nf.test | 81 ++++++++++++++++--- .../tests/main.function.nf.test.snap | 18 ++++- 2 files changed, 87 insertions(+), 12 deletions(-) diff --git a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.function.nf.test b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.function.nf.test index e6f11432..7b3ab592 100644 --- a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.function.nf.test +++ b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.function.nf.test @@ -7,11 +7,64 @@ nextflow_function { tag 'utils_nfcore_fetchngs_pipeline' tag 'subworkflows/utils_nfcore_fetchngs_pipeline' -// isSraId(input) -// isSynapseId(input) -// sraCheckENAMetadataFields(ena_metadata_fields) -// synapseShowToMap(synapse_file) -// synapseSampleNameFromFastQ(input_file, pattern) + test("Function isSraId") { + + function "isSraId" + + when { + function { + """ + input[0] = 'DRR000774' + """ + } + } + + then { + assertAll( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + } + + test("Function sraCheckENAMetadataFields [success]") { + + function "sraCheckENAMetadataFields" + + when { + function { + """ + input[0] = 'run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5' + """ + } + } + + then { + assertAll( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + } + + test("Function sraCheckENAMetadataFields [failure]") { + + function "sraCheckENAMetadataFields" + + when { + function { + """ + input[0] = 'run_accession,experiment_accession,library_layout,fastq_ftp' + """ + } + } + + then { + assertAll( + { assert !function.success } + ) + } + } test("Function sraCurateSamplesheetWarn") { @@ -23,13 +76,23 @@ nextflow_function { } } - test("Function synapseCurateSamplesheetWarn") { + test("Function isSynapseId") { + + function "isSynapseId" - function "synapseCurateSamplesheetWarn" + when { + function { + """ + input[0] = 'syn26240435' + """ + } + } then { - assert function.success - assert snapshot(function.result).match() + assertAll( + { assert function.success }, + { assert snapshot(function.result).match() } + ) } } } diff --git a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.function.nf.test.snap b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.function.nf.test.snap index 0dda851c..335967e6 100644 --- a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.function.nf.test.snap +++ b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.function.nf.test.snap @@ -1,10 +1,22 @@ { "Function sraCurateSamplesheetWarn": { "content": null, - "timestamp": "2024-01-19T13:21:43.405877" + "timestamp": "2024-01-19T16:37:05.668505" }, - "Function synapseCurateSamplesheetWarn": { + "Function sraCheckENAMetadataFields [success]": { "content": null, - "timestamp": "2024-01-19T13:21:50.818169" + "timestamp": "2024-01-19T16:36:51.121603" + }, + "Function isSraId": { + "content": [ + true + ], + "timestamp": "2024-01-19T16:36:43.68958" + }, + "Function isSynapseId": { + "content": [ + true + ], + "timestamp": "2024-01-19T16:37:12.992364" } } \ No newline at end of file From 401f91dcc5a5d2d45d84e7913d7abc8bd0699116 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Fri, 19 Jan 2024 16:49:24 +0000 Subject: [PATCH 707/852] Add files_yaml stuff for checking all --- .github/workflows/ci.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 81000541..d0d1e655 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -59,6 +59,17 @@ jobs: with: dir_names: "true" output_renamed_files_as_deleted_and_added: "true" + files_yaml: | + all: + - .github/workflows/** + - nf-test.config + - nextflow.config + pipeline: + - assets/* + - bin/* + - conf/* + - main.nf + - nextflow_schema.json files_ignore: | .git* .gitpod.yml @@ -66,6 +77,7 @@ jobs: .prettierrc.yml **.md **.png + modules.json pyproject.toml tower.yml From 6cdff1c77708464d4d90d708dd5298b697eb7bf5 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Fri, 19 Jan 2024 16:57:57 +0000 Subject: [PATCH 708/852] Add debug step --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d0d1e655..0705cb0c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -85,6 +85,7 @@ jobs: run: | echo ${{ steps.changed_files.outputs.any_modified }} echo ${{ steps.changed_files.outputs.all_changed_files }} + echo ${{ steps.changed_files.outputs.changed_keys }}} - name: nf-test list tags id: list From d490e6ab9f84f446de5ecf0fa0a5b033474f77d8 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Fri, 19 Jan 2024 17:02:05 +0000 Subject: [PATCH 709/852] Refine pipeline and 'all' test rules --- .github/workflows/ci.yml | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0705cb0c..d167e13e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -59,17 +59,19 @@ jobs: with: dir_names: "true" output_renamed_files_as_deleted_and_added: "true" + # Define list of additional rules for testing paths + # Mostly, we define additional 'pipeline' or 'all' tests here files_yaml: | - all: - - .github/workflows/** - - nf-test.config - - nextflow.config - pipeline: + tests: - assets/* - bin/* - conf/* - main.nf - nextflow_schema.json + ".": + - .github/workflows/** + - nf-test.config + - nextflow.config files_ignore: | .git* .gitpod.yml @@ -85,12 +87,12 @@ jobs: run: | echo ${{ steps.changed_files.outputs.any_modified }} echo ${{ steps.changed_files.outputs.all_changed_files }} - echo ${{ steps.changed_files.outputs.changed_keys }}} + echo ${{ steps.changed_files.outputs.changed_keys }} - name: nf-test list tags id: list if: ${{ steps.changed_files.outputs.any_modified }} - run: echo tags=$(nf-test list --silent --tags --format json ${{ steps.changed_files.outputs.all_changed_files }}) >> $GITHUB_OUTPUT + run: echo tags=$(nf-test list --silent --tags --format json ${{ steps.changed_files.outputs.all_changed_files }} ${{ steps.changed_files.outputs.changed_keys }}) >> $GITHUB_OUTPUT - name: debug2 run: | From 00c2ea02eb2e3cda4e98e5a3af52e2c2bff1db5b Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Fri, 19 Jan 2024 17:05:08 +0000 Subject: [PATCH 710/852] Add shared tag to pipeline level tests --- .github/workflows/ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d167e13e..e4b66ab7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -62,13 +62,14 @@ jobs: # Define list of additional rules for testing paths # Mostly, we define additional 'pipeline' or 'all' tests here files_yaml: | - tests: + tests: &shared - assets/* - bin/* - conf/* - main.nf - nextflow_schema.json ".": + - *shared - .github/workflows/** - nf-test.config - nextflow.config From 36972d006bdd702ac15a322088064adf42b9f54b Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 19 Jan 2024 18:19:28 +0100 Subject: [PATCH 711/852] forgotten } --- subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf b/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf index 21249dd7..821344d0 100644 --- a/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf @@ -31,7 +31,7 @@ workflow PIPELINE_INITIALISATION { take: version // boolean: Display version and exit help // boolean: Display help text - validate_params // boolean: Boolean whether to validate parameters against the schema at runtime + validate_params // boolean: Boolean whether to validate parameters against the schema at runtime monochrome_logs // boolean: Do not use coloured log outputs outdir // string: The output directory where the results will be saved input // string: File containing SRA/ENA/GEO/DDBJ identifiers one per line to download their associated metadata and FastQ files From 4d2d566d8f21139874ee6ed316f50d128336d0bb Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Fri, 19 Jan 2024 17:31:25 +0000 Subject: [PATCH 712/852] Remove shared yaml anchor because I think it isn't needed --- .github/workflows/ci.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e4b66ab7..3ee6b6a0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -62,17 +62,17 @@ jobs: # Define list of additional rules for testing paths # Mostly, we define additional 'pipeline' or 'all' tests here files_yaml: | - tests: &shared + ".": + - .github/workflows/** + - nf-test.config + - nextflow.config + tests: - assets/* - bin/* - conf/* - main.nf - nextflow_schema.json - ".": - - *shared - - .github/workflows/** - - nf-test.config - - nextflow.config + files_ignore: | .git* .gitpod.yml From 4615f9669441688f5c7e83766c82e8657000b436 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 19 Jan 2024 19:35:07 +0100 Subject: [PATCH 713/852] first version --- ...n.workflow_pipeline_initialisation.nf.test | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_initialisation.nf.test diff --git a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_initialisation.nf.test b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_initialisation.nf.test new file mode 100644 index 00000000..fe00b6c9 --- /dev/null +++ b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_initialisation.nf.test @@ -0,0 +1,45 @@ +nextflow_workflow { + + name "Test Workflow PIPELINE_INITIALISATION" + script "subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf" + workflow "PIPELINE_INITIALISATION" + tag 'subworkflows' + tag 'utils_nfcore_fetchngs_pipeline' + tag 'subworkflows/utils_nfcore_fetchngs_pipeline' + + test("Should run") { + + when { + params { + outdir = "$outputDir" + } + workflow { + """ + version = false + help = false + validate_params = true + monochrome_logs = false + outdir = "$params.outdir" + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/2732b911c57e607fa7aea5ba0c3d91b25bafb662/testdata/v1.12.0/sra_ids_test.csv' + input_type = 'sra' + ena_metadata_fields = 'null' + + input [0] = version + input [1] = help + input [2] = validate_params + input [3] = monochrome_logs + input [4] = outdir + input [5] = input + input [6] = input_type + input [7] = ena_metadata_fields + """ + } + } + + then { + assertAll( + { assert workflow.success } + ) + } + } +} From b4ce5e073cefd0732c62e1be81e9fd2345b3b116 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Fri, 19 Jan 2024 19:44:18 +0100 Subject: [PATCH 714/852] add tests for completion --- .../main.workflow_pipeline_completion.test | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_completion.test diff --git a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_completion.test b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_completion.test new file mode 100644 index 00000000..a840f0ae --- /dev/null +++ b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_completion.test @@ -0,0 +1,43 @@ +nextflow_workflow { + + name "Test Workflow PIPELINE_COMPLETION" + script "subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf" + workflow "PIPELINE_COMPLETION" + tag 'subworkflows' + tag 'utils_nfcore_fetchngs_pipeline' + tag 'subworkflows/utils_nfcore_fetchngs_pipeline' + + test("Should run") { + + when { + params { + outdir = "$outputDir" + } + workflow { + """ + input_type = 'sra' + email = null + email_on_fail = null + plaintext_email = false + outdir = "$params.outdir" + monochrome_logs = false + hook_url = null + + input [0] = input_type + input [1] = email + input [2] = email_on_fail + input [3] = plaintext_email + input [4] = outdir + input [5] = monochrome_logs + input [6] = hook_url + """ + } + } + + then { + assertAll( + { assert workflow.success } + ) + } + } +} From 6c004336922a64e8634fb9b7fff149a961b433fc Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Mon, 22 Jan 2024 15:44:42 +0000 Subject: [PATCH 715/852] Use collect and confirm strategy for tests Replace Nextflow versioning with simple list matrix --- .github/workflows/ci.yml | 52 +++++++++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3ee6b6a0..715800c8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -32,8 +32,6 @@ jobs: steps: - name: Install Nextflow uses: nf-core/setup-nextflow@v1 - with: - version: "${{ matrix.NXF_VER }}" - name: Cache nf-test installation id: cache-software @@ -99,29 +97,31 @@ jobs: run: | echo ${{ steps.list.outputs.tags }} - define_nxf_versions: - name: Choose nextflow versions to test against depending on target branch - runs-on: ubuntu-latest - outputs: - matrix: ${{ steps.nxf_versions.outputs.matrix }} - steps: - - id: nxf_versions - run: | - if [[ "${{ github.event_name }}" == "pull_request" && "${{ github.base_ref }}" == "dev" && "${{ matrix.NXF_VER }}" != "latest-everything" ]]; then - echo matrix='["latest-everything"]' | tee -a $GITHUB_OUTPUT - else - echo matrix='["latest-everything", "23.04.0"]' | tee -a $GITHUB_OUTPUT - fi + # define_nxf_versions: + # name: Choose nextflow versions to test against depending on target branch + # runs-on: ubuntu-latest + # outputs: + # matrix: ${{ steps.nxf_versions.outputs.matrix }} + # steps: + # - id: nxf_versions + # run: | + # if [[ "${{ github.event_name }}" == "pull_request" && "${{ github.base_ref }}" == "dev" && "${{ matrix.NXF_VER }}" != "latest-everything" ]]; then + # echo matrix='["latest-everything"]' | tee -a $GITHUB_OUTPUT + # else + # echo matrix='["latest-everything", "23.04.0"]' | tee -a $GITHUB_OUTPUT + # fi test: name: ${{ matrix.tags }} ${{ matrix.profile }} NF-${{ matrix.NXF_VER }} - needs: [changes, define_nxf_versions] + needs: [changes] if: needs.changes.outputs.changes runs-on: ubuntu-latest strategy: fail-fast: false matrix: - NXF_VER: ${{ fromJson(needs.define_nxf_versions.outputs.matrix) }} + NXF_VER: + - "latest-everything" + - "23.04" tags: ["${{ fromJson(needs.changes.outputs.tags) }}"] profile: - "docker" @@ -180,3 +180,21 @@ jobs: if: always() # always run even if the previous step fails with: report_paths: test.xml + + confirm-pass: + runs-on: ubuntu-latest + needs: [test] + if: always() + steps: + - name: All tests ok + if: ${{ success() || !contains(needs.*.result, 'failure') }} + run: exit 0 + - name: One or more tests failed + if: ${{ contains(needs.*.result, 'failure') }} + run: exit 1 + + - name: debug-print + if: always() + run: | + echo "toJSON(needs) = ${{ toJSON(needs) }}" + echo "toJSON(needs.*.result) = ${{ toJSON(needs.*.result) }}" From 4cea4de07cbbb02c5d03974f59b5a19f06be3786 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Mon, 22 Jan 2024 20:48:49 +0100 Subject: [PATCH 716/852] update tests --- .../main.workflow_pipeline_completion.test | 18 +++++++-------- ...n.workflow_pipeline_initialisation.nf.test | 23 +++++++++---------- 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_completion.test b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_completion.test index a840f0ae..16f11e8f 100644 --- a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_completion.test +++ b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_completion.test @@ -11,7 +11,7 @@ nextflow_workflow { when { params { - outdir = "$outputDir" + outdir = "tests/results" } workflow { """ @@ -19,17 +19,17 @@ nextflow_workflow { email = null email_on_fail = null plaintext_email = false - outdir = "$params.outdir" + outdir = "tests/results" monochrome_logs = false hook_url = null - input [0] = input_type - input [1] = email - input [2] = email_on_fail - input [3] = plaintext_email - input [4] = outdir - input [5] = monochrome_logs - input [6] = hook_url + input[0] = input_type + input[1] = email + input[2] = email_on_fail + input[3] = plaintext_email + input[4] = outdir + input[5] = monochrome_logs + input[6] = hook_url """ } } diff --git a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_initialisation.nf.test b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_initialisation.nf.test index fe00b6c9..035ecfd3 100644 --- a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_initialisation.nf.test +++ b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_initialisation.nf.test @@ -11,27 +11,26 @@ nextflow_workflow { when { params { - outdir = "$outputDir" + outdir = "tests/results" } workflow { """ version = false help = false - validate_params = true + validate_params = false monochrome_logs = false outdir = "$params.outdir" - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/2732b911c57e607fa7aea5ba0c3d91b25bafb662/testdata/v1.12.0/sra_ids_test.csv' input_type = 'sra' - ena_metadata_fields = 'null' + ena_metadata_fields = null - input [0] = version - input [1] = help - input [2] = validate_params - input [3] = monochrome_logs - input [4] = outdir - input [5] = input - input [6] = input_type - input [7] = ena_metadata_fields + input[0] = version + input[1] = help + input[2] = validate_params + input[3] = monochrome_logs + input[4] = outdir + input[5] = 'https://raw.githubusercontent.com/nf-core/test-datasets/2732b911c57e607fa7aea5ba0c3d91b25bafb662/testdata/v1.12.0/sra_ids_test.csv' + input[6] = input_type + input[7] = ena_metadata_fields """ } } From bc256278d2224313abb96580b96c2a07bf6451a0 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Tue, 23 Jan 2024 14:48:11 +0000 Subject: [PATCH 717/852] Tag tidy based on review comments --- modules/nf-core/sratools/fasterqdump/tests/main.nf.test | 1 - modules/nf-core/sratools/prefetch/tests/main.nf.test | 1 - modules/nf-core/untar/tests/main.nf.test | 1 - .../tests/main.nf.test | 2 +- .../utils_nextflow_pipeline/tests/main.workflow.nf.test | 1 - .../nf-core/utils_nfvalidation_plugin/tests/main.nf.test | 1 - tests/main.nf.test | 2 -- workflows/sra/tests/main.nf.test | 5 +---- 8 files changed, 2 insertions(+), 12 deletions(-) diff --git a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test index 18f9b925..b3107336 100644 --- a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test +++ b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test @@ -3,7 +3,6 @@ nextflow_process { script "../main.nf" config "./nextflow.config" process "SRATOOLS_FASTERQDUMP" - tag "SRATOOLS_FASTERQDUMP" tag "UNTAR" diff --git a/modules/nf-core/sratools/prefetch/tests/main.nf.test b/modules/nf-core/sratools/prefetch/tests/main.nf.test index 0c210f9a..7319108c 100644 --- a/modules/nf-core/sratools/prefetch/tests/main.nf.test +++ b/modules/nf-core/sratools/prefetch/tests/main.nf.test @@ -2,7 +2,6 @@ nextflow_process { name "Test Process SRATOOLS_PREFETCH" script "../main.nf" process "SRATOOLS_PREFETCH" - tag "SRATOOLS_PREFETCH" test("sratools/prefetch") { diff --git a/modules/nf-core/untar/tests/main.nf.test b/modules/nf-core/untar/tests/main.nf.test index e85ec082..0eb25d3c 100644 --- a/modules/nf-core/untar/tests/main.nf.test +++ b/modules/nf-core/untar/tests/main.nf.test @@ -3,7 +3,6 @@ nextflow_process { name "Test Process UNTAR" script "../main.nf" process "UNTAR" - tag "UNTAR" test("test_untar") { diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test index b3d65c79..2f1d0835 100644 --- a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test @@ -3,11 +3,11 @@ nextflow_workflow { name "Test workflow: fastq_download_prefetch_fasterqdump_sratools/main.nf" script "../main.nf" workflow "FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS" + tag "FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS" tag "CUSTOM_SRATOOLSNCBISETTINGS" tag "SRATOOLS_PREFETCH" tag "SRATOOLS_FASTERQDUMP" - tag "SUBWORKFLOWS_FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS" test("Parameters: default") { diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test index 007606ef..3298fffe 100644 --- a/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test +++ b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test @@ -4,7 +4,6 @@ nextflow_workflow { script "../main.nf" config "subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config" workflow "UTILS_NEXTFLOW_PIPELINE" - tag "UTILS_NEXTFLOW_PIPELINE" test("Should run no inputs") { diff --git a/subworkflows/nf-core/utils_nfvalidation_plugin/tests/main.nf.test b/subworkflows/nf-core/utils_nfvalidation_plugin/tests/main.nf.test index 47bfe461..b64a5106 100644 --- a/subworkflows/nf-core/utils_nfvalidation_plugin/tests/main.nf.test +++ b/subworkflows/nf-core/utils_nfvalidation_plugin/tests/main.nf.test @@ -3,7 +3,6 @@ nextflow_workflow { name "Test Workflow UTILS_NFVALIDATION_PLUGIN" script "../main.nf" workflow "UTILS_NFVALIDATION_PLUGIN" - tag "UTILS_NFVALIDATION_PLUGIN" test("Should run nothing") { diff --git a/tests/main.nf.test b/tests/main.nf.test index 3a88b84e..dc3662cd 100644 --- a/tests/main.nf.test +++ b/tests/main.nf.test @@ -4,8 +4,6 @@ nextflow_pipeline { script "../main.nf" tag "PIPELINE" - tag "SRA" - test("Run with profile test") { when { diff --git a/workflows/sra/tests/main.nf.test b/workflows/sra/tests/main.nf.test index 3b452564..8fcd0e47 100644 --- a/workflows/sra/tests/main.nf.test +++ b/workflows/sra/tests/main.nf.test @@ -3,12 +3,9 @@ nextflow_workflow { name "Test workflow: sra/main.nf" script "../main.nf" workflow "SRA" - - - // Subworkflows tag "SRA" - // Modules + // Dependencies tag "MULTIQC_MAPPINGS_CONFIG" tag "SRA_FASTQ_FTP" tag "SRA_IDS_TO_RUNINFO" From cb4f0e6558cdf2e1435e71e8ef7e48d50b17a01a Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Fri, 26 Jan 2024 18:20:40 +0000 Subject: [PATCH 718/852] Update tags for utils_nfcore_fetchngs_pipeline subworkflow --- .../tests/main.function.nf.test | 4 +--- .../tests/main.workflow_pipeline_completion.test | 4 +--- .../tests/main.workflow_pipeline_initialisation.nf.test | 4 +--- .../local/utils_nfcore_fetchngs_pipeline/tests/tags.yml | 2 -- 4 files changed, 3 insertions(+), 11 deletions(-) delete mode 100644 subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/tags.yml diff --git a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.function.nf.test b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.function.nf.test index 7b3ab592..5e5d3a62 100644 --- a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.function.nf.test +++ b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.function.nf.test @@ -3,9 +3,7 @@ nextflow_function { name "Test Functions" script "subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf" - tag 'subworkflows' - tag 'utils_nfcore_fetchngs_pipeline' - tag 'subworkflows/utils_nfcore_fetchngs_pipeline' + tag "UTILS_NFCORE_FETCHNGS_PIPELINE" test("Function isSraId") { diff --git a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_completion.test b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_completion.test index 16f11e8f..a1814bf6 100644 --- a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_completion.test +++ b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_completion.test @@ -3,9 +3,7 @@ nextflow_workflow { name "Test Workflow PIPELINE_COMPLETION" script "subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf" workflow "PIPELINE_COMPLETION" - tag 'subworkflows' - tag 'utils_nfcore_fetchngs_pipeline' - tag 'subworkflows/utils_nfcore_fetchngs_pipeline' + tag "PIPELINE_COMPLETION" test("Should run") { diff --git a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_initialisation.nf.test b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_initialisation.nf.test index 035ecfd3..d8dc3963 100644 --- a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_initialisation.nf.test +++ b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_initialisation.nf.test @@ -3,9 +3,7 @@ nextflow_workflow { name "Test Workflow PIPELINE_INITIALISATION" script "subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf" workflow "PIPELINE_INITIALISATION" - tag 'subworkflows' - tag 'utils_nfcore_fetchngs_pipeline' - tag 'subworkflows/utils_nfcore_fetchngs_pipeline' + tag 'PIPELINE_INITIALISATION' test("Should run") { diff --git a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/tags.yml b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/tags.yml deleted file mode 100644 index 944508d1..00000000 --- a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -subworkflows/utils_nfcore_fetchngs_pipeline: - - subworkflows/local/utils_nfcore_fetchngs_pipeline/** From 74fdcaab90fd1eec90d55fcf2aa197e77b7e1267 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Mon, 29 Jan 2024 17:00:23 +0000 Subject: [PATCH 719/852] Fixup for PR #253 --- .github/workflows/ci.yml | 14 -------------- CHANGELOG.md | 1 + 2 files changed, 1 insertion(+), 14 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 715800c8..12343148 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -97,20 +97,6 @@ jobs: run: | echo ${{ steps.list.outputs.tags }} - # define_nxf_versions: - # name: Choose nextflow versions to test against depending on target branch - # runs-on: ubuntu-latest - # outputs: - # matrix: ${{ steps.nxf_versions.outputs.matrix }} - # steps: - # - id: nxf_versions - # run: | - # if [[ "${{ github.event_name }}" == "pull_request" && "${{ github.base_ref }}" == "dev" && "${{ matrix.NXF_VER }}" != "latest-everything" ]]; then - # echo matrix='["latest-everything"]' | tee -a $GITHUB_OUTPUT - # else - # echo matrix='["latest-everything", "23.04.0"]' | tee -a $GITHUB_OUTPUT - # fi - test: name: ${{ matrix.tags }} ${{ matrix.profile }} NF-${{ matrix.NXF_VER }} needs: [changes] diff --git a/CHANGELOG.md b/CHANGELOG.md index d512d75c..e1e9f8ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements - [PR #246](https://github.com/nf-core/fetchngs/pull/246) - Handle dark/light mode for logo in GitHub README properly - [PR #248](https://github.com/nf-core/fetchngs/pull/248) - Update pipeline level test data path to use mirror on s3 - [PR #249](https://github.com/nf-core/fetchngs/pull/249) - Update modules which includes absolute paths for test data, making module level test compatible within the pipeline. +- [PR #253](https://github.com/nf-core/fetchngs/pull/253) - Add implicit tags in nf-test files for simpler testing strategy ### Software dependencies From a233dc0d091b678856b9a1b04cc4e47d46a6eec8 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 29 Jan 2024 17:02:08 +0000 Subject: [PATCH 720/852] Add Aspera CLI download support to pipeline --- CHANGELOG.md | 10 +++ CITATIONS.md | 2 + README.md | 6 +- conf/test_full.config | 4 +- modules/local/aspera_cli/environment.yml | 7 ++ modules/local/aspera_cli/main.nf | 63 ++++++++++++++++ modules/local/aspera_cli/nextflow.config | 17 +++++ modules/local/aspera_cli/tests/main.nf.test | 37 ++++++++++ .../local/aspera_cli/tests/main.nf.test.snap | 71 +++++++++++++++++++ nextflow.config | 1 + nextflow_schema.json | 6 ++ workflows/sra/main.nf | 45 ++++++++---- workflows/sra/nextflow.config | 1 + workflows/sra/tests/main.nf.test | 2 +- .../sra_custom_ena_metadata_fields.nf.test | 1 + .../sra_nf_core_pipeline_atacseq.nf.test | 1 + .../tests/sra_nf_core_pipeline_rnaseq.nf.test | 1 + .../sra_nf_core_pipeline_taxprofiler.nf.test | 1 + .../sra_nf_core_pipeline_viralrecon.nf.test | 1 + 19 files changed, 260 insertions(+), 17 deletions(-) create mode 100644 modules/local/aspera_cli/environment.yml create mode 100644 modules/local/aspera_cli/main.nf create mode 100644 modules/local/aspera_cli/nextflow.config create mode 100644 modules/local/aspera_cli/tests/main.nf.test create mode 100644 modules/local/aspera_cli/tests/main.nf.test.snap diff --git a/CHANGELOG.md b/CHANGELOG.md index d512d75c..c35e92bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,16 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements > > **NB:** Dependency has been **removed** if new version information isn't present. +### Parameters + +| Old parameter | New parameter | +| ------------- | ---------------------- | +| | `--force_ftp_download` | + +> **NB:** Parameter has been **updated** if both old and new parameter information is present. +> **NB:** Parameter has been **added** if just the new parameter information is present. +> **NB:** Parameter has been **removed** if new parameter information isn't present. + ## [[1.11.0](https://github.com/nf-core/fetchngs/releases/tag/1.11.0)] - 2023-10-18 ### Credits diff --git a/CITATIONS.md b/CITATIONS.md index 482d5600..a982bfd2 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -10,6 +10,8 @@ ## Pipeline tools +- [Aspera CLI](https://github.com/IBM/aspera-cli) + - [Python](http://www.python.org) - [Requests](https://docs.python-requests.org/) diff --git a/README.md b/README.md index 56ba2cb0..2442527c 100644 --- a/README.md +++ b/README.md @@ -67,8 +67,10 @@ Via a single file of ids, provided one-per-line (see [example input file](https: 1. Resolve database ids back to appropriate experiment-level ids and to be compatible with the [ENA API](https://ena-docs.readthedocs.io/en/latest/retrieval/programmatic-access.html) 2. Fetch extensive id metadata via ENA API 3. Download FastQ files: - - If direct download links are available from the ENA API, fetch in parallel via `curl` and perform `md5sum` check - - Otherwise use [`sra-tools`](https://github.com/ncbi/sra-tools) to download `.sra` files and convert them to FastQ + - If direct download links are available from the ENA API: + - Fetch in parallel via `aspera-cli` and perform `md5sum` check (default) + - Fetch in parallel via `wget` and perform `md5sum` check. Use `--force_ftp_download` to force this behaviour. + - Otherwise use [`sra-tools`](https://github.com/ncbi/sra-tools) to download `.sra` files and convert them to FastQ. Use `--force_sratools_download` to force this behaviour. 4. Collate id metadata and paths to FastQ files in a single samplesheet ### Synapse ids diff --git a/conf/test_full.config b/conf/test_full.config index 9215d510..84595dfa 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -14,6 +14,6 @@ params { config_profile_name = 'Full test profile' config_profile_description = 'Full test dataset to check pipeline function' - // Input data for full size test - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/bb634bcfef520552e8314dfa3f8a764e1d62f7dc/testdata/v1.12.0/sra_ids_test_full.csv' + // File containing SRA ids from nf-core/rnaseq -profile test_full for full-sized test + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/100736c99d87667fb7c247c267bc8acfac647bed/testdata/v1.12.0/sra_ids_rnaseq_test_full.csv' } diff --git a/modules/local/aspera_cli/environment.yml b/modules/local/aspera_cli/environment.yml new file mode 100644 index 00000000..9fbc162f --- /dev/null +++ b/modules/local/aspera_cli/environment.yml @@ -0,0 +1,7 @@ +name: aspera_cli +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::aspera-cli=4.14.0 diff --git a/modules/local/aspera_cli/main.nf b/modules/local/aspera_cli/main.nf new file mode 100644 index 00000000..cf47b188 --- /dev/null +++ b/modules/local/aspera_cli/main.nf @@ -0,0 +1,63 @@ +process ASPERA_CLI { + tag "$meta.id" + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/aspera-cli:4.14.0--hdfd78af_1' : + 'biocontainers/aspera-cli:4.14.0--hdfd78af_1' }" + + input: + tuple val(meta), val(fastq) + val user + + output: + tuple val(meta), path("*fastq.gz"), emit: fastq + tuple val(meta), path("*md5") , emit: md5 + path "versions.yml" , emit: versions + + script: + def args = task.ext.args ?: '' + if (meta.single_end) { + """ + ascp \\ + $args \\ + -i \$CONDA_PREFIX/etc/aspera/aspera_bypass_dsa.pem \\ + ${user}@${fastq[0]} \\ + ${meta.id}.fastq.gz + + echo "${meta.md5_1} ${meta.id}.fastq.gz" > ${meta.id}.fastq.gz.md5 + md5sum -c ${meta.id}.fastq.gz.md5 + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + aspera_cli: \$(ascli --version) + END_VERSIONS + """ + } else { + """ + ascp \\ + $args \\ + -i \$CONDA_PREFIX/etc/aspera/aspera_bypass_dsa.pem \\ + ${user}@${fastq[0]} \\ + ${meta.id}_1.fastq.gz + + echo "${meta.md5_1} ${meta.id}_1.fastq.gz" > ${meta.id}_1.fastq.gz.md5 + md5sum -c ${meta.id}_1.fastq.gz.md5 + + ascp \\ + $args \\ + -i \$CONDA_PREFIX/etc/aspera/aspera_bypass_dsa.pem \\ + ${user}@${fastq[1]} \\ + ${meta.id}_2.fastq.gz + + echo "${meta.md5_2} ${meta.id}_2.fastq.gz" > ${meta.id}_2.fastq.gz.md5 + md5sum -c ${meta.id}_2.fastq.gz.md5 + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + aspera_cli: \$(ascli --version) + END_VERSIONS + """ + } +} \ No newline at end of file diff --git a/modules/local/aspera_cli/nextflow.config b/modules/local/aspera_cli/nextflow.config new file mode 100644 index 00000000..fa2dbd90 --- /dev/null +++ b/modules/local/aspera_cli/nextflow.config @@ -0,0 +1,17 @@ +process { + withName: 'ASPERA_CLI' { + ext.args = '-QT -l 300m -P33001' + publishDir = [ + [ + path: { "${params.outdir}/fastq" }, + mode: params.publish_dir_mode, + pattern: "*.fastq.gz" + ], + [ + path: { "${params.outdir}/fastq/md5" }, + mode: params.publish_dir_mode, + pattern: "*.md5" + ] + ] + } +} diff --git a/modules/local/aspera_cli/tests/main.nf.test b/modules/local/aspera_cli/tests/main.nf.test new file mode 100644 index 00000000..d62dc94a --- /dev/null +++ b/modules/local/aspera_cli/tests/main.nf.test @@ -0,0 +1,37 @@ +nextflow_process { + + name "Test process: ASPERA_CLI" + script "../main.nf" + process "ASPERA_CLI" + + tag "ASPERA_CLI" + + test("Should run without failures") { + + when { + params { + outdir = "$outputDir" + } + + process { + """ + input[0] = [ + [ id:'SRX9626017_SRR13191702', single_end:false, md5_1: '89c5be920021a035084d8aeb74f32df7', md5_2: '56271be38a80db78ef3bdfc5d9909b98' ], // meta map + [ + 'fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_1.fastq.gz', + 'fasp.sra.ebi.ac.uk:/vol1/fastq/SRR131/002/SRR13191702/SRR13191702_2.fastq.gz' + ] + ] + input[1] = 'era-fasp' + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/local/aspera_cli/tests/main.nf.test.snap b/modules/local/aspera_cli/tests/main.nf.test.snap new file mode 100644 index 00000000..15497822 --- /dev/null +++ b/modules/local/aspera_cli/tests/main.nf.test.snap @@ -0,0 +1,71 @@ +{ + "Should run without failures": { + "content": [ + { + "0": [ + [ + { + "id": "SRX9626017_SRR13191702", + "single_end": false, + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98" + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,baaaea61cba4294ec696fdfea1610848", + "SRX9626017_SRR13191702_2.fastq.gz:md5,8e43ad99049fabb6526a4b846da01c32" + ] + ] + ], + "1": [ + [ + { + "id": "SRX9626017_SRR13191702", + "single_end": false, + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98" + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", + "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" + ] + ] + ], + "2": [ + "versions.yml:md5,a51a1dfc6308d71058ddc12c46101dd3" + ], + "fastq": [ + [ + { + "id": "SRX9626017_SRR13191702", + "single_end": false, + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98" + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz:md5,baaaea61cba4294ec696fdfea1610848", + "SRX9626017_SRR13191702_2.fastq.gz:md5,8e43ad99049fabb6526a4b846da01c32" + ] + ] + ], + "md5": [ + [ + { + "id": "SRX9626017_SRR13191702", + "single_end": false, + "md5_1": "89c5be920021a035084d8aeb74f32df7", + "md5_2": "56271be38a80db78ef3bdfc5d9909b98" + }, + [ + "SRX9626017_SRR13191702_1.fastq.gz.md5:md5,055a6916ec9ee478e453d50651f87997", + "SRX9626017_SRR13191702_2.fastq.gz.md5:md5,c30ac785f8d80ec563fabf604d8bf945" + ] + ] + ], + "versions": [ + "versions.yml:md5,a51a1dfc6308d71058ddc12c46101dd3" + ] + } + ], + "timestamp": "2024-01-29T13:00:29.847293" + } +} \ No newline at end of file diff --git a/nextflow.config b/nextflow.config index b3c65b78..3aece1d7 100644 --- a/nextflow.config +++ b/nextflow.config @@ -17,6 +17,7 @@ params { ena_metadata_fields = null sample_mapping_fields = 'experiment_accession,run_accession,sample_accession,experiment_alias,run_alias,sample_alias,experiment_title,sample_title,sample_description' synapse_config = null + force_ftp_download = false force_sratools_download = false skip_fastq_download = false dbgap_key = null diff --git a/nextflow_schema.json b/nextflow_schema.json index 31d9f17a..bdf37cd7 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -54,6 +54,12 @@ "help_text": "The default is 'auto' which can be used with nf-core/rnaseq v3.10 onwards to auto-detect strandedness during the pipeline execution.", "default": "auto" }, + "force_ftp_download": { + "type": "boolean", + "fa_icon": "fas fa-tools", + "description": "Force download FASTQ files via FTP instead of via the Aspera CLI.", + "help_text": "If the Aspera CLI is not working on your infrastructure use this flag to force the pipeline to download data via FTP." + }, "force_sratools_download": { "type": "boolean", "fa_icon": "fas fa-tools", diff --git a/workflows/sra/main.nf b/workflows/sra/main.nf index 62d8c577..80383085 100644 --- a/workflows/sra/main.nf +++ b/workflows/sra/main.nf @@ -8,6 +8,7 @@ include { MULTIQC_MAPPINGS_CONFIG } from '../../modules/local/multiqc_mappings_c include { SRA_FASTQ_FTP } from '../../modules/local/sra_fastq_ftp' include { SRA_IDS_TO_RUNINFO } from '../../modules/local/sra_ids_to_runinfo' include { SRA_RUNINFO_TO_FTP } from '../../modules/local/sra_runinfo_to_ftp' +include { ASPERA_CLI } from '../../modules/local/aspera_cli' include { SRA_TO_SAMPLESHEET } from '../../modules/local/sra_to_samplesheet' include { softwareVersionsToYAML } from '../../subworkflows/nf-core/utils_nfcore_pipeline' @@ -54,10 +55,11 @@ workflow SRA { .out .tsv .splitCsv(header:true, sep:'\t') - .map{ meta -> - def meta_clone = meta.clone() - meta_clone.single_end = meta_clone.single_end.toBoolean() - return meta_clone + .map { + meta -> + def meta_clone = meta.clone() + meta_clone.single_end = meta_clone.single_end.toBoolean() + return meta_clone } .unique() .set { ch_sra_metadata } @@ -65,16 +67,36 @@ workflow SRA { if (!params.skip_fastq_download) { ch_sra_metadata - .map { - meta -> - [ meta, [ meta.fastq_1, meta.fastq_2 ] ] - } .branch { - ftp: it[0].fastq_1 && !params.force_sratools_download - sra: !it[0].fastq_1 || params.force_sratools_download + meta -> + def download_method = 'aspera' + if (!meta.fastq_aspera || params.force_ftp_download) { + if (meta.fastq_1) { + download_method = 'ftp' + } + } + if ((!meta.fastq_aspera && !meta.fastq_1) || params.force_sratools_download) { + download_method = 'sratools' + } + + aspera: download_method == 'aspera' + return [ meta, meta.fastq_aspera.tokenize(';').take(2) ] + ftp: download_method == 'ftp' + return [ meta, [ meta.fastq_1, meta.fastq_2 ] ] + sratools: download_method == 'sratools' + return [ meta, meta.run_accession ] } .set { ch_sra_reads } + // + // MODULE: If Aspera link is provided in run information then download FastQ directly via Aspera CLI and validate with md5sums + // + ASPERA_CLI ( + ch_sra_reads.aspera, + 'era-fasp' + ) + ch_versions = ch_versions.mix(ASPERA_CLI.out.versions.first()) + // // MODULE: If FTP link is provided in run information then download FastQ directly via FTP and validate with md5sums // @@ -87,7 +109,7 @@ workflow SRA { // SUBWORKFLOW: Download sequencing reads without FTP links using sra-tools. // FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS ( - ch_sra_reads.sra.map { meta, reads -> [ meta, meta.run_accession ] }, + ch_sra_reads.sratools, params.dbgap_key ? file(params.dbgap_key, checkIfExists: true) : [] ) ch_versions = ch_versions.mix(FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS.out.versions.first()) @@ -157,7 +179,6 @@ workflow SRA { softwareVersionsToYAML(ch_versions) .collectFile(storeDir: "${params.outdir}/pipeline_info", name: 'nf_core_fetchngs_software_mqc_versions.yml', sort: true, newLine: true) - emit: samplesheet = ch_samplesheet mappings = ch_mappings diff --git a/workflows/sra/nextflow.config b/workflows/sra/nextflow.config index a48bcb73..56d7814c 100644 --- a/workflows/sra/nextflow.config +++ b/workflows/sra/nextflow.config @@ -1,4 +1,5 @@ includeConfig "../../modules/local/multiqc_mappings_config/nextflow.config" +includeConfig "../../modules/local/aspera_cli/nextflow.config" includeConfig "../../modules/local/sra_fastq_ftp/nextflow.config" includeConfig "../../modules/local/sra_ids_to_runinfo/nextflow.config" includeConfig "../../modules/local/sra_runinfo_to_ftp/nextflow.config" diff --git a/workflows/sra/tests/main.nf.test b/workflows/sra/tests/main.nf.test index 8fcd0e47..062d6886 100644 --- a/workflows/sra/tests/main.nf.test +++ b/workflows/sra/tests/main.nf.test @@ -7,12 +7,12 @@ nextflow_workflow { // Dependencies tag "MULTIQC_MAPPINGS_CONFIG" + tag "ASPERA_CLI" tag "SRA_FASTQ_FTP" tag "SRA_IDS_TO_RUNINFO" tag "SRA_RUNINFO_TO_FTP" tag "SRA_TO_SAMPLESHEET" - test("Parameters: default") { when { diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test index 0724b4fb..5fd4882b 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test @@ -9,6 +9,7 @@ nextflow_workflow { // Modules tag "MULTIQC_MAPPINGS_CONFIG" + tag "ASPERA_CLI" tag "SRA_FASTQ_FTP" tag "SRA_IDS_TO_RUNINFO" tag "SRA_RUNINFO_TO_FTP" diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test index d792e09f..95069597 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test @@ -9,6 +9,7 @@ nextflow_workflow { // Modules tag "MULTIQC_MAPPINGS_CONFIG" + tag "ASPERA_CLI" tag "SRA_FASTQ_FTP" tag "SRA_IDS_TO_RUNINFO" tag "SRA_RUNINFO_TO_FTP" diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test index 7f2603f6..99c7dbc5 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test @@ -9,6 +9,7 @@ nextflow_workflow { // Modules tag "MULTIQC_MAPPINGS_CONFIG" + tag "ASPERA_CLI" tag "SRA_FASTQ_FTP" tag "SRA_IDS_TO_RUNINFO" tag "SRA_RUNINFO_TO_FTP" diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test index 7d4fcb23..d48a714e 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test @@ -9,6 +9,7 @@ nextflow_workflow { // Modules tag "MULTIQC_MAPPINGS_CONFIG" + tag "ASPERA_CLI" tag "SRA_FASTQ_FTP" tag "SRA_IDS_TO_RUNINFO" tag "SRA_RUNINFO_TO_FTP" diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test index 89f8f370..f5802463 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test @@ -9,6 +9,7 @@ nextflow_workflow { // Modules tag "MULTIQC_MAPPINGS_CONFIG" + tag "ASPERA_CLI" tag "SRA_FASTQ_FTP" tag "SRA_IDS_TO_RUNINFO" tag "SRA_RUNINFO_TO_FTP" From f58c5682a6c602befe660d06271811375a806d34 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 29 Jan 2024 17:09:05 +0000 Subject: [PATCH 721/852] Fix ECLint --- CHANGELOG.md | 1 + modules/local/aspera_cli/main.nf | 2 +- modules/local/aspera_cli/tests/main.nf.test | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c35e92bc..fb853f96 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements - [PR #246](https://github.com/nf-core/fetchngs/pull/246) - Handle dark/light mode for logo in GitHub README properly - [PR #248](https://github.com/nf-core/fetchngs/pull/248) - Update pipeline level test data path to use mirror on s3 - [PR #249](https://github.com/nf-core/fetchngs/pull/249) - Update modules which includes absolute paths for test data, making module level test compatible within the pipeline. +- [PR #259](https://github.com/nf-core/fetchngs/pull/259) - Add Aspera CLI download support to pipeline ([#68](https://github.com/nf-core/fetchngs/issues/68)) ### Software dependencies diff --git a/modules/local/aspera_cli/main.nf b/modules/local/aspera_cli/main.nf index cf47b188..412c618a 100644 --- a/modules/local/aspera_cli/main.nf +++ b/modules/local/aspera_cli/main.nf @@ -41,7 +41,7 @@ process ASPERA_CLI { -i \$CONDA_PREFIX/etc/aspera/aspera_bypass_dsa.pem \\ ${user}@${fastq[0]} \\ ${meta.id}_1.fastq.gz - + echo "${meta.md5_1} ${meta.id}_1.fastq.gz" > ${meta.id}_1.fastq.gz.md5 md5sum -c ${meta.id}_1.fastq.gz.md5 diff --git a/modules/local/aspera_cli/tests/main.nf.test b/modules/local/aspera_cli/tests/main.nf.test index d62dc94a..3858e2c3 100644 --- a/modules/local/aspera_cli/tests/main.nf.test +++ b/modules/local/aspera_cli/tests/main.nf.test @@ -3,7 +3,7 @@ nextflow_process { name "Test process: ASPERA_CLI" script "../main.nf" process "ASPERA_CLI" - + tag "ASPERA_CLI" test("Should run without failures") { From a78310f0080a3c8b1ad9777735998e3051301795 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Mon, 29 Jan 2024 17:22:03 +0000 Subject: [PATCH 722/852] CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e1e9f8ee..9d2e0a9a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements - [PR #248](https://github.com/nf-core/fetchngs/pull/248) - Update pipeline level test data path to use mirror on s3 - [PR #249](https://github.com/nf-core/fetchngs/pull/249) - Update modules which includes absolute paths for test data, making module level test compatible within the pipeline. - [PR #253](https://github.com/nf-core/fetchngs/pull/253) - Add implicit tags in nf-test files for simpler testing strategy +- [PR #258](https://github.com/nf-core/fetchngs/pull/258) - Fixes for [PR #253](https://github.com/nf-core/fetchngs/pull/253) ### Software dependencies From 5f00ba81150a935a7c5d09ae4763e8e7b23575e2 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 29 Jan 2024 17:30:54 +0000 Subject: [PATCH 723/852] Mix Aspera CLI output channel with FTP and sratools reads --- workflows/sra/main.nf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/workflows/sra/main.nf b/workflows/sra/main.nf index 80383085..1e6c6e2f 100644 --- a/workflows/sra/main.nf +++ b/workflows/sra/main.nf @@ -115,9 +115,10 @@ workflow SRA { ch_versions = ch_versions.mix(FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS.out.versions.first()) // Isolate FASTQ channel which will be added to emit block - SRA_FASTQ_FTP + ASPERA_CLI .out .fastq + .mix(SRA_FASTQ_FTP.out.fastq) .mix(FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS.out.reads) .map { meta, fastq -> From d538a2aaa8a2ec5733124b298d221a864062c718 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 29 Jan 2024 17:31:57 +0000 Subject: [PATCH 724/852] Fix ECLint --- modules/local/aspera_cli/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/aspera_cli/main.nf b/modules/local/aspera_cli/main.nf index 412c618a..de78a7b2 100644 --- a/modules/local/aspera_cli/main.nf +++ b/modules/local/aspera_cli/main.nf @@ -60,4 +60,4 @@ process ASPERA_CLI { END_VERSIONS """ } -} \ No newline at end of file +} From 6cba93fdce634d4437e682f0179837ba3739fd16 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 29 Jan 2024 18:13:38 +0000 Subject: [PATCH 725/852] Fix pre-commit lint --- .devcontainer/devcontainer.json | 8 ++++---- .github/workflows/download_pipeline.yml | 2 +- .../local/multiqc_mappings_config/nextflow.config | 2 +- modules/local/sra_ids_to_runinfo/nextflow.config | 2 +- modules/local/sra_runinfo_to_ftp/nextflow.config | 2 +- modules/local/synapse_get/nextflow.config | 2 +- .../local/synapse_merge_samplesheet/nextflow.config | 2 +- modules/local/synapse_show/nextflow.config | 2 +- modules/local/synapse_to_samplesheet/nextflow.config | 2 +- .../nextflow.config | 2 +- .../tests/main.nf.test | 2 +- .../tests/main.function.nf.test | 2 +- .../utils_nextflow_pipeline/tests/nextflow.config | 2 +- .../tests/main.function.nf.test | 2 +- .../utils_nfcore_pipeline/tests/nextflow.config | 2 +- .../utils_nfvalidation_plugin/tests/main.nf.test | 2 +- workflows/sra/main.nf | 2 +- workflows/sra/nextflow.config | 2 +- .../sra/tests/sra_nf_core_pipeline_atacseq.nf.test | 2 +- .../tests/sra_nf_core_pipeline_viralrecon.nf.test | 2 +- workflows/sra/tests/sra_skip_fastq_download.nf.test | 12 ++++++------ workflows/synapse/nextflow.config | 2 +- 22 files changed, 30 insertions(+), 30 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 4a9bc5c7..4ecfbfe3 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -18,11 +18,11 @@ "python.linting.flake8Path": "/opt/conda/bin/flake8", "python.linting.pycodestylePath": "/opt/conda/bin/pycodestyle", "python.linting.pydocstylePath": "/opt/conda/bin/pydocstyle", - "python.linting.pylintPath": "/opt/conda/bin/pylint", + "python.linting.pylintPath": "/opt/conda/bin/pylint" }, // Add the IDs of extensions you want installed when the container is created. - "extensions": ["ms-python.python", "ms-python.vscode-pylance", "nf-core.nf-core-extensionpack"], - }, - }, + "extensions": ["ms-python.python", "ms-python.vscode-pylance", "nf-core.nf-core-extensionpack"] + } + } } diff --git a/.github/workflows/download_pipeline.yml b/.github/workflows/download_pipeline.yml index 8611458a..8a330045 100644 --- a/.github/workflows/download_pipeline.yml +++ b/.github/workflows/download_pipeline.yml @@ -64,4 +64,4 @@ jobs: env: NXF_SINGULARITY_CACHEDIR: ./ NXF_SINGULARITY_HOME_MOUNT: true - run: nextflow run ./${{ env.REPOTITLE_LOWERCASE }}/$( sed 's/\W/_/g' <<< ${{ env.REPO_BRANCH }}) -stub -profile test,singularity --outdir ./results + run: nextflow run ./${{ env.REPOTITLE_LOWERCASE }}/$( sed 's/\W/_/g' <<< ${{ env.REPO_BRANCH }}) -stub -profile test,singularity --outdir ./results diff --git a/modules/local/multiqc_mappings_config/nextflow.config b/modules/local/multiqc_mappings_config/nextflow.config index e2382930..11c58341 100644 --- a/modules/local/multiqc_mappings_config/nextflow.config +++ b/modules/local/multiqc_mappings_config/nextflow.config @@ -6,4 +6,4 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } -} \ No newline at end of file +} diff --git a/modules/local/sra_ids_to_runinfo/nextflow.config b/modules/local/sra_ids_to_runinfo/nextflow.config index 73da969a..9b9d0b16 100644 --- a/modules/local/sra_ids_to_runinfo/nextflow.config +++ b/modules/local/sra_ids_to_runinfo/nextflow.config @@ -5,4 +5,4 @@ process { enabled: false ] } -} \ No newline at end of file +} diff --git a/modules/local/sra_runinfo_to_ftp/nextflow.config b/modules/local/sra_runinfo_to_ftp/nextflow.config index aee1848c..43263648 100644 --- a/modules/local/sra_runinfo_to_ftp/nextflow.config +++ b/modules/local/sra_runinfo_to_ftp/nextflow.config @@ -6,4 +6,4 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } -} \ No newline at end of file +} diff --git a/modules/local/synapse_get/nextflow.config b/modules/local/synapse_get/nextflow.config index 869f80aa..9c42e741 100644 --- a/modules/local/synapse_get/nextflow.config +++ b/modules/local/synapse_get/nextflow.config @@ -13,4 +13,4 @@ process { ] ] } -} \ No newline at end of file +} diff --git a/modules/local/synapse_merge_samplesheet/nextflow.config b/modules/local/synapse_merge_samplesheet/nextflow.config index 9befef9c..c94c53dd 100644 --- a/modules/local/synapse_merge_samplesheet/nextflow.config +++ b/modules/local/synapse_merge_samplesheet/nextflow.config @@ -6,4 +6,4 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } -} \ No newline at end of file +} diff --git a/modules/local/synapse_show/nextflow.config b/modules/local/synapse_show/nextflow.config index a1864dfe..5b9167b3 100644 --- a/modules/local/synapse_show/nextflow.config +++ b/modules/local/synapse_show/nextflow.config @@ -6,4 +6,4 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } -} \ No newline at end of file +} diff --git a/modules/local/synapse_to_samplesheet/nextflow.config b/modules/local/synapse_to_samplesheet/nextflow.config index b286c12c..83af86b6 100644 --- a/modules/local/synapse_to_samplesheet/nextflow.config +++ b/modules/local/synapse_to_samplesheet/nextflow.config @@ -5,4 +5,4 @@ process { enabled: false ] } -} \ No newline at end of file +} diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/nextflow.config b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/nextflow.config index b11c499f..de803a38 100644 --- a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/nextflow.config +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/nextflow.config @@ -1,2 +1,2 @@ includeConfig '../../../modules/nf-core/sratools/prefetch/nextflow.config' -includeConfig '../../../modules/nf-core/sratools/fasterqdump/nextflow.config' \ No newline at end of file +includeConfig '../../../modules/nf-core/sratools/fasterqdump/nextflow.config' diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test index 2f1d0835..9ff65074 100644 --- a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test @@ -4,7 +4,7 @@ nextflow_workflow { script "../main.nf" workflow "FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS" tag "FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS" - + tag "CUSTOM_SRATOOLSNCBISETTINGS" tag "SRATOOLS_PREFETCH" tag "SRATOOLS_FASTERQDUMP" diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.function.nf.test b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.function.nf.test index 8ed4310c..68718e4f 100644 --- a/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.function.nf.test +++ b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.function.nf.test @@ -51,4 +51,4 @@ nextflow_function { ) } } -} \ No newline at end of file +} diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config b/subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config index 53574ffe..d0a926bf 100644 --- a/subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config +++ b/subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config @@ -6,4 +6,4 @@ manifest { nextflowVersion = '!>=23.04.0' version = '9.9.9' doi = 'https://doi.org/10.5281/zenodo.5070524' -} \ No newline at end of file +} diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test index c176295d..f7ea05fc 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test @@ -111,4 +111,4 @@ nextflow_function { ) } } -} \ No newline at end of file +} diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config b/subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config index 53574ffe..d0a926bf 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config @@ -6,4 +6,4 @@ manifest { nextflowVersion = '!>=23.04.0' version = '9.9.9' doi = 'https://doi.org/10.5281/zenodo.5070524' -} \ No newline at end of file +} diff --git a/subworkflows/nf-core/utils_nfvalidation_plugin/tests/main.nf.test b/subworkflows/nf-core/utils_nfvalidation_plugin/tests/main.nf.test index 517ee54e..5784a33f 100644 --- a/subworkflows/nf-core/utils_nfvalidation_plugin/tests/main.nf.test +++ b/subworkflows/nf-core/utils_nfvalidation_plugin/tests/main.nf.test @@ -197,4 +197,4 @@ nextflow_workflow { ) } } -} \ No newline at end of file +} diff --git a/workflows/sra/main.nf b/workflows/sra/main.nf index 62d8c577..b119dcbe 100644 --- a/workflows/sra/main.nf +++ b/workflows/sra/main.nf @@ -119,7 +119,7 @@ workflow SRA { params.nf_core_rnaseq_strandedness ?: 'auto', params.sample_mapping_fields ) - + // Merge samplesheets and mapping files across all samples SRA_TO_SAMPLESHEET .out diff --git a/workflows/sra/nextflow.config b/workflows/sra/nextflow.config index a48bcb73..21b374c5 100644 --- a/workflows/sra/nextflow.config +++ b/workflows/sra/nextflow.config @@ -4,4 +4,4 @@ includeConfig "../../modules/local/sra_ids_to_runinfo/nextflow.config" includeConfig "../../modules/local/sra_runinfo_to_ftp/nextflow.config" includeConfig "../../modules/local/sra_to_samplesheet/nextflow.config" includeConfig "../../modules/nf-core/sratools/prefetch/nextflow.config" -includeConfig "../../subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/nextflow.config" \ No newline at end of file +includeConfig "../../subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/nextflow.config" diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test index d792e09f..509d89b0 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test @@ -3,7 +3,7 @@ nextflow_workflow { name "Test workflow: sra/main.nf" script "../main.nf" workflow "SRA" - + // Subworkflows tag "SRA" diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test index 89f8f370..9e991a03 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test @@ -32,7 +32,7 @@ nextflow_workflow { assert workflow.success assertAll( - { + { with(workflow.out.samplesheet) { assert path(get(0)).readLines().size() == 4 assert path(get(0)).readLines()*.split(',')[0].take(4) == ['"sample"', '"fastq_1"', '"fastq_2"', '"run_accession"'] diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test b/workflows/sra/tests/sra_skip_fastq_download.nf.test index b3fdd883..f9a79e15 100644 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test @@ -32,25 +32,25 @@ nextflow_workflow { assert workflow.success assertAll( - { + { with(workflow.out.samplesheet) { assert path(get(0)).readLines().size() == 4 assert path(get(0)).readLines()*.split(',')[0].take(4) == ['"sample"', '"fastq_1"', '"fastq_2"', '"run_accession"'] assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] assert path(get(0)).text.contains('Illumina HiSeq 2500') - } + } }, - { + { with(workflow.out.mappings) { assert path(get(0)).readLines().size() == 4 assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] assert path(get(0)).text.contains('Illumina HiSeq 2500') - } + } }, - { + { with(workflow.out.sample_mappings) { assert path(get(0)[0]).md5 == "1ac06bb95b503703430e74660bbdd768" - } + } } ) } diff --git a/workflows/synapse/nextflow.config b/workflows/synapse/nextflow.config index 01b71558..ad9c69ed 100644 --- a/workflows/synapse/nextflow.config +++ b/workflows/synapse/nextflow.config @@ -2,4 +2,4 @@ includeConfig "../../modules/local/synapse_get/nextflow.config" includeConfig "../../modules/local/synapse_to_samplesheet/nextflow.config" includeConfig "../../modules/local/synapse_list/nextflow.config" includeConfig "../../modules/local/synapse_merge_samplesheet/nextflow.config" -includeConfig "../../modules/local/synapse_show/nextflow.config" \ No newline at end of file +includeConfig "../../modules/local/synapse_show/nextflow.config" From 9d8b0f392aea60b5029909be55d3148c6146e50f Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 29 Jan 2024 19:21:23 +0000 Subject: [PATCH 726/852] Delete redundant tags.yml files --- subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml | 2 -- subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml | 2 -- subworkflows/nf-core/utils_nfvalidation_plugin/tests/tags.yml | 2 -- 3 files changed, 6 deletions(-) delete mode 100644 subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml delete mode 100644 subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml delete mode 100644 subworkflows/nf-core/utils_nfvalidation_plugin/tests/tags.yml diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml b/subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml deleted file mode 100644 index f8476112..00000000 --- a/subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -subworkflows/utils_nextflow_pipeline: - - subworkflows/nf-core/utils_nextflow_pipeline/** diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml b/subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml deleted file mode 100644 index ac8523c9..00000000 --- a/subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -subworkflows/utils_nfcore_pipeline: - - subworkflows/nf-core/utils_nfcore_pipeline/** diff --git a/subworkflows/nf-core/utils_nfvalidation_plugin/tests/tags.yml b/subworkflows/nf-core/utils_nfvalidation_plugin/tests/tags.yml deleted file mode 100644 index 60b1cfff..00000000 --- a/subworkflows/nf-core/utils_nfvalidation_plugin/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -subworkflows/utils_nfvalidation_plugin: - - subworkflows/nf-core/utils_nfvalidation_plugin/** From 5ff5d2bcd18413c535b43772f00a2958232c421e Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 29 Jan 2024 19:39:08 +0000 Subject: [PATCH 727/852] Remove redundant tags from nf-core subworkflows --- .../utils_nextflow_pipeline/tests/main.function.nf.test | 4 +--- .../utils_nextflow_pipeline/tests/main.workflow.nf.test | 4 +--- .../utils_nfcore_pipeline/tests/main.function.nf.test | 5 +---- .../utils_nfcore_pipeline/tests/main.workflow.nf.test | 5 +---- .../nf-core/utils_nfvalidation_plugin/tests/main.nf.test | 7 +------ 5 files changed, 5 insertions(+), 20 deletions(-) diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.function.nf.test b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.function.nf.test index 68718e4f..e49d617f 100644 --- a/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.function.nf.test +++ b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.function.nf.test @@ -4,9 +4,7 @@ nextflow_function { name "Test Functions" script "subworkflows/nf-core/utils_nextflow_pipeline/main.nf" config "subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config" - tag 'subworkflows' - tag 'utils_nextflow_pipeline' - tag 'subworkflows/utils_nextflow_pipeline' + tag "UTILS_NEXTFLOW_PIPELINE" test("Test Function getWorkflowVersion") { diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test index f7c54bc6..b1b3a2c3 100644 --- a/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test +++ b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test @@ -4,9 +4,7 @@ nextflow_workflow { script "../main.nf" config "subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config" workflow "UTILS_NEXTFLOW_PIPELINE" - tag 'subworkflows' - tag 'utils_nextflow_pipeline' - tag 'subworkflows/utils_nextflow_pipeline' + tag "UTILS_NEXTFLOW_PIPELINE" test("Should run no inputs") { diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test index f7ea05fc..74577b26 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test @@ -4,10 +4,7 @@ nextflow_function { name "Test Functions" script "../main.nf" config "subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config" - tag "subworkflows" - tag "subworkflows_nfcore" - tag "utils_nfcore_pipeline" - tag "subworkflows/utils_nfcore_pipeline" + tag "UTILS_NFCORE_PIPELINE" test("Test Function checkConfigProvided") { diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test index c5f7776a..cb7376c0 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test @@ -4,10 +4,7 @@ nextflow_workflow { script "../main.nf" config "subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config" workflow "UTILS_NFCORE_PIPELINE" - tag "subworkflows" - tag "subworkflows_nfcore" - tag "utils_nfcore_pipeline" - tag "subworkflows/utils_nfcore_pipeline" + tag "UTILS_NFCORE_PIPELINE" test("Should run without failures") { diff --git a/subworkflows/nf-core/utils_nfvalidation_plugin/tests/main.nf.test b/subworkflows/nf-core/utils_nfvalidation_plugin/tests/main.nf.test index 5784a33f..b13e7e6e 100644 --- a/subworkflows/nf-core/utils_nfvalidation_plugin/tests/main.nf.test +++ b/subworkflows/nf-core/utils_nfvalidation_plugin/tests/main.nf.test @@ -3,12 +3,7 @@ nextflow_workflow { name "Test Workflow UTILS_NFVALIDATION_PLUGIN" script "../main.nf" workflow "UTILS_NFVALIDATION_PLUGIN" - tag "subworkflows" - tag "subworkflows_nfcore" - tag "plugin/nf-validation" - tag "'plugin/nf-validation'" - tag "utils_nfvalidation_plugin" - tag "subworkflows/utils_nfvalidation_plugin" + tag "UTILS_NFVALIDATION_PLUGIN" test("Should run nothing") { From 963dff2f4ac1790d6c6a710396d5c9d562451165 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 29 Jan 2024 19:48:03 +0000 Subject: [PATCH 728/852] Update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d512d75c..ec2a25a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements - [PR #246](https://github.com/nf-core/fetchngs/pull/246) - Handle dark/light mode for logo in GitHub README properly - [PR #248](https://github.com/nf-core/fetchngs/pull/248) - Update pipeline level test data path to use mirror on s3 - [PR #249](https://github.com/nf-core/fetchngs/pull/249) - Update modules which includes absolute paths for test data, making module level test compatible within the pipeline. +- [PR #257](https://github.com/nf-core/fetchngs/pull/257) - Template update for nf-core/tools v2.12 ### Software dependencies From 888597053131b9f60c0340f6b5dadc3cbc380af7 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 30 Jan 2024 10:09:18 +0000 Subject: [PATCH 729/852] Update usage docs --- docs/usage.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/usage.md b/docs/usage.md index 0cfb95d8..5c244223 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -66,6 +66,10 @@ You can use the `--nf_core_pipeline` parameter to customise this behaviour e.g. From v1.9 of this pipeline the default `strandedness` in the output samplesheet will be set to `auto` when using `--nf_core_pipeline rnaseq`. This will only work with v3.10 onwards of nf-core/rnaseq which permits the auto-detection of strandedness during the pipeline execution. You can change this behaviour with the `--nf_core_rnaseq_strandedness` parameter which is set to `auto` by default. +### Bypass Aspera data download + +If the appropriate download links are available, the pipeline uses the Aspera CLI by default to download FastQ files. If you are having issues and prefer to use FTP or sra-tools instead, you can use the [`--force_ftp_download`](https://nf-co.re/fetchngs/parameters#force_ftp_download) and [`--force_sratools_download`](https://nf-co.re/fetchngs/parameters#force_sratools_download) parameters, respectively. + ### Bypass `FTP` data download If FTP connections are blocked on your network use the [`--force_sratools_download`](https://nf-co.re/fetchngs/parameters#force_sratools_download) parameter to force the pipeline to download data using sra-tools instead of the ENA FTP. From 1f42b059a66ea22d163fb602b257125f1f25c464 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 30 Jan 2024 10:15:43 +0000 Subject: [PATCH 730/852] Fix pre-commit lint --- workflows/sra/main.nf | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/workflows/sra/main.nf b/workflows/sra/main.nf index 197cd658..6c657a68 100644 --- a/workflows/sra/main.nf +++ b/workflows/sra/main.nf @@ -55,7 +55,7 @@ workflow SRA { .out .tsv .splitCsv(header:true, sep:'\t') - .map { + .map { meta -> def meta_clone = meta.clone() meta_clone.single_end = meta_clone.single_end.toBoolean() @@ -68,15 +68,15 @@ workflow SRA { ch_sra_metadata .branch { - meta -> + meta -> def download_method = 'aspera' if (!meta.fastq_aspera || params.force_ftp_download) { - if (meta.fastq_1) { + if (meta.fastq_1) { download_method = 'ftp' } } - if ((!meta.fastq_aspera && !meta.fastq_1) || params.force_sratools_download) { - download_method = 'sratools' + if ((!meta.fastq_aspera && !meta.fastq_1) || params.force_sratools_download) { + download_method = 'sratools' } aspera: download_method == 'aspera' From 84c206602a0f99a0120b0f867e4397b2bfb79600 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 30 Jan 2024 10:54:04 +0000 Subject: [PATCH 731/852] Add comment for contents of meta.fastq_aspera --- workflows/sra/main.nf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/workflows/sra/main.nf b/workflows/sra/main.nf index 6c657a68..35ae18dc 100644 --- a/workflows/sra/main.nf +++ b/workflows/sra/main.nf @@ -70,6 +70,9 @@ workflow SRA { .branch { meta -> def download_method = 'aspera' + // meta.fastq_aspera is a metadata string with ENA fasp links supported by Aspera + // For single-end: 'fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz' + // For paired-end: 'fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz' if (!meta.fastq_aspera || params.force_ftp_download) { if (meta.fastq_1) { download_method = 'ftp' From e33eef40f27689b7f768d1525122d4a33e3c288d Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 30 Jan 2024 11:48:03 +0000 Subject: [PATCH 732/852] Update usage docs for samples with more than 2 FastQ files --- docs/usage.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/docs/usage.md b/docs/usage.md index 5c244223..42d134f3 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -66,6 +66,29 @@ You can use the `--nf_core_pipeline` parameter to customise this behaviour e.g. From v1.9 of this pipeline the default `strandedness` in the output samplesheet will be set to `auto` when using `--nf_core_pipeline rnaseq`. This will only work with v3.10 onwards of nf-core/rnaseq which permits the auto-detection of strandedness during the pipeline execution. You can change this behaviour with the `--nf_core_rnaseq_strandedness` parameter which is set to `auto` by default. +### Accessions with more than 2 FastQ files + +Using `SRR9320616` as an example, if we run the pipeline with default options to download via Aspera/FTP the ENA API indicates that this sample is associated with a single FastQ file: + +``` +run_accession experiment_accession sample_accession secondary_sample_accession study_accession secondary_study_accession submission_accession run_alias experiment_alias sample_alias study_alias library_layout library_selection library_source library_strategy library_name instrument_model instrument_platform base_count read_count tax_id scientific_name sample_title experiment_title study_title sample_description fastq_md5 fastq_bytes fastq_ftp fastq_galaxy fastq_aspera +SRR9320616 SRX6088086 SAMN12086751 SRS4989433 PRJNA549480 SRP201778 SRA900583 GSM3895942_r1 GSM3895942 GSM3895942 GSE132901 PAIRED cDNA TRANSCRIPTOMIC RNA-Seq Illumina HiSeq 2500 ILLUMINA 11857688850 120996825 10090 Mus musculus Old 3 Kidney Illumina HiSeq 2500 sequencing: GSM3895942: Old 3 Kidney Mus musculus RNA-Seq A murine aging cell atlas reveals cell identity and tissue-specific trajectories of aging Old 3 Kidney 98c939bbae1a1fcf9624905516485b67 7763114613 ftp.sra.ebi.ac.uk/vol1/fastq/SRR932/006/SRR9320616/SRR9320616.fastq.gz ftp.sra.ebi.ac.uk/vol1/fastq/SRR932/006/SRR9320616/SRR9320616.fastq.gz fasp.sra.ebi.ac.uk:/vol1/fastq/SRR932/006/SRR9320616/SRR9320616.fastq.gz +``` + +However, this sample actually has 2 additional FastQ files that are flagged as technical and can only be obtained by running sra-tools. This is particularly important for certain preps like 10x and others using UMI barcodes. + +``` +$ fasterq-dump --threads 6 --split-files --include-technical SRR9320616 --outfile SRR9320616.fastq --progress + +SRR9320616_1.fastq +SRR9320616_2.fastq +SRR9320616_3.fastq +``` + +This highlights that there is a discrepancy between the read data hosted on the ENA API and what can actually be fetched from sra-tools, where the latter seems to be the source of truth. If you anticipate that you may have more than 2 FastQ files per sample, it is recommended to use this pipeline with the `--force_sratools_download` parameter. + +See [issue #260](https://github.com/nf-core/fetchngs/issues/260) for more details. + ### Bypass Aspera data download If the appropriate download links are available, the pipeline uses the Aspera CLI by default to download FastQ files. If you are having issues and prefer to use FTP or sra-tools instead, you can use the [`--force_ftp_download`](https://nf-co.re/fetchngs/parameters#force_ftp_download) and [`--force_sratools_download`](https://nf-co.re/fetchngs/parameters#force_sratools_download) parameters, respectively. From b7979a30b1d50ad9ffa888258a0433134a0b2c01 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 30 Jan 2024 17:36:02 +0000 Subject: [PATCH 733/852] Revert sratools fasterqdump version to fix #221 --- modules.json | 3 +- .../sratools/fasterqdump/environment.yml | 2 +- modules/nf-core/sratools/fasterqdump/main.nf | 4 +- .../fasterqdump/sratools-fasterqdump.diff | 63 +++++++++++++++++++ 4 files changed, 68 insertions(+), 4 deletions(-) create mode 100644 modules/nf-core/sratools/fasterqdump/sratools-fasterqdump.diff diff --git a/modules.json b/modules.json index 1ddaa1fb..9190e3f5 100644 --- a/modules.json +++ b/modules.json @@ -13,7 +13,8 @@ "sratools/fasterqdump": { "branch": "master", "git_sha": "e719354ba77df0a1bd310836aa2039b45c29d620", - "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] + "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"], + "patch": "modules/nf-core/sratools/fasterqdump/sratools-fasterqdump.diff" }, "sratools/prefetch": { "branch": "master", diff --git a/modules/nf-core/sratools/fasterqdump/environment.yml b/modules/nf-core/sratools/fasterqdump/environment.yml index 4011b691..dd0faa56 100644 --- a/modules/nf-core/sratools/fasterqdump/environment.yml +++ b/modules/nf-core/sratools/fasterqdump/environment.yml @@ -4,5 +4,5 @@ channels: - bioconda - defaults dependencies: - - bioconda::sra-tools=3.0.8 + - bioconda::sra-tools=2.11.0 - conda-forge::pigz=2.6 diff --git a/modules/nf-core/sratools/fasterqdump/main.nf b/modules/nf-core/sratools/fasterqdump/main.nf index d4ddf268..e7cf157a 100644 --- a/modules/nf-core/sratools/fasterqdump/main.nf +++ b/modules/nf-core/sratools/fasterqdump/main.nf @@ -4,8 +4,8 @@ process SRATOOLS_FASTERQDUMP { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:2f4a4c900edd6801ff0068c2b3048b4459d119eb-0' : - 'biocontainers/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:2f4a4c900edd6801ff0068c2b3048b4459d119eb-0' }" + 'https://depot.galaxyproject.org/singularity/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:6a9ff0e76ec016c3d0d27e0c0d362339f2d787e6-0' : + 'quay.io/biocontainers/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:6a9ff0e76ec016c3d0d27e0c0d362339f2d787e6-0' }" input: tuple val(meta), path(sra) diff --git a/modules/nf-core/sratools/fasterqdump/sratools-fasterqdump.diff b/modules/nf-core/sratools/fasterqdump/sratools-fasterqdump.diff new file mode 100644 index 00000000..1fb8cbf4 --- /dev/null +++ b/modules/nf-core/sratools/fasterqdump/sratools-fasterqdump.diff @@ -0,0 +1,63 @@ +Changes in module 'nf-core/sratools/fasterqdump' +--- modules/nf-core/sratools/fasterqdump/main.nf ++++ modules/nf-core/sratools/fasterqdump/main.nf +@@ -4,8 +4,8 @@ + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? +- 'https://depot.galaxyproject.org/singularity/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:2f4a4c900edd6801ff0068c2b3048b4459d119eb-0' : +- 'biocontainers/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:2f4a4c900edd6801ff0068c2b3048b4459d119eb-0' }" ++ 'https://depot.galaxyproject.org/singularity/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:6a9ff0e76ec016c3d0d27e0c0d362339f2d787e6-0' : ++ 'quay.io/biocontainers/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:6a9ff0e76ec016c3d0d27e0c0d362339f2d787e6-0' }" + + input: + tuple val(meta), path(sra) + +--- /dev/null ++++ modules/nf-core/sratools/fasterqdump/nextflow.config +@@ -0,0 +1,10 @@ ++process { ++ withName: SRATOOLS_FASTERQDUMP { ++ ext.args = '--split-files --include-technical' ++ publishDir = [ ++ path: { "${params.outdir}/fastq" }, ++ mode: params.publish_dir_mode, ++ pattern: "*.fastq.gz" ++ ] ++ } ++} +--- modules/nf-core/sratools/fasterqdump/environment.yml ++++ modules/nf-core/sratools/fasterqdump/environment.yml +@@ -4,5 +4,5 @@ + - bioconda + - defaults + dependencies: +- - bioconda::sra-tools=3.0.8 ++ - bioconda::sra-tools=2.11.0 + - conda-forge::pigz=2.6 + +--- modules/nf-core/sratools/fasterqdump/tests/main.nf.test ++++ modules/nf-core/sratools/fasterqdump/tests/main.nf.test +@@ -3,11 +3,9 @@ + script "../main.nf" + config "./nextflow.config" + process "SRATOOLS_FASTERQDUMP" +- tag "modules" +- tag "modules_nfcore" +- tag "untar" +- tag "sratools" +- tag "sratools/fasterqdump" ++ tag "SRATOOLS_FASTERQDUMP" ++ ++ tag "UNTAR" + + test("Single-end") { + + +--- modules/nf-core/sratools/fasterqdump/tests/tags.yml ++++ /dev/null +@@ -1,2 +0,0 @@ +-sratools/fasterqdump: +- - modules/nf-core/sratools/fasterqdump/** + +************************************************************ From 7802ebc55aa05158f773e58608474901c183f6e9 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 30 Jan 2024 17:47:20 +0000 Subject: [PATCH 734/852] Update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1476a599..a91320c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements - [PR #257](https://github.com/nf-core/fetchngs/pull/257) - Template update for nf-core/tools v2.12 - [PR #258](https://github.com/nf-core/fetchngs/pull/258) - Fixes for [PR #253](https://github.com/nf-core/fetchngs/pull/253) - [PR #259](https://github.com/nf-core/fetchngs/pull/259) - Add Aspera CLI download support to pipeline ([#68](https://github.com/nf-core/fetchngs/issues/68)) +- [PR #261](https://github.com/nf-core/fetchngs/pull/261) - Revert sratools fasterqdump version ([#221](https://github.com/nf-core/fetchngs/issues/221)) ### Software dependencies From 56a16a34e24843103d8b861eb8f6786ef5e05aac Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 30 Jan 2024 18:08:28 +0000 Subject: [PATCH 735/852] Update snapshots for new version of sratools --- .../fasterqdump/tests/main.nf.test.snap | 12 +++++------ .../tests/main.nf.test.snap | 20 +++++++++---------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap index e2cc2612..0e590311 100644 --- a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap +++ b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap @@ -12,7 +12,7 @@ ] ], "1": [ - "versions.yml:md5,a3d61a9761e1606ef8459f0b68821d7a" + "versions.yml:md5,6ff2d50b15c3f0eb9c72cd13a4a20295" ], "reads": [ [ @@ -24,11 +24,11 @@ ] ], "versions": [ - "versions.yml:md5,a3d61a9761e1606ef8459f0b68821d7a" + "versions.yml:md5,6ff2d50b15c3f0eb9c72cd13a4a20295" ] } ], - "timestamp": "2024-01-09T12:55:00.629261" + "timestamp": "2024-01-30T18:02:53.958171" }, "Paired-end": { "content": [ @@ -46,7 +46,7 @@ ] ], "1": [ - "versions.yml:md5,a3d61a9761e1606ef8459f0b68821d7a" + "versions.yml:md5,6ff2d50b15c3f0eb9c72cd13a4a20295" ], "reads": [ [ @@ -61,10 +61,10 @@ ] ], "versions": [ - "versions.yml:md5,a3d61a9761e1606ef8459f0b68821d7a" + "versions.yml:md5,6ff2d50b15c3f0eb9c72cd13a4a20295" ] } ], - "timestamp": "2024-01-09T12:55:34.40299" + "timestamp": "2024-01-30T18:03:20.841426" } } \ No newline at end of file diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap index 2123d3f7..63ba2e99 100644 --- a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap @@ -3,7 +3,7 @@ "content": [ 19996 ], - "timestamp": "2024-01-11T11:52:21.464438219" + "timestamp": "2024-01-30T18:05:15.684489" }, "test_pe_reads_2_lines": { "content": [ @@ -16,29 +16,29 @@ "GTGCACTCACGCAGTATAATTAATAACTAATTACTGTCGTTGACAGGACACGAGTAACTCGTCTATCTTCTGCAGGCTGCTTACGGTTTCGTCCGTGTTGCAGCCGATCATCAGCACATCTAGGTTTCGTCCGGGTGTGACCGAAAGGTAAGATGGAGAGCCTTGTCCCTGGTTTCAACGAGAAAACACACGTCCAACTCAGTTTGCCTGTTTTACAGGTTCGCGACGTGCTCGTACG" ] ], - "timestamp": "2024-01-11T11:52:21.437261931" + "timestamp": "2024-01-30T18:05:15.670447" }, "test_pe_reads_2_size": { "content": [ 2011460 ], - "timestamp": "2024-01-11T11:52:21.44875993" + "timestamp": "2024-01-30T18:05:15.675771" }, "versions": { "content": [ [ "versions.yml:md5,1a2218ff913fc33408bffccb081b5048", - "versions.yml:md5,98d78bba9f3da39a0b7db6e9c7dcc224", - "versions.yml:md5,9c558ff624585a6eee82a19c8c0136db" + "versions.yml:md5,2f3b3a13b36dabf13f09327613d5558d", + "versions.yml:md5,98d78bba9f3da39a0b7db6e9c7dcc224" ] ], - "timestamp": "2024-01-11T12:11:06.731937323" + "timestamp": "2024-01-30T18:05:15.692165" }, "test_pe_reads_1_size": { "content": [ - 2011460 + 2013376 ], - "timestamp": "2024-01-11T11:52:21.428267242" + "timestamp": "2024-01-30T18:05:15.666916" }, "test_se_reads_lines": { "content": [ @@ -51,7 +51,7 @@ "ACGCAGGTGCCAGCAGCCGCGGTAATACGGAGGGAGCTAGCGTTGTTCGGAATTACTGGGCGTAAAGCGCACGTAGGCGGCTTTTCAAGTCAGGGGTGGAAATACCCGGGGCCGTCAACCCGACCG" ] ], - "timestamp": "2024-01-11T11:52:21.45496474" + "timestamp": "2024-01-30T18:05:15.679779" }, "test_pe_reads_1_lines": { "content": [ @@ -64,6 +64,6 @@ "CGTACGAGCACGTCGCGAACCTGTAAAACAGGCAAACTGAGTTGGACGTGTGTTTTCTCGTTGAAACCAGGGACAAGGCTCTCCATCTTACCTTTCGGTCACACCCGGACGAAACCTAGATGTGCTGATGATCGGCTGCAACACGGACGAAACCGTAAGCAGCCTGCAGAAGATAGACGAGTTACTCGTGTCCTGTCAACGACAGTAATTAGTTATTAATTATACTGCGTGAGTGCAC" ] ], - "timestamp": "2024-01-11T11:52:21.400169604" + "timestamp": "2024-01-30T18:05:15.654112" } } \ No newline at end of file From a56d4fad3c469284ffc71300ce5b9f2cfab6d994 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Wed, 31 Jan 2024 10:04:56 +0000 Subject: [PATCH 736/852] Update nf-test to v0.8.4 --- .github/workflows/ci.yml | 2 +- CHANGELOG.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 12343148..1395c844 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,7 +13,7 @@ on: env: NXF_ANSI_LOG: false - NFT_VER: "0.8.3" + NFT_VER: "0.8.4" NFT_WORKDIR: "~" NFT_DIFF: "pdiff" NFT_DIFF_ARGS: "--line-numbers --expand-tabs=2" diff --git a/CHANGELOG.md b/CHANGELOG.md index 1476a599..070a6364 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements - [PR #257](https://github.com/nf-core/fetchngs/pull/257) - Template update for nf-core/tools v2.12 - [PR #258](https://github.com/nf-core/fetchngs/pull/258) - Fixes for [PR #253](https://github.com/nf-core/fetchngs/pull/253) - [PR #259](https://github.com/nf-core/fetchngs/pull/259) - Add Aspera CLI download support to pipeline ([#68](https://github.com/nf-core/fetchngs/issues/68)) +- [PR ###](https://github.com/nf-core/fetchngs/pull/) - Use nf-test version v0.8.4 ### Software dependencies From 9974e638a4515cb403bf19d508c0e3b8f899685f Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Wed, 31 Jan 2024 10:14:17 +0000 Subject: [PATCH 737/852] Remove implicit tags --- CHANGELOG.md | 2 +- modules/local/aspera_cli/tests/main.nf.test | 2 -- modules/local/multiqc_mappings_config/tests/main.nf.test | 2 -- modules/local/sra_fastq_ftp/tests/main.nf.test | 2 -- modules/local/sra_ids_to_runinfo/tests/main.nf.test | 2 -- modules/local/sra_runinfo_to_ftp/tests/main.nf.test | 2 -- modules/local/sra_to_samplesheet/tests/main.nf.test | 2 -- .../nf-core/custom/sratoolsncbisettings/tests/main.nf.test | 4 +--- modules/nf-core/sratools/fasterqdump/tests/main.nf.test | 1 - modules/nf-core/sratools/prefetch/tests/main.nf.test | 1 - modules/nf-core/untar/tests/main.nf.test | 3 +-- .../tests/main.workflow_pipeline_completion.test | 1 - .../tests/main.workflow_pipeline_initialisation.nf.test | 1 - .../tests/main.nf.test | 1 - .../utils_nextflow_pipeline/tests/main.workflow.nf.test | 1 - .../nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test | 1 - .../nf-core/utils_nfvalidation_plugin/tests/main.nf.test | 1 - workflows/sra/tests/main.nf.test | 3 +-- 18 files changed, 4 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 070a6364..a74c68b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,7 +31,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements - [PR #257](https://github.com/nf-core/fetchngs/pull/257) - Template update for nf-core/tools v2.12 - [PR #258](https://github.com/nf-core/fetchngs/pull/258) - Fixes for [PR #253](https://github.com/nf-core/fetchngs/pull/253) - [PR #259](https://github.com/nf-core/fetchngs/pull/259) - Add Aspera CLI download support to pipeline ([#68](https://github.com/nf-core/fetchngs/issues/68)) -- [PR ###](https://github.com/nf-core/fetchngs/pull/) - Use nf-test version v0.8.4 +- [PR #262](https://github.com/nf-core/fetchngs/pull/262) - Use nf-test version v0.8.4 ### Software dependencies diff --git a/modules/local/aspera_cli/tests/main.nf.test b/modules/local/aspera_cli/tests/main.nf.test index 3858e2c3..b2f5f1bd 100644 --- a/modules/local/aspera_cli/tests/main.nf.test +++ b/modules/local/aspera_cli/tests/main.nf.test @@ -4,8 +4,6 @@ nextflow_process { script "../main.nf" process "ASPERA_CLI" - tag "ASPERA_CLI" - test("Should run without failures") { when { diff --git a/modules/local/multiqc_mappings_config/tests/main.nf.test b/modules/local/multiqc_mappings_config/tests/main.nf.test index e782116e..106f3248 100644 --- a/modules/local/multiqc_mappings_config/tests/main.nf.test +++ b/modules/local/multiqc_mappings_config/tests/main.nf.test @@ -4,8 +4,6 @@ nextflow_process { script "../main.nf" process "MULTIQC_MAPPINGS_CONFIG" - tag "MULTIQC_MAPPINGS_CONFIG" - test("Should run without failures") { when { diff --git a/modules/local/sra_fastq_ftp/tests/main.nf.test b/modules/local/sra_fastq_ftp/tests/main.nf.test index 27329cd9..f58aaae2 100644 --- a/modules/local/sra_fastq_ftp/tests/main.nf.test +++ b/modules/local/sra_fastq_ftp/tests/main.nf.test @@ -4,8 +4,6 @@ nextflow_process { script "../main.nf" process "SRA_FASTQ_FTP" - tag "SRA_FASTQ_FTP" - test("Should run without failures") { when { diff --git a/modules/local/sra_ids_to_runinfo/tests/main.nf.test b/modules/local/sra_ids_to_runinfo/tests/main.nf.test index cc0d6de9..2e510ea1 100644 --- a/modules/local/sra_ids_to_runinfo/tests/main.nf.test +++ b/modules/local/sra_ids_to_runinfo/tests/main.nf.test @@ -4,8 +4,6 @@ nextflow_process { script "../main.nf" process "SRA_IDS_TO_RUNINFO" - tag "SRA_IDS_TO_RUNINFO" - test("Should run without failures") { when { diff --git a/modules/local/sra_runinfo_to_ftp/tests/main.nf.test b/modules/local/sra_runinfo_to_ftp/tests/main.nf.test index 1060b394..4b03249c 100644 --- a/modules/local/sra_runinfo_to_ftp/tests/main.nf.test +++ b/modules/local/sra_runinfo_to_ftp/tests/main.nf.test @@ -4,8 +4,6 @@ nextflow_process { script "../main.nf" process "SRA_RUNINFO_TO_FTP" - tag "SRA_RUNINFO_TO_FTP" - test("Should run without failures") { when { diff --git a/modules/local/sra_to_samplesheet/tests/main.nf.test b/modules/local/sra_to_samplesheet/tests/main.nf.test index 999864b8..4458858e 100644 --- a/modules/local/sra_to_samplesheet/tests/main.nf.test +++ b/modules/local/sra_to_samplesheet/tests/main.nf.test @@ -4,8 +4,6 @@ nextflow_process { script "../main.nf" process "SRA_TO_SAMPLESHEET" - tag "SRA_TO_SAMPLESHEET" - test("Should run without failures") { when { diff --git a/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test b/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test index 6fde77c6..11899742 100644 --- a/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test +++ b/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test @@ -4,9 +4,7 @@ nextflow_process { script "../main.nf" process "CUSTOM_SRATOOLSNCBISETTINGS" config "modules/nf-core/custom/sratoolsncbisettings/tests/nextflow.config" - - tag "CUSTOM_SRATOOLSNCBISETTINGS" - + test("Should run without failures") { when { diff --git a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test index b3107336..c64f6fc1 100644 --- a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test +++ b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test @@ -3,7 +3,6 @@ nextflow_process { script "../main.nf" config "./nextflow.config" process "SRATOOLS_FASTERQDUMP" - tag "SRATOOLS_FASTERQDUMP" tag "UNTAR" diff --git a/modules/nf-core/sratools/prefetch/tests/main.nf.test b/modules/nf-core/sratools/prefetch/tests/main.nf.test index 7319108c..b0f5ffa2 100644 --- a/modules/nf-core/sratools/prefetch/tests/main.nf.test +++ b/modules/nf-core/sratools/prefetch/tests/main.nf.test @@ -2,7 +2,6 @@ nextflow_process { name "Test Process SRATOOLS_PREFETCH" script "../main.nf" process "SRATOOLS_PREFETCH" - tag "SRATOOLS_PREFETCH" test("sratools/prefetch") { diff --git a/modules/nf-core/untar/tests/main.nf.test b/modules/nf-core/untar/tests/main.nf.test index 0eb25d3c..05134043 100644 --- a/modules/nf-core/untar/tests/main.nf.test +++ b/modules/nf-core/untar/tests/main.nf.test @@ -3,8 +3,7 @@ nextflow_process { name "Test Process UNTAR" script "../main.nf" process "UNTAR" - tag "UNTAR" - + test("test_untar") { when { diff --git a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_completion.test b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_completion.test index a1814bf6..cfbfab4c 100644 --- a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_completion.test +++ b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_completion.test @@ -3,7 +3,6 @@ nextflow_workflow { name "Test Workflow PIPELINE_COMPLETION" script "subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf" workflow "PIPELINE_COMPLETION" - tag "PIPELINE_COMPLETION" test("Should run") { diff --git a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_initialisation.nf.test b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_initialisation.nf.test index d8dc3963..611eaee7 100644 --- a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_initialisation.nf.test +++ b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_initialisation.nf.test @@ -3,7 +3,6 @@ nextflow_workflow { name "Test Workflow PIPELINE_INITIALISATION" script "subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf" workflow "PIPELINE_INITIALISATION" - tag 'PIPELINE_INITIALISATION' test("Should run") { diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test index 9ff65074..7293a792 100644 --- a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test @@ -3,7 +3,6 @@ nextflow_workflow { name "Test workflow: fastq_download_prefetch_fasterqdump_sratools/main.nf" script "../main.nf" workflow "FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS" - tag "FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS" tag "CUSTOM_SRATOOLSNCBISETTINGS" tag "SRATOOLS_PREFETCH" diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test index b1b3a2c3..94e7198c 100644 --- a/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test +++ b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test @@ -4,7 +4,6 @@ nextflow_workflow { script "../main.nf" config "subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config" workflow "UTILS_NEXTFLOW_PIPELINE" - tag "UTILS_NEXTFLOW_PIPELINE" test("Should run no inputs") { diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test index cb7376c0..3df54055 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test @@ -4,7 +4,6 @@ nextflow_workflow { script "../main.nf" config "subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config" workflow "UTILS_NFCORE_PIPELINE" - tag "UTILS_NFCORE_PIPELINE" test("Should run without failures") { diff --git a/subworkflows/nf-core/utils_nfvalidation_plugin/tests/main.nf.test b/subworkflows/nf-core/utils_nfvalidation_plugin/tests/main.nf.test index b13e7e6e..5649654e 100644 --- a/subworkflows/nf-core/utils_nfvalidation_plugin/tests/main.nf.test +++ b/subworkflows/nf-core/utils_nfvalidation_plugin/tests/main.nf.test @@ -3,7 +3,6 @@ nextflow_workflow { name "Test Workflow UTILS_NFVALIDATION_PLUGIN" script "../main.nf" workflow "UTILS_NFVALIDATION_PLUGIN" - tag "UTILS_NFVALIDATION_PLUGIN" test("Should run nothing") { diff --git a/workflows/sra/tests/main.nf.test b/workflows/sra/tests/main.nf.test index 062d6886..7ad22a18 100644 --- a/workflows/sra/tests/main.nf.test +++ b/workflows/sra/tests/main.nf.test @@ -3,8 +3,7 @@ nextflow_workflow { name "Test workflow: sra/main.nf" script "../main.nf" workflow "SRA" - tag "SRA" - + // Dependencies tag "MULTIQC_MAPPINGS_CONFIG" tag "ASPERA_CLI" From df2ee5b9dd7dc0dfa91eab1997c1ef99f19c06cb Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Wed, 31 Jan 2024 10:34:57 +0000 Subject: [PATCH 738/852] lint fix --- workflows/sra/tests/main.nf.test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/sra/tests/main.nf.test b/workflows/sra/tests/main.nf.test index 7ad22a18..c08f345a 100644 --- a/workflows/sra/tests/main.nf.test +++ b/workflows/sra/tests/main.nf.test @@ -3,7 +3,7 @@ nextflow_workflow { name "Test workflow: sra/main.nf" script "../main.nf" workflow "SRA" - + // Dependencies tag "MULTIQC_MAPPINGS_CONFIG" tag "ASPERA_CLI" From 01ee6cc5a90a41d158383ac0466d0bee0b2a86ba Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Wed, 31 Jan 2024 11:09:11 +0000 Subject: [PATCH 739/852] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a74c68b1..c4ec2323 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,7 +31,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements - [PR #257](https://github.com/nf-core/fetchngs/pull/257) - Template update for nf-core/tools v2.12 - [PR #258](https://github.com/nf-core/fetchngs/pull/258) - Fixes for [PR #253](https://github.com/nf-core/fetchngs/pull/253) - [PR #259](https://github.com/nf-core/fetchngs/pull/259) - Add Aspera CLI download support to pipeline ([#68](https://github.com/nf-core/fetchngs/issues/68)) -- [PR #262](https://github.com/nf-core/fetchngs/pull/262) - Use nf-test version v0.8.4 +- [PR #262](https://github.com/nf-core/fetchngs/pull/262) - Use nf-test version v0.8.4 and remove implicit tags ### Software dependencies From 3c31d5ef251a34e6daa1c8b650377f4a0a8038fa Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 31 Jan 2024 13:01:49 +0000 Subject: [PATCH 740/852] Rename utils_nfcore_fetchngs_pipeline subworkflow and fix tags --- ...completion.test => main.workflow_pipeline_completion.nf.test} | 1 + .../tests/main.workflow_pipeline_initialisation.nf.test | 1 + 2 files changed, 2 insertions(+) rename subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/{main.workflow_pipeline_completion.test => main.workflow_pipeline_completion.nf.test} (96%) diff --git a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_completion.test b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_completion.nf.test similarity index 96% rename from subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_completion.test rename to subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_completion.nf.test index cfbfab4c..b41fca23 100644 --- a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_completion.test +++ b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_completion.nf.test @@ -3,6 +3,7 @@ nextflow_workflow { name "Test Workflow PIPELINE_COMPLETION" script "subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf" workflow "PIPELINE_COMPLETION" + tag "UTILS_NFCORE_FETCHNGS_PIPELINE" test("Should run") { diff --git a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_initialisation.nf.test b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_initialisation.nf.test index 611eaee7..3d107f3c 100644 --- a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_initialisation.nf.test +++ b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_initialisation.nf.test @@ -3,6 +3,7 @@ nextflow_workflow { name "Test Workflow PIPELINE_INITIALISATION" script "subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf" workflow "PIPELINE_INITIALISATION" + tag "UTILS_NFCORE_FETCHNGS_PIPELINE" test("Should run") { From f7e2a11272a6a3334aebdf447b73d0275647f289 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 31 Jan 2024 21:04:09 +0000 Subject: [PATCH 741/852] Update workflow tags --- workflows/sra/tests/main.nf.test | 6 +++--- .../sra/tests/sra_custom_ena_metadata_fields.nf.test | 11 ++++------- .../sra/tests/sra_force_sratools_download.nf.test | 10 ++++------ .../sra/tests/sra_nf_core_pipeline_atacseq.nf.test | 11 ++++------- .../sra/tests/sra_nf_core_pipeline_rnaseq.nf.test | 11 ++++------- .../tests/sra_nf_core_pipeline_taxprofiler.nf.test | 11 ++++------- .../sra/tests/sra_nf_core_pipeline_viralrecon.nf.test | 11 ++++------- workflows/sra/tests/sra_skip_fastq_download.nf.test | 9 +++------ 8 files changed, 30 insertions(+), 50 deletions(-) diff --git a/workflows/sra/tests/main.nf.test b/workflows/sra/tests/main.nf.test index c08f345a..69ad7f42 100644 --- a/workflows/sra/tests/main.nf.test +++ b/workflows/sra/tests/main.nf.test @@ -3,14 +3,14 @@ nextflow_workflow { name "Test workflow: sra/main.nf" script "../main.nf" workflow "SRA" + tag "SRA_DEFAULT" // Dependencies - tag "MULTIQC_MAPPINGS_CONFIG" - tag "ASPERA_CLI" - tag "SRA_FASTQ_FTP" tag "SRA_IDS_TO_RUNINFO" tag "SRA_RUNINFO_TO_FTP" + tag "ASPERA_CLI" tag "SRA_TO_SAMPLESHEET" + tag "MULTIQC_MAPPINGS_CONFIG" test("Parameters: default") { diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test index 5fd4882b..98d1432d 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test @@ -3,17 +3,14 @@ nextflow_workflow { name "Test workflow: sra/main.nf" script "../main.nf" workflow "SRA" + tag "SRA_CUSTOM_ENA_METADATA_FIELDS" - // Subworkflows - tag "SRA" - - // Modules - tag "MULTIQC_MAPPINGS_CONFIG" - tag "ASPERA_CLI" - tag "SRA_FASTQ_FTP" + // Dependencies tag "SRA_IDS_TO_RUNINFO" tag "SRA_RUNINFO_TO_FTP" + tag "SRA_FASTQ_FTP" tag "SRA_TO_SAMPLESHEET" + tag "MULTIQC_MAPPINGS_CONFIG" test("Parameters: --nf_core_pipeline rnaseq --ena_metadata_fields ... --sample_mapping_fields ...") { diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test b/workflows/sra/tests/sra_force_sratools_download.nf.test index 2d01c694..62d499df 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test +++ b/workflows/sra/tests/sra_force_sratools_download.nf.test @@ -3,16 +3,14 @@ nextflow_workflow { name "Test workflow: sra/main.nf" script "../main.nf" workflow "SRA" + tag "SRA_FORCE_SRATOOLS_DOWNLOAD" - // Subworkflows - tag "SRA" - - // Modules - tag "MULTIQC_MAPPINGS_CONFIG" - tag "SRA_FASTQ_FTP" + // Dependencies + tag "FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS" tag "SRA_IDS_TO_RUNINFO" tag "SRA_RUNINFO_TO_FTP" tag "SRA_TO_SAMPLESHEET" + tag "MULTIQC_MAPPINGS_CONFIG" test("Parameters: --force_sratools_download") { diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test index ce77baa2..26cac4b9 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test @@ -3,17 +3,14 @@ nextflow_workflow { name "Test workflow: sra/main.nf" script "../main.nf" workflow "SRA" + tag "SRA_NF_CORE_PIPELINE_ATACSEQ" - // Subworkflows - tag "SRA" - - // Modules - tag "MULTIQC_MAPPINGS_CONFIG" - tag "ASPERA_CLI" - tag "SRA_FASTQ_FTP" + // Dependencies tag "SRA_IDS_TO_RUNINFO" tag "SRA_RUNINFO_TO_FTP" + tag "ASPERA_CLI" tag "SRA_TO_SAMPLESHEET" + tag "MULTIQC_MAPPINGS_CONFIG" test("Parameters: --nf_core_pipeline atacseq") { diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test index 99c7dbc5..b5a49dd4 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test @@ -3,17 +3,14 @@ nextflow_workflow { name "Test workflow: sra/main.nf" script "../main.nf" workflow "SRA" + tag "SRA_NF_CORE_PIPELINE_RNASEQ" - // Subworkflows - tag "SRA" - - // Modules - tag "MULTIQC_MAPPINGS_CONFIG" - tag "ASPERA_CLI" - tag "SRA_FASTQ_FTP" + // Dependencies tag "SRA_IDS_TO_RUNINFO" tag "SRA_RUNINFO_TO_FTP" + tag "ASPERA_CLI" tag "SRA_TO_SAMPLESHEET" + tag "MULTIQC_MAPPINGS_CONFIG" test("Parameters: --nf_core_pipeline rnaseq") { diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test index d48a714e..0a92b446 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test @@ -3,17 +3,14 @@ nextflow_workflow { name "Test workflow: sra/main.nf" script "../main.nf" workflow "SRA" + tag "SRA_NF_CORE_PIPELINE_TAXPROFILER" - // Subworkflows - tag "SRA" - - // Modules - tag "MULTIQC_MAPPINGS_CONFIG" - tag "ASPERA_CLI" - tag "SRA_FASTQ_FTP" + // Dependencies tag "SRA_IDS_TO_RUNINFO" tag "SRA_RUNINFO_TO_FTP" + tag "ASPERA_CLI" tag "SRA_TO_SAMPLESHEET" + tag "MULTIQC_MAPPINGS_CONFIG" test("Parameters: --nf_core_pipeline taxprofiler") { diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test index def5c3cf..f633e0d6 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test @@ -3,17 +3,14 @@ nextflow_workflow { name "Test workflow: sra/main.nf" script "../main.nf" workflow "SRA" + tag "SRA_NF_CORE_PIPELINE_VIRALRECON" - // Subworkflows - tag "SRA" - - // Modules - tag "MULTIQC_MAPPINGS_CONFIG" - tag "ASPERA_CLI" - tag "SRA_FASTQ_FTP" + // Dependencies tag "SRA_IDS_TO_RUNINFO" tag "SRA_RUNINFO_TO_FTP" + tag "ASPERA_CLI" tag "SRA_TO_SAMPLESHEET" + tag "MULTIQC_MAPPINGS_CONFIG" test("Parameters: --nf_core_pipeline viralrecon") { diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test b/workflows/sra/tests/sra_skip_fastq_download.nf.test index f9a79e15..245dbb80 100644 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test @@ -3,16 +3,13 @@ nextflow_workflow { name "Test workflow: sra/main.nf" script "../main.nf" workflow "SRA" + tag "SRA_SKIP_FASTQ_DOWNLOAD" - // Subworkflows - tag "SRA" - - // Modules - tag "MULTIQC_MAPPINGS_CONFIG" - tag "SRA_FASTQ_FTP" + // Dependencies tag "SRA_IDS_TO_RUNINFO" tag "SRA_RUNINFO_TO_FTP" tag "SRA_TO_SAMPLESHEET" + tag "MULTIQC_MAPPINGS_CONFIG" test("Parameters: --skip_fastq_download") { From 46ec4f8b5a62524eb682b62aab0b643093d156c1 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 31 Jan 2024 21:12:42 +0000 Subject: [PATCH 742/852] Add test for --force_ftp_download --- .../sra/tests/sra_force_ftp_download.nf.test | 36 +++ .../tests/sra_force_ftp_download.nf.test.snap | 289 ++++++++++++++++++ 2 files changed, 325 insertions(+) create mode 100644 workflows/sra/tests/sra_force_ftp_download.nf.test create mode 100644 workflows/sra/tests/sra_force_ftp_download.nf.test.snap diff --git a/workflows/sra/tests/sra_force_ftp_download.nf.test b/workflows/sra/tests/sra_force_ftp_download.nf.test new file mode 100644 index 00000000..d66cc34a --- /dev/null +++ b/workflows/sra/tests/sra_force_ftp_download.nf.test @@ -0,0 +1,36 @@ +nextflow_workflow { + + name "Test workflow: sra/main.nf" + script "../main.nf" + workflow "SRA" + tag "SRA_FORCE_FTP_DOWNLOAD" + + // Dependencies + tag "SRA_IDS_TO_RUNINFO" + tag "SRA_RUNINFO_TO_FTP" + tag "SRA_FASTQ_FTP" + tag "SRA_TO_SAMPLESHEET" + tag "MULTIQC_MAPPINGS_CONFIG" + + test("Parameters: --force_ftp_download") { + + when { + workflow { + """ + input[0] = Channel.from("DRX026011", "ERX1234253", "SRX6725035") + """ + } + params { + outdir = "results" + force_ftp_download = true + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match() } + ) + } + } +} diff --git a/workflows/sra/tests/sra_force_ftp_download.nf.test.snap b/workflows/sra/tests/sra_force_ftp_download.nf.test.snap new file mode 100644 index 00000000..1d92e034 --- /dev/null +++ b/workflows/sra/tests/sra_force_ftp_download.nf.test.snap @@ -0,0 +1,289 @@ +{ + "Parameters: --force_ftp_download": { + "content": [ + { + "0": [ + "samplesheet.csv:md5,f6bf5c012eef0296f12316e16544ea60" + ], + "1": [ + "id_mappings.csv:md5,3e41ce6ab19feb76f2b20fa77a910ad3" + ], + "2": [ + [ + "multiqc_config.yml:md5,1ac06bb95b503703430e74660bbdd768", + "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" + ] + ], + "3": [ + { + "base_count": "194930", + "experiment_accession": "DRX026011", + "experiment_alias": "DRX026011", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", + "fastq_1": "DRX026011_DRR028935_1.fastq.gz:md5,1c3a691ea99767f25de2492440a02cb7", + "fastq_2": "DRX026011_DRR028935_2.fastq.gz:md5,6fa02d3e52613cfe3464cc7a29f227d4", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_bytes": "60275;61610", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", + "id": "DRX026011_DRR028935", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "library_layout": "PAIRED", + "library_name": "day0_BbSQE-I", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "md5_1": "cc01df82a9354bb6b3be93483b20c35a", + "md5_2": "941c9998d746416dad53c94c480ddf30", + "read_count": "965", + "run_accession": "DRR028935", + "run_alias": "DRR028935", + "sample_accession": "SAMD00024405", + "sample_alias": "SAMD00024405", + "sample_description": "Liquid culture", + "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", + "scientific_name": "Botryococcus braunii Showa", + "secondary_sample_accession": "DRS019431", + "secondary_study_accession": "DRP002616", + "single_end": false, + "study_accession": "PRJDB3420", + "study_alias": "DRP002616", + "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", + "submission_accession": "DRA002949", + "tax_id": "1202541" + }, + { + "base_count": "1996273", + "experiment_accession": "SRX6725035", + "experiment_alias": "Emb289P1_bin131", + "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", + "fastq_1": "SRX6725035_SRR9984183.fastq.gz:md5,909e5d68f59d2f1c9315d4f8f6a2ef60", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_bytes": "605358", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_md5": "0b512d2dc31685983456bd56fd836544", + "id": "SRX6725035_SRR9984183", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "Emb289P1_bin131", + "library_selection": "RANDOM", + "library_source": "METAGENOMIC", + "library_strategy": "WGS", + "md5_1": "0b512d2dc31685983456bd56fd836544", + "md5_2": "", + "read_count": "58", + "run_accession": "SRR9984183", + "run_alias": "Emb289P1_bin131.fastq", + "sample_accession": "SAMN12581720", + "sample_alias": "Emb289P1_bin131", + "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", + "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", + "scientific_name": "Defluviitaleaceae bacterium", + "secondary_sample_accession": "SRS5277011", + "secondary_study_accession": "SRP218535", + "single_end": true, + "study_accession": "PRJNA560329", + "study_alias": "PRJNA560329", + "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", + "submission_accession": "SRA942061", + "tax_id": "2660712" + }, + { + "base_count": "35658", + "experiment_accession": "ERX1234253", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "fastq_1": "ERX1234253_ERR1160846.fastq.gz:md5,98515d664854f1c96f55ac836fb671b9", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "id": "ERX1234253_ERR1160846", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "10317.BLANK.93.3E.r22", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "read_count": "283", + "run_accession": "ERR1160846", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "sample_accession": "SAMEA3687214", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "sample_description": "American Gut control", + "sample_title": "10317.BLANK.93.3E.r22", + "scientific_name": "metagenome", + "secondary_sample_accession": "ERS994363", + "secondary_study_accession": "ERP012803", + "single_end": true, + "study_accession": "PRJEB11419", + "study_alias": "qiita_sid_10317", + "study_title": "American Gut Project", + "submission_accession": "ERA541392", + "tax_id": "256318" + } + ], + "4": [ + "versions.yml:md5,0bb049f166e93b3d9866ed7e4407c6c9", + "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", + "versions.yml:md5,98a3ee9aa3bcc3b080247bccde481bbb", + "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" + ], + "mappings": [ + "id_mappings.csv:md5,3e41ce6ab19feb76f2b20fa77a910ad3" + ], + "sample_mappings": [ + [ + "multiqc_config.yml:md5,1ac06bb95b503703430e74660bbdd768", + "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" + ] + ], + "samplesheet": [ + "samplesheet.csv:md5,f6bf5c012eef0296f12316e16544ea60" + ], + "sra_metadata": [ + { + "base_count": "194930", + "experiment_accession": "DRX026011", + "experiment_alias": "DRX026011", + "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", + "fastq_1": "DRX026011_DRR028935_1.fastq.gz:md5,1c3a691ea99767f25de2492440a02cb7", + "fastq_2": "DRX026011_DRR028935_2.fastq.gz:md5,6fa02d3e52613cfe3464cc7a29f227d4", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_bytes": "60275;61610", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", + "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", + "id": "DRX026011_DRR028935", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "library_layout": "PAIRED", + "library_name": "day0_BbSQE-I", + "library_selection": "cDNA", + "library_source": "TRANSCRIPTOMIC", + "library_strategy": "RNA-Seq", + "md5_1": "cc01df82a9354bb6b3be93483b20c35a", + "md5_2": "941c9998d746416dad53c94c480ddf30", + "read_count": "965", + "run_accession": "DRR028935", + "run_alias": "DRR028935", + "sample_accession": "SAMD00024405", + "sample_alias": "SAMD00024405", + "sample_description": "Liquid culture", + "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", + "scientific_name": "Botryococcus braunii Showa", + "secondary_sample_accession": "DRS019431", + "secondary_study_accession": "DRP002616", + "single_end": false, + "study_accession": "PRJDB3420", + "study_alias": "DRP002616", + "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", + "submission_accession": "DRA002949", + "tax_id": "1202541" + }, + { + "base_count": "1996273", + "experiment_accession": "SRX6725035", + "experiment_alias": "Emb289P1_bin131", + "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", + "fastq_1": "SRX6725035_SRR9984183.fastq.gz:md5,909e5d68f59d2f1c9315d4f8f6a2ef60", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_bytes": "605358", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", + "fastq_md5": "0b512d2dc31685983456bd56fd836544", + "id": "SRX6725035_SRR9984183", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "Emb289P1_bin131", + "library_selection": "RANDOM", + "library_source": "METAGENOMIC", + "library_strategy": "WGS", + "md5_1": "0b512d2dc31685983456bd56fd836544", + "md5_2": "", + "read_count": "58", + "run_accession": "SRR9984183", + "run_alias": "Emb289P1_bin131.fastq", + "sample_accession": "SAMN12581720", + "sample_alias": "Emb289P1_bin131", + "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", + "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", + "scientific_name": "Defluviitaleaceae bacterium", + "secondary_sample_accession": "SRS5277011", + "secondary_study_accession": "SRP218535", + "single_end": true, + "study_accession": "PRJNA560329", + "study_alias": "PRJNA560329", + "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", + "submission_accession": "SRA942061", + "tax_id": "2660712" + }, + { + "base_count": "35658", + "experiment_accession": "ERX1234253", + "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", + "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", + "fastq_1": "ERX1234253_ERR1160846.fastq.gz:md5,98515d664854f1c96f55ac836fb671b9", + "fastq_2": "", + "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_bytes": "18077", + "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", + "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", + "id": "ERX1234253_ERR1160846", + "instrument_model": "Illumina HiSeq 2500", + "instrument_platform": "ILLUMINA", + "library_layout": "SINGLE", + "library_name": "10317.BLANK.93.3E.r22", + "library_selection": "PCR", + "library_source": "METAGENOMIC", + "library_strategy": "AMPLICON", + "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", + "md5_2": "", + "read_count": "283", + "run_accession": "ERR1160846", + "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", + "sample_accession": "SAMEA3687214", + "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", + "sample_description": "American Gut control", + "sample_title": "10317.BLANK.93.3E.r22", + "scientific_name": "metagenome", + "secondary_sample_accession": "ERS994363", + "secondary_study_accession": "ERP012803", + "single_end": true, + "study_accession": "PRJEB11419", + "study_alias": "qiita_sid_10317", + "study_title": "American Gut Project", + "submission_accession": "ERA541392", + "tax_id": "256318" + } + ], + "versions": [ + "versions.yml:md5,0bb049f166e93b3d9866ed7e4407c6c9", + "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", + "versions.yml:md5,98a3ee9aa3bcc3b080247bccde481bbb", + "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", + "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-01-31T21:12:02.03283" + } +} \ No newline at end of file From f5b0c58d0dae51f8c8d6bd519af3b4a856ea4b1a Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 31 Jan 2024 21:20:04 +0000 Subject: [PATCH 743/852] Remove snapshot and add custom checks --- .../sra/tests/sra_force_ftp_download.nf.test | 26 +- .../tests/sra_force_ftp_download.nf.test.snap | 289 ------------------ 2 files changed, 23 insertions(+), 292 deletions(-) delete mode 100644 workflows/sra/tests/sra_force_ftp_download.nf.test.snap diff --git a/workflows/sra/tests/sra_force_ftp_download.nf.test b/workflows/sra/tests/sra_force_ftp_download.nf.test index d66cc34a..357bd180 100644 --- a/workflows/sra/tests/sra_force_ftp_download.nf.test +++ b/workflows/sra/tests/sra_force_ftp_download.nf.test @@ -21,15 +21,35 @@ nextflow_workflow { """ } params { - outdir = "results" + outdir = "$outputDir" force_ftp_download = true } } then { + assert workflow.success + assertAll( - { assert workflow.success }, - { assert snapshot(workflow.out).match() } + { + with(workflow.out.samplesheet) { + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',')[0].take(4) == ['"sample"', '"fastq_1"', '"fastq_2"', '"run_accession"'] + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') + } + }, + { + with(workflow.out.mappings) { + assert path(get(0)).readLines().size() == 4 + assert path(get(0)).readLines()*.split(',').collect { it[0] } == ['"sample"', '"DRX026011"', '"ERX1234253"', '"SRX6725035"'] + assert path(get(0)).text.contains('Illumina HiSeq 2500') + } + }, + { + with(workflow.out.sample_mappings) { + assert path(get(0)[0]).md5 == "1ac06bb95b503703430e74660bbdd768" + } + } ) } } diff --git a/workflows/sra/tests/sra_force_ftp_download.nf.test.snap b/workflows/sra/tests/sra_force_ftp_download.nf.test.snap deleted file mode 100644 index 1d92e034..00000000 --- a/workflows/sra/tests/sra_force_ftp_download.nf.test.snap +++ /dev/null @@ -1,289 +0,0 @@ -{ - "Parameters: --force_ftp_download": { - "content": [ - { - "0": [ - "samplesheet.csv:md5,f6bf5c012eef0296f12316e16544ea60" - ], - "1": [ - "id_mappings.csv:md5,3e41ce6ab19feb76f2b20fa77a910ad3" - ], - "2": [ - [ - "multiqc_config.yml:md5,1ac06bb95b503703430e74660bbdd768", - "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" - ] - ], - "3": [ - { - "base_count": "194930", - "experiment_accession": "DRX026011", - "experiment_alias": "DRX026011", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", - "fastq_1": "DRX026011_DRR028935_1.fastq.gz:md5,1c3a691ea99767f25de2492440a02cb7", - "fastq_2": "DRX026011_DRR028935_2.fastq.gz:md5,6fa02d3e52613cfe3464cc7a29f227d4", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_bytes": "60275;61610", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", - "id": "DRX026011_DRR028935", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "library_layout": "PAIRED", - "library_name": "day0_BbSQE-I", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "md5_1": "cc01df82a9354bb6b3be93483b20c35a", - "md5_2": "941c9998d746416dad53c94c480ddf30", - "read_count": "965", - "run_accession": "DRR028935", - "run_alias": "DRR028935", - "sample_accession": "SAMD00024405", - "sample_alias": "SAMD00024405", - "sample_description": "Liquid culture", - "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", - "scientific_name": "Botryococcus braunii Showa", - "secondary_sample_accession": "DRS019431", - "secondary_study_accession": "DRP002616", - "single_end": false, - "study_accession": "PRJDB3420", - "study_alias": "DRP002616", - "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", - "submission_accession": "DRA002949", - "tax_id": "1202541" - }, - { - "base_count": "1996273", - "experiment_accession": "SRX6725035", - "experiment_alias": "Emb289P1_bin131", - "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", - "fastq_1": "SRX6725035_SRR9984183.fastq.gz:md5,909e5d68f59d2f1c9315d4f8f6a2ef60", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_bytes": "605358", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_md5": "0b512d2dc31685983456bd56fd836544", - "id": "SRX6725035_SRR9984183", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "Emb289P1_bin131", - "library_selection": "RANDOM", - "library_source": "METAGENOMIC", - "library_strategy": "WGS", - "md5_1": "0b512d2dc31685983456bd56fd836544", - "md5_2": "", - "read_count": "58", - "run_accession": "SRR9984183", - "run_alias": "Emb289P1_bin131.fastq", - "sample_accession": "SAMN12581720", - "sample_alias": "Emb289P1_bin131", - "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", - "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", - "scientific_name": "Defluviitaleaceae bacterium", - "secondary_sample_accession": "SRS5277011", - "secondary_study_accession": "SRP218535", - "single_end": true, - "study_accession": "PRJNA560329", - "study_alias": "PRJNA560329", - "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", - "submission_accession": "SRA942061", - "tax_id": "2660712" - }, - { - "base_count": "35658", - "experiment_accession": "ERX1234253", - "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", - "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", - "fastq_1": "ERX1234253_ERR1160846.fastq.gz:md5,98515d664854f1c96f55ac836fb671b9", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_bytes": "18077", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", - "id": "ERX1234253_ERR1160846", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "10317.BLANK.93.3E.r22", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", - "md5_2": "", - "read_count": "283", - "run_accession": "ERR1160846", - "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", - "sample_accession": "SAMEA3687214", - "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", - "sample_description": "American Gut control", - "sample_title": "10317.BLANK.93.3E.r22", - "scientific_name": "metagenome", - "secondary_sample_accession": "ERS994363", - "secondary_study_accession": "ERP012803", - "single_end": true, - "study_accession": "PRJEB11419", - "study_alias": "qiita_sid_10317", - "study_title": "American Gut Project", - "submission_accession": "ERA541392", - "tax_id": "256318" - } - ], - "4": [ - "versions.yml:md5,0bb049f166e93b3d9866ed7e4407c6c9", - "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", - "versions.yml:md5,98a3ee9aa3bcc3b080247bccde481bbb", - "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" - ], - "mappings": [ - "id_mappings.csv:md5,3e41ce6ab19feb76f2b20fa77a910ad3" - ], - "sample_mappings": [ - [ - "multiqc_config.yml:md5,1ac06bb95b503703430e74660bbdd768", - "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9" - ] - ], - "samplesheet": [ - "samplesheet.csv:md5,f6bf5c012eef0296f12316e16544ea60" - ], - "sra_metadata": [ - { - "base_count": "194930", - "experiment_accession": "DRX026011", - "experiment_alias": "DRX026011", - "experiment_title": "Illumina HiSeq 2500 paired end sequencing: Illumina HiSeq 2500 paired end sequencing of SAMD00024405", - "fastq_1": "DRX026011_DRR028935_1.fastq.gz:md5,1c3a691ea99767f25de2492440a02cb7", - "fastq_2": "DRX026011_DRR028935_2.fastq.gz:md5,6fa02d3e52613cfe3464cc7a29f227d4", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_bytes": "60275;61610", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/DRR028/DRR028935/DRR028935_2.fastq.gz", - "fastq_md5": "cc01df82a9354bb6b3be93483b20c35a;941c9998d746416dad53c94c480ddf30", - "id": "DRX026011_DRR028935", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "library_layout": "PAIRED", - "library_name": "day0_BbSQE-I", - "library_selection": "cDNA", - "library_source": "TRANSCRIPTOMIC", - "library_strategy": "RNA-Seq", - "md5_1": "cc01df82a9354bb6b3be93483b20c35a", - "md5_2": "941c9998d746416dad53c94c480ddf30", - "read_count": "965", - "run_accession": "DRR028935", - "run_alias": "DRR028935", - "sample_accession": "SAMD00024405", - "sample_alias": "SAMD00024405", - "sample_description": "Liquid culture", - "sample_title": "Botryococcus braunii Showa at day 0 after inoculation into fresh culture medium", - "scientific_name": "Botryococcus braunii Showa", - "secondary_sample_accession": "DRS019431", - "secondary_study_accession": "DRP002616", - "single_end": false, - "study_accession": "PRJDB3420", - "study_alias": "DRP002616", - "study_title": "Liquid culture of Botryococcus braunii, race B, Showa", - "submission_accession": "DRA002949", - "tax_id": "1202541" - }, - { - "base_count": "1996273", - "experiment_accession": "SRX6725035", - "experiment_alias": "Emb289P1_bin131", - "experiment_title": "Illumina HiSeq 2500 sequencing: Binning of metagenomic reads from the P1 gut compartment of Embiratermes neotenicus", - "fastq_1": "SRX6725035_SRR9984183.fastq.gz:md5,909e5d68f59d2f1c9315d4f8f6a2ef60", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_bytes": "605358", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/SRR998/003/SRR9984183/SRR9984183.fastq.gz", - "fastq_md5": "0b512d2dc31685983456bd56fd836544", - "id": "SRX6725035_SRR9984183", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "Emb289P1_bin131", - "library_selection": "RANDOM", - "library_source": "METAGENOMIC", - "library_strategy": "WGS", - "md5_1": "0b512d2dc31685983456bd56fd836544", - "md5_2": "", - "read_count": "58", - "run_accession": "SRR9984183", - "run_alias": "Emb289P1_bin131.fastq", - "sample_accession": "SAMN12581720", - "sample_alias": "Emb289P1_bin131", - "sample_description": "Keywords: GSC:MIxS MIMAG:5.0", - "sample_title": "MIMAG Metagenome-assembled Genome sample from Defluviitaleaceae bacterium", - "scientific_name": "Defluviitaleaceae bacterium", - "secondary_sample_accession": "SRS5277011", - "secondary_study_accession": "SRP218535", - "single_end": true, - "study_accession": "PRJNA560329", - "study_alias": "PRJNA560329", - "study_title": "Phylogenomic analysis of 589 metagenome-assembled genomes encompassing all major prokaryotic lineages from the gut of higher termites", - "submission_accession": "SRA942061", - "tax_id": "2660712" - }, - { - "base_count": "35658", - "experiment_accession": "ERX1234253", - "experiment_alias": "qiita_ptid_1263:10317.BLANK.93.3E.r22", - "experiment_title": "Illumina HiSeq 2500 sequencing: qiita_ptid_1263:10317.BLANK.93.3E.r22", - "fastq_1": "ERX1234253_ERR1160846.fastq.gz:md5,98515d664854f1c96f55ac836fb671b9", - "fastq_2": "", - "fastq_aspera": "fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_bytes": "18077", - "fastq_ftp": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_galaxy": "ftp.sra.ebi.ac.uk/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz", - "fastq_md5": "5924f20ef547ebdfed7cad795bbab6e6", - "id": "ERX1234253_ERR1160846", - "instrument_model": "Illumina HiSeq 2500", - "instrument_platform": "ILLUMINA", - "library_layout": "SINGLE", - "library_name": "10317.BLANK.93.3E.r22", - "library_selection": "PCR", - "library_source": "METAGENOMIC", - "library_strategy": "AMPLICON", - "md5_1": "5924f20ef547ebdfed7cad795bbab6e6", - "md5_2": "", - "read_count": "283", - "run_accession": "ERR1160846", - "run_alias": "qiita_ppdid_706:10317.BLANK.93.3E.r22", - "sample_accession": "SAMEA3687214", - "sample_alias": "qiita_sid_10317:10317.BLANK.93.3E.r22", - "sample_description": "American Gut control", - "sample_title": "10317.BLANK.93.3E.r22", - "scientific_name": "metagenome", - "secondary_sample_accession": "ERS994363", - "secondary_study_accession": "ERP012803", - "single_end": true, - "study_accession": "PRJEB11419", - "study_alias": "qiita_sid_10317", - "study_title": "American Gut Project", - "submission_accession": "ERA541392", - "tax_id": "256318" - } - ], - "versions": [ - "versions.yml:md5,0bb049f166e93b3d9866ed7e4407c6c9", - "versions.yml:md5,1496d1cbc9041e07ab8a0c25f0b054d9", - "versions.yml:md5,98a3ee9aa3bcc3b080247bccde481bbb", - "versions.yml:md5,9b17045ca8bdc272cb3f9d349a81d206", - "versions.yml:md5,b52279f7d6b891a6523d9321f3f85b47" - ] - } - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-01-31T21:12:02.03283" - } -} \ No newline at end of file From c0dbd9346665c875b0e446434893ed0ddde9376b Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 31 Jan 2024 21:48:34 +0000 Subject: [PATCH 744/852] Update custom/sratoolsncbisettings to only run when sra ids are provided --- modules/nf-core/custom/sratoolsncbisettings/main.nf | 3 +++ modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test | 3 ++- .../fastq_download_prefetch_fasterqdump_sratools/main.nf | 2 +- .../tests/main.nf.test.snap | 1 + 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/modules/nf-core/custom/sratoolsncbisettings/main.nf b/modules/nf-core/custom/sratoolsncbisettings/main.nf index ba9441c9..cf304500 100644 --- a/modules/nf-core/custom/sratoolsncbisettings/main.nf +++ b/modules/nf-core/custom/sratoolsncbisettings/main.nf @@ -7,6 +7,9 @@ process CUSTOM_SRATOOLSNCBISETTINGS { 'https://depot.galaxyproject.org/singularity/sra-tools:3.0.8--h9f5acd7_0' : 'biocontainers/sra-tools:3.0.8--h9f5acd7_0' }" + input: + val sra_ids + output: path('*.mkfg') , emit: ncbi_settings path 'versions.yml', emit: versions diff --git a/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test b/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test index 11899742..ae9db9b0 100644 --- a/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test +++ b/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test @@ -11,11 +11,12 @@ nextflow_process { params { settings_path = '/tmp/.ncbi' settings_file = "${params.settings_path}/user-settings.mkfg" - outdir = "$outputDir" + outdir = "$outputDir" } process { """ + input[0] = ["SRX6725035"] file(params.settings_path).mkdirs() def settings = file(params.modules_testdata_base_path + 'generic/config/ncbi_user_settings.mkfg', checkIfExists: true) settings.copyTo(params.settings_file) diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/main.nf b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/main.nf index de31637e..0713892e 100644 --- a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/main.nf +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/main.nf @@ -17,7 +17,7 @@ workflow FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS { // // Detect existing NCBI user settings or create new ones. // - CUSTOM_SRATOOLSNCBISETTINGS() + CUSTOM_SRATOOLSNCBISETTINGS( ch_sra_ids ) ch_ncbi_settings = CUSTOM_SRATOOLSNCBISETTINGS.out.ncbi_settings ch_versions = ch_versions.mix(CUSTOM_SRATOOLSNCBISETTINGS.out.versions) diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap index 63ba2e99..86252466 100644 --- a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap @@ -27,6 +27,7 @@ "versions": { "content": [ [ + "versions.yml:md5,1a2218ff913fc33408bffccb081b5048", "versions.yml:md5,1a2218ff913fc33408bffccb081b5048", "versions.yml:md5,2f3b3a13b36dabf13f09327613d5558d", "versions.yml:md5,98d78bba9f3da39a0b7db6e9c7dcc224" From a70d97ee00a60b32db624f1027c83262a0b76554 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 1 Feb 2024 08:35:30 +0000 Subject: [PATCH 745/852] Install updated fastq_download_prefetch_fasterqdump_sratools subworkflow from nf-core/modules --- CHANGELOG.md | 1 + modules.json | 4 +- .../custom/sratoolsncbisettings/main.nf | 2 +- .../sratoolsncbisettings/tests/main.nf.test | 2 +- .../main.nf | 2 +- .../tests/main.nf.test.snap | 43 +++++++++++++++---- 6 files changed, 41 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 856667de..43c15bec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements - [PR #259](https://github.com/nf-core/fetchngs/pull/259) - Add Aspera CLI download support to pipeline ([#68](https://github.com/nf-core/fetchngs/issues/68)) - [PR #261](https://github.com/nf-core/fetchngs/pull/261) - Revert sratools fasterqdump version ([#221](https://github.com/nf-core/fetchngs/issues/221)) - [PR #262](https://github.com/nf-core/fetchngs/pull/262) - Use nf-test version v0.8.4 and remove implicit tags +- [PR #263](https://github.com/nf-core/fetchngs/pull/263) - Refine tags used for workflows ### Software dependencies diff --git a/modules.json b/modules.json index 9190e3f5..14bd461f 100644 --- a/modules.json +++ b/modules.json @@ -7,7 +7,7 @@ "nf-core": { "custom/sratoolsncbisettings": { "branch": "master", - "git_sha": "e719354ba77df0a1bd310836aa2039b45c29d620", + "git_sha": "3aa09ac8899d7735cb5bc004da0ef5f35f9a7901", "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] }, "sratools/fasterqdump": { @@ -32,7 +32,7 @@ "nf-core": { "fastq_download_prefetch_fasterqdump_sratools": { "branch": "master", - "git_sha": "bdfd7bc8d2e5a93531e14bd94c4128d9a72a2435", + "git_sha": "3aa09ac8899d7735cb5bc004da0ef5f35f9a7901", "installed_by": ["subworkflows"] }, "utils_nextflow_pipeline": { diff --git a/modules/nf-core/custom/sratoolsncbisettings/main.nf b/modules/nf-core/custom/sratoolsncbisettings/main.nf index cf304500..577117ed 100644 --- a/modules/nf-core/custom/sratoolsncbisettings/main.nf +++ b/modules/nf-core/custom/sratoolsncbisettings/main.nf @@ -8,7 +8,7 @@ process CUSTOM_SRATOOLSNCBISETTINGS { 'biocontainers/sra-tools:3.0.8--h9f5acd7_0' }" input: - val sra_ids + val ids output: path('*.mkfg') , emit: ncbi_settings diff --git a/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test b/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test index ae9db9b0..8cd0de8a 100644 --- a/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test +++ b/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test @@ -4,7 +4,7 @@ nextflow_process { script "../main.nf" process "CUSTOM_SRATOOLSNCBISETTINGS" config "modules/nf-core/custom/sratoolsncbisettings/tests/nextflow.config" - + test("Should run without failures") { when { diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/main.nf b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/main.nf index 0713892e..fbeacf4a 100644 --- a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/main.nf +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/main.nf @@ -17,7 +17,7 @@ workflow FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS { // // Detect existing NCBI user settings or create new ones. // - CUSTOM_SRATOOLSNCBISETTINGS( ch_sra_ids ) + CUSTOM_SRATOOLSNCBISETTINGS ( ch_sra_ids.collect() ) ch_ncbi_settings = CUSTOM_SRATOOLSNCBISETTINGS.out.ncbi_settings ch_versions = ch_versions.mix(CUSTOM_SRATOOLSNCBISETTINGS.out.versions) diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap index 86252466..d64857ef 100644 --- a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap @@ -3,7 +3,11 @@ "content": [ 19996 ], - "timestamp": "2024-01-30T18:05:15.684489" + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-01T08:34:54.56022" }, "test_pe_reads_2_lines": { "content": [ @@ -16,30 +20,45 @@ "GTGCACTCACGCAGTATAATTAATAACTAATTACTGTCGTTGACAGGACACGAGTAACTCGTCTATCTTCTGCAGGCTGCTTACGGTTTCGTCCGTGTTGCAGCCGATCATCAGCACATCTAGGTTTCGTCCGGGTGTGACCGAAAGGTAAGATGGAGAGCCTTGTCCCTGGTTTCAACGAGAAAACACACGTCCAACTCAGTTTGCCTGTTTTACAGGTTCGCGACGTGCTCGTACG" ] ], - "timestamp": "2024-01-30T18:05:15.670447" + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-01T08:34:54.532626" }, "test_pe_reads_2_size": { "content": [ 2011460 ], - "timestamp": "2024-01-30T18:05:15.675771" + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-01T08:34:54.542804" }, "versions": { "content": [ [ - "versions.yml:md5,1a2218ff913fc33408bffccb081b5048", "versions.yml:md5,1a2218ff913fc33408bffccb081b5048", "versions.yml:md5,2f3b3a13b36dabf13f09327613d5558d", "versions.yml:md5,98d78bba9f3da39a0b7db6e9c7dcc224" ] ], - "timestamp": "2024-01-30T18:05:15.692165" + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-01T08:34:54.570734" }, "test_pe_reads_1_size": { "content": [ 2013376 ], - "timestamp": "2024-01-30T18:05:15.666916" + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-01T08:34:54.525795" }, "test_se_reads_lines": { "content": [ @@ -52,7 +71,11 @@ "ACGCAGGTGCCAGCAGCCGCGGTAATACGGAGGGAGCTAGCGTTGTTCGGAATTACTGGGCGTAAAGCGCACGTAGGCGGCTTTTCAAGTCAGGGGTGGAAATACCCGGGGCCGTCAACCCGACCG" ] ], - "timestamp": "2024-01-30T18:05:15.679779" + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-01T08:34:54.550392" }, "test_pe_reads_1_lines": { "content": [ @@ -65,6 +88,10 @@ "CGTACGAGCACGTCGCGAACCTGTAAAACAGGCAAACTGAGTTGGACGTGTGTTTTCTCGTTGAAACCAGGGACAAGGCTCTCCATCTTACCTTTCGGTCACACCCGGACGAAACCTAGATGTGCTGATGATCGGCTGCAACACGGACGAAACCGTAAGCAGCCTGCAGAAGATAGACGAGTTACTCGTGTCCTGTCAACGACAGTAATTAGTTATTAATTATACTGCGTGAGTGCAC" ] ], - "timestamp": "2024-01-30T18:05:15.654112" + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-01T08:34:54.509486" } } \ No newline at end of file From 49b598b9e8dade03c08223a35e8b19713791090d Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 1 Feb 2024 10:01:43 +0000 Subject: [PATCH 746/852] Remove Synapse workflow from pipeline --- CHANGELOG.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 856667de..0c8c3a31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unpublished Version / DEV] +### :warning: Major enhancements + +- The Aspera CLI was recently added to [Bioconda](https://anaconda.org/bioconda/aspera-cli) and we have added it as another way of downloading FastQ files on top of the existing FTP and sra-tools support. In our limited benchmarks on all public Clouds we found ~50% speed-up in download times compared to FTP! We are not aware of any obvious downsides and have made this the default download method in the pipeline. You can however, revert to using FTP and sra-tools using the `--force_ftp_download` and `--force_sratools_download` parameters, respectively. We would love to have your feedback! +- Support for Synapse ids has been dropped in this release. We haven't had any feedback from users whether it is being used or not. Users can run earlier versions of the pipeline if required. + ### Credits Special thanks to the following for their contributions to the release: @@ -48,9 +53,11 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements ### Parameters -| Old parameter | New parameter | -| ------------- | ---------------------- | -| | `--force_ftp_download` | +| Old parameter | New parameter | +| ------------------ | ---------------------- | +| | `--force_ftp_download` | +| `--input_type` | | +| `--synapse_config` | | > **NB:** Parameter has been **updated** if both old and new parameter information is present. > **NB:** Parameter has been **added** if just the new parameter information is present. From 4472842c87be594d3008b6ded001a587e05b4844 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 1 Feb 2024 10:02:46 +0000 Subject: [PATCH 747/852] Remove Synapse workflow from pipeline --- README.md | 7 - assets/schema_input.json | 2 +- conf/test_synapse.config | 25 ---- docs/output.md | 25 +--- docs/usage.md | 37 ++--- main.nf | 15 +- modules/local/synapse_get/main.nf | 37 ----- modules/local/synapse_get/nextflow.config | 16 --- modules/local/synapse_list/main.nf | 36 ----- modules/local/synapse_list/nextflow.config | 10 -- .../local/synapse_merge_samplesheet/main.nf | 28 ---- .../synapse_merge_samplesheet/nextflow.config | 9 -- modules/local/synapse_show/main.nf | 36 ----- modules/local/synapse_show/nextflow.config | 9 -- modules/local/synapse_to_samplesheet/main.nf | 55 -------- .../synapse_to_samplesheet/nextflow.config | 8 -- nextflow.config | 13 +- nextflow_schema.json | 13 -- .../utils_nfcore_fetchngs_pipeline/main.nf | 130 +----------------- .../tests/main.function.nf.test | 19 --- .../main.workflow_pipeline_completion.test | 14 +- ...n.workflow_pipeline_initialisation.nf.test | 4 +- workflows/synapse/main.nf | 125 ----------------- workflows/synapse/nextflow.config | 5 - 24 files changed, 25 insertions(+), 653 deletions(-) delete mode 100644 conf/test_synapse.config delete mode 100644 modules/local/synapse_get/main.nf delete mode 100644 modules/local/synapse_get/nextflow.config delete mode 100644 modules/local/synapse_list/main.nf delete mode 100644 modules/local/synapse_list/nextflow.config delete mode 100644 modules/local/synapse_merge_samplesheet/main.nf delete mode 100644 modules/local/synapse_merge_samplesheet/nextflow.config delete mode 100644 modules/local/synapse_show/main.nf delete mode 100644 modules/local/synapse_show/nextflow.config delete mode 100644 modules/local/synapse_to_samplesheet/main.nf delete mode 100644 modules/local/synapse_to_samplesheet/nextflow.config delete mode 100644 workflows/synapse/main.nf delete mode 100644 workflows/synapse/nextflow.config diff --git a/README.md b/README.md index bf69b682..f652bd66 100644 --- a/README.md +++ b/README.md @@ -72,13 +72,6 @@ Via a single file of ids, provided one-per-line (see [example input file](https: - Otherwise use [`sra-tools`](https://github.com/ncbi/sra-tools) to download `.sra` files and convert them to FastQ. Use `--force_sratools_download` to force this behaviour. 4. Collate id metadata and paths to FastQ files in a single samplesheet -### Synapse ids - -1. Resolve Synapse directory ids to their corresponding FastQ files ids via the `synapse list` command. -2. Retrieve FastQ file metadata including FastQ file names, md5sums, etags, annotations and other data provenance via the `synapse show` command. -3. Download FastQ files in parallel via `synapse get` -4. Collate paths to FastQ files in a single samplesheet - ## Pipeline output The columns in the output samplesheet can be tailored to be accepted out-of-the-box by selected nf-core pipelines (see [usage docs](https://nf-co.re/fetchngs/usage#samplesheet-format)), these currently include: diff --git a/assets/schema_input.json b/assets/schema_input.json index 13044b1b..db9ffc00 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -9,7 +9,7 @@ "properties": { "": { "type": "string", - "pattern": "^(((SR|ER|DR)[APRSX])|(SAM(N|EA|D))|(PRJ(NA|EB|DB))|(GS[EM])|(syn))(\\d+)$", + "pattern": "^(((SR|ER|DR)[APRSX])|(SAM(N|EA|D))|(PRJ(NA|EB|DB))|(GS[EM]))(\\d+)$", "errorMessage": "Please provide a valid SRA, ENA, DDBJ or GEO identifier" } } diff --git a/conf/test_synapse.config b/conf/test_synapse.config deleted file mode 100644 index 1ac1388a..00000000 --- a/conf/test_synapse.config +++ /dev/null @@ -1,25 +0,0 @@ -/* -======================================================================================== - Nextflow config file for running minimal tests -======================================================================================== - Defines input files and everything required to run a fast and simple pipeline test. - - Use as follows: - nextflow run nf-core/fetchngs -profile test_synapse, - ----------------------------------------------------------------------------------------- -*/ - -params { - config_profile_name = 'Test profile using Synapse ids' - config_profile_description = 'Minimal test dataset to check pipeline function' - - // Limit resources so that this can run on GitHub Actions - max_cpus = 2 - max_memory = '6.GB' - max_time = '6.h' - - // Input data - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/fetchngs/synapse_ids_test.csv' - input_type = 'synapse' -} diff --git a/docs/output.md b/docs/output.md index aad48fe8..5a27bfca 100644 --- a/docs/output.md +++ b/docs/output.md @@ -8,9 +8,7 @@ This document describes the output produced by the pipeline. The directories lis The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data depending on the type of ids provided: -- Download FastQ files and create samplesheet from: - 1. [SRA / ENA / DDBJ / GEO ids](#sra--ena--ddbj--geo-ids) - 2. [Synapse ids](#synapse-ids) +- Download FastQ files and create samplesheet from [SRA / ENA / DDBJ / GEO ids](#sra--ena--ddbj--geo-ids) - [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution Please see the [usage documentation](https://nf-co.re/fetchngs/usage#introduction) for a list of supported public repository identifiers and how to provide them to the pipeline. @@ -36,27 +34,6 @@ Please see the [usage documentation](https://nf-co.re/fetchngs/usage#introductio The final sample information for all identifiers is obtained from the ENA which provides direct download links for FastQ files as well as their associated md5 sums. If download links exist, the files will be downloaded in parallel by FTP. Otherwise they are downloaded using sra-tools. -### Synapse ids - -
-Output files - -- `fastq/` - - `*.fastq.gz`: Paired-end/single-end reads downloaded from Synapse. -- `fastq/md5/` - - `*.md5`: Files containing `md5` sum for FastQ files downloaded from the Synapse platform. -- `samplesheet/` - - `samplesheet.csv`: Auto-created samplesheet with collated metadata and paths to downloaded FastQ files. -- `metadata/` - - `*.metadata.txt`: Original metadata file generated using the `synapse show` command. - - `*.list.txt`: Original output of the `synapse list` command, containing the Synapse ids, file version numbers, file names, and other file-specific data for the Synapse directory ID provided. - -
- -FastQ files and corresponding sample information for `Synapse` identifiers are downloaded in parallel directly from the [Synapse](https://www.synapse.org/#) platform. A [configuration file](http://python-docs.synapse.org/build/html/Credentials.html#use-synapseconfig) containing valid login credentials is required for Synapse downloads. - -The final sample information for the FastQ files downloaded from `Synapse` is obtained from the file name itself. The file names are parsed according to the glob pattern `*{1,2}*`. This returns the sample name, presumed to be the longest possible string matching the glob pattern, with the fewest number of wildcard insertions. Further information on sample name parsing can be found in the [usage documentation](https://nf-co.re/fetchngs/usage#introduction). - ### Pipeline information
diff --git a/docs/usage.md b/docs/usage.md index 42d134f3..06ff7802 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -8,15 +8,15 @@ The pipeline has been set-up to automatically download and process the raw FastQ files from both public and private repositories. Identifiers can be provided in a file, one-per-line via the `--input` parameter. Currently, the following types of example identifiers are supported: -| `SRA` | `ENA` | `DDBJ` | `GEO` | `Synapse` | -| ------------ | ------------ | ------------ | ---------- | ----------- | -| SRR11605097 | ERR4007730 | DRR171822 | GSM4432381 | syn26240435 | -| SRX8171613 | ERX4009132 | DRX162434 | GSE147507 | | -| SRS6531847 | ERS4399630 | DRS090921 | | | -| SAMN14689442 | SAMEA6638373 | SAMD00114846 | | | -| SRP256957 | ERP120836 | DRP004793 | | | -| SRA1068758 | ERA2420837 | DRA008156 | | | -| PRJNA625551 | PRJEB37513 | PRJDB4176 | | | +| `SRA` | `ENA` | `DDBJ` | `GEO` | +| ------------ | ------------ | ------------ | ---------- | +| SRR11605097 | ERR4007730 | DRR171822 | GSM4432381 | +| SRX8171613 | ERX4009132 | DRX162434 | GSE147507 | +| SRS6531847 | ERS4399630 | DRS090921 | | +| SAMN14689442 | SAMEA6638373 | SAMD00114846 | | +| SRP256957 | ERP120836 | DRP004793 | | +| SRA1068758 | ERA2420837 | DRA008156 | | +| PRJNA625551 | PRJEB37513 | PRJDB4176 | | ### SRR / ERR / DRR ids @@ -34,25 +34,6 @@ If you have a GEO accession (found in the data availability section of published This downloads a text file called `SRR_Acc_List.txt` that can be directly provided to the pipeline once renamed with a .csv extension e.g. `--input SRR_Acc_List.csv`. -### Synapse ids - -[Synapse](https://www.synapse.org/#) is a collaborative research platform created by [Sage Bionetworks](https://sagebionetworks.org/). Its aim is to promote reproducible research and responsible data sharing throughout the biomedical community. To download data from `Synapse`, the Synapse id of the _directory_ containing all files to be downloaded should be provided. The Synapse id should be an eleven-characters beginning with `syn`. - -This Synapse id will then be resolved to the Synapse id of the corresponding FastQ files contained within the directory. The individual FastQ files are then downloaded in parellel using the `synapse get` command. All Synapse metadata, annotations and data provenance are also downloaded using the `synapse show` command, and are outputted to a separate metadata file. By default, only the md5sums, file sizes, etags, Synapse ids, file names, and file versions are shown. - -In order to download data from Synapse, an account must be created and a user configuration file provided via the parameter `--synapse_config`. For more information about Synapse configuration, please see the [Synapse client configuration](https://help.synapse.org/docs/Client-Configuration.1985446156.html) documentation. - -The final sample information for the FastQ files used for samplesheet generation is obtained from the file name itself. The file names are parsed according to the glob pattern `*{1,2}*`, which returns the sample name, presumed to be the longest possible string matching the glob pattern, with the fewest number of wildcard insertions. - -
-Supported File Names - -- Files named `SRR493366_1.fastq` and `SRR493366_2.fastq` will have a sample name of `SRR493366` -- Files named `SRR_493_367_1.fastq` and `SRR_493_367_2.fastq` will have a sample name of `SRR_493_367` -- Files named `filename12_1.fastq` and `filename12_2.fastq` will have a sample name of `filename12` - -
- ### Samplesheet format As a bonus, the columns in the auto-created samplesheet can be tailored to be accepted out-of-the-box by selected nf-core pipelines, these currently include: diff --git a/main.nf b/main.nf index d3779d16..b5b499d5 100644 --- a/main.nf +++ b/main.nf @@ -17,8 +17,7 @@ nextflow.enable.dsl = 2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -if (params.input_type == 'sra') include { SRA } from './workflows/sra' -if (params.input_type == 'synapse') include { SYNAPSE } from './workflows/synapse' +include { SRA } from './workflows/sra' // // WORKFLOW: Run main nf-core/fetchngs analysis pipeline depending on type of identifier provided @@ -33,15 +32,7 @@ workflow NFCORE_FETCHNGS { // // WORKFLOW: Download FastQ files for SRA / ENA / GEO / DDBJ ids // - if (params.input_type == 'sra') { - SRA ( ids ) - - // - // WORKFLOW: Download FastQ files for Synapse ids - // - } else if (params.input_type == 'synapse') { - SYNAPSE ( ids ) - } + SRA ( ids ) } @@ -69,7 +60,6 @@ workflow { params.monochrome_logs, params.outdir, params.input, - params.input_type, params.ena_metadata_fields ) @@ -84,7 +74,6 @@ workflow { // SUBWORKFLOW: Run completion tasks // PIPELINE_COMPLETION ( - params.input_type, params.email, params.email_on_fail, params.plaintext_email, diff --git a/modules/local/synapse_get/main.nf b/modules/local/synapse_get/main.nf deleted file mode 100644 index c8a6d7a4..00000000 --- a/modules/local/synapse_get/main.nf +++ /dev/null @@ -1,37 +0,0 @@ - -process SYNAPSE_GET { - tag "$meta.id" - label 'process_low' - label 'error_retry' - - conda "bioconda::synapseclient=2.7.1" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/synapseclient:2.7.1--pyh7cba7a3_0' : - 'biocontainers/synapseclient:2.7.1--pyh7cba7a3_0' }" - - input: - val meta - path config - - output: - tuple val(meta), path("*.fastq.gz"), emit: fastq - tuple val(meta), path("*md5") , emit: md5 - path "versions.yml" , emit: versions - - script: - def args = task.ext.args ?: '' - """ - synapse \\ - -c $config \\ - get \\ - $args \\ - $meta.id - - echo "${meta.md5} \t ${meta.name}" > ${meta.id}.md5 - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - synapse: \$(synapse --version | sed -e "s/Synapse Client //g") - END_VERSIONS - """ -} diff --git a/modules/local/synapse_get/nextflow.config b/modules/local/synapse_get/nextflow.config deleted file mode 100644 index 9c42e741..00000000 --- a/modules/local/synapse_get/nextflow.config +++ /dev/null @@ -1,16 +0,0 @@ -process { - withName: 'SYNAPSE_GET' { - publishDir = [ - [ - path: { "${params.outdir}/fastq" }, - mode: params.publish_dir_mode, - pattern: "*.fastq.gz" - ], - [ - path: { "${params.outdir}/fastq/md5" }, - mode: params.publish_dir_mode, - pattern: "*.md5" - ] - ] - } -} diff --git a/modules/local/synapse_list/main.nf b/modules/local/synapse_list/main.nf deleted file mode 100644 index 0c03f8b2..00000000 --- a/modules/local/synapse_list/main.nf +++ /dev/null @@ -1,36 +0,0 @@ - -process SYNAPSE_LIST { - tag "$id" - label 'process_low' - - conda "bioconda::synapseclient=2.7.1" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/synapseclient:2.7.1--pyh7cba7a3_0' : - 'biocontainers/synapseclient:2.7.1--pyh7cba7a3_0' }" - - input: - val id - path config - - output: - path "*.txt" , emit: txt - path "versions.yml", emit: versions - - script: - def args = task.ext.args ?: '' - def args2 = task.ext.args2 ?: '' - """ - synapse \\ - -c $config \\ - list \\ - $args \\ - $id \\ - $args2 \\ - > ${id}.list.txt - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - syanpse: \$(synapse --version | sed -e "s/Synapse Client //g") - END_VERSIONS - """ -} diff --git a/modules/local/synapse_list/nextflow.config b/modules/local/synapse_list/nextflow.config deleted file mode 100644 index 15124234..00000000 --- a/modules/local/synapse_list/nextflow.config +++ /dev/null @@ -1,10 +0,0 @@ -process { - withName: SYNAPSE_LIST { - ext.args = '--long' - publishDir = [ - path: { "${params.outdir}/metadata" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } -} diff --git a/modules/local/synapse_merge_samplesheet/main.nf b/modules/local/synapse_merge_samplesheet/main.nf deleted file mode 100644 index 4cb2abc3..00000000 --- a/modules/local/synapse_merge_samplesheet/main.nf +++ /dev/null @@ -1,28 +0,0 @@ - -process SYNAPSE_MERGE_SAMPLESHEET { - - conda "conda-forge::sed=4.7" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/ubuntu:20.04' : - 'nf-core/ubuntu:20.04' }" - - input: - path ('samplesheets/*') - - output: - path "samplesheet.csv", emit: samplesheet - path "versions.yml" , emit: versions - - script: - """ - head -n 1 `ls ./samplesheets/* | head -n 1` > samplesheet.csv - for fileid in `ls ./samplesheets/*`; do - awk 'NR>1' \$fileid >> samplesheet.csv - done - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - sed: \$(echo \$(sed --version 2>&1) | sed 's/^.*GNU sed) //; s/ .*\$//') - END_VERSIONS - """ -} diff --git a/modules/local/synapse_merge_samplesheet/nextflow.config b/modules/local/synapse_merge_samplesheet/nextflow.config deleted file mode 100644 index c94c53dd..00000000 --- a/modules/local/synapse_merge_samplesheet/nextflow.config +++ /dev/null @@ -1,9 +0,0 @@ -process { - withName: SYNAPSE_MERGE_SAMPLESHEET { - publishDir = [ - path: { "${params.outdir}/samplesheet" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } -} diff --git a/modules/local/synapse_show/main.nf b/modules/local/synapse_show/main.nf deleted file mode 100644 index e1f756a5..00000000 --- a/modules/local/synapse_show/main.nf +++ /dev/null @@ -1,36 +0,0 @@ - -process SYNAPSE_SHOW { - tag "$id" - label 'process_low' - - conda "bioconda::synapseclient=2.7.1" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/synapseclient:2.7.1--pyh7cba7a3_0' : - 'biocontainers/synapseclient:2.7.1--pyh7cba7a3_0' }" - - input: - val id - path config - - output: - path "*.txt" , emit: metadata - path "versions.yml", emit: versions - - script: - def args = task.ext.args ?: '' - def args2 = task.ext.args2 ?: '' - """ - synapse \\ - -c $config \\ - show \\ - $args \\ - $id \\ - $args2 \\ - > ${id}.metadata.txt - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - synapse: \$(synapse --version | sed -e "s/Synapse Client //g") - END_VERSIONS - """ -} diff --git a/modules/local/synapse_show/nextflow.config b/modules/local/synapse_show/nextflow.config deleted file mode 100644 index 5b9167b3..00000000 --- a/modules/local/synapse_show/nextflow.config +++ /dev/null @@ -1,9 +0,0 @@ -process { - withName: 'SYNAPSE_SHOW' { - publishDir = [ - path: { "${params.outdir}/metadata" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } -} diff --git a/modules/local/synapse_to_samplesheet/main.nf b/modules/local/synapse_to_samplesheet/main.nf deleted file mode 100644 index 393203de..00000000 --- a/modules/local/synapse_to_samplesheet/main.nf +++ /dev/null @@ -1,55 +0,0 @@ - -process SYNAPSE_TO_SAMPLESHEET { - tag "$meta.id" - - executor 'local' - memory 100.MB - - input: - tuple val(meta), path(fastq) - val pipeline - val strandedness - - output: - tuple val(meta), path("*.csv"), emit: samplesheet - - exec: - - // Remove custom keys - def meta_map = meta.clone() - meta_map.remove("id") - - def fastq_1 = "${params.outdir}/fastq/${fastq}" - def fastq_2 = '' - if (fastq instanceof List && fastq.size() == 2) { - fastq_1 = "${params.outdir}/fastq/${fastq[0]}" - fastq_2 = "${params.outdir}/fastq/${fastq[1]}" - } - - // Add relevant fields to the beginning of the map - pipeline_map = [ - sample : "${meta.id}", - fastq_1 : fastq_1, - fastq_2 : fastq_2 - ] - - // Add nf-core pipeline specific entries - if (pipeline) { - if (pipeline == 'rnaseq') { - pipeline_map << [ strandedness: strandedness ] - } else if (pipeline == 'atacseq') { - pipeline_map << [ replicate: 1 ] - } else if (pipeline == 'taxprofiler') { - pipeline_map << [ fasta: '' ] - } - } - pipeline_map << meta_map - - // Create a samplesheet - samplesheet = pipeline_map.keySet().collect{ '"' + it + '"'}.join(",") + '\n' - samplesheet += pipeline_map.values().collect{ '"' + it + '"'}.join(",") - - // Write samplesheet to file - def samplesheet_file = task.workDir.resolve("${meta.id}.samplesheet.csv") - samplesheet_file.text = samplesheet -} diff --git a/modules/local/synapse_to_samplesheet/nextflow.config b/modules/local/synapse_to_samplesheet/nextflow.config deleted file mode 100644 index 83af86b6..00000000 --- a/modules/local/synapse_to_samplesheet/nextflow.config +++ /dev/null @@ -1,8 +0,0 @@ -process { - withName: SYNAPSE_TO_SAMPLESHEET { - publishDir = [ - path: { "${params.outdir}/samplesheet" }, - enabled: false - ] - } -} diff --git a/nextflow.config b/nextflow.config index 593f9ad0..c9b67f04 100644 --- a/nextflow.config +++ b/nextflow.config @@ -11,12 +11,10 @@ params { // Input options input = null - input_type = 'sra' nf_core_pipeline = null nf_core_rnaseq_strandedness = 'auto' ena_metadata_fields = null sample_mapping_fields = 'experiment_accession,run_accession,sample_accession,experiment_alias,run_alias,sample_alias,experiment_title,sample_title,sample_description' - synapse_config = null force_ftp_download = false force_sratools_download = false skip_fastq_download = false @@ -67,11 +65,7 @@ try { } // Workflow specific configs -if (params.input_type == 'sra') { - includeConfig './workflows/sra/nextflow.config' -} else if (params.input_type == 'synapse') { - includeConfig './workflows/synapse/nextflow.config' -} +includeConfig './workflows/sra/nextflow.config' // Load nf-core/fetchngs custom profiles from different institutions. // Warning: Uncomment only if a pipeline-specific institutional config already exists on nf-core/configs! @@ -173,9 +167,8 @@ profiles { executor.cpus = 4 executor.memory = 8.GB } - test { includeConfig 'conf/test.config' } - test_synapse { includeConfig 'conf/test_synapse.config' } - test_full { includeConfig 'conf/test_full.config' } + test { includeConfig 'conf/test.config' } + test_full { includeConfig 'conf/test_full.config' } } // Set default registry for Apptainer, Docker, Podman and Singularity independent of -profile diff --git a/nextflow_schema.json b/nextflow_schema.json index bdf37cd7..77ae6673 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -22,13 +22,6 @@ "fa_icon": "fas fa-file-excel", "description": "File containing SRA/ENA/GEO/DDBJ identifiers one per line to download their associated metadata and FastQ files." }, - "input_type": { - "type": "string", - "default": "sra", - "description": "Specifies the type of identifier provided via `--input` - available options are 'sra' and 'synapse'.", - "fa_icon": "fas fa-keyboard", - "enum": ["sra", "synapse"] - }, "ena_metadata_fields": { "type": "string", "fa_icon": "fas fa-columns", @@ -90,12 +83,6 @@ "fa_icon": "fas fa-envelope", "help_text": "Set this parameter to your e-mail address to get a summary e-mail with details of the run sent to you when the workflow exits. If set in your user config file (`~/.nextflow/config`) then you don't need to specify this on the command line for every run.", "pattern": "^([a-zA-Z0-9_\\-\\.]+)@([a-zA-Z0-9_\\-\\.]+)\\.([a-zA-Z]{2,5})$" - }, - "synapse_config": { - "type": "string", - "description": "Path to Synapse configuration file", - "fa_icon": "fas fa-users-cog", - "hidden": true } } }, diff --git a/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf b/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf index 821344d0..7b46200f 100644 --- a/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf @@ -35,7 +35,6 @@ workflow PIPELINE_INITIALISATION { monochrome_logs // boolean: Do not use coloured log outputs outdir // string: The output directory where the results will be saved input // string: File containing SRA/ENA/GEO/DDBJ identifiers one per line to download their associated metadata and FastQ files - input_type // string: Specifies the type of identifier provided via `--input` - available options are 'sra' and 'synapse' ena_metadata_fields // string: Comma-separated list of ENA metadata fields to fetch before downloading data main: @@ -74,18 +73,10 @@ workflow PIPELINE_INITIALISATION { // Auto-detect input id type // ch_input = file(input) - def inferred_input_type = '' if (isSraId(ch_input)) { - inferred_input_type = 'sra' sraCheckENAMetadataFields(ena_metadata_fields) - } else if (isSynapseId(ch_input)) { - inferred_input_type = 'synapse' } else { - error('Ids provided via --input not recognised please make sure they are either SRA / ENA / GEO / DDBJ or Synapse ids!') - } - - if (input_type != inferred_input_type) { - error("Ids auto-detected as ${inferred_input_type}. Please provide '--input_type ${inferred_input_type}' as a parameter to the pipeline!") + error('Ids provided via --input not recognised please make sure they are either SRA / ENA / GEO / DDBJ ids!') } // Read in ids from --input file @@ -109,7 +100,6 @@ workflow PIPELINE_INITIALISATION { workflow PIPELINE_COMPLETION { take: - input_type // string: 'sra' or 'synapse' email // string: email address email_on_fail // string: email address sent on pipeline failure plaintext_email // boolean: Send plain-text email instead of HTML @@ -135,11 +125,7 @@ workflow PIPELINE_COMPLETION { imNotification(summary_params, hook_url) } - if (input_type == 'sra') { - sraCurateSamplesheetWarn() - } else if (input_type == 'synapse') { - synapseCurateSamplesheetWarn() - } + sraCurateSamplesheetWarn() } } @@ -175,32 +161,6 @@ def isSraId(input) { return is_sra } -// -// Check if input ids are from the Synapse platform -// -def isSynapseId(input) { - def is_synapse = false - def total_ids = 0 - def no_match_ids = [] - def pattern = /^syn\d{8}$/ - input.eachLine { line -> - total_ids += 1 - if (!(line =~ pattern)) { - no_match_ids << line - } - } - - def num_match = total_ids - no_match_ids.size() - if (num_match > 0) { - if (num_match == total_ids) { - is_synapse = true - } else { - error("Mixture of ids provided via --input: ${no_match_ids.join(', ')}\nPlease provide either SRA / ENA / GEO / DDBJ or Synapse ids!") - } - } - return is_synapse -} - // // Check and validate parameters // @@ -226,89 +186,3 @@ def sraCurateSamplesheetWarn() { " running nf-core/other pipelines.\n" + "===================================================================================" } - -// -// Convert metadata obtained from the 'synapse show' command to a Groovy map -// -def synapseShowToMap(synapse_file) { - def meta = [:] - def category = '' - synapse_file.eachLine { line -> - def entries = [null, null] - if (!line.startsWith(' ') && !line.trim().isEmpty()) { - category = line.tokenize(':')[0] - } else { - entries = line.trim().tokenize('=') - } - meta["${category}|${entries[0]}"] = entries[1] - } - meta.id = meta['properties|id'] - meta.name = meta['properties|name'] - meta.md5 = meta['File|md5'] - return meta.findAll{ it.value != null } -} - -// -// Print a warning after pipeline has completed -// -def synapseCurateSamplesheetWarn() { - log.warn "=============================================================================\n" + - " Please double-check the samplesheet that has been auto-created by the pipeline.\n\n" + - " Where applicable, default values will be used for sample-specific metadata\n" + - " such as strandedness, controls etc as this information is not provided\n" + - " in a standardised manner when uploading data to Synapse.\n" + - "===================================================================================" -} - -// -// Obtain Sample ID from File Name -// -def synapseSampleNameFromFastQ(input_file, pattern) { - - def sampleids = "" - - def filePattern = pattern.toString() - int p = filePattern.lastIndexOf('/') - if( p != -1 ) - filePattern = filePattern.substring(p+1) - - input_file.each { - String fileName = input_file.getFileName().toString() - - String indexOfWildcards = filePattern.findIndexOf { it=='*' || it=='?' } - String indexOfBrackets = filePattern.findIndexOf { it=='{' || it=='[' } - if( indexOfWildcards==-1 && indexOfBrackets==-1 ) { - if( fileName == filePattern ) - return actual.getSimpleName() - throw new IllegalArgumentException("Not a valid file pair globbing pattern: pattern=$filePattern file=$fileName") - } - - int groupCount = 0 - for( int i=0; i WorkflowMain.synapseShowToMap(it) } - .set { ch_samples_meta } - - // - // MODULE: Download FastQs by synapse id - // - SYNAPSE_GET ( - ch_samples_meta, - ch_synapse_config - ) - ch_versions = ch_versions.mix(SYNAPSE_GET.out.versions.first()) - - // Combine channels for PE/SE FastQs: [ [ id:SRR6357070, synapse_ids:syn26240474;syn26240477 ], [ fastq_1, fastq_2 ] ] - SYNAPSE_GET - .out - .fastq - .map { meta, fastq -> [ WorkflowMain.synapseSampleNameFromFastQ( fastq , "*{1,2}*"), fastq ] } - .groupTuple(sort: { it -> it.baseName }) - .set { ch_fastq } - - SYNAPSE_GET - .out - .fastq - .map { meta, fastq -> [ WorkflowMain.synapseSampleNameFromFastQ( fastq , "*{1,2}*"), meta.id ] } - .groupTuple() - .join(ch_fastq) - .map { id, synids, fastq -> - def meta = [ id:id, synapse_ids:synids.join(';') ] - [ meta, fastq ] - } - .set { ch_fastq } - - // - // MODULE: Create samplesheet per sample - // - SYNAPSE_TO_SAMPLESHEET ( - ch_fastq, - params.nf_core_pipeline ?: '', - params.nf_core_rnaseq_strandedness ?: 'auto' - ) - - // - // MODULE: Merge samplesheets - // - SYNAPSE_MERGE_SAMPLESHEET ( - SYNAPSE_TO_SAMPLESHEET.out.samplesheet.collect{ it[1] } - ) - ch_versions = ch_versions.mix(SYNAPSE_MERGE_SAMPLESHEET.out.versions) - - // - // Collate and save software versions - // - softwareVersionsToYAML(ch_versions) - .collectFile(storeDir: "${params.outdir}/pipeline_info", name: 'nf_core_fetchngs_software_mqc_versions.yml', sort: true, newLine: true) - - emit: - fastq = ch_fastq - samplesheet = SYNAPSE_MERGE_SAMPLESHEET.out.samplesheet - versions = ch_versions.unique() -} - -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - THE END -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ diff --git a/workflows/synapse/nextflow.config b/workflows/synapse/nextflow.config deleted file mode 100644 index ad9c69ed..00000000 --- a/workflows/synapse/nextflow.config +++ /dev/null @@ -1,5 +0,0 @@ -includeConfig "../../modules/local/synapse_get/nextflow.config" -includeConfig "../../modules/local/synapse_to_samplesheet/nextflow.config" -includeConfig "../../modules/local/synapse_list/nextflow.config" -includeConfig "../../modules/local/synapse_merge_samplesheet/nextflow.config" -includeConfig "../../modules/local/synapse_show/nextflow.config" From cd4b6bf98336db21c84c52cb1303a0da5405a5f6 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 1 Feb 2024 10:45:33 +0000 Subject: [PATCH 748/852] Update CHANGELOG --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b0061622..b54f463c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - The Aspera CLI was recently added to [Bioconda](https://anaconda.org/bioconda/aspera-cli) and we have added it as another way of downloading FastQ files on top of the existing FTP and sra-tools support. In our limited benchmarks on all public Clouds we found ~50% speed-up in download times compared to FTP! We are not aware of any obvious downsides and have made this the default download method in the pipeline. You can however, revert to using FTP and sra-tools using the `--force_ftp_download` and `--force_sratools_download` parameters, respectively. We would love to have your feedback! - Support for Synapse ids has been dropped in this release. We haven't had any feedback from users whether it is being used or not. Users can run earlier versions of the pipeline if required. +- We have significantly refactored and standardised the way we are using nf-test within this pipeline. This pipeline is now the current, best-practice implementation for nf-test usage on nf-core. We required a number of features to be added to nf-test and a huge shoutout to [Lukas Forer](https://github.com/lukfor) for entertaining our requests and implementing them within upstream :heart:! ### Credits @@ -17,6 +18,7 @@ Special thanks to the following for their contributions to the release: - [Adam Talbot](https://github.com/adamrtalbot) - [Alexandru Mizeranschi](https://github.com/nicolae06) - [Alexander Blaessle](https://github.com/alexblaessle) +- [Lukas Forer](https://github.com/lukfor) - [Maxime Garcia](https://github.com/maxulysse) - [Sebastian Uhrig](https://github.com/suhrig) From 76b5fd9ebb0473b9da93bf54d59212504bfd7441 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 1 Feb 2024 10:47:23 +0000 Subject: [PATCH 749/852] Bump pipeline version to 1.12.0 --- CHANGELOG.md | 2 +- nextflow.config | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b54f463c..3807610a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unpublished Version / DEV] +## [[1.12.0](https://github.com/nf-core/fetchngs/releases/tag/1.12.0)] - 2024-02-02 ### :warning: Major enhancements diff --git a/nextflow.config b/nextflow.config index c9b67f04..fad805bf 100644 --- a/nextflow.config +++ b/nextflow.config @@ -226,7 +226,7 @@ manifest { description = """Pipeline to fetch metadata and raw FastQ files from public databases""" mainScript = 'main.nf' nextflowVersion = '!>=23.04.0' - version = '1.12.0dev' + version = '1.12.0' doi = 'https://doi.org/10.5281/zenodo.5070524' } From 3e825cca662854cde363876444a2d404f8bd43c9 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 1 Feb 2024 11:15:48 +0000 Subject: [PATCH 750/852] Update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3807610a..750abeff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,6 +41,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements - [PR #261](https://github.com/nf-core/fetchngs/pull/261) - Revert sratools fasterqdump version ([#221](https://github.com/nf-core/fetchngs/issues/221)) - [PR #262](https://github.com/nf-core/fetchngs/pull/262) - Use nf-test version v0.8.4 and remove implicit tags - [PR #263](https://github.com/nf-core/fetchngs/pull/263) - Refine tags used for workflows +- [PR #264](https://github.com/nf-core/fetchngs/pull/264) - Remove synapse workflow from pipeline ### Software dependencies From 80a898389d1fe3f83d2335817fb43aefd1f018cf Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Thu, 1 Feb 2024 17:41:42 +0000 Subject: [PATCH 751/852] Use +profile in CI to add test to docker/conda/singularity profile Changes: - Uses "+" syntax from nf-test to add a the test profile to pre-existing profile - No other changes yet, keeping the PR small - We can replace parts of the test config after this is implemented --- .github/workflows/ci.yml | 2 +- CHANGELOG.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1395c844..2d4387a8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -148,7 +148,7 @@ jobs: - name: Run nf-test run: | - nf-test test --verbose --tag ${{ matrix.tags }} --profile "${{ matrix.profile }}" --junitxml=test.xml --tap=test.tap + nf-test test --verbose --tag ${{ matrix.tags }} --profile "+${{ matrix.profile }}" --junitxml=test.xml --tap=test.tap - uses: pcolby/tap-summary@v1 with: diff --git a/CHANGELOG.md b/CHANGELOG.md index 750abeff..ff44ad66 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,6 +42,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements - [PR #262](https://github.com/nf-core/fetchngs/pull/262) - Use nf-test version v0.8.4 and remove implicit tags - [PR #263](https://github.com/nf-core/fetchngs/pull/263) - Refine tags used for workflows - [PR #264](https://github.com/nf-core/fetchngs/pull/264) - Remove synapse workflow from pipeline +- [PR #265](https://github.com/nf-core/fetchngs/pull/265) - Use "+" syntax for profiles to accumulate profiles in nf-test ### Software dependencies From 6ae6f14045de0dc3d21c7696e13806809fcbb7c2 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Thu, 1 Feb 2024 18:11:35 +0000 Subject: [PATCH 752/852] Make gitignore match template --- .gitignore | 14 +++++++------- .nf-core.yml | 2 +- CHANGELOG.md | 1 + 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index ef809d7c..3e70ad89 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,12 @@ -*.pyc -.DS_Store .nextflow* -.nf-test.log +work/ data/ +results/ +.DS_Store +testing/ +testing* +*.pyc +.nf-test.log nf-test .nf-test* -results/ test.xml -testing* -testing/ -work/ diff --git a/.nf-core.yml b/.nf-core.yml index 707d5cd8..705cd855 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -7,5 +7,5 @@ lint: - lib/Utils.groovy - lib/WorkflowMain.groovy files_unchanged: - - .gitignore + - '.gitignore' - assets/sendmail_template.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index 750abeff..093039f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,6 +42,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements - [PR #262](https://github.com/nf-core/fetchngs/pull/262) - Use nf-test version v0.8.4 and remove implicit tags - [PR #263](https://github.com/nf-core/fetchngs/pull/263) - Refine tags used for workflows - [PR #264](https://github.com/nf-core/fetchngs/pull/264) - Remove synapse workflow from pipeline +- [PR #266](https://github.com/nf-core/fetchngs/pull/266) - Make .gitignore match template ### Software dependencies From cf07cad9a335092e3e63800a50f63eae3f4630cd Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Thu, 1 Feb 2024 18:13:25 +0000 Subject: [PATCH 753/852] revert .nf-core.yml --- .nf-core.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.nf-core.yml b/.nf-core.yml index 705cd855..707d5cd8 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -7,5 +7,5 @@ lint: - lib/Utils.groovy - lib/WorkflowMain.groovy files_unchanged: - - '.gitignore' + - .gitignore - assets/sendmail_template.txt From 93e997a76a18a402a1470f2867528650ffd36e83 Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Fri, 2 Feb 2024 11:22:01 +0100 Subject: [PATCH 754/852] Update README.md restore badges --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f652bd66..9419fa1a 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ nf-core/fetchngs + [![GitHub Actions CI Status](https://github.com/nf-core/fetchngs/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/fetchngs/actions?query=workflow%3A%22nf-core+CI%22) [![GitHub Actions Linting Status](https://github.com/nf-core/fetchngs/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/fetchngs/actions?query=workflow%3A%22nf-core+linting%22) [![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/fetchngs/results) From b35e947990b59f400c1140620456a1f513c402ba Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Fri, 2 Feb 2024 11:13:19 +0000 Subject: [PATCH 755/852] Add Mermaid diagram --- CHANGELOG.md | 1 + README.md | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f2d0620..495ab427 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,6 +44,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements - [PR #264](https://github.com/nf-core/fetchngs/pull/264) - Remove synapse workflow from pipeline - [PR #265](https://github.com/nf-core/fetchngs/pull/265) - Use "+" syntax for profiles to accumulate profiles in nf-test - [PR #266](https://github.com/nf-core/fetchngs/pull/266) - Make .gitignore match template +- [PR #267](https://github.com/nf-core/fetchngs/pull/267) - Add mermaid diagram ### Software dependencies diff --git a/README.md b/README.md index 9419fa1a..b35e583e 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,36 @@ **nf-core/fetchngs** is a bioinformatics pipeline to fetch metadata and raw FastQ files from both public and private databases. At present, the pipeline supports SRA / ENA / DDBJ / GEO / Synapse ids (see [usage docs](https://nf-co.re/fetchngs/usage#introduction)). +```mermaid +flowchart LR + IDS("`Input + File`") --> SRA & GEO & ENA & DDBJ + subgraph SG_DBIDS[Database IDs] + SRA("SRA") + GEO("GEO") + ENA("ENA") + DDBJ("DDBJ") + end + subgraph SG_METADATA[Download Metadata] + SRA & GEO & ENA & DDBJ --> META("`Get + Metadata`") + META --> LINKS("`Get + Download + Links`") + end + subgraph SG_FETCH_FASTQ[Download FastQ] + LINKS --> |default| ASPERA("Aspera") + LINKS --> |--force_ftp_download| FTP("FTP") + LINKS --> |--force_sra_tools_download| SRATOOLS("sra-tools") + end + subgraph SG_FASTQ[Pipeline Outputs] + ASPERA & FTP & SRATOOLS --> FASTQ("FastQ") + FASTQ --> SAMPLESHEET("Samplesheet") + end + LINKS --> |--skip_fastq_download| SAMPLESHEET + +``` + ## Usage > [!NOTE] From e5daf3af2c62bfd45be8df2282b4baf3d3301a0f Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Fri, 2 Feb 2024 11:14:33 +0000 Subject: [PATCH 756/852] Correct CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 495ab427..35c7a01d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,7 +44,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements - [PR #264](https://github.com/nf-core/fetchngs/pull/264) - Remove synapse workflow from pipeline - [PR #265](https://github.com/nf-core/fetchngs/pull/265) - Use "+" syntax for profiles to accumulate profiles in nf-test - [PR #266](https://github.com/nf-core/fetchngs/pull/266) - Make .gitignore match template -- [PR #267](https://github.com/nf-core/fetchngs/pull/267) - Add mermaid diagram +- [PR #268](https://github.com/nf-core/fetchngs/pull/268) - Add mermaid diagram ### Software dependencies From fb324b84851de952c65111a5e4ceb83dbc39f793 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Fri, 2 Feb 2024 11:15:42 +0000 Subject: [PATCH 757/852] Change theme to Forest --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index b35e583e..90a147ac 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,7 @@ **nf-core/fetchngs** is a bioinformatics pipeline to fetch metadata and raw FastQ files from both public and private databases. At present, the pipeline supports SRA / ENA / DDBJ / GEO / Synapse ids (see [usage docs](https://nf-co.re/fetchngs/usage#introduction)). ```mermaid +%%{init: {'theme': 'forest' } }%% flowchart LR IDS("`Input File`") --> SRA & GEO & ENA & DDBJ From bece63439b7e290a6dac3c50fb07440e599aceec Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Fri, 2 Feb 2024 11:19:23 +0000 Subject: [PATCH 758/852] Trying some themes --- README.md | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 90a147ac..523c9c01 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,20 @@ **nf-core/fetchngs** is a bioinformatics pipeline to fetch metadata and raw FastQ files from both public and private databases. At present, the pipeline supports SRA / ENA / DDBJ / GEO / Synapse ids (see [usage docs](https://nf-co.re/fetchngs/usage#introduction)). ```mermaid -%%{init: {'theme': 'forest' } }%% +%%{ + init: { + "theme": "forest", + "fontFamily": "monospace", + "logLevel": "info", + "flowchart": { + "htmlLabels": true, + "curve": "linear" + }, + "sequence": { + "mirrorActors": true + } + } +}%% flowchart LR IDS("`Input File`") --> SRA & GEO & ENA & DDBJ @@ -42,7 +55,7 @@ flowchart LR Links`") end subgraph SG_FETCH_FASTQ[Download FastQ] - LINKS --> |default| ASPERA("Aspera") + LINKS --> |"(default)"| ASPERA("Aspera") LINKS --> |--force_ftp_download| FTP("FTP") LINKS --> |--force_sra_tools_download| SRATOOLS("sra-tools") end From 26ba7580deb1837b2bd4d2d26c8da4e6070b6e83 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Fri, 2 Feb 2024 11:21:20 +0000 Subject: [PATCH 759/852] Remove backticks| --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 523c9c01..c7e9d5a0 100644 --- a/README.md +++ b/README.md @@ -39,8 +39,8 @@ } }%% flowchart LR - IDS("`Input - File`") --> SRA & GEO & ENA & DDBJ + IDS("Input + File") --> SRA & GEO & ENA & DDBJ subgraph SG_DBIDS[Database IDs] SRA("SRA") GEO("GEO") @@ -48,11 +48,11 @@ flowchart LR DDBJ("DDBJ") end subgraph SG_METADATA[Download Metadata] - SRA & GEO & ENA & DDBJ --> META("`Get - Metadata`") - META --> LINKS("`Get + SRA & GEO & ENA & DDBJ --> META("Get + Metadata") + META --> LINKS("Get Download - Links`") + Links") end subgraph SG_FETCH_FASTQ[Download FastQ] LINKS --> |"(default)"| ASPERA("Aspera") From 7b69bce638030188e06d62f8b1c6085285e4c552 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Fri, 2 Feb 2024 11:22:02 +0000 Subject: [PATCH 760/852] Remove some theme stuff --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index c7e9d5a0..188fc3f4 100644 --- a/README.md +++ b/README.md @@ -27,11 +27,9 @@ %%{ init: { "theme": "forest", - "fontFamily": "monospace", "logLevel": "info", "flowchart": { "htmlLabels": true, - "curve": "linear" }, "sequence": { "mirrorActors": true From 0e18e7ee20910dd4fed20c6f01a2ebb7362fe77b Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Fri, 2 Feb 2024 11:26:01 +0000 Subject: [PATCH 761/852] pulling more stuff out of the mermaid --- README.md | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/README.md b/README.md index 188fc3f4..847fe3ee 100644 --- a/README.md +++ b/README.md @@ -27,13 +27,7 @@ %%{ init: { "theme": "forest", - "logLevel": "info", - "flowchart": { - "htmlLabels": true, - }, - "sequence": { - "mirrorActors": true - } + "logLevel": "info" } }%% flowchart LR From f94c742c6395bf0041c2f16430d74d0c530407a4 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Fri, 2 Feb 2024 11:38:59 +0000 Subject: [PATCH 762/852] Approximate nf-core theme (attempt 1) --- README.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 847fe3ee..095f8e45 100644 --- a/README.md +++ b/README.md @@ -26,8 +26,14 @@ ```mermaid %%{ init: { - "theme": "forest", - "logLevel": "info" + 'theme': 'base', + 'themeVariables': { + 'fontFamily': "maven pro bold", + 'primaryColor': '#24B064', + 'primaryTextColor': '#fff', + 'secondaryColor': '#006100', + 'tertiaryColor': '#fff' + } } }%% flowchart LR From ddf7e3c8da8155e0d370212ad9ea29cca533316e Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Fri, 2 Feb 2024 12:13:51 +0000 Subject: [PATCH 763/852] Style updates to Mermaid --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 095f8e45..23fbd2a0 100644 --- a/README.md +++ b/README.md @@ -28,10 +28,13 @@ init: { 'theme': 'base', 'themeVariables': { - 'fontFamily': "maven pro bold", + 'fontFamily': "maven", 'primaryColor': '#24B064', 'primaryTextColor': '#fff', - 'secondaryColor': '#006100', + 'secondaryTextColor': '#000000', + 'secondaryColor': '#BCDDB6', + 'edgeLabelBackground': '#C8C8C8', + 'noteTextColor': '#050505', 'tertiaryColor': '#fff' } } From 64a40cf54b39455322d6a0a0728c7cb9c9eef49a Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Fri, 2 Feb 2024 16:01:42 +0000 Subject: [PATCH 764/852] Remove theme stuff because it doesn't work on Github Dark mode --- README.md | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/README.md b/README.md index 23fbd2a0..8b6d253b 100644 --- a/README.md +++ b/README.md @@ -24,21 +24,6 @@ **nf-core/fetchngs** is a bioinformatics pipeline to fetch metadata and raw FastQ files from both public and private databases. At present, the pipeline supports SRA / ENA / DDBJ / GEO / Synapse ids (see [usage docs](https://nf-co.re/fetchngs/usage#introduction)). ```mermaid -%%{ - init: { - 'theme': 'base', - 'themeVariables': { - 'fontFamily': "maven", - 'primaryColor': '#24B064', - 'primaryTextColor': '#fff', - 'secondaryTextColor': '#000000', - 'secondaryColor': '#BCDDB6', - 'edgeLabelBackground': '#C8C8C8', - 'noteTextColor': '#050505', - 'tertiaryColor': '#fff' - } - } -}%% flowchart LR IDS("Input File") --> SRA & GEO & ENA & DDBJ From 342a331c5b09b4250831ec4d9ff60460457f5794 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Mon, 12 Feb 2024 17:41:20 +0000 Subject: [PATCH 765/852] Parse nf-test file directly for finding target objects Add new method for detecting file changes by parsing nf-test files directly using python Can stand in until nf-test list has new features --- .github/python/find_changed_files.py | 140 +++++++++++++++++++++++++++ .github/workflows/ci.yml | 40 +++++--- 2 files changed, 165 insertions(+), 15 deletions(-) create mode 100644 .github/python/find_changed_files.py diff --git a/.github/python/find_changed_files.py b/.github/python/find_changed_files.py new file mode 100644 index 00000000..91241c0d --- /dev/null +++ b/.github/python/find_changed_files.py @@ -0,0 +1,140 @@ +#!/usr/bin/env python + +## This script is used to generate scan *.nf.test files for function/process/workflow name and return as a JSON list +# It is functionally similar to nf-test list but fills a gap until feature https://github.com/askimed/nf-test/issues/196 is added + +import argparse +import json +import logging +import re +import yaml + +from pathlib import Path + + +def parse_args() -> argparse.Namespace: + """ + Parse command line arguments and return an ArgumentParser object. + + Returns: + argparse.ArgumentParser: The ArgumentParser object with the parsed arguments. + """ + parser = argparse.ArgumentParser( + description="Scan *.nf.test files for function/process/workflow name and return as a JSON list" + ) + parser.add_argument( + "paths", nargs="*", default=["."], help="List of directories or files to scan" + ) + parser.add_argument( + "-l", + "--log-level", + choices=["DEBUG", "INFO", "WARNING", "ERROR"], + default="INFO", + help="Logging level", + ) + parser.add_argument( + "-t", + "--types", + nargs="+", + choices=["function", "process", "workflow", "pipeline"], + default=["function", "process", "workflow", "pipeline"], + help="Types of tests to include.", + ) + return parser.parse_args() + + +def find_files(paths: list[str]) -> list[Path]: + """ + Find all files matching pattern *.nf.test recursively from a list of paths. + + Args: + paths (list): List of directories or files to scan. + + Returns: + list: List of files matching the pattern *.nf.test. + """ + return [test_file for path in paths for test_file in Path(path).rglob("*.nf.test")] + + +def process_files(files: list[Path]) -> list[str]: + """ + Process the files and return lines that begin with 'workflow', 'process', or 'function' and have a single string afterwards. + + Args: + files (list): List of files to process. + + Returns: + list: List of lines that match the criteria. + """ + result = [] + for file in files: + with open(file, "r") as f: + lines = f.readlines() + for line in lines: + line = line.strip() + if line.startswith(("workflow", "process", "function")): + words = line.split() + if len(words) == 2 and re.match(r'^".*"$', words[1]): + result.append(line) + return result + + +def generate( + lines: list[str], types: list[str] = ["function", "process", "workflow", "pipeline"] +) -> dict[str, list[str]]: + """ + Generate a dictionary of function, process, workflow, and pipeline lists from the lines. + + Args: + lines (list): List of lines to process. + types (list): List of types to include. + + Returns: + dict: Dictionary with function, process, workflow, and pipeline lists. + """ + result: dict[str, list[str]] = { + "function": [], + "process": [], + "workflow": [], + "pipeline": [], + } + for line in lines: + words = line.split() + if len(words) == 2: + keyword = words[0] + name = words[1].strip("'\"") # Strip both single and double quotes + if keyword in types: + result[keyword].append(name) + return result + + +def read_yaml_file(file_path: str) -> dict: + """ + Read a YAML file and return its contents as a dictionary. + + Args: + file_path (str): The path to the YAML file. + + Returns: + dict: The contents of the YAML file as a dictionary. + """ + with open(file_path, "r") as f: + data = yaml.safe_load(f) + return data + + +if __name__ == "__main__": + + # Utility stuff + args = parse_args() + logging.basicConfig(level=args.log_level) + + files = find_files(args.paths) + lines = process_files(files) + result = generate(lines, args.types) + + # Flatten dict to list of results + # Mmm ugly. Yet glorious. + result_flat = list(set().union(*result.values())) + # Print to stdout + print(json.dumps(result_flat)) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2d4387a8..241a4bf3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -30,23 +30,33 @@ jobs: changes: ${{ steps.changed_files.outputs.any_modified }} tags: ${{ steps.list.outputs.tags }} steps: - - name: Install Nextflow - uses: nf-core/setup-nextflow@v1 - - - name: Cache nf-test installation - id: cache-software - uses: actions/cache@v3 + - uses: actions/setup-python@v4 with: - path: | - /usr/local/bin/nf-test - /home/runner/.nf-test/nf-test.jar - key: ${{ runner.os }}-${{ env.NFT_VER }}-nftest + python-version: "3.11" + architecture: "x64" - - name: Install nf-test - if: steps.cache-software.outputs.cache-hit != 'true' + - name: Install pdiff to see diff between nf-test snapshots run: | - wget -qO- https://code.askimed.com/install/nf-test | bash - sudo mv nf-test /usr/local/bin/ + python -m pip install --upgrade pip + pip install pdiff + + # - name: Install Nextflow + # uses: nf-core/setup-nextflow@v1 + + # - name: Cache nf-test installation + # id: cache-software + # uses: actions/cache@v3 + # with: + # path: | + # /usr/local/bin/nf-test + # /home/runner/.nf-test/nf-test.jar + # key: ${{ runner.os }}-${{ env.NFT_VER }}-nftest + + # - name: Install nf-test + # if: steps.cache-software.outputs.cache-hit != 'true' + # run: | + # wget -qO- https://code.askimed.com/install/nf-test | bash + # sudo mv nf-test /usr/local/bin/ - uses: actions/checkout@v3 with: @@ -91,7 +101,7 @@ jobs: - name: nf-test list tags id: list if: ${{ steps.changed_files.outputs.any_modified }} - run: echo tags=$(nf-test list --silent --tags --format json ${{ steps.changed_files.outputs.all_changed_files }} ${{ steps.changed_files.outputs.changed_keys }}) >> $GITHUB_OUTPUT + run: echo tags=$(python .github/python/find_changed_files.py ${{ steps.changed_files.outputs.all_changed_files }} ${{ steps.changed_files.outputs.changed_keys }}) >> $GITHUB_OUTPUT - name: debug2 run: | From 4eee0e39ff080c0df18d6f132b6e37ff3294b6f0 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Mon, 12 Feb 2024 18:18:49 +0000 Subject: [PATCH 766/852] remove pyyaml --- .github/python/find_changed_files.py | 16 ---------------- .github/workflows/ci.yml | 5 ----- 2 files changed, 21 deletions(-) diff --git a/.github/python/find_changed_files.py b/.github/python/find_changed_files.py index 91241c0d..39e04676 100644 --- a/.github/python/find_changed_files.py +++ b/.github/python/find_changed_files.py @@ -7,7 +7,6 @@ import json import logging import re -import yaml from pathlib import Path @@ -108,21 +107,6 @@ def generate( return result -def read_yaml_file(file_path: str) -> dict: - """ - Read a YAML file and return its contents as a dictionary. - - Args: - file_path (str): The path to the YAML file. - - Returns: - dict: The contents of the YAML file as a dictionary. - """ - with open(file_path, "r") as f: - data = yaml.safe_load(f) - return data - - if __name__ == "__main__": # Utility stuff diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 241a4bf3..6f64125e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -35,11 +35,6 @@ jobs: python-version: "3.11" architecture: "x64" - - name: Install pdiff to see diff between nf-test snapshots - run: | - python -m pip install --upgrade pip - pip install pdiff - # - name: Install Nextflow # uses: nf-core/setup-nextflow@v1 From ae50c4b242511333318c4d9a7e985efa21e6a589 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Tue, 13 Feb 2024 11:03:27 +0000 Subject: [PATCH 767/852] Update to improve filtering of output Changes: - find_changed_files.py now supports filtering to only process, workflow or function - still struggling for Pipeline tag support --- .github/python/find_changed_files.py | 38 +++++++++++++++------------- .github/workflows/ci.yml | 18 ------------- 2 files changed, 21 insertions(+), 35 deletions(-) diff --git a/.github/python/find_changed_files.py b/.github/python/find_changed_files.py index 39e04676..485b61c7 100644 --- a/.github/python/find_changed_files.py +++ b/.github/python/find_changed_files.py @@ -8,6 +8,7 @@ import logging import re +from itertools import chain from pathlib import Path @@ -22,7 +23,11 @@ def parse_args() -> argparse.Namespace: description="Scan *.nf.test files for function/process/workflow name and return as a JSON list" ) parser.add_argument( - "paths", nargs="*", default=["."], help="List of directories or files to scan" + "-p", + "--paths", + nargs="+", + default=["."], + help="List of directories or files to scan", ) parser.add_argument( "-l", @@ -35,8 +40,8 @@ def parse_args() -> argparse.Namespace: "-t", "--types", nargs="+", - choices=["function", "process", "workflow", "pipeline"], - default=["function", "process", "workflow", "pipeline"], + choices=["function", "process", "workflow"], + default=["function", "process", "workflow"], help="Types of tests to include.", ) return parser.parse_args() @@ -79,24 +84,19 @@ def process_files(files: list[Path]) -> list[str]: def generate( - lines: list[str], types: list[str] = ["function", "process", "workflow", "pipeline"] + lines: list[str], types: list[str] = ["function", "process", "workflow"] ) -> dict[str, list[str]]: """ - Generate a dictionary of function, process, workflow, and pipeline lists from the lines. + Generate a dictionary of function, process and workflow lists from the lines. Args: lines (list): List of lines to process. types (list): List of types to include. Returns: - dict: Dictionary with function, process, workflow, and pipeline lists. + dict: Dictionary with function, process and workflow lists. """ - result: dict[str, list[str]] = { - "function": [], - "process": [], - "workflow": [], - "pipeline": [], - } + result: dict[str, list[str]] = {"function": [], "process": [], "workflow": []} for line in lines: words = line.split() if len(words) == 2: @@ -113,12 +113,16 @@ def generate( args = parse_args() logging.basicConfig(level=args.log_level) + # Parse nf-test files for targets of tests files = find_files(args.paths) lines = process_files(files) - result = generate(lines, args.types) + result = generate(lines) + + # Get only relevant results (specified by -t) + # Unique using a set + target_results = list( + {item for sublist in map(result.get, args.types) for item in sublist} + ) - # Flatten dict to list of results - # Mmm ugly. Yet glorious. - result_flat = list(set().union(*result.values())) # Print to stdout - print(json.dumps(result_flat)) + print(json.dumps(target_results)) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6f64125e..314e8868 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -35,24 +35,6 @@ jobs: python-version: "3.11" architecture: "x64" - # - name: Install Nextflow - # uses: nf-core/setup-nextflow@v1 - - # - name: Cache nf-test installation - # id: cache-software - # uses: actions/cache@v3 - # with: - # path: | - # /usr/local/bin/nf-test - # /home/runner/.nf-test/nf-test.jar - # key: ${{ runner.os }}-${{ env.NFT_VER }}-nftest - - # - name: Install nf-test - # if: steps.cache-software.outputs.cache-hit != 'true' - # run: | - # wget -qO- https://code.askimed.com/install/nf-test | bash - # sudo mv nf-test /usr/local/bin/ - - uses: actions/checkout@v3 with: fetch-depth: 0 From a33d3698b535ba45c85ca75404f5346d4156ddf8 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Tue, 13 Feb 2024 11:25:27 +0000 Subject: [PATCH 768/852] find_changed_files handles PIPELINE tags --- .github/python/find_changed_files.py | 34 ++++++++++++++++++++++++---- .github/workflows/ci.yml | 6 ++++- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/.github/python/find_changed_files.py b/.github/python/find_changed_files.py index 485b61c7..6dc73449 100644 --- a/.github/python/find_changed_files.py +++ b/.github/python/find_changed_files.py @@ -40,8 +40,8 @@ def parse_args() -> argparse.Namespace: "-t", "--types", nargs="+", - choices=["function", "process", "workflow"], - default=["function", "process", "workflow"], + choices=["function", "process", "workflow", "pipeline"], + default=["function", "process", "workflow", "pipeline"], help="Types of tests to include.", ) return parser.parse_args() @@ -57,7 +57,18 @@ def find_files(paths: list[str]) -> list[Path]: Returns: list: List of files matching the pattern *.nf.test. """ - return [test_file for path in paths for test_file in Path(path).rglob("*.nf.test")] + # this is a bit clunky + result = [] + for path in paths: + path_obj = Path(path) + # If Path is the exact nf-test file add to list: + if path_obj.match("*.nf.test"): + result.append(path_obj) + # Else recursively search for nf-test files: + else: + for file in path_obj.rglob("*.nf.test"): + result.append(file) + return result def process_files(files: list[Path]) -> list[str]: @@ -73,6 +84,7 @@ def process_files(files: list[Path]) -> list[str]: result = [] for file in files: with open(file, "r") as f: + is_pipeline_test = True lines = f.readlines() for line in lines: line = line.strip() @@ -80,11 +92,18 @@ def process_files(files: list[Path]) -> list[str]: words = line.split() if len(words) == 2 and re.match(r'^".*"$', words[1]): result.append(line) + is_pipeline_test = False + + # If no results included workflow, process or function + # Add a dummy result to fill the 'pipeline' category + if is_pipeline_test: + result.append("pipeline 'PIPELINE'") + return result def generate( - lines: list[str], types: list[str] = ["function", "process", "workflow"] + lines: list[str], types: list[str] = ["function", "process", "workflow", "pipeline"] ) -> dict[str, list[str]]: """ Generate a dictionary of function, process and workflow lists from the lines. @@ -96,7 +115,12 @@ def generate( Returns: dict: Dictionary with function, process and workflow lists. """ - result: dict[str, list[str]] = {"function": [], "process": [], "workflow": []} + result: dict[str, list[str]] = { + "function": [], + "process": [], + "workflow": [], + "pipeline": [], + } for line in lines: words = line.split() if len(words) == 2: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 314e8868..d2ddf312 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -78,7 +78,11 @@ jobs: - name: nf-test list tags id: list if: ${{ steps.changed_files.outputs.any_modified }} - run: echo tags=$(python .github/python/find_changed_files.py ${{ steps.changed_files.outputs.all_changed_files }} ${{ steps.changed_files.outputs.changed_keys }}) >> $GITHUB_OUTPUT + run: echo tags=$(python \ + .github/python/find_changed_files.py \ + -t pipeline workflow process \ + -p ${{ steps.changed_files.outputs.all_changed_files }} ${{ steps.changed_files.outputs.changed_keys }} \ + ) >> $GITHUB_OUTPUT - name: debug2 run: | From e4db6185c866a305eb93b1b924bebcd80a7fc78a Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Tue, 13 Feb 2024 11:27:58 +0000 Subject: [PATCH 769/852] Tidy GHA command using line wrappings --- .github/workflows/ci.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d2ddf312..1ec7c811 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -78,10 +78,11 @@ jobs: - name: nf-test list tags id: list if: ${{ steps.changed_files.outputs.any_modified }} - run: echo tags=$(python \ - .github/python/find_changed_files.py \ - -t pipeline workflow process \ - -p ${{ steps.changed_files.outputs.all_changed_files }} ${{ steps.changed_files.outputs.changed_keys }} \ + run: > + echo tags=$(python + .github/python/find_changed_files.py + -t pipeline workflow process + -p ${{ steps.changed_files.outputs.all_changed_files }} ${{ steps.changed_files.outputs.changed_keys }} ) >> $GITHUB_OUTPUT - name: debug2 From a8d2c2f0bf3554907e81895f54c1b103e5d4702c Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Tue, 13 Feb 2024 11:29:32 +0000 Subject: [PATCH 770/852] Tidy GHA command using line wrappings --- .github/workflows/ci.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1ec7c811..5697b76a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -78,11 +78,11 @@ jobs: - name: nf-test list tags id: list if: ${{ steps.changed_files.outputs.any_modified }} - run: > - echo tags=$(python - .github/python/find_changed_files.py - -t pipeline workflow process - -p ${{ steps.changed_files.outputs.all_changed_files }} ${{ steps.changed_files.outputs.changed_keys }} + run: | + echo tags=$(python \ + .github/python/find_changed_files.py \ + -t pipeline workflow process \ + -p ${{ steps.changed_files.outputs.all_changed_files }} ${{ steps.changed_files.outputs.changed_keys }} \ ) >> $GITHUB_OUTPUT - name: debug2 From c5a3e7d2b8b1e3d210a03a6c6a3b8c9ca7b43fe0 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Tue, 13 Feb 2024 12:16:43 +0000 Subject: [PATCH 771/852] Upate utility subworkflows --- modules.json | 2 +- .../nf-core/utils_nfcore_pipeline/main.nf | 50 ++++++++++++++++++- .../nf-core/utils_nfcore_pipeline/meta.yml | 6 ++- .../tests/main.function.nf.test | 25 +++++++++- .../tests/main.function.nf.test.snap | 4 ++ .../tests/main.workflow.nf.test | 12 +++++ .../utils_nfcore_pipeline/tests/tags.yml | 2 + 7 files changed, 96 insertions(+), 5 deletions(-) create mode 100644 subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml diff --git a/modules.json b/modules.json index 14bd461f..71a3e25c 100644 --- a/modules.json +++ b/modules.json @@ -42,7 +42,7 @@ }, "utils_nfcore_pipeline": { "branch": "master", - "git_sha": "cd08c91373cd00a73255081340e4914485846ba1", + "git_sha": "262b17ed2aad591039f914951659177e6c39a8d8", "installed_by": ["subworkflows"] }, "utils_nfvalidation_plugin": { diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf index 2b7ec3df..a8b55d6f 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf +++ b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf @@ -13,8 +13,12 @@ import nextflow.extension.FilesEx workflow UTILS_NFCORE_PIPELINE { + take: + nextflow_cli_args + main: valid_config = checkConfigProvided() + checkProfileProvided(nextflow_cli_args) emit: valid_config @@ -43,6 +47,20 @@ def checkConfigProvided() { return valid_config } +// +// Exit pipeline if --profile contains spaces +// +def checkProfileProvided(nextflow_cli_args) { + if (workflow.profile.endsWith(',')) { + error "The `-profile` option cannot end with a trailing comma, please remove it and re-run the pipeline!\n" + + "HINT: A common mistake is to provide multiple values separated by spaces e.g. `-profile test, docker`.\n" + } + if (nextflow_cli_args[0]) { + log.warn "nf-core pipelines do not accept positional arguments. The positional argument `${nextflow_cli_args[0]}` has been detected.\n" + + "HINT: A common mistake is to provide multiple values separated by spaces e.g. `-profile test, docker`.\n" + } +} + // // Citation string for pipeline // @@ -101,6 +119,7 @@ def softwareVersionsToYAML(ch_versions) { return ch_versions .unique() .map { processVersionsFromYAML(it) } + .unique() .mix(Channel.of(workflowVersionToYAML())) } @@ -227,10 +246,33 @@ def logColours(monochrome_logs=true) { return colorcodes } +// +// Attach the multiqc report to email +// +def attachMultiqcReport(multiqc_report) { + def mqc_report = null + try { + if (workflow.success) { + mqc_report = multiqc_report.getVal() + if (mqc_report.getClass() == ArrayList && mqc_report.size() >= 1) { + if (mqc_report.size() > 1) { + log.warn "[$workflow.manifest.name] Found multiple reports from process 'MULTIQC', will use only one" + } + mqc_report = mqc_report[0] + } + } + } catch (all) { + if (multiqc_report) { + log.warn "[$workflow.manifest.name] Could not attach MultiQC report to summary email" + } + } + return mqc_report +} + // // Construct and send completion email // -def completionEmail(summary_params, email, email_on_fail, plaintext_email, outdir, monochrome_logs=true) { +def completionEmail(summary_params, email, email_on_fail, plaintext_email, outdir, monochrome_logs=true, multiqc_report=null) { // Set up the e-mail variables def subject = "[$workflow.manifest.name] Successful: $workflow.runName" @@ -268,6 +310,9 @@ def completionEmail(summary_params, email, email_on_fail, plaintext_email, outdi email_fields['projectDir'] = workflow.projectDir email_fields['summary'] = summary << misc_fields + // On success try attach the multiqc report + def mqc_report = attachMultiqcReport(multiqc_report) + // Check if we are only sending emails on failure def email_address = email if (!email && email_on_fail && !workflow.success) { @@ -286,7 +331,8 @@ def completionEmail(summary_params, email, email_on_fail, plaintext_email, outdi def email_html = html_template.toString() // Render the sendmail template - def smail_fields = [ email: email_address, subject: subject, email_txt: email_txt, email_html: email_html, projectDir: "${workflow.projectDir}" ] + def max_multiqc_email_size = (params.containsKey('max_multiqc_email_size') ? params.max_multiqc_email_size : 0) as nextflow.util.MemoryUnit + def smail_fields = [ email: email_address, subject: subject, email_txt: email_txt, email_html: email_html, projectDir: "${workflow.projectDir}", mqcFile: mqc_report, mqcMaxSize: max_multiqc_email_size.toBytes() ] def sf = new File("${workflow.projectDir}/assets/sendmail_template.txt") def sendmail_template = engine.createTemplate(sf).make(smail_fields) def sendmail_html = sendmail_template.toString() diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/meta.yml b/subworkflows/nf-core/utils_nfcore_pipeline/meta.yml index dd1462b2..d08d2434 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/meta.yml +++ b/subworkflows/nf-core/utils_nfcore_pipeline/meta.yml @@ -7,7 +7,11 @@ keywords: - initialise - version components: [] -input: [] +input: + - nextflow_cli_args: + type: list + description: | + Nextflow CLI positional arguments output: - success: type: boolean diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test index 74577b26..1dc317f8 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test @@ -4,7 +4,10 @@ nextflow_function { name "Test Functions" script "../main.nf" config "subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config" - tag "UTILS_NFCORE_PIPELINE" + tag "subworkflows" + tag "subworkflows_nfcore" + tag "utils_nfcore_pipeline" + tag "subworkflows/utils_nfcore_pipeline" test("Test Function checkConfigProvided") { @@ -18,6 +21,26 @@ nextflow_function { } } + test("Test Function checkProfileProvided") { + + function "checkProfileProvided" + + when { + function { + """ + input[0] = [] + """ + } + } + + then { + assertAll( + { assert function.success }, + { assert snapshot(function.result).match() } + ) + } + } + test("Test Function workflowCitation") { function "workflowCitation" diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test.snap b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test.snap index afb9ab4d..10f948e6 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test.snap +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test.snap @@ -1,4 +1,8 @@ { + "Test Function checkProfileProvided": { + "content": null, + "timestamp": "2024-02-09T15:43:55.145717" + }, "Test Function checkConfigProvided": { "content": [ true diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test index 3df54055..8940d32d 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test @@ -4,9 +4,21 @@ nextflow_workflow { script "../main.nf" config "subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config" workflow "UTILS_NFCORE_PIPELINE" + tag "subworkflows" + tag "subworkflows_nfcore" + tag "utils_nfcore_pipeline" + tag "subworkflows/utils_nfcore_pipeline" test("Should run without failures") { + when { + workflow { + """ + input[0] = [] + """ + } + } + then { assertAll( { assert workflow.success }, diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml b/subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml new file mode 100644 index 00000000..ac8523c9 --- /dev/null +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml @@ -0,0 +1,2 @@ +subworkflows/utils_nfcore_pipeline: + - subworkflows/nf-core/utils_nfcore_pipeline/** From 9c567e418fd1cdcc855397766069a4e475893ed5 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Tue, 13 Feb 2024 12:49:59 +0000 Subject: [PATCH 772/852] Add argument to UTILS_NFCORE_PIPELINE --- assets/methods_description_template.yml | 2 -- subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/assets/methods_description_template.yml b/assets/methods_description_template.yml index 49a0a9fd..469f4a46 100644 --- a/assets/methods_description_template.yml +++ b/assets/methods_description_template.yml @@ -3,8 +3,6 @@ description: "Suggested text and references to use when describing pipeline usag section_name: "nf-core/fetchngs Methods Description" section_href: "https://github.com/nf-core/fetchngs" plot_type: "html" -## TODO nf-core: Update the HTML below to your preferred methods description, e.g. add publication citation for this pipeline -## You inject any metadata in the Nextflow '${workflow}' object data: |

Methods

Data was processed using nf-core/fetchngs v${workflow.manifest.version} ${doi_text} of the nf-core collection of workflows (Ewels et al., 2020), utilising reproducible software environments from the Bioconda (Grüning et al., 2018) and Biocontainers (da Veiga Leprevost et al., 2017) projects.

diff --git a/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf b/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf index 7b46200f..18660e50 100644 --- a/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf @@ -67,7 +67,7 @@ workflow PIPELINE_INITIALISATION { // // Check config provided to the pipeline // - UTILS_NFCORE_PIPELINE () + UTILS_NFCORE_PIPELINE ( args ) // // Auto-detect input id type From 302694cfe6674a2a49809d4fd3cd128447cc08e1 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Wed, 14 Feb 2024 13:37:33 +0000 Subject: [PATCH 773/852] CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f2d0620..498168cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,6 +44,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements - [PR #264](https://github.com/nf-core/fetchngs/pull/264) - Remove synapse workflow from pipeline - [PR #265](https://github.com/nf-core/fetchngs/pull/265) - Use "+" syntax for profiles to accumulate profiles in nf-test - [PR #266](https://github.com/nf-core/fetchngs/pull/266) - Make .gitignore match template +- [PR #273](https://github.com/nf-core/fetchngs/pull/273) - Update subworkflows ### Software dependencies From fdf576fd3a3e2b27e079faf2cb35a23c729deeff Mon Sep 17 00:00:00 2001 From: Edmund Miller Date: Fri, 16 Feb 2024 12:16:39 -0600 Subject: [PATCH 774/852] chore: Emiller88 => edmundmiller --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 498168cc..653da944 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -77,7 +77,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements Special thanks to the following for their contributions to the release: - [Adam Talbot](https://github.com/adamrtalbot) -- [Edmund Miller](https://github.com/Emiller88) +- [Edmund Miller](https://github.com/edmundmiller) - [Esha Joshi](https://github.com/ejseqera) - [Harshil Patel](https://github.com/drpatelh) - [Lukas Forer](https://github.com/lukfor) From ba7d804d3251dc8f9af0edc6f92dffbbe4cfda96 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Sun, 18 Feb 2024 11:56:26 +0000 Subject: [PATCH 775/852] [automated] Fix linting with Prettier --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 8b6d253b..31831022 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ ```mermaid flowchart LR - IDS("Input + IDS("Input File") --> SRA & GEO & ENA & DDBJ subgraph SG_DBIDS[Database IDs] SRA("SRA") @@ -34,9 +34,9 @@ flowchart LR DDBJ("DDBJ") end subgraph SG_METADATA[Download Metadata] - SRA & GEO & ENA & DDBJ --> META("Get + SRA & GEO & ENA & DDBJ --> META("Get Metadata") - META --> LINKS("Get + META --> LINKS("Get Download Links") end @@ -50,7 +50,7 @@ flowchart LR FASTQ --> SAMPLESHEET("Samplesheet") end LINKS --> |--skip_fastq_download| SAMPLESHEET - + ``` ## Usage From bd09ad07a7e08410e15aea5b84b4a6c629764f54 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 18 Feb 2024 12:28:43 +0000 Subject: [PATCH 776/852] Rename --force_ftp_download to --force_aspera_download to make FTP default again --- CHANGELOG.md | 12 ++++++------ README.md | 4 ++-- docs/usage.md | 8 ++------ nextflow.config | 2 +- nextflow_schema.json | 6 +++--- workflows/sra/main.nf | 34 ++++++++++++++++------------------ 6 files changed, 30 insertions(+), 36 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 653da944..ba9ee43b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### :warning: Major enhancements -- The Aspera CLI was recently added to [Bioconda](https://anaconda.org/bioconda/aspera-cli) and we have added it as another way of downloading FastQ files on top of the existing FTP and sra-tools support. In our limited benchmarks on all public Clouds we found ~50% speed-up in download times compared to FTP! We are not aware of any obvious downsides and have made this the default download method in the pipeline. You can however, revert to using FTP and sra-tools using the `--force_ftp_download` and `--force_sratools_download` parameters, respectively. We would love to have your feedback! +- The Aspera CLI was recently added to [Bioconda](https://anaconda.org/bioconda/aspera-cli) and we have added it as another way of downloading FastQ files on top of the existing FTP and sra-tools support. In our limited benchmarks on all public Clouds we found ~50% speed-up in download times compared to FTP! FTP downloads will still be the default download method but you can however, choose to use sra-tools or Aspera using the `--force_sratools_download` or `--force_aspera_download` parameters, respectively. We would love to have your feedback! - Support for Synapse ids has been dropped in this release. We haven't had any feedback from users whether it is being used or not. Users can run earlier versions of the pipeline if required. - We have significantly refactored and standardised the way we are using nf-test within this pipeline. This pipeline is now the current, best-practice implementation for nf-test usage on nf-core. We required a number of features to be added to nf-test and a huge shoutout to [Lukas Forer](https://github.com/lukfor) for entertaining our requests and implementing them within upstream :heart:! @@ -60,11 +60,11 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements ### Parameters -| Old parameter | New parameter | -| ------------------ | ---------------------- | -| | `--force_ftp_download` | -| `--input_type` | | -| `--synapse_config` | | +| Old parameter | New parameter | +| ------------------ | ------------------------- | +| | `--force_aspera_download` | +| `--input_type` | | +| `--synapse_config` | | > **NB:** Parameter has been **updated** if both old and new parameter information is present. > **NB:** Parameter has been **added** if just the new parameter information is present. diff --git a/README.md b/README.md index 9419fa1a..ef748159 100644 --- a/README.md +++ b/README.md @@ -68,8 +68,8 @@ Via a single file of ids, provided one-per-line (see [example input file](https: 2. Fetch extensive id metadata via ENA API 3. Download FastQ files: - If direct download links are available from the ENA API: - - Fetch in parallel via `aspera-cli` and perform `md5sum` check (default) - - Fetch in parallel via `wget` and perform `md5sum` check. Use `--force_ftp_download` to force this behaviour. + - Fetch in parallel via `wget` and perform `md5sum` check (default). + - Fetch in parallel via `aspera-cli` and perform `md5sum` check. Use `--force_aspera_download` to force this behaviour. - Otherwise use [`sra-tools`](https://github.com/ncbi/sra-tools) to download `.sra` files and convert them to FastQ. Use `--force_sratools_download` to force this behaviour. 4. Collate id metadata and paths to FastQ files in a single samplesheet diff --git a/docs/usage.md b/docs/usage.md index 06ff7802..756a62a3 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -70,13 +70,9 @@ This highlights that there is a discrepancy between the read data hosted on the See [issue #260](https://github.com/nf-core/fetchngs/issues/260) for more details. -### Bypass Aspera data download +### Primary options for downloading data -If the appropriate download links are available, the pipeline uses the Aspera CLI by default to download FastQ files. If you are having issues and prefer to use FTP or sra-tools instead, you can use the [`--force_ftp_download`](https://nf-co.re/fetchngs/parameters#force_ftp_download) and [`--force_sratools_download`](https://nf-co.re/fetchngs/parameters#force_sratools_download) parameters, respectively. - -### Bypass `FTP` data download - -If FTP connections are blocked on your network use the [`--force_sratools_download`](https://nf-co.re/fetchngs/parameters#force_sratools_download) parameter to force the pipeline to download data using sra-tools instead of the ENA FTP. +If the appropriate download links are available, the pipeline uses FTP by default to download FastQ files. If you are having issues and prefer to use sra-tools or Aspera instead, you can use the [`--force_sratools_download`](https://nf-co.re/fetchngs/parameters#force_sratools_download) or [`--force_aspera_download`](https://nf-co.re/fetchngs/parameters#force_aspera_download) parameters, respectively. ### Downloading dbGAP data with JWT diff --git a/nextflow.config b/nextflow.config index fad805bf..c6658f4a 100644 --- a/nextflow.config +++ b/nextflow.config @@ -15,7 +15,7 @@ params { nf_core_rnaseq_strandedness = 'auto' ena_metadata_fields = null sample_mapping_fields = 'experiment_accession,run_accession,sample_accession,experiment_alias,run_alias,sample_alias,experiment_title,sample_title,sample_description' - force_ftp_download = false + force_aspera_download = false force_sratools_download = false skip_fastq_download = false dbgap_key = null diff --git a/nextflow_schema.json b/nextflow_schema.json index 77ae6673..5ad7a50d 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -47,11 +47,11 @@ "help_text": "The default is 'auto' which can be used with nf-core/rnaseq v3.10 onwards to auto-detect strandedness during the pipeline execution.", "default": "auto" }, - "force_ftp_download": { + "force_aspera_download": { "type": "boolean", "fa_icon": "fas fa-tools", - "description": "Force download FASTQ files via FTP instead of via the Aspera CLI.", - "help_text": "If the Aspera CLI is not working on your infrastructure use this flag to force the pipeline to download data via FTP." + "description": "Force download FASTQ files via Aspera CLI instead of via FTP.", + "help_text": "If FTP downloads are not working on your infrastructure use this flag to force the pipeline to download data via the Aspera CLI." }, "force_sratools_download": { "type": "boolean", diff --git a/workflows/sra/main.nf b/workflows/sra/main.nf index 35ae18dc..61906273 100644 --- a/workflows/sra/main.nf +++ b/workflows/sra/main.nf @@ -69,37 +69,26 @@ workflow SRA { ch_sra_metadata .branch { meta -> - def download_method = 'aspera' + def download_method = 'ftp' // meta.fastq_aspera is a metadata string with ENA fasp links supported by Aspera // For single-end: 'fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz' // For paired-end: 'fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz' - if (!meta.fastq_aspera || params.force_ftp_download) { - if (meta.fastq_1) { - download_method = 'ftp' - } + if (meta.fastq_aspera && params.force_aspera_download) { + download_method = 'aspera' } if ((!meta.fastq_aspera && !meta.fastq_1) || params.force_sratools_download) { download_method = 'sratools' } - aspera: download_method == 'aspera' - return [ meta, meta.fastq_aspera.tokenize(';').take(2) ] ftp: download_method == 'ftp' return [ meta, [ meta.fastq_1, meta.fastq_2 ] ] sratools: download_method == 'sratools' return [ meta, meta.run_accession ] + aspera: download_method == 'aspera' + return [ meta, meta.fastq_aspera.tokenize(';').take(2) ] } .set { ch_sra_reads } - // - // MODULE: If Aspera link is provided in run information then download FastQ directly via Aspera CLI and validate with md5sums - // - ASPERA_CLI ( - ch_sra_reads.aspera, - 'era-fasp' - ) - ch_versions = ch_versions.mix(ASPERA_CLI.out.versions.first()) - // // MODULE: If FTP link is provided in run information then download FastQ directly via FTP and validate with md5sums // @@ -117,12 +106,21 @@ workflow SRA { ) ch_versions = ch_versions.mix(FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS.out.versions.first()) + // + // MODULE: If Aspera link is provided in run information then download FastQ directly via Aspera CLI and validate with md5sums + // + ASPERA_CLI ( + ch_sra_reads.aspera, + 'era-fasp' + ) + ch_versions = ch_versions.mix(ASPERA_CLI.out.versions.first()) + // Isolate FASTQ channel which will be added to emit block - ASPERA_CLI + SRA_FASTQ_FTP .out .fastq - .mix(SRA_FASTQ_FTP.out.fastq) .mix(FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS.out.reads) + .mix(ASPERA_CLI.out.fastq) .map { meta, fastq -> def reads = fastq instanceof List ? fastq.flatten() : [ fastq ] From 047f81fee0907da3c2459944291e0d9509fddfbd Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Sun, 18 Feb 2024 12:30:12 +0000 Subject: [PATCH 777/852] Update workflow tags and tests to change default behaviour to FTP download --- workflows/sra/tests/main.nf.test | 2 +- ...p_download.nf.test => sra_force_aspera_download.nf.test} | 6 +++--- workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test | 2 +- workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test | 2 +- .../sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test | 2 +- workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) rename workflows/sra/tests/{sra_force_ftp_download.nf.test => sra_force_aspera_download.nf.test} (93%) diff --git a/workflows/sra/tests/main.nf.test b/workflows/sra/tests/main.nf.test index 69ad7f42..dddc5275 100644 --- a/workflows/sra/tests/main.nf.test +++ b/workflows/sra/tests/main.nf.test @@ -8,7 +8,7 @@ nextflow_workflow { // Dependencies tag "SRA_IDS_TO_RUNINFO" tag "SRA_RUNINFO_TO_FTP" - tag "ASPERA_CLI" + tag "SRA_FASTQ_FTP" tag "SRA_TO_SAMPLESHEET" tag "MULTIQC_MAPPINGS_CONFIG" diff --git a/workflows/sra/tests/sra_force_ftp_download.nf.test b/workflows/sra/tests/sra_force_aspera_download.nf.test similarity index 93% rename from workflows/sra/tests/sra_force_ftp_download.nf.test rename to workflows/sra/tests/sra_force_aspera_download.nf.test index 357bd180..af0911bd 100644 --- a/workflows/sra/tests/sra_force_ftp_download.nf.test +++ b/workflows/sra/tests/sra_force_aspera_download.nf.test @@ -8,11 +8,11 @@ nextflow_workflow { // Dependencies tag "SRA_IDS_TO_RUNINFO" tag "SRA_RUNINFO_TO_FTP" - tag "SRA_FASTQ_FTP" + tag "ASPERA_CLI" tag "SRA_TO_SAMPLESHEET" tag "MULTIQC_MAPPINGS_CONFIG" - test("Parameters: --force_ftp_download") { + test("Parameters: --force_aspera_download") { when { workflow { @@ -22,7 +22,7 @@ nextflow_workflow { } params { outdir = "$outputDir" - force_ftp_download = true + force_aspera_download = true } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test index 26cac4b9..522ab75b 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test @@ -8,7 +8,7 @@ nextflow_workflow { // Dependencies tag "SRA_IDS_TO_RUNINFO" tag "SRA_RUNINFO_TO_FTP" - tag "ASPERA_CLI" + tag "SRA_FASTQ_FTP" tag "SRA_TO_SAMPLESHEET" tag "MULTIQC_MAPPINGS_CONFIG" diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test index b5a49dd4..f6f1b560 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test @@ -8,7 +8,7 @@ nextflow_workflow { // Dependencies tag "SRA_IDS_TO_RUNINFO" tag "SRA_RUNINFO_TO_FTP" - tag "ASPERA_CLI" + tag "SRA_FASTQ_FTP" tag "SRA_TO_SAMPLESHEET" tag "MULTIQC_MAPPINGS_CONFIG" diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test index 0a92b446..b9373b57 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test @@ -8,7 +8,7 @@ nextflow_workflow { // Dependencies tag "SRA_IDS_TO_RUNINFO" tag "SRA_RUNINFO_TO_FTP" - tag "ASPERA_CLI" + tag "SRA_FASTQ_FTP" tag "SRA_TO_SAMPLESHEET" tag "MULTIQC_MAPPINGS_CONFIG" diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test index f633e0d6..4985b9d0 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test @@ -8,7 +8,7 @@ nextflow_workflow { // Dependencies tag "SRA_IDS_TO_RUNINFO" tag "SRA_RUNINFO_TO_FTP" - tag "ASPERA_CLI" + tag "SRA_FASTQ_FTP" tag "SRA_TO_SAMPLESHEET" tag "MULTIQC_MAPPINGS_CONFIG" From c2827a00007387397e83350493f427d898d5c3d3 Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Mon, 19 Feb 2024 10:01:19 +0100 Subject: [PATCH 778/852] Apply suggestions from code review --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 31831022..05a8f2b5 100644 --- a/README.md +++ b/README.md @@ -41,8 +41,8 @@ flowchart LR Links") end subgraph SG_FETCH_FASTQ[Download FastQ] - LINKS --> |"(default)"| ASPERA("Aspera") - LINKS --> |--force_ftp_download| FTP("FTP") + LINKS --> |"(default)"| FTP("FTP") + LINKS --> |--force_aspera_download| ASPERA("Aspera") LINKS --> |--force_sra_tools_download| SRATOOLS("sra-tools") end subgraph SG_FASTQ[Pipeline Outputs] From f4e3a1f036f14135576b726cf9e08b9927707cf4 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Mon, 19 Feb 2024 09:54:39 +0000 Subject: [PATCH 779/852] confirm-pass will pass if no tests are triggered --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5697b76a..86c6b5bc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -165,7 +165,7 @@ jobs: if: always() steps: - name: All tests ok - if: ${{ success() || !contains(needs.*.result, 'failure') }} + if: ${{ !contains(needs.*.result, 'failure') }} run: exit 0 - name: One or more tests failed if: ${{ contains(needs.*.result, 'failure') }} From 61ee0cba845581789ce15043977a1d168faea3b8 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 19 Feb 2024 12:10:01 +0000 Subject: [PATCH 780/852] Replace --force_* parameters with --download_method --- CHANGELOG.md | 14 +++++++----- README.md | 6 ++--- docs/usage.md | 4 ++-- nextflow.config | 3 +-- nextflow_schema.json | 22 ++++++++----------- workflows/sra/main.nf | 8 +++---- ...est => sra_download_method_aspera.nf.test} | 6 ++--- ...t => sra_download_method_sratools.nf.test} | 6 ++--- 8 files changed, 33 insertions(+), 36 deletions(-) rename workflows/sra/tests/{sra_force_aspera_download.nf.test => sra_download_method_aspera.nf.test} (93%) rename workflows/sra/tests/{sra_force_sratools_download.nf.test => sra_download_method_sratools.nf.test} (93%) diff --git a/CHANGELOG.md b/CHANGELOG.md index ba9ee43b..68a8174d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### :warning: Major enhancements -- The Aspera CLI was recently added to [Bioconda](https://anaconda.org/bioconda/aspera-cli) and we have added it as another way of downloading FastQ files on top of the existing FTP and sra-tools support. In our limited benchmarks on all public Clouds we found ~50% speed-up in download times compared to FTP! FTP downloads will still be the default download method but you can however, choose to use sra-tools or Aspera using the `--force_sratools_download` or `--force_aspera_download` parameters, respectively. We would love to have your feedback! +- The Aspera CLI was recently added to [Bioconda](https://anaconda.org/bioconda/aspera-cli) and we have added it as another way of downloading FastQ files in addition to the existing FTP and sra-tools support. In our limited benchmarks on all public Clouds we found ~50% speed-up in download times compared to FTP! FTP downloads will still be the default download method (i.e. `--download_method ftp`) but you can choose to use sra-tools or Aspera using `--download_method sratools` or `--download_method aspera`, respectively. We would love to have your feedback! +- The `--force_sratools_download` parameter has been deprecated in favour of using `--download_method ` to explicitly specify the download method; available options are `ftp`, `sratools` or `aspera`. - Support for Synapse ids has been dropped in this release. We haven't had any feedback from users whether it is being used or not. Users can run earlier versions of the pipeline if required. - We have significantly refactored and standardised the way we are using nf-test within this pipeline. This pipeline is now the current, best-practice implementation for nf-test usage on nf-core. We required a number of features to be added to nf-test and a huge shoutout to [Lukas Forer](https://github.com/lukfor) for entertaining our requests and implementing them within upstream :heart:! @@ -60,11 +61,12 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements ### Parameters -| Old parameter | New parameter | -| ------------------ | ------------------------- | -| | `--force_aspera_download` | -| `--input_type` | | -| `--synapse_config` | | +| Old parameter | New parameter | +| --------------------------- | ------------------- | +| | `--download_method` | +| `--input_type` | | +| `--force_sratools_download` | | +| `--synapse_config` | | > **NB:** Parameter has been **updated** if both old and new parameter information is present. > **NB:** Parameter has been **added** if just the new parameter information is present. diff --git a/README.md b/README.md index ef748159..58fa86f4 100644 --- a/README.md +++ b/README.md @@ -68,9 +68,9 @@ Via a single file of ids, provided one-per-line (see [example input file](https: 2. Fetch extensive id metadata via ENA API 3. Download FastQ files: - If direct download links are available from the ENA API: - - Fetch in parallel via `wget` and perform `md5sum` check (default). - - Fetch in parallel via `aspera-cli` and perform `md5sum` check. Use `--force_aspera_download` to force this behaviour. - - Otherwise use [`sra-tools`](https://github.com/ncbi/sra-tools) to download `.sra` files and convert them to FastQ. Use `--force_sratools_download` to force this behaviour. + - Fetch in parallel via `wget` and perform `md5sum` check (`--download_method ftp`; default). + - Fetch in parallel via `aspera-cli` and perform `md5sum` check. Use `--download_method aspera` to force this behaviour. + - Otherwise use [`sra-tools`](https://github.com/ncbi/sra-tools) to download `.sra` files and convert them to FastQ. Use `--download_method sratools` to force this behaviour. 4. Collate id metadata and paths to FastQ files in a single samplesheet ## Pipeline output diff --git a/docs/usage.md b/docs/usage.md index 756a62a3..2bc9a125 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -66,13 +66,13 @@ SRR9320616_2.fastq SRR9320616_3.fastq ``` -This highlights that there is a discrepancy between the read data hosted on the ENA API and what can actually be fetched from sra-tools, where the latter seems to be the source of truth. If you anticipate that you may have more than 2 FastQ files per sample, it is recommended to use this pipeline with the `--force_sratools_download` parameter. +This highlights that there is a discrepancy between the read data hosted on the ENA API and what can actually be fetched from sra-tools, where the latter seems to be the source of truth. If you anticipate that you may have more than 2 FastQ files per sample, it is recommended to use this pipeline with the `--download_method sratools` parameter. See [issue #260](https://github.com/nf-core/fetchngs/issues/260) for more details. ### Primary options for downloading data -If the appropriate download links are available, the pipeline uses FTP by default to download FastQ files. If you are having issues and prefer to use sra-tools or Aspera instead, you can use the [`--force_sratools_download`](https://nf-co.re/fetchngs/parameters#force_sratools_download) or [`--force_aspera_download`](https://nf-co.re/fetchngs/parameters#force_aspera_download) parameters, respectively. +If the appropriate download links are available, the pipeline uses FTP by default to download FastQ files by setting the `--download_method ftp` parameter. If you are having issues and prefer to use sra-tools or Aspera instead, you can set the [`--download_method`](https://nf-co.re/fetchngs/parameters#download_method) parameter to `--download_method sratools` or `--download_method aspera`, respectively. ### Downloading dbGAP data with JWT diff --git a/nextflow.config b/nextflow.config index c6658f4a..40333478 100644 --- a/nextflow.config +++ b/nextflow.config @@ -15,8 +15,7 @@ params { nf_core_rnaseq_strandedness = 'auto' ena_metadata_fields = null sample_mapping_fields = 'experiment_accession,run_accession,sample_accession,experiment_alias,run_alias,sample_alias,experiment_title,sample_title,sample_description' - force_aspera_download = false - force_sratools_download = false + download_method = 'ftp' skip_fastq_download = false dbgap_key = null diff --git a/nextflow_schema.json b/nextflow_schema.json index 5ad7a50d..e870974a 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -30,7 +30,7 @@ }, "sample_mapping_fields": { "type": "string", - "fa_icon": "fas fa-globe-americas", + "fa_icon": "fas fa-columns", "description": "Comma-separated list of ENA metadata fields used to create a separate 'id_mappings.csv' and 'multiqc_config.yml' with selected fields that can be used to rename samples in general and in MultiQC.", "default": "experiment_accession,run_accession,sample_accession,experiment_alias,run_alias,sample_alias,experiment_title,sample_title,sample_description" }, @@ -42,22 +42,18 @@ }, "nf_core_rnaseq_strandedness": { "type": "string", - "fa_icon": "fas fa-car", + "fa_icon": "fas fa-dna", "description": "Value for 'strandedness' entry added to samplesheet created when using '--nf_core_pipeline rnaseq'.", "help_text": "The default is 'auto' which can be used with nf-core/rnaseq v3.10 onwards to auto-detect strandedness during the pipeline execution.", "default": "auto" }, - "force_aspera_download": { - "type": "boolean", - "fa_icon": "fas fa-tools", - "description": "Force download FASTQ files via Aspera CLI instead of via FTP.", - "help_text": "If FTP downloads are not working on your infrastructure use this flag to force the pipeline to download data via the Aspera CLI." - }, - "force_sratools_download": { - "type": "boolean", - "fa_icon": "fas fa-tools", - "description": "Force download FASTQ files via sra-tools instead of via the ENA FTP.", - "help_text": "If FTP connections are blocked on your network use this flag to force the pipeline to download data using sra-tools instead of the ENA FTP." + "download_method": { + "type": "string", + "default": "ftp", + "fa_icon": "fas fa-download", + "enum": ["aspera", "ftp", "sratools"], + "description": "Method to download FastQ files. Available options are 'aspera', 'ftp' or 'sratools'. Default is 'ftp'.", + "help_text": "FTP and Aspera CLI download FastQ files directly from the ENA FTP whereas sratools uses sra-tools to download *.sra files and convert to FastQ." }, "skip_fastq_download": { "type": "boolean", diff --git a/workflows/sra/main.nf b/workflows/sra/main.nf index 61906273..0c8cac0c 100644 --- a/workflows/sra/main.nf +++ b/workflows/sra/main.nf @@ -73,19 +73,19 @@ workflow SRA { // meta.fastq_aspera is a metadata string with ENA fasp links supported by Aspera // For single-end: 'fasp.sra.ebi.ac.uk:/vol1/fastq/ERR116/006/ERR1160846/ERR1160846.fastq.gz' // For paired-end: 'fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_1.fastq.gz;fasp.sra.ebi.ac.uk:/vol1/fastq/SRR130/020/SRR13055520/SRR13055520_2.fastq.gz' - if (meta.fastq_aspera && params.force_aspera_download) { + if (meta.fastq_aspera && params.download_method == 'aspera') { download_method = 'aspera' } - if ((!meta.fastq_aspera && !meta.fastq_1) || params.force_sratools_download) { + if ((!meta.fastq_aspera && !meta.fastq_1) || params.download_method == 'sratools') { download_method = 'sratools' } + aspera: download_method == 'aspera' + return [ meta, meta.fastq_aspera.tokenize(';').take(2) ] ftp: download_method == 'ftp' return [ meta, [ meta.fastq_1, meta.fastq_2 ] ] sratools: download_method == 'sratools' return [ meta, meta.run_accession ] - aspera: download_method == 'aspera' - return [ meta, meta.fastq_aspera.tokenize(';').take(2) ] } .set { ch_sra_reads } diff --git a/workflows/sra/tests/sra_force_aspera_download.nf.test b/workflows/sra/tests/sra_download_method_aspera.nf.test similarity index 93% rename from workflows/sra/tests/sra_force_aspera_download.nf.test rename to workflows/sra/tests/sra_download_method_aspera.nf.test index af0911bd..d36f9095 100644 --- a/workflows/sra/tests/sra_force_aspera_download.nf.test +++ b/workflows/sra/tests/sra_download_method_aspera.nf.test @@ -3,7 +3,7 @@ nextflow_workflow { name "Test workflow: sra/main.nf" script "../main.nf" workflow "SRA" - tag "SRA_FORCE_FTP_DOWNLOAD" + tag "SRA_DOWNLOAD_METHOD_ASPERA" // Dependencies tag "SRA_IDS_TO_RUNINFO" @@ -12,7 +12,7 @@ nextflow_workflow { tag "SRA_TO_SAMPLESHEET" tag "MULTIQC_MAPPINGS_CONFIG" - test("Parameters: --force_aspera_download") { + test("Parameters: --download_method aspera") { when { workflow { @@ -22,7 +22,7 @@ nextflow_workflow { } params { outdir = "$outputDir" - force_aspera_download = true + download_method = 'aspera' } } diff --git a/workflows/sra/tests/sra_force_sratools_download.nf.test b/workflows/sra/tests/sra_download_method_sratools.nf.test similarity index 93% rename from workflows/sra/tests/sra_force_sratools_download.nf.test rename to workflows/sra/tests/sra_download_method_sratools.nf.test index 62d499df..05613f1e 100644 --- a/workflows/sra/tests/sra_force_sratools_download.nf.test +++ b/workflows/sra/tests/sra_download_method_sratools.nf.test @@ -3,7 +3,7 @@ nextflow_workflow { name "Test workflow: sra/main.nf" script "../main.nf" workflow "SRA" - tag "SRA_FORCE_SRATOOLS_DOWNLOAD" + tag "SRA_DOWNLOAD_METHOD_SRATOOLS" // Dependencies tag "FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS" @@ -12,7 +12,7 @@ nextflow_workflow { tag "SRA_TO_SAMPLESHEET" tag "MULTIQC_MAPPINGS_CONFIG" - test("Parameters: --force_sratools_download") { + test("Parameters: --download_method sratools") { when { workflow { @@ -22,7 +22,7 @@ nextflow_workflow { } params { outdir = "$outputDir" - force_sratools_download = true + download_method = 'sratools' } } From 177be25a1c4c1a362cc7d9f080e6b8de983d9128 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 19 Feb 2024 12:10:37 +0000 Subject: [PATCH 781/852] Update .nf-core.yml relative to latest tools release --- .nf-core.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.nf-core.yml b/.nf-core.yml index 707d5cd8..8694fced 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -7,5 +7,4 @@ lint: - lib/Utils.groovy - lib/WorkflowMain.groovy files_unchanged: - - .gitignore - assets/sendmail_template.txt From 4573cdd502438f63210b710f7ec0ef0d3e0c5d5f Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 19 Feb 2024 12:11:08 +0000 Subject: [PATCH 782/852] Use strict validation of parameters since deprecating --force_sratools_download --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 40333478..5b82d5b2 100644 --- a/nextflow.config +++ b/nextflow.config @@ -45,7 +45,7 @@ params { max_time = '240.h' // Schema validation default options - validationFailUnrecognisedParams = false + validationFailUnrecognisedParams = true validationLenientMode = false validationShowHiddenParams = false validationSchemaIgnoreParams = '' From 502d58f1d138d8beb318dfddc2bdbf3808d99460 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 19 Feb 2024 12:58:36 +0000 Subject: [PATCH 783/852] Add deprecated parameter section for --force_sratools_download --- nextflow.config | 6 +++++- nextflow_schema.json | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 5b82d5b2..0b2abf8c 100644 --- a/nextflow.config +++ b/nextflow.config @@ -45,12 +45,16 @@ params { max_time = '240.h' // Schema validation default options - validationFailUnrecognisedParams = true + validationFailUnrecognisedParams = false validationLenientMode = false validationShowHiddenParams = false validationSchemaIgnoreParams = '' validate_params = true + // Deprecated options + // See: https://github.com/nf-core/fetchngs/pull/279/files#r1494459480 + force_sratools_download = false + } // Load base.config by default for all pipelines diff --git a/nextflow_schema.json b/nextflow_schema.json index e870974a..5d5e48d3 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -249,6 +249,22 @@ "help_text": "Allows string values that are parseable as numbers or booleans. For further information see [JSONSchema docs](https://github.com/everit-org/json-schema#lenient-mode)." } } + }, + "deprecated_options": { + "title": "Deprecated options", + "type": "object", + "description": "List of parameters that have been deprecated.", + "default": "", + "fa_icon": "fas fa-calendar-times", + "properties": { + "force_sratools_download": { + "type": "boolean", + "fa_icon": "fas fa-times-circle", + "description": "This parameter has been deprecated. Please use '--download_method sratools' instead.", + "enum": [false], + "hidden": true + } + } } }, "allOf": [ @@ -263,6 +279,9 @@ }, { "$ref": "#/definitions/generic_options" + }, + { + "$ref": "#/definitions/deprecated_options" } ] } From c8ec03b57a9ad2e7a486dc9eee1c312135b60975 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 20 Feb 2024 13:47:44 +0100 Subject: [PATCH 784/852] Update README.md --- README.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 05a8f2b5..9f59aec2 100644 --- a/README.md +++ b/README.md @@ -41,16 +41,15 @@ flowchart LR Links") end subgraph SG_FETCH_FASTQ[Download FastQ] - LINKS --> |"(default)"| FTP("FTP") - LINKS --> |--force_aspera_download| ASPERA("Aspera") - LINKS --> |--force_sra_tools_download| SRATOOLS("sra-tools") + LINKS --> |--download_method 'ftp' | FTP("FTP") + LINKS --> |--download_method 'aspera' | ASPERA("Aspera") + LINKS --> |--download_method 'sratools' | SRATOOLS("sra-tools") end subgraph SG_FASTQ[Pipeline Outputs] ASPERA & FTP & SRATOOLS --> FASTQ("FastQ") FASTQ --> SAMPLESHEET("Samplesheet") end LINKS --> |--skip_fastq_download| SAMPLESHEET - ``` ## Usage From 9e5e301d968ab2495d48bf64a2866f81e3523046 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 20 Feb 2024 18:24:19 +0000 Subject: [PATCH 785/852] Update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e6c085b..62b239b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,6 +47,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements - [PR #266](https://github.com/nf-core/fetchngs/pull/266) - Make .gitignore match template - [PR #268](https://github.com/nf-core/fetchngs/pull/268) - Add mermaid diagram - [PR #273](https://github.com/nf-core/fetchngs/pull/273) - Update utility subworkflows +- [PR #283](https://github.com/nf-core/fetchngs/pull/283) - Template update for nf-core/tools v2.13 ### Software dependencies From 5e3bb4ae28958367105a10e2733c82283a1751a4 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 20 Feb 2024 20:11:47 +0000 Subject: [PATCH 786/852] Remove tags.yml files --- subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml | 2 -- subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml | 2 -- subworkflows/nf-core/utils_nfvalidation_plugin/tests/tags.yml | 2 -- 3 files changed, 6 deletions(-) delete mode 100644 subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml delete mode 100644 subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml delete mode 100644 subworkflows/nf-core/utils_nfvalidation_plugin/tests/tags.yml diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml b/subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml deleted file mode 100644 index f8476112..00000000 --- a/subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -subworkflows/utils_nextflow_pipeline: - - subworkflows/nf-core/utils_nextflow_pipeline/** diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml b/subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml deleted file mode 100644 index ac8523c9..00000000 --- a/subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -subworkflows/utils_nfcore_pipeline: - - subworkflows/nf-core/utils_nfcore_pipeline/** diff --git a/subworkflows/nf-core/utils_nfvalidation_plugin/tests/tags.yml b/subworkflows/nf-core/utils_nfvalidation_plugin/tests/tags.yml deleted file mode 100644 index 60b1cfff..00000000 --- a/subworkflows/nf-core/utils_nfvalidation_plugin/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -subworkflows/utils_nfvalidation_plugin: - - subworkflows/nf-core/utils_nfvalidation_plugin/** From eae9cb43f211a77b2cad648f12be7a309c2ca425 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 20 Feb 2024 20:12:04 +0000 Subject: [PATCH 787/852] Remove duplicate schema entry in nextflow_schema.json --- nextflow_schema.json | 1 - 1 file changed, 1 deletion(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 9fdea4e8..29f7b710 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -19,7 +19,6 @@ "schema": "assets/schema_input.json", "mimetype": "text/csv", "pattern": "^\\S+\\.(csv|tsv|txt)$", - "schema": "assets/schema_input.json", "fa_icon": "fas fa-file-excel", "description": "File containing SRA/ENA/GEO/DDBJ identifiers one per line to download their associated metadata and FastQ files." }, From 3a92ac0ece3266b0634e6869dab81ec95acfdb6f Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 20 Feb 2024 20:13:58 +0000 Subject: [PATCH 788/852] Fix ECLint --- subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf b/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf index 68b91255..22079228 100644 --- a/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf @@ -68,8 +68,8 @@ workflow PIPELINE_INITIALISATION { // // Check config provided to the pipeline // - UTILS_NFCORE_PIPELINE ( - nextflow_cli_args + UTILS_NFCORE_PIPELINE ( + nextflow_cli_args ) // From 61a5b18a4bea376c44b4fa242f21f5ea6a2feae5 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 20 Feb 2024 20:19:15 +0000 Subject: [PATCH 789/852] Fix PIPELINE_INITIALISATION tests --- main.nf | 2 +- .../tests/main.workflow_pipeline_initialisation.nf.test | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/main.nf b/main.nf index 46b4b0e3..52539e40 100644 --- a/main.nf +++ b/main.nf @@ -90,4 +90,4 @@ workflow { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ THE END ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ \ No newline at end of file +*/ diff --git a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_initialisation.nf.test b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_initialisation.nf.test index 356961e6..5d3a2fcf 100644 --- a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_initialisation.nf.test +++ b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_initialisation.nf.test @@ -17,6 +17,7 @@ nextflow_workflow { help = false validate_params = false monochrome_logs = false + nextflow_cli_args = '' outdir = "$params.outdir" ena_metadata_fields = null @@ -24,9 +25,10 @@ nextflow_workflow { input[1] = help input[2] = validate_params input[3] = monochrome_logs - input[4] = outdir - input[5] = 'https://raw.githubusercontent.com/nf-core/test-datasets/2732b911c57e607fa7aea5ba0c3d91b25bafb662/testdata/v1.12.0/sra_ids_test.csv' - input[6] = ena_metadata_fields + input[4] = nextflow_cli_args + input[5] = outdir + input[6] = 'https://raw.githubusercontent.com/nf-core/test-datasets/2732b911c57e607fa7aea5ba0c3d91b25bafb662/testdata/v1.12.0/sra_ids_test.csv' + input[7] = ena_metadata_fields """ } } From 5ab509a07deb6662273bd8b54ead630f4263aaab Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 20 Feb 2024 20:34:04 +0000 Subject: [PATCH 790/852] nextflow_cli_args is a list not a string --- .../tests/main.workflow_pipeline_initialisation.nf.test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_initialisation.nf.test b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_initialisation.nf.test index 5d3a2fcf..377d91f2 100644 --- a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_initialisation.nf.test +++ b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_initialisation.nf.test @@ -17,7 +17,7 @@ nextflow_workflow { help = false validate_params = false monochrome_logs = false - nextflow_cli_args = '' + nextflow_cli_args = [] outdir = "$params.outdir" ena_metadata_fields = null From fe16845833516530364d9d27eb560b40a7d969fd Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 21 Feb 2024 09:38:47 +0000 Subject: [PATCH 791/852] Update nf-test badge --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e6035281..bc17b5de 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ [![GitHub Actions CI Status](https://github.com/nf-core/fetchngs/actions/workflows/ci.yml/badge.svg)](https://github.com/nf-core/fetchngs/actions/workflows/ci.yml) -[![GitHub Actions Linting Status](https://github.com/nf-core/fetchngs/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/fetchngs/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/fetchngs/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.5070524-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.5070524)[![nf-test](https://img.shields.io/badge/unit_testing-nf--test-337ab7.svg)](https://github.com/askimed/nf-test) +[![GitHub Actions Linting Status](https://github.com/nf-core/fetchngs/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/fetchngs/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/fetchngs/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.5070524-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.5070524)[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com) [![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A523.04.0-23aa62.svg)](https://www.nextflow.io/) [![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/) From 1a8e68293c75f79c7b322b4a78b541d191df53b3 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 22 Feb 2024 11:40:56 +0000 Subject: [PATCH 792/852] Update Github Action to run full-sized test for all 3 download methods --- .github/workflows/cloud_tests_full.yml | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/.github/workflows/cloud_tests_full.yml b/.github/workflows/cloud_tests_full.yml index 2748b542..7b049497 100644 --- a/.github/workflows/cloud_tests_full.yml +++ b/.github/workflows/cloud_tests_full.yml @@ -19,6 +19,9 @@ jobs: run-full-tests-on-aws: if: ${{ github.event.inputs.platform == 'all' || github.event.inputs.platform == 'aws' || !github.event.inputs }} runs-on: ubuntu-latest + strategy: + matrix: + download_method: ["aspera", "ftp", "sratools"] steps: - uses: seqeralabs/action-tower-launch@v2 with: @@ -26,13 +29,14 @@ jobs: access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} compute_env: ${{ secrets.TOWER_CE_AWS_CPU }} workdir: "${{ secrets.TOWER_BUCKET_AWS }}/work/fetchngs/work-${{ github.sha }}" - run_name: "aws_fetchngs_full" + run_name: "aws_fetchngs_full_${{ matrix.download_method }}" revision: ${{ github.sha }} profiles: test_full parameters: | { "hook_url": "${{ secrets.MEGATESTS_ALERTS_SLACK_HOOK_URL }}", - "outdir": "${{ secrets.TOWER_BUCKET_AWS }}/fetchngs/results-${{ github.sha }}/" + "download_method": "${{ matrix.download_method }}", + "outdir": "${{ secrets.TOWER_BUCKET_AWS }}/fetchngs/results-${{ github.sha }}/download_method_${{ matrix.download_method }}/" } - uses: actions/upload-artifact@v3 with: @@ -42,6 +46,9 @@ jobs: run-full-tests-on-azure: if: ${{ github.event.inputs.platform == 'all' || github.event.inputs.platform == 'azure' || !github.event.inputs }} runs-on: ubuntu-latest + strategy: + matrix: + download_method: ["aspera", "ftp", "sratools"] steps: - uses: seqeralabs/action-tower-launch@v2 with: @@ -49,13 +56,14 @@ jobs: access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} compute_env: ${{ secrets.TOWER_CE_AZURE_CPU }} workdir: "${{ secrets.TOWER_BUCKET_AZURE }}/work/fetchngs/work-${{ github.sha }}" - run_name: "azure_fetchngs_full" + run_name: "azure_fetchngs_full_${{ matrix.download_method }}" revision: ${{ github.sha }} profiles: test_full parameters: | { "hook_url": "${{ secrets.MEGATESTS_ALERTS_SLACK_HOOK_URL }}", - "outdir": "${{ secrets.TOWER_BUCKET_AZURE }}/fetchngs/results-${{ github.sha }}/" + "download_method": "${{ matrix.download_method }}", + "outdir": "${{ secrets.TOWER_BUCKET_AZURE }}/fetchngs/results-${{ github.sha }}/download_method_${{ matrix.download_method }}/" } - uses: actions/upload-artifact@v3 with: @@ -65,6 +73,8 @@ jobs: run-full-tests-on-gcp: if: ${{ github.event.inputs.platform == 'gcp' || !github.event.inputs }} runs-on: ubuntu-latest + matrix: + download_method: ["aspera", "ftp", "sratools"] steps: - uses: seqeralabs/action-tower-launch@v2 with: @@ -72,13 +82,14 @@ jobs: access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} compute_env: ${{ secrets.TOWER_CE_GCP_CPU }} workdir: "${{ secrets.TOWER_BUCKET_GCP }}/work/fetchngs/work-${{ github.sha }}" - run_name: "gcp_fetchngs_full" + run_name: "gcp_fetchngs_full_${{ matrix.download_method }}" revision: ${{ github.sha }} profiles: test_full parameters: | { "hook_url": "${{ secrets.MEGATESTS_ALERTS_SLACK_HOOK_URL }}", - "outdir": "${{ secrets.TOWER_BUCKET_GCP }}/fetchngs/results-${{ github.sha }}/" + "download_method": "${{ matrix.download_method }}", + "outdir": "${{ secrets.TOWER_BUCKET_GCP }}/fetchngs/results-${{ github.sha }}/download_method_${{ matrix.download_method }}/" } - uses: actions/upload-artifact@v3 with: From 430c520267cc80ea0b24c9e84f626d4de55ec662 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 22 Feb 2024 11:42:54 +0000 Subject: [PATCH 793/852] Update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 62b239b8..20aa37c5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -48,6 +48,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements - [PR #268](https://github.com/nf-core/fetchngs/pull/268) - Add mermaid diagram - [PR #273](https://github.com/nf-core/fetchngs/pull/273) - Update utility subworkflows - [PR #283](https://github.com/nf-core/fetchngs/pull/283) - Template update for nf-core/tools v2.13 +- [PR #288](https://github.com/nf-core/fetchngs/pull/288) - Update Github Action to run full-sized test for all 3 download methods ### Software dependencies From 68d96f1f28f559ae81858b09834db717d059f676 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 22 Feb 2024 11:45:07 +0000 Subject: [PATCH 794/852] Add in missing strategy section --- .github/workflows/cloud_tests_full.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cloud_tests_full.yml b/.github/workflows/cloud_tests_full.yml index 7b049497..81cabbfd 100644 --- a/.github/workflows/cloud_tests_full.yml +++ b/.github/workflows/cloud_tests_full.yml @@ -73,8 +73,9 @@ jobs: run-full-tests-on-gcp: if: ${{ github.event.inputs.platform == 'gcp' || !github.event.inputs }} runs-on: ubuntu-latest - matrix: - download_method: ["aspera", "ftp", "sratools"] + strategy: + matrix: + download_method: ["aspera", "ftp", "sratools"] steps: - uses: seqeralabs/action-tower-launch@v2 with: From 58cc000570c229ee896a81337ea950ed3b662f4d Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 22 Feb 2024 12:25:21 +0000 Subject: [PATCH 795/852] Remove mentions of deprecated Synapse functionality in pipeline --- CITATIONS.md | 3 --- README.md | 4 ++-- docs/usage.md | 2 +- subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf | 2 +- .../tests/main.function.nf.test.snap | 6 ------ 5 files changed, 4 insertions(+), 13 deletions(-) diff --git a/CITATIONS.md b/CITATIONS.md index a982bfd2..62235e72 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -36,9 +36,6 @@ > Barrett T, Wilhite SE, Ledoux P, Evangelista C, Kim IF, Tomashevsky M, Marshall KA, Phillippy KH, Sherman PM, Holko M, Yefanov A, Lee H, Zhang N, Robertson CL, Serova N, Davis S, Soboleva A. NCBI GEO: archive for functional genomics data sets--update. Nucleic Acids Res. 2013 Jan;41(Database issue):D991-5. doi: 10.1093/nar/gks1193. Epub 2012 Nov 27. PubMed PMID: 23193258; PubMed Central PMCID: PMC3531084. -- [Synapse](https://pubmed.ncbi.nlm.nih.gov/24071850/) - > Omberg L, Ellrott K, Yuan Y, Kandoth C, Wong C, Kellen MR, Friend SH, Stuart J, Liang H, Margolin AA. Enabling transparent and collaborative computational analysis of 12 tumor types within The Cancer Genome Atlas. Nat Genet. 2013 Oct;45(10):1121-6. doi: 10.1038/ng.2761. PMID: 24071850; PMCID: PMC3950337. - ## Software packaging/containerisation/testing tools - [Anaconda](https://anaconda.com) diff --git a/README.md b/README.md index bc17b5de..7d869500 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ ## Introduction -**nf-core/fetchngs** is a bioinformatics pipeline to fetch metadata and raw FastQ files from both public and private databases. At present, the pipeline supports SRA / ENA / DDBJ / GEO / Synapse ids (see [usage docs](https://nf-co.re/fetchngs/usage#introduction)). +**nf-core/fetchngs** is a bioinformatics pipeline to fetch metadata and raw FastQ files from both public databases. At present, the pipeline supports SRA / ENA / DDBJ / GEO ids (see [usage docs](https://nf-co.re/fetchngs/usage#introduction)). ```mermaid flowchart LR @@ -114,7 +114,7 @@ For more details about the output files and reports, please refer to the ## Credits -nf-core/fetchngs was originally written by Harshil Patel ([@drpatelh](https://github.com/drpatelh)) from [Seqera Labs, Spain](https://seqera.io/) and Jose Espinosa-Carrasco ([@JoseEspinosa](https://github.com/JoseEspinosa)) from [The Comparative Bioinformatics Group](https://www.crg.eu/en/cedric_notredame) at [The Centre for Genomic Regulation, Spain](https://www.crg.eu/). Support for download of sequencing reads without FTP links via sra-tools was added by Moritz E. Beber ([@Midnighter](https://github.com/Midnighter)) from [Unseen Bio ApS, Denmark](https://unseenbio.com). The Synapse workflow was added by Daisy Han [@daisyhan97](https://github.com/daisyhan97) and Bruno Grande [@BrunoGrandePhD](https://github.com/BrunoGrandePhD) from [Sage Bionetworks, Seattle](https://sagebionetworks.org/). +nf-core/fetchngs was originally written by Harshil Patel ([@drpatelh](https://github.com/drpatelh)) from [Seqera Labs, Spain](https://seqera.io/) and Jose Espinosa-Carrasco ([@JoseEspinosa](https://github.com/JoseEspinosa)) from [The Comparative Bioinformatics Group](https://www.crg.eu/en/cedric_notredame) at [The Centre for Genomic Regulation, Spain](https://www.crg.eu/). Support for download of sequencing reads without FTP links via sra-tools was added by Moritz E. Beber ([@Midnighter](https://github.com/Midnighter)) from [Unseen Bio ApS, Denmark](https://unseenbio.com). ## Contributions and Support diff --git a/docs/usage.md b/docs/usage.md index 2bc9a125..8f27c3d5 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -6,7 +6,7 @@ ## Introduction -The pipeline has been set-up to automatically download and process the raw FastQ files from both public and private repositories. Identifiers can be provided in a file, one-per-line via the `--input` parameter. Currently, the following types of example identifiers are supported: +The pipeline has been set-up to automatically download and process the raw FastQ files from public repositories. Identifiers can be provided in a file, one-per-line via the `--input` parameter. Currently, the following types of example identifiers are supported: | `SRA` | `ENA` | `DDBJ` | `GEO` | | ------------ | ------------ | ------------ | ---------- | diff --git a/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf b/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf index 22079228..0c4307b5 100644 --- a/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_fetchngs_pipeline/main.nf @@ -158,7 +158,7 @@ def isSraId(input) { if (num_match == total_ids) { is_sra = true } else { - error("Mixture of ids provided via --input: ${no_match_ids.join(', ')}\nPlease provide either SRA / ENA / GEO / DDBJ or Synapse ids!") + error("Mixture of ids provided via --input: ${no_match_ids.join(', ')}\nPlease provide either SRA / ENA / GEO / DDBJ ids!") } } return is_sra diff --git a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.function.nf.test.snap b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.function.nf.test.snap index 335967e6..05840fc8 100644 --- a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.function.nf.test.snap +++ b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.function.nf.test.snap @@ -12,11 +12,5 @@ true ], "timestamp": "2024-01-19T16:36:43.68958" - }, - "Function isSynapseId": { - "content": [ - true - ], - "timestamp": "2024-01-19T16:37:12.992364" } } \ No newline at end of file From 0836b3b7c3dd15662ed3ffd09d73e4b96a28310a Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 22 Feb 2024 12:26:53 +0000 Subject: [PATCH 796/852] Update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 62b239b8..1ab82afa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -48,6 +48,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements - [PR #268](https://github.com/nf-core/fetchngs/pull/268) - Add mermaid diagram - [PR #273](https://github.com/nf-core/fetchngs/pull/273) - Update utility subworkflows - [PR #283](https://github.com/nf-core/fetchngs/pull/283) - Template update for nf-core/tools v2.13 +- [PR #290](https://github.com/nf-core/fetchngs/pull/290) - Remove mentions of deprecated Synapse functionality in pipeline ### Software dependencies From b234c7123c9816e248a639a2922556c86f82fd99 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 22 Feb 2024 18:27:10 +0100 Subject: [PATCH 797/852] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c5530353..063b345e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [[1.12.0](https://github.com/nf-core/fetchngs/releases/tag/1.12.0)] - 2024-02-02 +## [[1.12.0](https://github.com/nf-core/fetchngs/releases/tag/1.12.0)] - 2024-02-23 ### :warning: Major enhancements From 546120a0b0cb6eb5c6ecc64cdd45f04d373634a4 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Wed, 28 Feb 2024 12:15:36 +0100 Subject: [PATCH 798/852] replace mermaid diagram with subway map --- CHANGELOG.md | 3 +- README.md | 29 +- .../nf-core-fetchngs_metro_map_grey.png | Bin 0 -> 182235 bytes .../nf-core-fetchngs_metro_map_grey.svg | 12733 ++++++++++++++++ 4 files changed, 12736 insertions(+), 29 deletions(-) create mode 100644 docs/images/nf-core-fetchngs_metro_map_grey.png create mode 100644 docs/images/nf-core-fetchngs_metro_map_grey.svg diff --git a/CHANGELOG.md b/CHANGELOG.md index 063b345e..02ec0ebb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [[1.12.0](https://github.com/nf-core/fetchngs/releases/tag/1.12.0)] - 2024-02-23 +## [[1.12.0](https://github.com/nf-core/fetchngs/releases/tag/1.12.0)] - 2024-02-29 ### :warning: Major enhancements @@ -50,6 +50,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements - [PR #283](https://github.com/nf-core/fetchngs/pull/283) - Template update for nf-core/tools v2.13 - [PR #288](https://github.com/nf-core/fetchngs/pull/288) - Update Github Action to run full-sized test for all 3 download methods - [PR #290](https://github.com/nf-core/fetchngs/pull/290) - Remove mentions of deprecated Synapse functionality in pipeline +- [PR #291](https://github.com/nf-core/fetchngs/pull/291) - Replace mermaid diagram with subway map ### Software dependencies diff --git a/README.md b/README.md index 7d869500..d6c5c597 100644 --- a/README.md +++ b/README.md @@ -20,34 +20,7 @@ **nf-core/fetchngs** is a bioinformatics pipeline to fetch metadata and raw FastQ files from both public databases. At present, the pipeline supports SRA / ENA / DDBJ / GEO ids (see [usage docs](https://nf-co.re/fetchngs/usage#introduction)). -```mermaid -flowchart LR - IDS("Input - File") --> SRA & GEO & ENA & DDBJ - subgraph SG_DBIDS[Database IDs] - SRA("SRA") - GEO("GEO") - ENA("ENA") - DDBJ("DDBJ") - end - subgraph SG_METADATA[Download Metadata] - SRA & GEO & ENA & DDBJ --> META("Get - Metadata") - META --> LINKS("Get - Download - Links") - end - subgraph SG_FETCH_FASTQ[Download FastQ] - LINKS --> |--download_method 'ftp' | FTP("FTP") - LINKS --> |--download_method 'aspera' | ASPERA("Aspera") - LINKS --> |--download_method 'sratools' | SRATOOLS("sra-tools") - end - subgraph SG_FASTQ[Pipeline Outputs] - ASPERA & FTP & SRATOOLS --> FASTQ("FastQ") - FASTQ --> SAMPLESHEET("Samplesheet") - end - LINKS --> |--skip_fastq_download| SAMPLESHEET -``` +![nf-core/fetchngs metro map](docs/images/nf-core-fetchngs_metro_map_grey.png) ## Usage diff --git a/docs/images/nf-core-fetchngs_metro_map_grey.png b/docs/images/nf-core-fetchngs_metro_map_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..eb4b49bc94260eec9a9984c772f25642741cbbe3 GIT binary patch literal 182235 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 literal 0 HcmV?d00001 diff --git a/docs/images/nf-core-fetchngs_metro_map_grey.svg b/docs/images/nf-core-fetchngs_metro_map_grey.svg new file mode 100644 index 00000000..9857bc12 --- /dev/null +++ b/docs/images/nf-core-fetchngs_metro_map_grey.svg @@ -0,0 +1,12733 @@ + + + +21License:3nf-core/fetchngsENASRADDBJGEODATABASE IDsSTAGE2. Download FASTQ files1. Download metadata3. Downstream pipelinesAsperaFTPsra-toolsFASTQCSVFetchmetadataGetdownloadlinksnf-core/rnaseqnf-core/atacseqnf-core/viralreconnf-core/taxprofilerCSVCSVCSVCSVCSV From 549ff23caa0838c37ee812b3c92c0770c8c88c48 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Wed, 28 Feb 2024 12:24:36 +0100 Subject: [PATCH 799/852] fix PR number --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 02ec0ebb..ca348513 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -50,7 +50,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements - [PR #283](https://github.com/nf-core/fetchngs/pull/283) - Template update for nf-core/tools v2.13 - [PR #288](https://github.com/nf-core/fetchngs/pull/288) - Update Github Action to run full-sized test for all 3 download methods - [PR #290](https://github.com/nf-core/fetchngs/pull/290) - Remove mentions of deprecated Synapse functionality in pipeline -- [PR #291](https://github.com/nf-core/fetchngs/pull/291) - Replace mermaid diagram with subway map +- [PR #294](https://github.com/nf-core/fetchngs/pull/294) - Replace mermaid diagram with subway map ### Software dependencies From 5da86768b2acc166ec152995dcd02a9ea66fe2f3 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Wed, 28 Feb 2024 12:29:27 +0100 Subject: [PATCH 800/852] be less stringent with tests expectation --- .github/workflows/ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c474190e..fa75579f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -161,7 +161,9 @@ jobs: confirm-pass: runs-on: ubuntu-latest - needs: [test] + needs: + - changes + - test if: always() steps: - name: All tests ok From a4463111cbd0beec6219b70ac3d00d56d73c7ab4 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Wed, 28 Feb 2024 12:30:44 +0100 Subject: [PATCH 801/852] revert changes --- .github/workflows/ci.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fa75579f..c474190e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -161,9 +161,7 @@ jobs: confirm-pass: runs-on: ubuntu-latest - needs: - - changes - - test + needs: [test] if: always() steps: - name: All tests ok From 9e5221e2c359ae5ed95eb4d3845e66e799e1d8a7 Mon Sep 17 00:00:00 2001 From: maxulysse Date: Wed, 28 Feb 2024 12:32:15 +0100 Subject: [PATCH 802/852] be less stringent with tests expectation --- .github/workflows/ci.yml | 4 +++- CHANGELOG.md | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c474190e..fa75579f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -161,7 +161,9 @@ jobs: confirm-pass: runs-on: ubuntu-latest - needs: [test] + needs: + - changes + - test if: always() steps: - name: All tests ok diff --git a/CHANGELOG.md b/CHANGELOG.md index 063b345e..625e4de9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -50,6 +50,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements - [PR #283](https://github.com/nf-core/fetchngs/pull/283) - Template update for nf-core/tools v2.13 - [PR #288](https://github.com/nf-core/fetchngs/pull/288) - Update Github Action to run full-sized test for all 3 download methods - [PR #290](https://github.com/nf-core/fetchngs/pull/290) - Remove mentions of deprecated Synapse functionality in pipeline +- [PR #295](https://github.com/nf-core/fetchngs/pull/295) - Be less stringent with test expectations for CI ### Software dependencies From d538a927c8959e861007d3c4c741092e3bd1c8ef Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 28 Feb 2024 11:41:56 +0000 Subject: [PATCH 803/852] Remove --outdir definition in nf-tests for local modules --- modules/local/aspera_cli/tests/main.nf.test | 4 ---- modules/local/multiqc_mappings_config/tests/main.nf.test | 4 ---- modules/local/sra_fastq_ftp/tests/main.nf.test | 4 ---- modules/local/sra_ids_to_runinfo/tests/main.nf.test | 4 ---- modules/local/sra_runinfo_to_ftp/tests/main.nf.test | 4 ---- modules/local/sra_to_samplesheet/tests/main.nf.test | 4 ---- 6 files changed, 24 deletions(-) diff --git a/modules/local/aspera_cli/tests/main.nf.test b/modules/local/aspera_cli/tests/main.nf.test index b2f5f1bd..63347000 100644 --- a/modules/local/aspera_cli/tests/main.nf.test +++ b/modules/local/aspera_cli/tests/main.nf.test @@ -7,10 +7,6 @@ nextflow_process { test("Should run without failures") { when { - params { - outdir = "$outputDir" - } - process { """ input[0] = [ diff --git a/modules/local/multiqc_mappings_config/tests/main.nf.test b/modules/local/multiqc_mappings_config/tests/main.nf.test index 106f3248..dbb4d74f 100644 --- a/modules/local/multiqc_mappings_config/tests/main.nf.test +++ b/modules/local/multiqc_mappings_config/tests/main.nf.test @@ -7,10 +7,6 @@ nextflow_process { test("Should run without failures") { when { - params { - outdir = "$outputDir" - } - process { """ input[0] = file(params.pipelines_testdata_base_path + 'csv/SRX9626017_SRR13191702.mappings.csv', checkIfExists: true) diff --git a/modules/local/sra_fastq_ftp/tests/main.nf.test b/modules/local/sra_fastq_ftp/tests/main.nf.test index f58aaae2..bf005290 100644 --- a/modules/local/sra_fastq_ftp/tests/main.nf.test +++ b/modules/local/sra_fastq_ftp/tests/main.nf.test @@ -7,10 +7,6 @@ nextflow_process { test("Should run without failures") { when { - params { - outdir = "$outputDir" - } - process { """ input[0] = [ diff --git a/modules/local/sra_ids_to_runinfo/tests/main.nf.test b/modules/local/sra_ids_to_runinfo/tests/main.nf.test index 2e510ea1..48797a1a 100644 --- a/modules/local/sra_ids_to_runinfo/tests/main.nf.test +++ b/modules/local/sra_ids_to_runinfo/tests/main.nf.test @@ -7,10 +7,6 @@ nextflow_process { test("Should run without failures") { when { - params { - outdir = "$outputDir" - } - process { """ input[0] = 'SRR13191702' diff --git a/modules/local/sra_runinfo_to_ftp/tests/main.nf.test b/modules/local/sra_runinfo_to_ftp/tests/main.nf.test index 4b03249c..39db814a 100644 --- a/modules/local/sra_runinfo_to_ftp/tests/main.nf.test +++ b/modules/local/sra_runinfo_to_ftp/tests/main.nf.test @@ -7,10 +7,6 @@ nextflow_process { test("Should run without failures") { when { - params { - outdir = "$outputDir" - } - process { """ input[0] = file(params.pipelines_testdata_base_path + 'tsv/SRR13191702.runinfo.tsv', checkIfExists: true) diff --git a/modules/local/sra_to_samplesheet/tests/main.nf.test b/modules/local/sra_to_samplesheet/tests/main.nf.test index 4458858e..ed765158 100644 --- a/modules/local/sra_to_samplesheet/tests/main.nf.test +++ b/modules/local/sra_to_samplesheet/tests/main.nf.test @@ -7,10 +7,6 @@ nextflow_process { test("Should run without failures") { when { - params { - outdir = "$outputDir" - } - process { """ input[0] = [id:'ERX1188904_ERR1109373', run_accession:'ERR1109373', experiment_accession:'ERX1188904', sample_accession:'SAMEA3643867', experiment_alias:'ena-EXPERIMENT-CAM-03-11-2015-17:01:52:847-7', run_alias:'ena-RUN-CAM-03-11-2015-17:01:52:847-7', sample_alias:'sample_56', study_alias:'ena-STUDY-CAM-02-11-2015-17:42:24:189-13', library_layout:'PAIRED', experiment_title:'Illumina HiSeq 2500 paired end sequencing', sample_title:'RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome', sample_description:'RNA-Seq reads mapped onto L. Boulardi Toti-like virus genome', fastq_md5:'8d7d7b854d0207d1226477a30103fade;9fd57225d6c07a31843276d6df9b15c0;5a62e8f785687dce890cfb4fe3e607f9', fastq_ftp:'ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_1.fastq.gz;ftp.sra.ebi.ac.uk/vol1/fastq/ERR110/003/ERR1109373/ERR1109373_2.fastq.gz', fastq_1:'./results/fastq/ERX1188904_ERR1109373_1.fastq.gz', fastq_2:'./results/fastq/ERX1188904_ERR1109373_2.fastq.gz', md5_1:'9fd57225d6c07a31843276d6df9b15c0', md5_2:'5a62e8f785687dce890cfb4fe3e607f9', single_end:false] From 41f0a96d670ca8ad87e326a08e684542bb69725a Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 28 Feb 2024 11:50:42 +0000 Subject: [PATCH 804/852] Remove --outdir definition in nf-tests for nf-core/modules and update snapshots --- .../sratoolsncbisettings/tests/main.nf.test.snap | 8 ++++++-- .../nf-core/sratools/fasterqdump/tests/main.nf.test | 8 -------- .../sratools/fasterqdump/tests/main.nf.test.snap | 12 ++++++++++-- modules/nf-core/sratools/prefetch/tests/main.nf.test | 6 ------ .../sratools/prefetch/tests/main.nf.test.snap | 12 ++++++++++-- modules/nf-core/untar/tests/main.nf.test | 6 ------ modules/nf-core/untar/tests/main.nf.test.snap | 12 ++++++++++-- 7 files changed, 36 insertions(+), 28 deletions(-) diff --git a/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test.snap b/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test.snap index 65a706d4..5e314f0b 100644 --- a/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test.snap +++ b/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test.snap @@ -5,6 +5,10 @@ "versions.yml:md5,3d6ee88cce1ee517e198633f062589a8" ] ], - "timestamp": "2024-01-09T22:43:44.996003" + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T11:47:15.824443" } -} +} \ No newline at end of file diff --git a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test index c64f6fc1..695394d4 100644 --- a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test +++ b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test @@ -20,10 +20,6 @@ nextflow_process { } when { - params { - outdir = "$outputDir" - } - process { """ input[0] = UNTAR.out.untar.map{ meta, files -> [ [ id:'test_single_end', single_end:true ], files]} @@ -55,10 +51,6 @@ nextflow_process { } when { - params { - outdir = "$outputDir" - } - process { """ input[0] = UNTAR.out.untar.map{ meta, files -> [ [ id:'test_paired_end', single_end:false ], files]} diff --git a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap index 0e590311..3439b400 100644 --- a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap +++ b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap @@ -28,7 +28,11 @@ ] } ], - "timestamp": "2024-01-30T18:02:53.958171" + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T11:47:42.981471" }, "Paired-end": { "content": [ @@ -65,6 +69,10 @@ ] } ], - "timestamp": "2024-01-30T18:03:20.841426" + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T11:48:09.914497" } } \ No newline at end of file diff --git a/modules/nf-core/sratools/prefetch/tests/main.nf.test b/modules/nf-core/sratools/prefetch/tests/main.nf.test index b0f5ffa2..c3ebd91e 100644 --- a/modules/nf-core/sratools/prefetch/tests/main.nf.test +++ b/modules/nf-core/sratools/prefetch/tests/main.nf.test @@ -6,9 +6,6 @@ nextflow_process { test("sratools/prefetch") { when { - params { - outdir = "output" - } process { """ input[0] = Channel.of([ [ id:'test', single_end:false ], 'DRR000774' ]) @@ -29,9 +26,6 @@ nextflow_process { test("sratools/prefetch with sralite") { when { - params { - outdir = "output" - } process { """ input[0] = Channel.of([ [ id:'test', single_end:false ], 'SRR1170046' ]) diff --git a/modules/nf-core/sratools/prefetch/tests/main.nf.test.snap b/modules/nf-core/sratools/prefetch/tests/main.nf.test.snap index ab1d2088..946fc869 100644 --- a/modules/nf-core/sratools/prefetch/tests/main.nf.test.snap +++ b/modules/nf-core/sratools/prefetch/tests/main.nf.test.snap @@ -32,7 +32,11 @@ ] } ], - "timestamp": "2023-10-13T12:11:24.563510389" + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T11:49:02.309737" }, "sratools/prefetch": { "content": [ @@ -67,6 +71,10 @@ ] } ], - "timestamp": "2023-10-13T12:11:02.75256571" + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T11:48:37.428307" } } \ No newline at end of file diff --git a/modules/nf-core/untar/tests/main.nf.test b/modules/nf-core/untar/tests/main.nf.test index 05134043..98b769ad 100644 --- a/modules/nf-core/untar/tests/main.nf.test +++ b/modules/nf-core/untar/tests/main.nf.test @@ -7,9 +7,6 @@ nextflow_process { test("test_untar") { when { - params { - outdir = "$outputDir" - } process { """ input[0] = [ [], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/db/kraken2.tar.gz', checkIfExists: true) ] @@ -29,9 +26,6 @@ nextflow_process { test("test_untar_onlyfiles") { when { - params { - outdir = "$outputDir" - } process { """ input[0] = [ [], file(params.modules_testdata_base_path + 'generic/tar/hello.tar.gz', checkIfExists: true) ] diff --git a/modules/nf-core/untar/tests/main.nf.test.snap b/modules/nf-core/untar/tests/main.nf.test.snap index ace42576..64550292 100644 --- a/modules/nf-core/untar/tests/main.nf.test.snap +++ b/modules/nf-core/untar/tests/main.nf.test.snap @@ -12,7 +12,11 @@ ] ] ], - "timestamp": "2023-10-18T11:56:46.878844" + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T11:49:41.320643" }, "test_untar": { "content": [ @@ -29,6 +33,10 @@ ] ] ], - "timestamp": "2023-10-18T11:56:08.16574" + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T11:49:33.795172" } } \ No newline at end of file From f8da74e62842c960969e4cd1cd6d4f328c9d3ae6 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 28 Feb 2024 11:52:55 +0000 Subject: [PATCH 805/852] Update snapshots for local modules --- modules/local/aspera_cli/tests/main.nf.test.snap | 6 +++++- .../local/multiqc_mappings_config/tests/main.nf.test.snap | 6 +++++- modules/local/sra_fastq_ftp/tests/main.nf.test.snap | 6 +++++- modules/local/sra_ids_to_runinfo/tests/main.nf.test.snap | 6 +++++- modules/local/sra_runinfo_to_ftp/tests/main.nf.test.snap | 6 +++++- modules/local/sra_to_samplesheet/tests/main.nf.test.snap | 6 +++++- 6 files changed, 30 insertions(+), 6 deletions(-) diff --git a/modules/local/aspera_cli/tests/main.nf.test.snap b/modules/local/aspera_cli/tests/main.nf.test.snap index 15497822..0ba6a643 100644 --- a/modules/local/aspera_cli/tests/main.nf.test.snap +++ b/modules/local/aspera_cli/tests/main.nf.test.snap @@ -66,6 +66,10 @@ ] } ], - "timestamp": "2024-01-29T13:00:29.847293" + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T11:52:00.601018" } } \ No newline at end of file diff --git a/modules/local/multiqc_mappings_config/tests/main.nf.test.snap b/modules/local/multiqc_mappings_config/tests/main.nf.test.snap index 1a4d16c4..43e46f61 100644 --- a/modules/local/multiqc_mappings_config/tests/main.nf.test.snap +++ b/modules/local/multiqc_mappings_config/tests/main.nf.test.snap @@ -22,6 +22,10 @@ ] } ], - "timestamp": "2023-09-22T10:58:18.132284" + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T11:52:12.65888" } } \ No newline at end of file diff --git a/modules/local/sra_fastq_ftp/tests/main.nf.test.snap b/modules/local/sra_fastq_ftp/tests/main.nf.test.snap index 531a5ec3..5b300f8c 100644 --- a/modules/local/sra_fastq_ftp/tests/main.nf.test.snap +++ b/modules/local/sra_fastq_ftp/tests/main.nf.test.snap @@ -66,6 +66,10 @@ ] } ], - "timestamp": "2023-12-20T23:33:35.159073" + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T11:51:51.301654" } } \ No newline at end of file diff --git a/modules/local/sra_ids_to_runinfo/tests/main.nf.test.snap b/modules/local/sra_ids_to_runinfo/tests/main.nf.test.snap index 241efe2a..f7b6cee5 100644 --- a/modules/local/sra_ids_to_runinfo/tests/main.nf.test.snap +++ b/modules/local/sra_ids_to_runinfo/tests/main.nf.test.snap @@ -16,6 +16,10 @@ ] } ], - "timestamp": "2023-09-22T10:58:56.721948" + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T11:52:05.345153" } } \ No newline at end of file diff --git a/modules/local/sra_runinfo_to_ftp/tests/main.nf.test.snap b/modules/local/sra_runinfo_to_ftp/tests/main.nf.test.snap index cd246303..be190f5a 100644 --- a/modules/local/sra_runinfo_to_ftp/tests/main.nf.test.snap +++ b/modules/local/sra_runinfo_to_ftp/tests/main.nf.test.snap @@ -16,6 +16,10 @@ ] } ], - "timestamp": "2023-09-22T10:58:36.16611" + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T11:51:45.748227" } } \ No newline at end of file diff --git a/modules/local/sra_to_samplesheet/tests/main.nf.test.snap b/modules/local/sra_to_samplesheet/tests/main.nf.test.snap index 8cc8686a..568f3ea7 100644 --- a/modules/local/sra_to_samplesheet/tests/main.nf.test.snap +++ b/modules/local/sra_to_samplesheet/tests/main.nf.test.snap @@ -108,6 +108,10 @@ ] } ], - "timestamp": "2023-09-22T10:58:27.169349" + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T11:51:38.244046" } } \ No newline at end of file From 03374f8a2b115602db138e8433a03cd1d7486984 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 28 Feb 2024 11:57:17 +0000 Subject: [PATCH 806/852] Remove --outdir definition in nf-tests for local subworkflows and update snapshots --- .../tests/main.function.nf.test | 6 ++++-- .../tests/main.function.nf.test.snap | 18 +++++++++++++++--- .../main.workflow_pipeline_completion.nf.test | 3 --- ...in.workflow_pipeline_initialisation.nf.test | 3 --- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.function.nf.test b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.function.nf.test index 85c16bf9..f2e3f12a 100644 --- a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.function.nf.test +++ b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.function.nf.test @@ -69,8 +69,10 @@ nextflow_function { function "sraCurateSamplesheetWarn" then { - assert function.success - assert snapshot(function.result).match() + assertAll( + { assert function.success }, + { assert snapshot(function.result).match() } + ) } } diff --git a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.function.nf.test.snap b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.function.nf.test.snap index 05840fc8..99fb20e7 100644 --- a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.function.nf.test.snap +++ b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.function.nf.test.snap @@ -1,16 +1,28 @@ { "Function sraCurateSamplesheetWarn": { "content": null, - "timestamp": "2024-01-19T16:37:05.668505" + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T11:55:41.001798" }, "Function sraCheckENAMetadataFields [success]": { "content": null, - "timestamp": "2024-01-19T16:36:51.121603" + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T11:55:33.679255" }, "Function isSraId": { "content": [ true ], - "timestamp": "2024-01-19T16:36:43.68958" + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T11:55:29.999289" } } \ No newline at end of file diff --git a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_completion.nf.test b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_completion.nf.test index b2114675..da87b66b 100644 --- a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_completion.nf.test +++ b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_completion.nf.test @@ -8,9 +8,6 @@ nextflow_workflow { test("Should run") { when { - params { - outdir = "tests/results" - } workflow { """ email = null diff --git a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_initialisation.nf.test b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_initialisation.nf.test index 377d91f2..2b6878a3 100644 --- a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_initialisation.nf.test +++ b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_initialisation.nf.test @@ -8,9 +8,6 @@ nextflow_workflow { test("Should run") { when { - params { - outdir = "tests/results" - } workflow { """ version = false From cd8f66db4962555263e7d2b67a12ef7f09e457e7 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 28 Feb 2024 12:05:48 +0000 Subject: [PATCH 807/852] Remove --outdir definition in nf-tests for nf-core subworkflows and update snapshots --- .../tests/main.nf.test | 3 -- .../tests/main.nf.test.snap | 14 +++---- .../tests/main.function.nf.test.snap | 12 +++++- .../tests/main.workflow.nf.test | 18 ++------ .../tests/main.function.nf.test.snap | 42 +++++++++++++++---- .../tests/main.workflow.nf.test.snap | 6 ++- 6 files changed, 60 insertions(+), 35 deletions(-) diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test index 7293a792..7b41ed7e 100644 --- a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test @@ -20,9 +20,6 @@ nextflow_workflow { input[1] = [] """ } - params { - outdir = "output" - } } then { diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap index d64857ef..bec84076 100644 --- a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap @@ -7,7 +7,7 @@ "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-02-01T08:34:54.56022" + "timestamp": "2024-02-28T12:02:56.176292" }, "test_pe_reads_2_lines": { "content": [ @@ -24,7 +24,7 @@ "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-02-01T08:34:54.532626" + "timestamp": "2024-02-28T12:02:56.166207" }, "test_pe_reads_2_size": { "content": [ @@ -34,7 +34,7 @@ "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-02-01T08:34:54.542804" + "timestamp": "2024-02-28T12:02:56.168869" }, "versions": { "content": [ @@ -48,7 +48,7 @@ "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-02-01T08:34:54.570734" + "timestamp": "2024-02-28T12:02:56.17931" }, "test_pe_reads_1_size": { "content": [ @@ -58,7 +58,7 @@ "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-02-01T08:34:54.525795" + "timestamp": "2024-02-28T12:02:56.163669" }, "test_se_reads_lines": { "content": [ @@ -75,7 +75,7 @@ "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-02-01T08:34:54.550392" + "timestamp": "2024-02-28T12:02:56.171227" }, "test_pe_reads_1_lines": { "content": [ @@ -92,6 +92,6 @@ "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-02-01T08:34:54.509486" + "timestamp": "2024-02-28T12:02:56.161354" } } \ No newline at end of file diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.function.nf.test.snap b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.function.nf.test.snap index db2030f8..e3f0baf4 100644 --- a/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.function.nf.test.snap +++ b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.function.nf.test.snap @@ -3,10 +3,18 @@ "content": [ "v9.9.9" ], - "timestamp": "2024-01-19T11:32:36.031083" + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T12:02:05.308243" }, "Test Function checkCondaChannels": { "content": null, - "timestamp": "2024-01-19T11:32:50.456" + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T12:02:12.425833" } } \ No newline at end of file diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test index 94e7198c..530cca54 100644 --- a/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test +++ b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test @@ -8,9 +8,6 @@ nextflow_workflow { test("Should run no inputs") { when { - params { - outdir = "tests/results" - } workflow { """ print_version = false @@ -36,9 +33,6 @@ nextflow_workflow { test("Should print version") { when { - params { - outdir = "tests/results" - } workflow { """ print_version = true @@ -65,19 +59,16 @@ nextflow_workflow { test("Should dump params") { when { - params { - outdir = "$outputDir" - } workflow { """ print_version = false dump_parameters = true - outdir = params.outdir + outdir = 'results' check_conda_channels = false input[0] = false input[1] = true - input[2] = params.outdir + input[2] = outdir input[3] = false """ } @@ -93,14 +84,11 @@ nextflow_workflow { test("Should not create params JSON if no output directory") { when { - params { - outdir = "$outputDir" - } workflow { """ print_version = false dump_parameters = true - outdir = params.outdir + outdir = 'results' check_conda_channels = false input[0] = false diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test.snap b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test.snap index 10f948e6..1037232c 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test.snap +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test.snap @@ -1,25 +1,41 @@ { "Test Function checkProfileProvided": { "content": null, - "timestamp": "2024-02-09T15:43:55.145717" + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T12:03:03.360873" }, "Test Function checkConfigProvided": { "content": [ true ], - "timestamp": "2024-01-19T11:34:13.548431224" + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T12:02:59.729647" }, "Test Function nfCoreLogo": { "content": [ "\n\n-\u001b[2m----------------------------------------------------\u001b[0m-\n \u001b[0;32m,--.\u001b[0;30m/\u001b[0;32m,-.\u001b[0m\n\u001b[0;34m ___ __ __ __ ___ \u001b[0;32m/,-._.--~'\u001b[0m\n\u001b[0;34m |\\ | |__ __ / ` / \\ |__) |__ \u001b[0;33m} {\u001b[0m\n\u001b[0;34m | \\| | \\__, \\__/ | \\ |___ \u001b[0;32m\\`-._,-`-,\u001b[0m\n \u001b[0;32m`._,._,'\u001b[0m\n\u001b[0;35m nextflow_workflow v9.9.9\u001b[0m\n-\u001b[2m----------------------------------------------------\u001b[0m-\n" ], - "timestamp": "2024-01-19T11:34:38.840454873" + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T12:03:10.562934" }, "Test Function workflowCitation": { "content": [ "If you use nextflow_workflow for your analysis please cite:\n\n* The pipeline\n https://doi.org/10.5281/zenodo.5070524\n\n* The nf-core framework\n https://doi.org/10.1038/s41587-020-0439-x\n\n* Software dependencies\n https://github.com/nextflow_workflow/blob/master/CITATIONS.md" ], - "timestamp": "2024-01-19T11:34:22.24352016" + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T12:03:07.019761" }, "Test Function without logColours": { "content": [ @@ -73,13 +89,21 @@ "biwhite": "" } ], - "timestamp": "2024-01-19T11:35:04.418416984" + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T12:03:17.969323" }, "Test Function dashedLine": { "content": [ "-\u001b[2m----------------------------------------------------\u001b[0m-" ], - "timestamp": "2024-01-19T11:34:55.420000755" + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T12:03:14.366181" }, "Test Function with logColours": { "content": [ @@ -133,6 +157,10 @@ "biwhite": "\u001b[1;97m" } ], - "timestamp": "2024-01-19T11:35:13.436366565" + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T12:03:21.714424" } } \ No newline at end of file diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test.snap b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test.snap index d07ce54c..859d1030 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test.snap +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.workflow.nf.test.snap @@ -10,6 +10,10 @@ ] } ], - "timestamp": "2024-01-19T11:35:22.538940073" + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-28T12:03:25.726491" } } \ No newline at end of file From 669b8686f6ac326e554b6bd4c73feb3c4882c4e2 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 28 Feb 2024 12:08:46 +0000 Subject: [PATCH 808/852] Update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ca348513..dbd7ac4d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -51,6 +51,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements - [PR #288](https://github.com/nf-core/fetchngs/pull/288) - Update Github Action to run full-sized test for all 3 download methods - [PR #290](https://github.com/nf-core/fetchngs/pull/290) - Remove mentions of deprecated Synapse functionality in pipeline - [PR #294](https://github.com/nf-core/fetchngs/pull/294) - Replace mermaid diagram with subway map +- [PR #296](https://github.com/nf-core/fetchngs/pull/296) - Remove params.outdir from tests where required and update snapshots ### Software dependencies From cbe835e4906e8dde78461d9ff48f0884701c6762 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 28 Feb 2024 12:15:59 +0000 Subject: [PATCH 809/852] Remove --outdir definition in nf-tests for workflows --- workflows/sra/tests/main.nf.test | 3 --- workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test | 1 - workflows/sra/tests/sra_download_method_aspera.nf.test | 1 - workflows/sra/tests/sra_download_method_sratools.nf.test | 1 - workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test | 1 - workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test | 1 - workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test | 1 - workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test | 1 - workflows/sra/tests/sra_skip_fastq_download.nf.test | 1 - 9 files changed, 11 deletions(-) diff --git a/workflows/sra/tests/main.nf.test b/workflows/sra/tests/main.nf.test index dddc5275..1e2856c1 100644 --- a/workflows/sra/tests/main.nf.test +++ b/workflows/sra/tests/main.nf.test @@ -20,9 +20,6 @@ nextflow_workflow { input[0] = Channel.from("DRX026011", "ERX1234253", "SRX6725035") """ } - params { - outdir = "$outputDir" - } } then { diff --git a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test index 98d1432d..c8d17876 100644 --- a/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test +++ b/workflows/sra/tests/sra_custom_ena_metadata_fields.nf.test @@ -21,7 +21,6 @@ nextflow_workflow { """ } params { - outdir = "$outputDir" nf_core_pipeline = "rnaseq" ena_metadata_fields = "run_accession,experiment_accession,library_layout,fastq_ftp,fastq_md5" sample_mapping_fields = "run_accession,library_layout" diff --git a/workflows/sra/tests/sra_download_method_aspera.nf.test b/workflows/sra/tests/sra_download_method_aspera.nf.test index d36f9095..d431a571 100644 --- a/workflows/sra/tests/sra_download_method_aspera.nf.test +++ b/workflows/sra/tests/sra_download_method_aspera.nf.test @@ -21,7 +21,6 @@ nextflow_workflow { """ } params { - outdir = "$outputDir" download_method = 'aspera' } } diff --git a/workflows/sra/tests/sra_download_method_sratools.nf.test b/workflows/sra/tests/sra_download_method_sratools.nf.test index 05613f1e..e4f8c2d2 100644 --- a/workflows/sra/tests/sra_download_method_sratools.nf.test +++ b/workflows/sra/tests/sra_download_method_sratools.nf.test @@ -21,7 +21,6 @@ nextflow_workflow { """ } params { - outdir = "$outputDir" download_method = 'sratools' } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test index 522ab75b..72f8d595 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_atacseq.nf.test @@ -21,7 +21,6 @@ nextflow_workflow { """ } params { - outdir = "$outputDir" nf_core_pipeline = "atacseq" } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test index f6f1b560..2e20902a 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_rnaseq.nf.test @@ -21,7 +21,6 @@ nextflow_workflow { """ } params { - outdir = "$outputDir" nf_core_pipeline = "rnaseq" } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test index b9373b57..50650b79 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_taxprofiler.nf.test @@ -21,7 +21,6 @@ nextflow_workflow { """ } params { - outdir = "$outputDir" nf_core_pipeline = "taxprofiler" } } diff --git a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test index 4985b9d0..1fe9cc41 100644 --- a/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test +++ b/workflows/sra/tests/sra_nf_core_pipeline_viralrecon.nf.test @@ -21,7 +21,6 @@ nextflow_workflow { """ } params { - outdir = "$outputDir" nf_core_pipeline = "viralrecon" } } diff --git a/workflows/sra/tests/sra_skip_fastq_download.nf.test b/workflows/sra/tests/sra_skip_fastq_download.nf.test index 245dbb80..8663cf3f 100644 --- a/workflows/sra/tests/sra_skip_fastq_download.nf.test +++ b/workflows/sra/tests/sra_skip_fastq_download.nf.test @@ -20,7 +20,6 @@ nextflow_workflow { """ } params { - outdir = "$outputDir" skip_fastq_download = true } } From 502bc7024925e3af1e707b45ab67dd27f5db63a8 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 28 Feb 2024 12:21:54 +0000 Subject: [PATCH 810/852] Fix missed tests for nf-core modules --- .../nf-core/custom/sratoolsncbisettings/tests/main.nf.test | 1 - .../nf-core/custom/sratoolsncbisettings/tests/nextflow.config | 2 -- .../utils_nextflow_pipeline/tests/main.workflow.nf.test | 4 ++-- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test b/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test index 8cd0de8a..e9ea68dc 100644 --- a/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test +++ b/modules/nf-core/custom/sratoolsncbisettings/tests/main.nf.test @@ -11,7 +11,6 @@ nextflow_process { params { settings_path = '/tmp/.ncbi' settings_file = "${params.settings_path}/user-settings.mkfg" - outdir = "$outputDir" } process { diff --git a/modules/nf-core/custom/sratoolsncbisettings/tests/nextflow.config b/modules/nf-core/custom/sratoolsncbisettings/tests/nextflow.config index c4a96e94..df5def04 100644 --- a/modules/nf-core/custom/sratoolsncbisettings/tests/nextflow.config +++ b/modules/nf-core/custom/sratoolsncbisettings/tests/nextflow.config @@ -4,8 +4,6 @@ params.settings_file = "${params.settings_path}/user-settings.mkfg" env.NCBI_SETTINGS = params.settings_file process { - - publishDir = { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" } withName: CUSTOM_SRATOOLSNCBISETTINGS { containerOptions = { (workflow.containerEngine == 'singularity') ? diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test index 530cca54..13782037 100644 --- a/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test +++ b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test @@ -88,12 +88,12 @@ nextflow_workflow { """ print_version = false dump_parameters = true - outdir = 'results' + outdir = null check_conda_channels = false input[0] = false input[1] = true - input[2] = null + input[2] = outdir input[3] = false """ } From 5b20998323feafb763f458d58e8eadb6d25995bd Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 28 Feb 2024 12:28:57 +0000 Subject: [PATCH 811/852] Change outdir path in local subworkflow --- .../tests/main.workflow_pipeline_completion.nf.test | 2 +- .../tests/main.workflow_pipeline_initialisation.nf.test | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_completion.nf.test b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_completion.nf.test index da87b66b..b94f72cf 100644 --- a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_completion.nf.test +++ b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_completion.nf.test @@ -13,7 +13,7 @@ nextflow_workflow { email = null email_on_fail = null plaintext_email = false - outdir = "tests/results" + outdir = 'results' monochrome_logs = false hook_url = null diff --git a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_initialisation.nf.test b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_initialisation.nf.test index 2b6878a3..e04aa726 100644 --- a/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_initialisation.nf.test +++ b/subworkflows/local/utils_nfcore_fetchngs_pipeline/tests/main.workflow_pipeline_initialisation.nf.test @@ -15,7 +15,7 @@ nextflow_workflow { validate_params = false monochrome_logs = false nextflow_cli_args = [] - outdir = "$params.outdir" + outdir = 'results' ena_metadata_fields = null input[0] = version From 92cbb7db1454f026e16e45db5fc13121453446e9 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 29 Feb 2024 09:36:59 +0000 Subject: [PATCH 812/852] Re-install modules and subworkflows from nf-core --- modules.json | 16 ++++++++-------- .../fasterqdump/sratools-fasterqdump.diff | 3 +-- .../sratools/fasterqdump/tests/main.nf.test.snap | 16 ++++++++-------- .../tests/main.nf.test.snap | 14 +++++++------- 4 files changed, 24 insertions(+), 25 deletions(-) diff --git a/modules.json b/modules.json index 71a3e25c..93f4553b 100644 --- a/modules.json +++ b/modules.json @@ -7,23 +7,23 @@ "nf-core": { "custom/sratoolsncbisettings": { "branch": "master", - "git_sha": "3aa09ac8899d7735cb5bc004da0ef5f35f9a7901", + "git_sha": "5caf7640a9ef1d18d765d55339be751bb0969dfa", "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] }, "sratools/fasterqdump": { "branch": "master", - "git_sha": "e719354ba77df0a1bd310836aa2039b45c29d620", + "git_sha": "5caf7640a9ef1d18d765d55339be751bb0969dfa", "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"], "patch": "modules/nf-core/sratools/fasterqdump/sratools-fasterqdump.diff" }, "sratools/prefetch": { "branch": "master", - "git_sha": "e719354ba77df0a1bd310836aa2039b45c29d620", + "git_sha": "5caf7640a9ef1d18d765d55339be751bb0969dfa", "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] }, "untar": { "branch": "master", - "git_sha": "e719354ba77df0a1bd310836aa2039b45c29d620", + "git_sha": "5caf7640a9ef1d18d765d55339be751bb0969dfa", "installed_by": ["modules"] } } @@ -32,22 +32,22 @@ "nf-core": { "fastq_download_prefetch_fasterqdump_sratools": { "branch": "master", - "git_sha": "3aa09ac8899d7735cb5bc004da0ef5f35f9a7901", + "git_sha": "5caf7640a9ef1d18d765d55339be751bb0969dfa", "installed_by": ["subworkflows"] }, "utils_nextflow_pipeline": { "branch": "master", - "git_sha": "cd08c91373cd00a73255081340e4914485846ba1", + "git_sha": "5caf7640a9ef1d18d765d55339be751bb0969dfa", "installed_by": ["subworkflows"] }, "utils_nfcore_pipeline": { "branch": "master", - "git_sha": "262b17ed2aad591039f914951659177e6c39a8d8", + "git_sha": "5caf7640a9ef1d18d765d55339be751bb0969dfa", "installed_by": ["subworkflows"] }, "utils_nfvalidation_plugin": { "branch": "master", - "git_sha": "cd08c91373cd00a73255081340e4914485846ba1", + "git_sha": "5caf7640a9ef1d18d765d55339be751bb0969dfa", "installed_by": ["subworkflows"] } } diff --git a/modules/nf-core/sratools/fasterqdump/sratools-fasterqdump.diff b/modules/nf-core/sratools/fasterqdump/sratools-fasterqdump.diff index 1fb8cbf4..089862bf 100644 --- a/modules/nf-core/sratools/fasterqdump/sratools-fasterqdump.diff +++ b/modules/nf-core/sratools/fasterqdump/sratools-fasterqdump.diff @@ -38,7 +38,7 @@ Changes in module 'nf-core/sratools/fasterqdump' --- modules/nf-core/sratools/fasterqdump/tests/main.nf.test +++ modules/nf-core/sratools/fasterqdump/tests/main.nf.test -@@ -3,11 +3,9 @@ +@@ -3,11 +3,8 @@ script "../main.nf" config "./nextflow.config" process "SRATOOLS_FASTERQDUMP" @@ -47,7 +47,6 @@ Changes in module 'nf-core/sratools/fasterqdump' - tag "untar" - tag "sratools" - tag "sratools/fasterqdump" -+ tag "SRATOOLS_FASTERQDUMP" + + tag "UNTAR" diff --git a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap index 3439b400..14a6429d 100644 --- a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap +++ b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap @@ -12,7 +12,7 @@ ] ], "1": [ - "versions.yml:md5,6ff2d50b15c3f0eb9c72cd13a4a20295" + "versions.yml:md5,a3d61a9761e1606ef8459f0b68821d7a" ], "reads": [ [ @@ -24,15 +24,15 @@ ] ], "versions": [ - "versions.yml:md5,6ff2d50b15c3f0eb9c72cd13a4a20295" + "versions.yml:md5,a3d61a9761e1606ef8459f0b68821d7a" ] } ], "meta": { "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nextflow": "24.01.0" }, - "timestamp": "2024-02-28T11:47:42.981471" + "timestamp": "2024-02-28T15:25:52.837288" }, "Paired-end": { "content": [ @@ -50,7 +50,7 @@ ] ], "1": [ - "versions.yml:md5,6ff2d50b15c3f0eb9c72cd13a4a20295" + "versions.yml:md5,a3d61a9761e1606ef8459f0b68821d7a" ], "reads": [ [ @@ -65,14 +65,14 @@ ] ], "versions": [ - "versions.yml:md5,6ff2d50b15c3f0eb9c72cd13a4a20295" + "versions.yml:md5,a3d61a9761e1606ef8459f0b68821d7a" ] } ], "meta": { "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nextflow": "24.01.0" }, - "timestamp": "2024-02-28T11:48:09.914497" + "timestamp": "2024-02-28T15:26:42.466223" } } \ No newline at end of file diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap index bec84076..9972556a 100644 --- a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap @@ -40,25 +40,25 @@ "content": [ [ "versions.yml:md5,1a2218ff913fc33408bffccb081b5048", - "versions.yml:md5,2f3b3a13b36dabf13f09327613d5558d", - "versions.yml:md5,98d78bba9f3da39a0b7db6e9c7dcc224" + "versions.yml:md5,98d78bba9f3da39a0b7db6e9c7dcc224", + "versions.yml:md5,9c558ff624585a6eee82a19c8c0136db" ] ], "meta": { "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nextflow": "24.01.0" }, - "timestamp": "2024-02-28T12:02:56.17931" + "timestamp": "2024-02-28T15:19:18.755939" }, "test_pe_reads_1_size": { "content": [ - 2013376 + 2011460 ], "meta": { "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nextflow": "24.01.0" }, - "timestamp": "2024-02-28T12:02:56.163669" + "timestamp": "2024-02-28T15:19:18.677234" }, "test_se_reads_lines": { "content": [ From 7a9d81184b8f8cce3843bc0e8605ee62364f6294 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 29 Feb 2024 09:38:09 +0000 Subject: [PATCH 813/852] Add Sateesh to contributors for reviews --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b7d76f2..588bc318 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ Special thanks to the following for their contributions to the release: - [Alexander Blaessle](https://github.com/alexblaessle) - [Lukas Forer](https://github.com/lukfor) - [Maxime Garcia](https://github.com/maxulysse) +- [Sateesh Peri](https://github.com/sateeshperi) - [Sebastian Uhrig](https://github.com/suhrig) Thank you to everyone else that has contributed by reporting bugs, enhancements or in any other way, shape or form. From f6cf223f533e940e55036b70508d82a777c325aa Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 29 Feb 2024 10:31:27 +0000 Subject: [PATCH 814/852] Fix nf-tests --- .../nf-core/sratools/fasterqdump/tests/main.nf.test.snap | 8 ++++---- .../tests/main.nf.test.snap | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap index 14a6429d..ce0f9800 100644 --- a/modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap +++ b/modules/nf-core/sratools/fasterqdump/tests/main.nf.test.snap @@ -12,7 +12,7 @@ ] ], "1": [ - "versions.yml:md5,a3d61a9761e1606ef8459f0b68821d7a" + "versions.yml:md5,6ff2d50b15c3f0eb9c72cd13a4a20295" ], "reads": [ [ @@ -24,7 +24,7 @@ ] ], "versions": [ - "versions.yml:md5,a3d61a9761e1606ef8459f0b68821d7a" + "versions.yml:md5,6ff2d50b15c3f0eb9c72cd13a4a20295" ] } ], @@ -50,7 +50,7 @@ ] ], "1": [ - "versions.yml:md5,a3d61a9761e1606ef8459f0b68821d7a" + "versions.yml:md5,6ff2d50b15c3f0eb9c72cd13a4a20295" ], "reads": [ [ @@ -65,7 +65,7 @@ ] ], "versions": [ - "versions.yml:md5,a3d61a9761e1606ef8459f0b68821d7a" + "versions.yml:md5,6ff2d50b15c3f0eb9c72cd13a4a20295" ] } ], diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap index 9972556a..485411da 100644 --- a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap @@ -40,8 +40,8 @@ "content": [ [ "versions.yml:md5,1a2218ff913fc33408bffccb081b5048", - "versions.yml:md5,98d78bba9f3da39a0b7db6e9c7dcc224", - "versions.yml:md5,9c558ff624585a6eee82a19c8c0136db" + "versions.yml:md5,2f3b3a13b36dabf13f09327613d5558d", + "versions.yml:md5,98d78bba9f3da39a0b7db6e9c7dcc224" ] ], "meta": { @@ -52,7 +52,7 @@ }, "test_pe_reads_1_size": { "content": [ - 2011460 + 2013376 ], "meta": { "nf-test": "0.8.4", From 06494258f6b5d307c5a9c2b43e6f6dc0cec2edb2 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 29 Feb 2024 11:49:47 +0000 Subject: [PATCH 815/852] export CONDA_PREFIX into container when using Singularity and Apptainer --- modules/local/aspera_cli/main.nf | 5 +++++ nextflow.config | 8 -------- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/modules/local/aspera_cli/main.nf b/modules/local/aspera_cli/main.nf index de78a7b2..b38d17c0 100644 --- a/modules/local/aspera_cli/main.nf +++ b/modules/local/aspera_cli/main.nf @@ -18,8 +18,11 @@ process ASPERA_CLI { script: def args = task.ext.args ?: '' + def conda_prefix = ['singularity', 'apptainer'].contains(workflow.containerEngine) ? "export CONDA_PREFIX=/usr/local" : "" if (meta.single_end) { """ + $conda_prefix + ascp \\ $args \\ -i \$CONDA_PREFIX/etc/aspera/aspera_bypass_dsa.pem \\ @@ -36,6 +39,8 @@ process ASPERA_CLI { """ } else { """ + $conda_prefix + ascp \\ $args \\ -i \$CONDA_PREFIX/etc/aspera/aspera_bypass_dsa.pem \\ diff --git a/nextflow.config b/nextflow.config index 0b2abf8c..bb6b6b79 100644 --- a/nextflow.config +++ b/nextflow.config @@ -70,14 +70,6 @@ try { // Workflow specific configs includeConfig './workflows/sra/nextflow.config' -// Load nf-core/fetchngs custom profiles from different institutions. -// Warning: Uncomment only if a pipeline-specific institutional config already exists on nf-core/configs! -// try { -// includeConfig "${params.custom_config_base}/pipeline/fetchngs.config" -// } catch (Exception e) { -// System.err.println("WARNING: Could not load nf-core/config/fetchngs profiles: ${params.custom_config_base}/pipeline/fetchngs.config") -// } - profiles { debug { dumpHashes = true From cdc31b97ffaa28948a010fe6857242729a3134f9 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 29 Feb 2024 12:03:08 +0000 Subject: [PATCH 816/852] Update CHANGELOG --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 588bc318..e0261675 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ Special thanks to the following for their contributions to the release: - [Alexandru Mizeranschi](https://github.com/nicolae06) - [Alexander Blaessle](https://github.com/alexblaessle) - [Lukas Forer](https://github.com/lukfor) +- [Matt Niederhuber](https://github.com/mniederhuber) - [Maxime Garcia](https://github.com/maxulysse) - [Sateesh Peri](https://github.com/sateeshperi) - [Sebastian Uhrig](https://github.com/suhrig) @@ -54,6 +55,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements - [PR #294](https://github.com/nf-core/fetchngs/pull/294) - Replace mermaid diagram with subway map - [PR #295](https://github.com/nf-core/fetchngs/pull/295) - Be less stringent with test expectations for CI - [PR #296](https://github.com/nf-core/fetchngs/pull/296) - Remove params.outdir from tests where required and update snapshots +- [PR #298](https://github.com/nf-core/fetchngs/pull/298) - `export CONDA_PREFIX` into container when using Singularity and Apptainer ### Software dependencies From bc6ac0bbe0fcf2267a9ded5a3ade50dc9aec06cf Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 29 Feb 2024 17:55:02 +0000 Subject: [PATCH 817/852] Bump pipeline version to 1.13.0dev --- CHANGELOG.md | 4 ++++ nextflow.config | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e0261675..42dbdf32 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unpublished Version / DEV] + +### Enhancements & fixes + ## [[1.12.0](https://github.com/nf-core/fetchngs/releases/tag/1.12.0)] - 2024-02-29 ### :warning: Major enhancements diff --git a/nextflow.config b/nextflow.config index bb6b6b79..7f4f8ebf 100644 --- a/nextflow.config +++ b/nextflow.config @@ -221,7 +221,7 @@ manifest { description = """Pipeline to fetch metadata and raw FastQ files from public databases""" mainScript = 'main.nf' nextflowVersion = '!>=23.04.0' - version = '1.12.0' + version = '1.13.0dev' doi = 'https://doi.org/10.5281/zenodo.5070524' } From d15ce76ce2294a703e93afbf4183756085df4cd3 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Thu, 29 Feb 2024 17:56:05 +0000 Subject: [PATCH 818/852] Update CHANGELOG --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 42dbdf32..8bba6e9d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Enhancements & fixes +- [PR #299](https://github.com/nf-core/fetchngs/pull/299) - Template update for nf-core/tools v2.13.1 + ## [[1.12.0](https://github.com/nf-core/fetchngs/releases/tag/1.12.0)] - 2024-02-29 ### :warning: Major enhancements From 0fc43a903d2ce44bd680a9cc87e842e31c91dd7f Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Mon, 4 Mar 2024 10:20:03 +0000 Subject: [PATCH 819/852] Use paths instead of tags as matrix variable Additions: - find_changed_files returns a list of paths instead of tags - Uses this as input to matrix Benefits: - More efficient testing (1 test per file). Additional additions: - include.yaml file to specify files to include or exclude from test sets - Will include additional tests if major files have been modified, e.g. the .github/workflows/* files - Uses globbing for exclude statement to match multiple files. Changes: - bump setup-nextflow - Adds pyyaml as dependency - Uses pathlib.Path object where possible to prevent coercion back and forth between strings - Splits find_files into two functions, find_changed_files and detect_nf_test_files --- .github/python/find_changed_files.py | 170 ++++++++++++++++++++++++--- .github/python/include.yaml | 10 ++ .github/workflows/ci.yml | 64 +++------- 3 files changed, 179 insertions(+), 65 deletions(-) create mode 100644 .github/python/include.yaml diff --git a/.github/python/find_changed_files.py b/.github/python/find_changed_files.py index 6dc73449..ed1a8467 100644 --- a/.github/python/find_changed_files.py +++ b/.github/python/find_changed_files.py @@ -1,15 +1,17 @@ #!/usr/bin/env python -## This script is used to generate scan *.nf.test files for function/process/workflow name and return as a JSON list -# It is functionally similar to nf-test list but fills a gap until feature https://github.com/askimed/nf-test/issues/196 is added +# This script is used to identify *.nf.test files for changed functions/processs/workflows/pipelines and *.nf-test files +# with changed dependencies, then return as a JSON list import argparse import json import logging import re +import yaml from itertools import chain from pathlib import Path +from git import Repo def parse_args() -> argparse.Namespace: @@ -23,11 +25,40 @@ def parse_args() -> argparse.Namespace: description="Scan *.nf.test files for function/process/workflow name and return as a JSON list" ) parser.add_argument( - "-p", - "--paths", + "-r", + "--head_ref", + required=True, + help="Head reference branch (Source branch for a PR).", + ) + parser.add_argument( + "-b", + "--base_ref", + required=True, + help="Base reference branch (Target branch for a PR).", + ) + parser.add_argument( + "-x", + "--ignored_files", nargs="+", - default=["."], - help="List of directories or files to scan", + default=[ + ".git/*", + ".gitpod.yml", + ".prettierignore", + ".prettierrc.yml", + "*.md", + "*.png", + "modules.json", + "pyproject.toml", + "tower.yml", + ], + help="List of files or file substrings to ignore.", + ) + parser.add_argument( + "-i", + "--include", + type=Path, + default=".github/python/include.yaml", + help="Path to an include file containing a YAML of key value pairs to include in changed files. I.e., return the current directory if an important file is changed.", ) parser.add_argument( "-l", @@ -47,19 +78,75 @@ def parse_args() -> argparse.Namespace: return parser.parse_args() -def find_files(paths: list[str]) -> list[Path]: +def read_yaml_inverted(file_path: str) -> dict: """ - Find all files matching pattern *.nf.test recursively from a list of paths. + Read a YAML file and return its contents as a dictionary but reversed, i.e. the values become the keys and the keys become the values. Args: - paths (list): List of directories or files to scan. + file_path (str): The path to the YAML file. Returns: - list: List of files matching the pattern *.nf.test. + dict: The contents of the YAML file as a dictionary inverted. """ - # this is a bit clunky - result = [] - for path in paths: + with open(file_path, "r") as f: + data = yaml.safe_load(f) + + # Invert dictionary of lists into contents of lists are keys, values are the original keys + # { "key": ["item1", "item2] } --> { "item1": "key", "item2": "key" } + return {value: key for key, values in data.items() for value in values} + + +def find_changed_files( + branch1: str, branch2: str, ignore: list[str], include_files: dict[str, str] +) -> list[Path]: + """ + Find all *.nf.tests that are associated with files that have been changed between two specified branches. + + Args: + branch1 (str) : The first branch being compared + branch2 (str) : The second branch being compared + ignore (list) : List of files or file substrings to ignore. + include_files (dict): Key value pairs to return if a certain file has changed, i.e. if a file in a directory has changed point to a different directory. + + Returns: + list: List of files matching the pattern *.nf.test that have changed between branch2 and branch1. + """ + # create repo + repo = Repo(".") + # identify commit on branch1 + branch1_commit = repo.commit(branch1) + # identify commit on branch2 + branch2_commit = repo.commit(branch2) + # compare two branches + diff_index = branch1_commit.diff(branch2_commit) + # collect changed files + changed_files = [] + for file in diff_index: + changed_files.append(Path(file.a_path)) + # remove ignored files + for file in changed_files: + for ignored_substring in ignore: + if file.match(ignored_substring): + changed_files.remove(file) + for include_path, include_key in include_files.items(): + if file.match(include_path): + changed_files.append(Path(include_key)) + + return changed_files + + +def detect_nf_test_files(changed_files: list[Path]) -> list[Path]: + """ + Detects and returns a list of nf-test files from the given list of changed files. + + Args: + changed_files (list[Path]): A list of file paths. + + Returns: + list[Path]: A list of nf-test file paths. + """ + result: list[Path] = [] + for path in changed_files: path_obj = Path(path) # If Path is the exact nf-test file add to list: if path_obj.match("*.nf.test"): @@ -131,15 +218,56 @@ def generate( return result +def find_changed_dependencies(paths: list[Path], tags: list[str]) -> list[Path]: + """ + Find all *.nf.test files with changed dependencies from a list of paths. + + Args: + paths (list): List of directories or files to scan. + tags (list): List of tags identified as having changes. + + Returns: + list: List of *.nf.test files with changed dependencies. + """ + # this is a bit clunky + result = [] + for path in paths: + # find all *.nf-test files + nf_test_files = [] + for file in path.rglob("*.nf.test"): + nf_test_files.append(file) + # find nf-test files with changed dependencies + for nf_test_file in nf_test_files: + with open(nf_test_file, "r") as f: + lines = f.readlines() + for line in lines: + line = line.strip() + if line.startswith("tag"): + words = line.split() + if len(words) == 2 and re.match(r'^".*"$', words[1]): + name = words[1].strip( + "'\"" + ) # Strip both single and double quotes + if name in tags: + result.append(nf_test_file) + + return list(set(result)) + + if __name__ == "__main__": # Utility stuff args = parse_args() logging.basicConfig(level=args.log_level) - # Parse nf-test files for targets of tests - files = find_files(args.paths) - lines = process_files(files) + # Parse nf-test files for target test tags + if args.include: + include_files = read_yaml_inverted(args.include) + changed_files = find_changed_files( + args.head_ref, args.base_ref, args.ignored_files, include_files + ) + nf_test_files = detect_nf_test_files(changed_files) + lines = process_files(nf_test_files) result = generate(lines) # Get only relevant results (specified by -t) @@ -148,5 +276,13 @@ def generate( {item for sublist in map(result.get, args.types) for item in sublist} ) + # Parse files to identify nf-tests with changed dependencies + changed_dep_files = find_changed_dependencies([Path(".")], target_results) + + # Combine target nf-test files and nf-test files with changed dependencies + all_nf_tests = [ + str(test_path) for test_path in set(changed_dep_files + nf_test_files) + ] + # Print to stdout - print(json.dumps(target_results)) + print(json.dumps(all_nf_tests)) diff --git a/.github/python/include.yaml b/.github/python/include.yaml new file mode 100644 index 00000000..682073c5 --- /dev/null +++ b/.github/python/include.yaml @@ -0,0 +1,10 @@ +".": + - .github/workflows/** + - nf-test.config + - nextflow.config +tests: + - assets/* + - bin/* + - conf/* + - main.nf + - nextflow_schema.json \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8a8d0935..7d226968 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,8 +27,7 @@ jobs: name: Check for changes runs-on: ubuntu-latest outputs: - changes: ${{ steps.changed_files.outputs.any_modified }} - tags: ${{ steps.list.outputs.tags }} + nf_test_files: ${{ steps.list.outputs.nf_test_files }} steps: - uses: actions/setup-python@v4 with: @@ -39,60 +38,29 @@ jobs: with: fetch-depth: 0 - - uses: tj-actions/changed-files@v42 - id: changed_files - with: - dir_names: "true" - output_renamed_files_as_deleted_and_added: "true" - # Define list of additional rules for testing paths - # Mostly, we define additional 'pipeline' or 'all' tests here - files_yaml: | - ".": - - .github/workflows/** - - nf-test.config - - nextflow.config - tests: - - assets/* - - bin/* - - conf/* - - main.nf - - nextflow_schema.json - - files_ignore: | - .git* - .gitpod.yml - .prettierignore - .prettierrc.yml - **.md - **.png - modules.json - pyproject.toml - tower.yml - - - name: debug + - name: Install gitpython find changed files run: | - echo ${{ steps.changed_files.outputs.any_modified }} - echo ${{ steps.changed_files.outputs.all_changed_files }} - echo ${{ steps.changed_files.outputs.changed_keys }} + python -m pip install --upgrade pip + pip install gitpython pyyaml - - name: nf-test list tags + - name: nf-test list nf_test_files id: list - if: ${{ steps.changed_files.outputs.any_modified }} run: | - echo tags=$(python \ + echo nf_test_files=$(python \ .github/python/find_changed_files.py \ -t pipeline workflow process \ - -p ${{ steps.changed_files.outputs.all_changed_files }} ${{ steps.changed_files.outputs.changed_keys }} \ + --head_ref ${{ github.sha }} \ + --base_ref origin/${{ github.base_ref }} \ ) >> $GITHUB_OUTPUT - - name: debug2 + - name: debug run: | - echo ${{ steps.list.outputs.tags }} + echo ${{ steps.list.outputs.nf_test_files }} test: - name: ${{ matrix.tags }} ${{ matrix.profile }} NF-${{ matrix.NXF_VER }} + name: ${{ matrix.nf_test_files }} ${{ matrix.profile }} NF-${{ matrix.NXF_VER }} needs: [changes] - if: needs.changes.outputs.changes + if: needs.changes.outputs.nf_test_files != '[]' runs-on: ubuntu-latest strategy: fail-fast: false @@ -100,16 +68,16 @@ jobs: NXF_VER: - "latest-everything" - "23.04" - tags: ["${{ fromJson(needs.changes.outputs.tags) }}"] + nf_test_files: ["${{ fromJson(needs.changes.outputs.nf_test_files) }}"] profile: - "docker" steps: - name: Check out pipeline code - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + uses: actions/checkout@4 - name: Install Nextflow - uses: nf-core/setup-nextflow@v1 + uses: nf-core/setup-nextflow@2 with: version: "${{ matrix.NXF_VER }}" @@ -140,7 +108,7 @@ jobs: - name: Run nf-test run: | - nf-test test --verbose --tag ${{ matrix.tags }} --profile "+${{ matrix.profile }}" --junitxml=test.xml --tap=test.tap + nf-test test --verbose --tag ${{ matrix.nf_test_files }} --profile "+${{ matrix.profile }}" --junitxml=test.xml --tap=test.tap - uses: pcolby/tap-summary@v1 with: From c92b31be4cbfdec46504c0f8cacdfcdc117c281e Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Mon, 4 Mar 2024 11:15:30 +0000 Subject: [PATCH 820/852] prettier --- .github/python/include.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/python/include.yaml b/.github/python/include.yaml index 682073c5..c3b69246 100644 --- a/.github/python/include.yaml +++ b/.github/python/include.yaml @@ -7,4 +7,4 @@ tests: - bin/* - conf/* - main.nf - - nextflow_schema.json \ No newline at end of file + - nextflow_schema.json From ce56e5ef0a536593364e2b28ac2b12446afd790c Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Mon, 4 Mar 2024 11:24:46 +0000 Subject: [PATCH 821/852] Fix action versions --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7d226968..b2af8b16 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -74,10 +74,10 @@ jobs: steps: - name: Check out pipeline code - uses: actions/checkout@4 + uses: actions/checkout@v4 - name: Install Nextflow - uses: nf-core/setup-nextflow@2 + uses: nf-core/setup-nextflow@v2 with: version: "${{ matrix.NXF_VER }}" From b2516474199cf5d02acee1054a804c9dd2ed6157 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Mon, 4 Mar 2024 13:21:43 +0000 Subject: [PATCH 822/852] remove tag --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b2af8b16..bed5a12e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -108,7 +108,7 @@ jobs: - name: Run nf-test run: | - nf-test test --verbose --tag ${{ matrix.nf_test_files }} --profile "+${{ matrix.profile }}" --junitxml=test.xml --tap=test.tap + nf-test test --verbose ${{ matrix.nf_test_files }} --profile "+${{ matrix.profile }}" --junitxml=test.xml --tap=test.tap - uses: pcolby/tap-summary@v1 with: From 7dfbf1cc934e537d803faa467369f6253108c372 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Wed, 6 Mar 2024 16:34:27 +0000 Subject: [PATCH 823/852] Check if nf-test file exists before adding --- .github/python/find_changed_files.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/python/find_changed_files.py b/.github/python/find_changed_files.py index ed1a8467..a50b3525 100644 --- a/.github/python/find_changed_files.py +++ b/.github/python/find_changed_files.py @@ -149,7 +149,7 @@ def detect_nf_test_files(changed_files: list[Path]) -> list[Path]: for path in changed_files: path_obj = Path(path) # If Path is the exact nf-test file add to list: - if path_obj.match("*.nf.test"): + if path_obj.match("*.nf.test") and path_obj.exists(): result.append(path_obj) # Else recursively search for nf-test files: else: From fab42ea611d51f778b216a39796d91c73b62eeb5 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Thu, 7 Mar 2024 10:16:09 +0000 Subject: [PATCH 824/852] Changes: - Better logic for detecting changed files and excluding the ignore list - Break out include statement into separate function - Correctly identify changed files in the same dir as changed files - Better name for function than 'generate' --- .github/python/find_changed_files.py | 74 +++++++++++++++++++--------- 1 file changed, 52 insertions(+), 22 deletions(-) diff --git a/.github/python/find_changed_files.py b/.github/python/find_changed_files.py index a50b3525..ac506a25 100644 --- a/.github/python/find_changed_files.py +++ b/.github/python/find_changed_files.py @@ -97,7 +97,9 @@ def read_yaml_inverted(file_path: str) -> dict: def find_changed_files( - branch1: str, branch2: str, ignore: list[str], include_files: dict[str, str] + branch1: str, + branch2: str, + ignore: list[str], ) -> list[Path]: """ Find all *.nf.tests that are associated with files that have been changed between two specified branches. @@ -106,7 +108,6 @@ def find_changed_files( branch1 (str) : The first branch being compared branch2 (str) : The second branch being compared ignore (list) : List of files or file substrings to ignore. - include_files (dict): Key value pairs to return if a certain file has changed, i.e. if a file in a directory has changed point to a different directory. Returns: list: List of files matching the pattern *.nf.test that have changed between branch2 and branch1. @@ -119,20 +120,42 @@ def find_changed_files( branch2_commit = repo.commit(branch2) # compare two branches diff_index = branch1_commit.diff(branch2_commit) - # collect changed files + + # Start empty list of changed files changed_files = [] + + # For every file that has changed between commits for file in diff_index: - changed_files.append(Path(file.a_path)) - # remove ignored files - for file in changed_files: - for ignored_substring in ignore: - if file.match(ignored_substring): - changed_files.remove(file) - for include_path, include_key in include_files.items(): - if file.match(include_path): - changed_files.append(Path(include_key)) + # Get pathlib.Path object + filepath = Path(file.a_path) + # If file does not match any in the ignore list, add containing directory to changed_files + if not any(filepath.match(ignored_path) for ignored_path in ignore): + changed_files.append(filepath) + + # Uniqueify the results before returning for efficiency + return list(set(changed_files)) - return changed_files + +def detect_include_files( + changed_files: list[Path], include_files: dict[str, str] +) -> list[Path]: + """ + Detects the include files based on the changed files. + + Args: + changed_files (list[Path]): List of paths to the changed files. + include_files (dict[str, str]): Key-value pairs to return if a certain file has changed. If a file in a directory has changed, it points to a different directory. + + Returns: + list[Path]: List of paths to representing the keys of the include_files dictionary, where a value matched a path in changed_files. + """ + new_changed_files = [] + for filepath in changed_files: + # If file is in the include_files, we return the key instead of the value + for include_path, include_key in include_files.items(): + if filepath.match(include_path): + new_changed_files.append(Path(include_key)) + return new_changed_files def detect_nf_test_files(changed_files: list[Path]) -> list[Path]: @@ -147,13 +170,17 @@ def detect_nf_test_files(changed_files: list[Path]) -> list[Path]: """ result: list[Path] = [] for path in changed_files: - path_obj = Path(path) # If Path is the exact nf-test file add to list: - if path_obj.match("*.nf.test") and path_obj.exists(): - result.append(path_obj) + if path.match("*.nf.test") and path.exists(): + result.append(path) # Else recursively search for nf-test files: else: - for file in path_obj.rglob("*.nf.test"): + # Get the enclosing dir so files in the same dir can be found. + # e.g. + # dir/ + # ├─ main.nf + # ├─ main.nf.test + for file in path.parent.rglob("*.nf.test"): result.append(file) return result @@ -189,7 +216,7 @@ def process_files(files: list[Path]) -> list[str]: return result -def generate( +def convert_nf_test_files_to_test_types( lines: list[str], types: list[str] = ["function", "process", "workflow", "pipeline"] ) -> dict[str, list[str]]: """ @@ -261,14 +288,17 @@ def find_changed_dependencies(paths: list[Path], tags: list[str]) -> list[Path]: logging.basicConfig(level=args.log_level) # Parse nf-test files for target test tags + changed_files = find_changed_files(args.head_ref, args.base_ref, args.ignored_files) + + # If an additional include YAML is added, we detect additional changed dirs to include if args.include: include_files = read_yaml_inverted(args.include) - changed_files = find_changed_files( - args.head_ref, args.base_ref, args.ignored_files, include_files - ) + changed_files = changed_files + detect_include_files( + changed_files, include_files + ) nf_test_files = detect_nf_test_files(changed_files) lines = process_files(nf_test_files) - result = generate(lines) + result = convert_nf_test_files_to_test_types(lines) # Get only relevant results (specified by -t) # Unique using a set From 3e2665f8103ffb306c57b5cb2de05b530c12da1a Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Thu, 7 Mar 2024 10:29:42 +0000 Subject: [PATCH 825/852] Code re-use so we don't duplicate functions everywhere --- .github/python/find_changed_files.py | 51 ++++++++++++---------------- 1 file changed, 21 insertions(+), 30 deletions(-) diff --git a/.github/python/find_changed_files.py b/.github/python/find_changed_files.py index ac506a25..117000ae 100644 --- a/.github/python/find_changed_files.py +++ b/.github/python/find_changed_files.py @@ -229,15 +229,12 @@ def convert_nf_test_files_to_test_types( Returns: dict: Dictionary with function, process and workflow lists. """ - result: dict[str, list[str]] = { - "function": [], - "process": [], - "workflow": [], - "pipeline": [], - } + # Populate empty dict from types + result: dict[str, list[str]] = {key: [] for key in types} + for line in lines: words = line.split() - if len(words) == 2: + if len(words) == 2 and re.match(r'^".*"$', words[1]): keyword = words[0] name = words[1].strip("'\"") # Strip both single and double quotes if keyword in types: @@ -256,29 +253,23 @@ def find_changed_dependencies(paths: list[Path], tags: list[str]) -> list[Path]: Returns: list: List of *.nf.test files with changed dependencies. """ - # this is a bit clunky - result = [] - for path in paths: - # find all *.nf-test files - nf_test_files = [] - for file in path.rglob("*.nf.test"): - nf_test_files.append(file) - # find nf-test files with changed dependencies - for nf_test_file in nf_test_files: - with open(nf_test_file, "r") as f: - lines = f.readlines() - for line in lines: - line = line.strip() - if line.startswith("tag"): - words = line.split() - if len(words) == 2 and re.match(r'^".*"$', words[1]): - name = words[1].strip( - "'\"" - ) # Strip both single and double quotes - if name in tags: - result.append(nf_test_file) - - return list(set(result)) + + result: list[Path] = [] + + nf_test_files = detect_nf_test_files(paths) + + # find nf-test files with changed dependencies + for nf_test_file in nf_test_files: + with open(nf_test_file, "r") as f: + lines = f.readlines() + tags_in_nf_test_file = convert_nf_test_files_to_test_types( + lines, types=["tag"] + ) + # Check if tag in nf-test file appears in a tag + if any(tag in tags_in_nf_test_file["tag"] for tag in tags): + result.append(nf_test_file) + + return result if __name__ == "__main__": From 30702552903c81b2c8b1f9ef0c5195deac878100 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Fri, 8 Mar 2024 15:56:35 +0000 Subject: [PATCH 826/852] Make tags check case insensitive --- .github/python/find_changed_files.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/.github/python/find_changed_files.py b/.github/python/find_changed_files.py index 117000ae..2e24ab74 100644 --- a/.github/python/find_changed_files.py +++ b/.github/python/find_changed_files.py @@ -262,11 +262,17 @@ def find_changed_dependencies(paths: list[Path], tags: list[str]) -> list[Path]: for nf_test_file in nf_test_files: with open(nf_test_file, "r") as f: lines = f.readlines() - tags_in_nf_test_file = convert_nf_test_files_to_test_types( - lines, types=["tag"] - ) - # Check if tag in nf-test file appears in a tag - if any(tag in tags_in_nf_test_file["tag"] for tag in tags): + # Get all tags from nf-test file + # Make case insensitive with .casefold() + tags_in_nf_test_file = [ + tag.casefold() + for tag in convert_nf_test_files_to_test_types(lines, types=["tag"])[ + "tag" + ] + ] + # Check if tag in nf-test file appears in a tag. + # Use .casefold() to be case insensitive + if any(tag.casefold() in tags_in_nf_test_file for tag in tags): result.append(nf_test_file) return result From f23ae011f919fb4edd461d338e99c76552a0bc88 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Tue, 12 Mar 2024 11:14:19 +0000 Subject: [PATCH 827/852] Replace slashes with underscores --- .github/python/find_changed_files.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/python/find_changed_files.py b/.github/python/find_changed_files.py index 2e24ab74..c0c61752 100644 --- a/.github/python/find_changed_files.py +++ b/.github/python/find_changed_files.py @@ -265,14 +265,16 @@ def find_changed_dependencies(paths: list[Path], tags: list[str]) -> list[Path]: # Get all tags from nf-test file # Make case insensitive with .casefold() tags_in_nf_test_file = [ - tag.casefold() + tag.casefold().replace("/", "_") for tag in convert_nf_test_files_to_test_types(lines, types=["tag"])[ "tag" ] ] # Check if tag in nf-test file appears in a tag. # Use .casefold() to be case insensitive - if any(tag.casefold() in tags_in_nf_test_file for tag in tags): + if any( + tag.casefold().replace("/", "_") in tags_in_nf_test_file for tag in tags + ): result.append(nf_test_file) return result From a2b0ccfe55f5538736ca7b475260e38b4b356849 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Tue, 12 Mar 2024 11:24:25 +0000 Subject: [PATCH 828/852] Be more explicit about file patterns --- .github/python/include.yaml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/python/include.yaml b/.github/python/include.yaml index c3b69246..a3629f4c 100644 --- a/.github/python/include.yaml +++ b/.github/python/include.yaml @@ -1,10 +1,10 @@ ".": - - .github/workflows/** - - nf-test.config - - nextflow.config + - ./.github/workflows/** + - ./nf-test.config + - ./nextflow.config tests: - - assets/* - - bin/* - - conf/* - - main.nf - - nextflow_schema.json + - ./assets/* + - ./bin/* + - ./conf/* + - ./main.nf + - ./nextflow_schema.json From a9b246c69a2c463395aa57f14695ece4fe603fb0 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Wed, 13 Mar 2024 11:28:02 +0000 Subject: [PATCH 829/852] Fixup some names --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bed5a12e..527048fe 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -43,7 +43,7 @@ jobs: python -m pip install --upgrade pip pip install gitpython pyyaml - - name: nf-test list nf_test_files + - name: List nf-test files id: list run: | echo nf_test_files=$(python \ @@ -53,7 +53,7 @@ jobs: --base_ref origin/${{ github.base_ref }} \ ) >> $GITHUB_OUTPUT - - name: debug + - name: print list of nf-test files run: | echo ${{ steps.list.outputs.nf_test_files }} From 18b56273175aef22d70771edae9b48e192da9f1b Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Wed, 13 Mar 2024 11:30:32 +0000 Subject: [PATCH 830/852] CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8bba6e9d..b9232710 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Enhancements & fixes - [PR #299](https://github.com/nf-core/fetchngs/pull/299) - Template update for nf-core/tools v2.13.1 +- [PR #300](https://github.com/nf-core/fetchngs/pull/300) - Use file paths instead of tags for testing matrix, should make matrices more efficient ## [[1.12.0](https://github.com/nf-core/fetchngs/releases/tag/1.12.0)] - 2024-02-29 From fe2756912803b988a3407586c7264578b0c147f2 Mon Sep 17 00:00:00 2001 From: Adrian Janucik Date: Thu, 21 Mar 2024 16:20:07 +0100 Subject: [PATCH 831/852] update wget container for SRA_FASTQ_FTP from 1.20.1 to 1.21.4 --- modules/local/sra_fastq_ftp/main.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/local/sra_fastq_ftp/main.nf b/modules/local/sra_fastq_ftp/main.nf index e2274d46..017a08c9 100644 --- a/modules/local/sra_fastq_ftp/main.nf +++ b/modules/local/sra_fastq_ftp/main.nf @@ -4,10 +4,10 @@ process SRA_FASTQ_FTP { label 'process_low' label 'error_retry' - conda "conda-forge::wget=1.20.1" + conda "conda-forge::wget=1.21.4" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/wget:1.20.1' : - 'biocontainers/wget:1.20.1' }" + 'https://depot.galaxyproject.org/singularity/wget:1.21.4' : + 'biocontainers/wget:1.21.4' }" input: tuple val(meta), val(fastq) From 7208db1af766e847d840f9a84c0b26665e962917 Mon Sep 17 00:00:00 2001 From: Adrian Janucik Date: Thu, 21 Mar 2024 16:39:27 +0100 Subject: [PATCH 832/852] update CHANGELOG.md to reflect newer version of wget --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b9232710..bdbdb580 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -68,7 +68,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements | Dependency | Old version | New version | | ---------- | ----------- | ----------- | -| `wget` | | 1.20.1 | +| `wget` | 1.20.1 | 1.21.4 | > **NB:** Dependency has been **updated** if both old and new version information is present. > From 0c23f923dd4293db3c39cdb54cb48d48f5968acc Mon Sep 17 00:00:00 2001 From: Adrian Date: Thu, 21 Mar 2024 17:05:04 +0100 Subject: [PATCH 833/852] update md5 for versions.yml in sra_fastq_ftp --- modules/local/sra_fastq_ftp/tests/main.nf.test.snap | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/local/sra_fastq_ftp/tests/main.nf.test.snap b/modules/local/sra_fastq_ftp/tests/main.nf.test.snap index 5b300f8c..229ad4fe 100644 --- a/modules/local/sra_fastq_ftp/tests/main.nf.test.snap +++ b/modules/local/sra_fastq_ftp/tests/main.nf.test.snap @@ -31,7 +31,7 @@ ] ], "2": [ - "versions.yml:md5,6b60ed6d5805271a1b97798e29c0635c" + "versions.yml:md5,7bfc86ca1f3e3236dbb91eb85c1d7af0" ], "fastq": [ [ @@ -62,7 +62,7 @@ ] ], "versions": [ - "versions.yml:md5,6b60ed6d5805271a1b97798e29c0635c" + "versions.yml:md5,7bfc86ca1f3e3236dbb91eb85c1d7af0" ] } ], @@ -72,4 +72,4 @@ }, "timestamp": "2024-02-28T11:51:51.301654" } -} \ No newline at end of file +} From ebb0e5271fca0c5465e67fc441c45ee5b515ca6a Mon Sep 17 00:00:00 2001 From: Adrian Date: Fri, 22 Mar 2024 12:24:20 +0100 Subject: [PATCH 834/852] Move wget update notice to Unpublished Version / DEV section --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bdbdb580..30128dcf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [PR #299](https://github.com/nf-core/fetchngs/pull/299) - Template update for nf-core/tools v2.13.1 - [PR #300](https://github.com/nf-core/fetchngs/pull/300) - Use file paths instead of tags for testing matrix, should make matrices more efficient +- [PR #303](https://github.com/nf-core/fetchngs/pull/303) - Update wget container for SRA_FASTQ_FTP from 1.20.1 to 1.21.4 ## [[1.12.0](https://github.com/nf-core/fetchngs/releases/tag/1.12.0)] - 2024-02-29 @@ -68,7 +69,7 @@ Thank you to everyone else that has contributed by reporting bugs, enhancements | Dependency | Old version | New version | | ---------- | ----------- | ----------- | -| `wget` | 1.20.1 | 1.21.4 | +| `wget` | | 1.20.1 | > **NB:** Dependency has been **updated** if both old and new version information is present. > From d2641e48616dd20e51fd9f86723de3e5ffa6e089 Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Fri, 22 Mar 2024 13:14:55 +0100 Subject: [PATCH 835/852] Update CHANGELOG.md --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 30128dcf..ecb962d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [PR #300](https://github.com/nf-core/fetchngs/pull/300) - Use file paths instead of tags for testing matrix, should make matrices more efficient - [PR #303](https://github.com/nf-core/fetchngs/pull/303) - Update wget container for SRA_FASTQ_FTP from 1.20.1 to 1.21.4 +### Software dependencies + +| Dependency | Old version | New version | +| ---------- | ----------- | ----------- | +| `wget` | 1.20.1 | 1.21.4 | + ## [[1.12.0](https://github.com/nf-core/fetchngs/releases/tag/1.12.0)] - 2024-02-29 ### :warning: Major enhancements From 42ccce6d9ce6c70cd91d9808891f8368521ed4cd Mon Sep 17 00:00:00 2001 From: Sebastian Uhrig Date: Sun, 7 Apr 2024 20:27:50 +0000 Subject: [PATCH 836/852] update module sratools/prefetch --- modules.json | 4 ++-- modules/nf-core/sratools/prefetch/environment.yml | 3 ++- modules/nf-core/sratools/prefetch/main.nf | 4 ++-- .../prefetch/templates/retry_with_backoff.sh | 12 +++++++++++- modules/nf-core/sratools/prefetch/tests/main.nf.test | 4 ++++ .../sratools/prefetch/tests/main.nf.test.snap | 10 +++++----- modules/nf-core/sratools/prefetch/tests/tags.yml | 2 ++ .../tests/main.nf.test | 10 ++++++---- .../tests/main.nf.test.snap | 8 ++++---- .../tests/tags.yml | 2 ++ 10 files changed, 40 insertions(+), 19 deletions(-) create mode 100644 modules/nf-core/sratools/prefetch/tests/tags.yml create mode 100644 subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/tags.yml diff --git a/modules.json b/modules.json index 93f4553b..c6b234bb 100644 --- a/modules.json +++ b/modules.json @@ -18,7 +18,7 @@ }, "sratools/prefetch": { "branch": "master", - "git_sha": "5caf7640a9ef1d18d765d55339be751bb0969dfa", + "git_sha": "1fc29f92e439d5631fdf34b8ac4687297d70f5ec", "installed_by": ["fastq_download_prefetch_fasterqdump_sratools"] }, "untar": { @@ -32,7 +32,7 @@ "nf-core": { "fastq_download_prefetch_fasterqdump_sratools": { "branch": "master", - "git_sha": "5caf7640a9ef1d18d765d55339be751bb0969dfa", + "git_sha": "1fc29f92e439d5631fdf34b8ac4687297d70f5ec", "installed_by": ["subworkflows"] }, "utils_nextflow_pipeline": { diff --git a/modules/nf-core/sratools/prefetch/environment.yml b/modules/nf-core/sratools/prefetch/environment.yml index cfc7d9a8..0abad336 100644 --- a/modules/nf-core/sratools/prefetch/environment.yml +++ b/modules/nf-core/sratools/prefetch/environment.yml @@ -4,4 +4,5 @@ channels: - bioconda - defaults dependencies: - - bioconda::sra-tools=3.0.8 + - bioconda::sra-tools=3.1.0 + - conda-forge::curl=8.5.0 diff --git a/modules/nf-core/sratools/prefetch/main.nf b/modules/nf-core/sratools/prefetch/main.nf index 3c30739a..170f1753 100644 --- a/modules/nf-core/sratools/prefetch/main.nf +++ b/modules/nf-core/sratools/prefetch/main.nf @@ -4,8 +4,8 @@ process SRATOOLS_PREFETCH { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/sra-tools:3.0.8--h9f5acd7_0' : - 'biocontainers/sra-tools:3.0.8--h9f5acd7_0' }" + 'https://depot.galaxyproject.org/singularity/sra-tools:3.1.0--h9f5acd7_0' : + 'biocontainers/sra-tools:3.1.0--h9f5acd7_0' }" input: tuple val(meta), val(id) diff --git a/modules/nf-core/sratools/prefetch/templates/retry_with_backoff.sh b/modules/nf-core/sratools/prefetch/templates/retry_with_backoff.sh index a72a4bfb..bfee6070 100755 --- a/modules/nf-core/sratools/prefetch/templates/retry_with_backoff.sh +++ b/modules/nf-core/sratools/prefetch/templates/retry_with_backoff.sh @@ -47,9 +47,19 @@ retry_with_backoff !{args2} \ !{args} \ !{id} -[ -f !{id}.sralite ] && vdb-validate !{id}.sralite || vdb-validate !{id} +# check file integrity using vdb-validate or (when archive contains no checksums) md5sum +vdb-validate !{id} > vdb-validate_result.txt 2>&1 || exit 1 +if grep -q "checksums missing" vdb-validate_result.txt; then + VALID_MD5SUMS=$(curl --silent --fail --location --retry 3 --retry-delay 60 'https://locate.ncbi.nlm.nih.gov/sdl/2/retrieve?filetype=run&acc=!{id}') + LOCAL_MD5SUMS=$(md5sum !{id}/* | cut -f1 -d' ') + if ! grep -q -F -f <(echo "$LOCAL_MD5SUMS") <(echo "$VALID_MD5SUMS"); then + echo "MD5 sum check failed" 1>&2 + exit 1 + fi +fi cat <<-END_VERSIONS > versions.yml "!{task.process}": sratools: $(prefetch --version 2>&1 | grep -Eo '[0-9.]+') + curl: $(curl --version | head -n 1 | sed 's/^curl //; s/ .*$//') END_VERSIONS diff --git a/modules/nf-core/sratools/prefetch/tests/main.nf.test b/modules/nf-core/sratools/prefetch/tests/main.nf.test index c3ebd91e..f59de7cb 100644 --- a/modules/nf-core/sratools/prefetch/tests/main.nf.test +++ b/modules/nf-core/sratools/prefetch/tests/main.nf.test @@ -2,6 +2,10 @@ nextflow_process { name "Test Process SRATOOLS_PREFETCH" script "../main.nf" process "SRATOOLS_PREFETCH" + tag "modules" + tag "modules_nfcore" + tag "sratools" + tag "sratools/prefetch" test("sratools/prefetch") { diff --git a/modules/nf-core/sratools/prefetch/tests/main.nf.test.snap b/modules/nf-core/sratools/prefetch/tests/main.nf.test.snap index 946fc869..67795ebb 100644 --- a/modules/nf-core/sratools/prefetch/tests/main.nf.test.snap +++ b/modules/nf-core/sratools/prefetch/tests/main.nf.test.snap @@ -14,7 +14,7 @@ ] ], "1": [ - "versions.yml:md5,c967dea4135cb75490e1e801c4639efc" + "versions.yml:md5,83d1b23f5ff5b2ad1b96d17d7d7594ee" ], "sra": [ [ @@ -28,7 +28,7 @@ ] ], "versions": [ - "versions.yml:md5,c967dea4135cb75490e1e801c4639efc" + "versions.yml:md5,83d1b23f5ff5b2ad1b96d17d7d7594ee" ] } ], @@ -53,7 +53,7 @@ ] ], "1": [ - "versions.yml:md5,c967dea4135cb75490e1e801c4639efc" + "versions.yml:md5,83d1b23f5ff5b2ad1b96d17d7d7594ee" ], "sra": [ [ @@ -67,7 +67,7 @@ ] ], "versions": [ - "versions.yml:md5,c967dea4135cb75490e1e801c4639efc" + "versions.yml:md5,83d1b23f5ff5b2ad1b96d17d7d7594ee" ] } ], @@ -77,4 +77,4 @@ }, "timestamp": "2024-02-28T11:48:37.428307" } -} \ No newline at end of file +} diff --git a/modules/nf-core/sratools/prefetch/tests/tags.yml b/modules/nf-core/sratools/prefetch/tests/tags.yml new file mode 100644 index 00000000..52110bfd --- /dev/null +++ b/modules/nf-core/sratools/prefetch/tests/tags.yml @@ -0,0 +1,2 @@ +sratools/prefetch: + - modules/nf-core/sratools/prefetch/** diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test index 7b41ed7e..5f74ed20 100644 --- a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test @@ -3,10 +3,12 @@ nextflow_workflow { name "Test workflow: fastq_download_prefetch_fasterqdump_sratools/main.nf" script "../main.nf" workflow "FASTQ_DOWNLOAD_PREFETCH_FASTERQDUMP_SRATOOLS" - - tag "CUSTOM_SRATOOLSNCBISETTINGS" - tag "SRATOOLS_PREFETCH" - tag "SRATOOLS_FASTERQDUMP" + tag "subworkflows" + tag "subworkflows_nfcore" + tag "custom/sratoolsncbisettings" + tag "sratools/prefetch" + tag "sratools/fasterqdump" + tag "subworkflows/fastq_download_prefetch_fasterqdump_sratools" test("Parameters: default") { diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap index 485411da..1a34e0b8 100644 --- a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap @@ -40,8 +40,8 @@ "content": [ [ "versions.yml:md5,1a2218ff913fc33408bffccb081b5048", - "versions.yml:md5,2f3b3a13b36dabf13f09327613d5558d", - "versions.yml:md5,98d78bba9f3da39a0b7db6e9c7dcc224" + "versions.yml:md5,53d6e983afde3a28add2ffc6b7eba4f3", + "versions.yml:md5,9c558ff624585a6eee82a19c8c0136db" ] ], "meta": { @@ -52,7 +52,7 @@ }, "test_pe_reads_1_size": { "content": [ - 2013376 + 2011460 ], "meta": { "nf-test": "0.8.4", @@ -94,4 +94,4 @@ }, "timestamp": "2024-02-28T12:02:56.161354" } -} \ No newline at end of file +} diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/tags.yml b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/tags.yml new file mode 100644 index 00000000..03028c32 --- /dev/null +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/tags.yml @@ -0,0 +1,2 @@ +subworkflows/fastq_download_prefetch_fasterqdump_sratools: + - subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/** From 3896fd35a4f750c75de9419559406c752bd5277b Mon Sep 17 00:00:00 2001 From: Sebastian Uhrig Date: Sun, 7 Apr 2024 20:33:29 +0000 Subject: [PATCH 837/852] update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ecb962d6..dbfb81be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,12 +10,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [PR #299](https://github.com/nf-core/fetchngs/pull/299) - Template update for nf-core/tools v2.13.1 - [PR #300](https://github.com/nf-core/fetchngs/pull/300) - Use file paths instead of tags for testing matrix, should make matrices more efficient - [PR #303](https://github.com/nf-core/fetchngs/pull/303) - Update wget container for SRA_FASTQ_FTP from 1.20.1 to 1.21.4 +- [PR #305](https://github.com/nf-core/fetchngs/pull/305) - Update module sratools/prefetch for reliable download integrity check ### Software dependencies | Dependency | Old version | New version | | ---------- | ----------- | ----------- | | `wget` | 1.20.1 | 1.21.4 | +| `sratools` | 3.0.8 | 3.1.0 | ## [[1.12.0](https://github.com/nf-core/fetchngs/releases/tag/1.12.0)] - 2024-02-29 From 577af8a7973fe085146590a1be5d1bc1d92c0d78 Mon Sep 17 00:00:00 2001 From: Sebastian Uhrig Date: Mon, 8 Apr 2024 09:32:23 +0000 Subject: [PATCH 838/852] update MD5 sum of versions.yml for nf-test --- .../tests/main.nf.test.snap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap index 1a34e0b8..6872d8d2 100644 --- a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap @@ -41,7 +41,7 @@ [ "versions.yml:md5,1a2218ff913fc33408bffccb081b5048", "versions.yml:md5,53d6e983afde3a28add2ffc6b7eba4f3", - "versions.yml:md5,9c558ff624585a6eee82a19c8c0136db" + "versions.yml:md5,2f3b3a13b36dabf13f09327613d5558d" ] ], "meta": { From 445577f72d4cff32aa2b19dbe90aa7101d8c688e Mon Sep 17 00:00:00 2001 From: Sebastian Uhrig Date: Mon, 8 Apr 2024 09:51:42 +0000 Subject: [PATCH 839/852] update MD5 sum of versions.yml for nf-test --- .../tests/main.nf.test.snap | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap index 6872d8d2..e10ffeb3 100644 --- a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap @@ -40,8 +40,8 @@ "content": [ [ "versions.yml:md5,1a2218ff913fc33408bffccb081b5048", - "versions.yml:md5,53d6e983afde3a28add2ffc6b7eba4f3", - "versions.yml:md5,2f3b3a13b36dabf13f09327613d5558d" + "versions.yml:md5,2f3b3a13b36dabf13f09327613d5558d", + "versions.yml:md5,53d6e983afde3a28add2ffc6b7eba4f3" ] ], "meta": { From dd4d19cc2285825435e60c044ea9a8f57cc3734b Mon Sep 17 00:00:00 2001 From: Sebastian Uhrig Date: Mon, 8 Apr 2024 10:39:42 +0000 Subject: [PATCH 840/852] update snapshots for nf-test --- .../tests/main.nf.test.snap | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap index e10ffeb3..2530372b 100644 --- a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap @@ -28,7 +28,7 @@ }, "test_pe_reads_2_size": { "content": [ - 2011460 + 2013376 ], "meta": { "nf-test": "0.8.4", @@ -52,7 +52,7 @@ }, "test_pe_reads_1_size": { "content": [ - 2011460 + 2013376 ], "meta": { "nf-test": "0.8.4", From 3056a3ad09306ce58159093c8ee013d59dc5e682 Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Mon, 8 Apr 2024 14:51:27 +0200 Subject: [PATCH 841/852] Update subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap --- .../tests/main.nf.test.snap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap index 2530372b..0c0be2a4 100644 --- a/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap +++ b/subworkflows/nf-core/fastq_download_prefetch_fasterqdump_sratools/tests/main.nf.test.snap @@ -28,7 +28,7 @@ }, "test_pe_reads_2_size": { "content": [ - 2013376 + 2011460 ], "meta": { "nf-test": "0.8.4", From 32abe41ce5af745147b0559e92a6124e39350b53 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Mon, 15 Apr 2024 09:54:36 +0100 Subject: [PATCH 842/852] feat: use github action instead of custom python --- .github/workflows/ci.yml | 25 ++++++------------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 527048fe..53859060 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,35 +27,22 @@ jobs: name: Check for changes runs-on: ubuntu-latest outputs: - nf_test_files: ${{ steps.list.outputs.nf_test_files }} + nf_test_files: ${{ steps.list.outputs.components }} steps: - - uses: actions/setup-python@v4 - with: - python-version: "3.11" - architecture: "x64" - - uses: actions/checkout@v3 with: fetch-depth: 0 - - name: Install gitpython find changed files - run: | - python -m pip install --upgrade pip - pip install gitpython pyyaml - - name: List nf-test files id: list - run: | - echo nf_test_files=$(python \ - .github/python/find_changed_files.py \ - -t pipeline workflow process \ - --head_ref ${{ github.sha }} \ - --base_ref origin/${{ github.base_ref }} \ - ) >> $GITHUB_OUTPUT + uses: adamrtalbot/detect-nf-test-changes@main + with: + head: ${{ github.sha }} + base: origin/${{ github.base_ref }} - name: print list of nf-test files run: | - echo ${{ steps.list.outputs.nf_test_files }} + echo ${{ steps.list.outputs.components }} test: name: ${{ matrix.nf_test_files }} ${{ matrix.profile }} NF-${{ matrix.NXF_VER }} From cfa6a262ee590a5fa2c718fdc54d203d7612e6ab Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Mon, 15 Apr 2024 09:55:34 +0100 Subject: [PATCH 843/852] Fixup: Add include file --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 53859060..8c2107ea 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -39,6 +39,7 @@ jobs: with: head: ${{ github.sha }} base: origin/${{ github.base_ref }} + include: .github/python/include.yaml - name: print list of nf-test files run: | From d4cd896df7a7ca6b9d9e4548d04c1ed5555c30dc Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Mon, 15 Apr 2024 10:19:20 +0100 Subject: [PATCH 844/852] move include.yaml --- .github/{python => }/include.yaml | 0 .github/python/find_changed_files.py | 317 --------------------------- .github/workflows/ci.yml | 2 +- 3 files changed, 1 insertion(+), 318 deletions(-) rename .github/{python => }/include.yaml (100%) delete mode 100644 .github/python/find_changed_files.py diff --git a/.github/python/include.yaml b/.github/include.yaml similarity index 100% rename from .github/python/include.yaml rename to .github/include.yaml diff --git a/.github/python/find_changed_files.py b/.github/python/find_changed_files.py deleted file mode 100644 index c0c61752..00000000 --- a/.github/python/find_changed_files.py +++ /dev/null @@ -1,317 +0,0 @@ -#!/usr/bin/env python - -# This script is used to identify *.nf.test files for changed functions/processs/workflows/pipelines and *.nf-test files -# with changed dependencies, then return as a JSON list - -import argparse -import json -import logging -import re -import yaml - -from itertools import chain -from pathlib import Path -from git import Repo - - -def parse_args() -> argparse.Namespace: - """ - Parse command line arguments and return an ArgumentParser object. - - Returns: - argparse.ArgumentParser: The ArgumentParser object with the parsed arguments. - """ - parser = argparse.ArgumentParser( - description="Scan *.nf.test files for function/process/workflow name and return as a JSON list" - ) - parser.add_argument( - "-r", - "--head_ref", - required=True, - help="Head reference branch (Source branch for a PR).", - ) - parser.add_argument( - "-b", - "--base_ref", - required=True, - help="Base reference branch (Target branch for a PR).", - ) - parser.add_argument( - "-x", - "--ignored_files", - nargs="+", - default=[ - ".git/*", - ".gitpod.yml", - ".prettierignore", - ".prettierrc.yml", - "*.md", - "*.png", - "modules.json", - "pyproject.toml", - "tower.yml", - ], - help="List of files or file substrings to ignore.", - ) - parser.add_argument( - "-i", - "--include", - type=Path, - default=".github/python/include.yaml", - help="Path to an include file containing a YAML of key value pairs to include in changed files. I.e., return the current directory if an important file is changed.", - ) - parser.add_argument( - "-l", - "--log-level", - choices=["DEBUG", "INFO", "WARNING", "ERROR"], - default="INFO", - help="Logging level", - ) - parser.add_argument( - "-t", - "--types", - nargs="+", - choices=["function", "process", "workflow", "pipeline"], - default=["function", "process", "workflow", "pipeline"], - help="Types of tests to include.", - ) - return parser.parse_args() - - -def read_yaml_inverted(file_path: str) -> dict: - """ - Read a YAML file and return its contents as a dictionary but reversed, i.e. the values become the keys and the keys become the values. - - Args: - file_path (str): The path to the YAML file. - - Returns: - dict: The contents of the YAML file as a dictionary inverted. - """ - with open(file_path, "r") as f: - data = yaml.safe_load(f) - - # Invert dictionary of lists into contents of lists are keys, values are the original keys - # { "key": ["item1", "item2] } --> { "item1": "key", "item2": "key" } - return {value: key for key, values in data.items() for value in values} - - -def find_changed_files( - branch1: str, - branch2: str, - ignore: list[str], -) -> list[Path]: - """ - Find all *.nf.tests that are associated with files that have been changed between two specified branches. - - Args: - branch1 (str) : The first branch being compared - branch2 (str) : The second branch being compared - ignore (list) : List of files or file substrings to ignore. - - Returns: - list: List of files matching the pattern *.nf.test that have changed between branch2 and branch1. - """ - # create repo - repo = Repo(".") - # identify commit on branch1 - branch1_commit = repo.commit(branch1) - # identify commit on branch2 - branch2_commit = repo.commit(branch2) - # compare two branches - diff_index = branch1_commit.diff(branch2_commit) - - # Start empty list of changed files - changed_files = [] - - # For every file that has changed between commits - for file in diff_index: - # Get pathlib.Path object - filepath = Path(file.a_path) - # If file does not match any in the ignore list, add containing directory to changed_files - if not any(filepath.match(ignored_path) for ignored_path in ignore): - changed_files.append(filepath) - - # Uniqueify the results before returning for efficiency - return list(set(changed_files)) - - -def detect_include_files( - changed_files: list[Path], include_files: dict[str, str] -) -> list[Path]: - """ - Detects the include files based on the changed files. - - Args: - changed_files (list[Path]): List of paths to the changed files. - include_files (dict[str, str]): Key-value pairs to return if a certain file has changed. If a file in a directory has changed, it points to a different directory. - - Returns: - list[Path]: List of paths to representing the keys of the include_files dictionary, where a value matched a path in changed_files. - """ - new_changed_files = [] - for filepath in changed_files: - # If file is in the include_files, we return the key instead of the value - for include_path, include_key in include_files.items(): - if filepath.match(include_path): - new_changed_files.append(Path(include_key)) - return new_changed_files - - -def detect_nf_test_files(changed_files: list[Path]) -> list[Path]: - """ - Detects and returns a list of nf-test files from the given list of changed files. - - Args: - changed_files (list[Path]): A list of file paths. - - Returns: - list[Path]: A list of nf-test file paths. - """ - result: list[Path] = [] - for path in changed_files: - # If Path is the exact nf-test file add to list: - if path.match("*.nf.test") and path.exists(): - result.append(path) - # Else recursively search for nf-test files: - else: - # Get the enclosing dir so files in the same dir can be found. - # e.g. - # dir/ - # ├─ main.nf - # ├─ main.nf.test - for file in path.parent.rglob("*.nf.test"): - result.append(file) - return result - - -def process_files(files: list[Path]) -> list[str]: - """ - Process the files and return lines that begin with 'workflow', 'process', or 'function' and have a single string afterwards. - - Args: - files (list): List of files to process. - - Returns: - list: List of lines that match the criteria. - """ - result = [] - for file in files: - with open(file, "r") as f: - is_pipeline_test = True - lines = f.readlines() - for line in lines: - line = line.strip() - if line.startswith(("workflow", "process", "function")): - words = line.split() - if len(words) == 2 and re.match(r'^".*"$', words[1]): - result.append(line) - is_pipeline_test = False - - # If no results included workflow, process or function - # Add a dummy result to fill the 'pipeline' category - if is_pipeline_test: - result.append("pipeline 'PIPELINE'") - - return result - - -def convert_nf_test_files_to_test_types( - lines: list[str], types: list[str] = ["function", "process", "workflow", "pipeline"] -) -> dict[str, list[str]]: - """ - Generate a dictionary of function, process and workflow lists from the lines. - - Args: - lines (list): List of lines to process. - types (list): List of types to include. - - Returns: - dict: Dictionary with function, process and workflow lists. - """ - # Populate empty dict from types - result: dict[str, list[str]] = {key: [] for key in types} - - for line in lines: - words = line.split() - if len(words) == 2 and re.match(r'^".*"$', words[1]): - keyword = words[0] - name = words[1].strip("'\"") # Strip both single and double quotes - if keyword in types: - result[keyword].append(name) - return result - - -def find_changed_dependencies(paths: list[Path], tags: list[str]) -> list[Path]: - """ - Find all *.nf.test files with changed dependencies from a list of paths. - - Args: - paths (list): List of directories or files to scan. - tags (list): List of tags identified as having changes. - - Returns: - list: List of *.nf.test files with changed dependencies. - """ - - result: list[Path] = [] - - nf_test_files = detect_nf_test_files(paths) - - # find nf-test files with changed dependencies - for nf_test_file in nf_test_files: - with open(nf_test_file, "r") as f: - lines = f.readlines() - # Get all tags from nf-test file - # Make case insensitive with .casefold() - tags_in_nf_test_file = [ - tag.casefold().replace("/", "_") - for tag in convert_nf_test_files_to_test_types(lines, types=["tag"])[ - "tag" - ] - ] - # Check if tag in nf-test file appears in a tag. - # Use .casefold() to be case insensitive - if any( - tag.casefold().replace("/", "_") in tags_in_nf_test_file for tag in tags - ): - result.append(nf_test_file) - - return result - - -if __name__ == "__main__": - - # Utility stuff - args = parse_args() - logging.basicConfig(level=args.log_level) - - # Parse nf-test files for target test tags - changed_files = find_changed_files(args.head_ref, args.base_ref, args.ignored_files) - - # If an additional include YAML is added, we detect additional changed dirs to include - if args.include: - include_files = read_yaml_inverted(args.include) - changed_files = changed_files + detect_include_files( - changed_files, include_files - ) - nf_test_files = detect_nf_test_files(changed_files) - lines = process_files(nf_test_files) - result = convert_nf_test_files_to_test_types(lines) - - # Get only relevant results (specified by -t) - # Unique using a set - target_results = list( - {item for sublist in map(result.get, args.types) for item in sublist} - ) - - # Parse files to identify nf-tests with changed dependencies - changed_dep_files = find_changed_dependencies([Path(".")], target_results) - - # Combine target nf-test files and nf-test files with changed dependencies - all_nf_tests = [ - str(test_path) for test_path in set(changed_dep_files + nf_test_files) - ] - - # Print to stdout - print(json.dumps(all_nf_tests)) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8c2107ea..938c54ae 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -39,7 +39,7 @@ jobs: with: head: ${{ github.sha }} base: origin/${{ github.base_ref }} - include: .github/python/include.yaml + include: .github/include.yaml - name: print list of nf-test files run: | From fd1d23f6310952b0861af1640718aaf4d010b3d8 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Tue, 23 Apr 2024 12:13:25 +0100 Subject: [PATCH 845/852] Update .github/workflows/ci.yml --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 938c54ae..7ddcf0bf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -35,7 +35,7 @@ jobs: - name: List nf-test files id: list - uses: adamrtalbot/detect-nf-test-changes@main + uses: adamrtalbot/detect-nf-test-changes@rewrite-using-class-instead-of-loops with: head: ${{ github.sha }} base: origin/${{ github.base_ref }} From e04589bb9298462716a5a4d7fafa64da7f196087 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Tue, 23 Apr 2024 16:12:38 +0100 Subject: [PATCH 846/852] Update .github/workflows/ci.yml --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7ddcf0bf..4c535bd1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -35,7 +35,7 @@ jobs: - name: List nf-test files id: list - uses: adamrtalbot/detect-nf-test-changes@rewrite-using-class-instead-of-loops + uses: adamrtalbot/detect-nf-test-changes@v0.0.1 with: head: ${{ github.sha }} base: origin/${{ github.base_ref }} From ce83591aa3002089614bd16c4e8fc2ddfebd5cb1 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Tue, 23 Apr 2024 18:01:57 +0100 Subject: [PATCH 847/852] Update detect-nf-test-changes to v0.0.2 --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4c535bd1..b102cc21 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -35,7 +35,7 @@ jobs: - name: List nf-test files id: list - uses: adamrtalbot/detect-nf-test-changes@v0.0.1 + uses: adamrtalbot/detect-nf-test-changes@v0.0.2 with: head: ${{ github.sha }} base: origin/${{ github.base_ref }} From 3e558c340968832179d04f878b78b18156ed22b1 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Wed, 24 Apr 2024 10:38:34 +0100 Subject: [PATCH 848/852] Update .github/workflows/ci.yml --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b102cc21..ad373fcf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -35,7 +35,7 @@ jobs: - name: List nf-test files id: list - uses: adamrtalbot/detect-nf-test-changes@v0.0.2 + uses: adamrtalbot/detect-nf-test-changes@9f8c94bee392098ca3e247e1004613a3728bbce5 with: head: ${{ github.sha }} base: origin/${{ github.base_ref }} From 31220181bf0af5adae56abfb77911d4e559a1f73 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Wed, 24 Apr 2024 16:02:18 +0100 Subject: [PATCH 849/852] Update .github/workflows/ci.yml --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ad373fcf..83e11c56 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -35,7 +35,7 @@ jobs: - name: List nf-test files id: list - uses: adamrtalbot/detect-nf-test-changes@9f8c94bee392098ca3e247e1004613a3728bbce5 + uses: adamrtalbot/detect-nf-test-changes@v0.0 with: head: ${{ github.sha }} base: origin/${{ github.base_ref }} From 2c49a44c87fef7cca1e11ed449483a9a3ed5edd4 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Wed, 24 Apr 2024 16:03:31 +0100 Subject: [PATCH 850/852] Update .github/workflows/ci.yml --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 83e11c56..3b1c9c6f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -35,7 +35,7 @@ jobs: - name: List nf-test files id: list - uses: adamrtalbot/detect-nf-test-changes@v0.0 + uses: adamrtalbot/detect-nf-test-changes@v0.0.3 with: head: ${{ github.sha }} base: origin/${{ github.base_ref }} From d3b03cd222f77ffed59e8ddda86013ed6f2a5e21 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Fri, 5 Jul 2024 16:23:34 +0100 Subject: [PATCH 851/852] Use nf-core/setup-nf-test action for reusability --- .github/workflows/ci.yml | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3b1c9c6f..83ed7d5e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -69,6 +69,8 @@ jobs: with: version: "${{ matrix.NXF_VER }}" + - uses: nf-core/setup-nf-test@v1 + - uses: actions/setup-python@v4 with: python-version: "3.11" @@ -79,21 +81,6 @@ jobs: python -m pip install --upgrade pip pip install pdiff - - name: Cache nf-test installation - id: cache-software - uses: actions/cache@v3 - with: - path: | - /usr/local/bin/nf-test - /home/runner/.nf-test/nf-test.jar - key: ${{ runner.os }}-${{ env.NFT_VER }}-nftest - - - name: Install nf-test - if: steps.cache-software.outputs.cache-hit != 'true' - run: | - wget -qO- https://code.askimed.com/install/nf-test | bash - sudo mv nf-test /usr/local/bin/ - - name: Run nf-test run: | nf-test test --verbose ${{ matrix.nf_test_files }} --profile "+${{ matrix.profile }}" --junitxml=test.xml --tap=test.tap From d96b1bc5933ea2bf8a63024a78cb51086a502f24 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Fri, 5 Jul 2024 16:27:20 +0100 Subject: [PATCH 852/852] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index dbfb81be..89ad79bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [PR #300](https://github.com/nf-core/fetchngs/pull/300) - Use file paths instead of tags for testing matrix, should make matrices more efficient - [PR #303](https://github.com/nf-core/fetchngs/pull/303) - Update wget container for SRA_FASTQ_FTP from 1.20.1 to 1.21.4 - [PR #305](https://github.com/nf-core/fetchngs/pull/305) - Update module sratools/prefetch for reliable download integrity check +- [PR #316](https://github.com/nf-core/fetchngs/pull/316) - Use nf-core/setup-nf-test to install nf-test from cache during CI/CD ### Software dependencies