From f7dabe47e110432456a4939997d4260cec207b1b Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Wed, 8 May 2024 13:58:19 +0000 Subject: [PATCH 001/154] Template update for nf-core/tools version 2.14.0 --- .editorconfig | 6 +- .github/PULL_REQUEST_TEMPLATE.md | 2 +- .github/workflows/awsfulltest.yml | 10 +- .github/workflows/awstest.yml | 12 +- .github/workflows/ci.yml | 4 +- .github/workflows/download_pipeline.yml | 22 ++- .github/workflows/fix-linting.yml | 6 +- .github/workflows/linting.yml | 18 +- .github/workflows/linting_comment.yml | 2 +- .github/workflows/release-announcements.yml | 6 +- .nf-core.yml | 1 + .pre-commit-config.yaml | 3 + CHANGELOG.md | 2 +- README.md | 2 +- assets/multiqc_config.yml | 6 +- conf/base.config | 3 - conf/modules.config | 8 - conf/test.config | 2 +- conf/test_full.config | 2 +- docs/usage.md | 2 + modules.json | 4 +- modules/nf-core/fastqc/main.nf | 6 + nextflow.config | 178 +++++++++--------- nextflow_schema.json | 7 + pyproject.toml | 15 -- .../main.nf | 16 +- .../nf-core/utils_nfcore_pipeline/main.nf | 8 +- workflows/differentialabundance.nf | 46 +++-- 28 files changed, 226 insertions(+), 173 deletions(-) delete mode 100644 pyproject.toml diff --git a/.editorconfig b/.editorconfig index dd9ffa53..72dda289 100644 --- a/.editorconfig +++ b/.editorconfig @@ -28,10 +28,6 @@ indent_style = unset [/assets/email*] indent_size = unset -# ignore Readme -[README.md] -indent_style = unset - -# ignore python +# ignore python and markdown [*.{py,md}] indent_style = unset diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 70d62a73..89778df2 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -18,7 +18,7 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/diff - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/differentialabundance/tree/master/.github/CONTRIBUTING.md) - [ ] If necessary, also make a PR on the nf-core/differentialabundance _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. - [ ] Make sure your code lints (`nf-core lint`). -- [ ] Ensure the test suite passes (`nf-test test main.nf.test -profile test,docker`). +- [ ] Ensure the test suite passes (`nextflow run . -profile test,docker --outdir `). - [ ] Check for unexpected warnings in debug mode (`nextflow run . -profile debug,test,docker --outdir `). - [ ] Usage Documentation in `docs/usage.md` is updated. - [ ] Output Documentation in `docs/output.md` is updated. diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index aa6416ec..8b09e66e 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -8,12 +8,12 @@ on: types: [published] workflow_dispatch: jobs: - run-tower: + run-platform: name: Run AWS full tests if: github.repository == 'nf-core/differentialabundance' runs-on: ubuntu-latest steps: - - name: Launch workflow via tower + - name: Launch workflow via Seqera Platform uses: seqeralabs/action-tower-launch@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) @@ -33,7 +33,7 @@ jobs: - uses: actions/upload-artifact@v4 with: - name: Tower debug log file + name: Seqera Platform debug log file path: | - tower_action_*.log - tower_action_*.json + seqera_platform_action_*.log + seqera_platform_action_*.json diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index ed9b65e7..b3d06d05 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -5,13 +5,13 @@ name: nf-core AWS test on: workflow_dispatch: jobs: - run-tower: + run-platform: name: Run AWS tests if: github.repository == 'nf-core/differentialabundance' runs-on: ubuntu-latest steps: - # Launch workflow using Tower CLI tool action - - name: Launch workflow via tower + # Launch workflow using Seqera Platform CLI tool action + - name: Launch workflow via Seqera Platform uses: seqeralabs/action-tower-launch@v2 with: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} @@ -27,7 +27,7 @@ jobs: - uses: actions/upload-artifact@v4 with: - name: Tower debug log file + name: Seqera Platform debug log file path: | - tower_action_*.log - tower_action_*.json + seqera_platform_action_*.log + seqera_platform_action_*.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ec48ce72..0f3f3490 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,10 +28,10 @@ jobs: - "latest-everything" steps: - name: Check out pipeline code - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4 - name: Install Nextflow - uses: nf-core/setup-nextflow@v1 + uses: nf-core/setup-nextflow@v2 with: version: "${{ matrix.NXF_VER }}" diff --git a/.github/workflows/download_pipeline.yml b/.github/workflows/download_pipeline.yml index 08622fd5..2d20d644 100644 --- a/.github/workflows/download_pipeline.yml +++ b/.github/workflows/download_pipeline.yml @@ -14,6 +14,8 @@ on: pull_request: types: - opened + - edited + - synchronize branches: - master pull_request_target: @@ -28,11 +30,14 @@ jobs: runs-on: ubuntu-latest steps: - name: Install Nextflow - uses: nf-core/setup-nextflow@v1 + uses: nf-core/setup-nextflow@v2 - - uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5 + - name: Disk space cleanup + uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 + + - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5 with: - python-version: "3.11" + python-version: "3.12" architecture: "x64" - uses: eWaterCycle/setup-singularity@931d4e31109e875b13309ae1d07c70ca8fbc8537 # v7 with: @@ -65,8 +70,17 @@ jobs: - name: Inspect download run: tree ./${{ env.REPOTITLE_LOWERCASE }} - - name: Run the downloaded pipeline + - name: Run the downloaded pipeline (stub) + id: stub_run_pipeline + continue-on-error: true 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 + - name: Run the downloaded pipeline (stub run not supported) + id: run_pipeline + if: ${{ job.steps.stub_run_pipeline.status == failure() }} + env: + NXF_SINGULARITY_CACHEDIR: ./ + NXF_SINGULARITY_HOME_MOUNT: true + run: nextflow run ./${{ env.REPOTITLE_LOWERCASE }}/$( sed 's/\W/_/g' <<< ${{ env.REPO_BRANCH }}) -profile test,singularity --outdir ./results diff --git a/.github/workflows/fix-linting.yml b/.github/workflows/fix-linting.yml index 07013265..01392a8f 100644 --- a/.github/workflows/fix-linting.yml +++ b/.github/workflows/fix-linting.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: # Use the @nf-core-bot token to check out so we can push later - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4 with: token: ${{ secrets.nf_core_bot_auth_token }} @@ -32,9 +32,9 @@ jobs: GITHUB_TOKEN: ${{ secrets.nf_core_bot_auth_token }} # Install and run pre-commit - - uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5 + - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5 with: - python-version: 3.11 + python-version: "3.12" - name: Install pre-commit run: pip install pre-commit diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 073e1876..a3fb2541 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -14,12 +14,12 @@ jobs: pre-commit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4 - - name: Set up Python 3.11 - uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5 + - name: Set up Python 3.12 + uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5 with: - python-version: 3.11 + python-version: "3.12" cache: "pip" - name: Install pre-commit @@ -32,14 +32,14 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out pipeline code - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4 - name: Install Nextflow - uses: nf-core/setup-nextflow@v1 + uses: nf-core/setup-nextflow@v2 - - uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5 + - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5 with: - python-version: "3.11" + python-version: "3.12" architecture: "x64" - name: Install dependencies @@ -60,7 +60,7 @@ jobs: - name: Upload linting log file artifact if: ${{ always() }} - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4 + uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4 with: name: linting-logs path: | diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index b706875f..40acc23f 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Download lint results - uses: dawidd6/action-download-artifact@f6b0bace624032e30a85a8fd9c1a7f8f611f5737 # v3 + uses: dawidd6/action-download-artifact@09f2f74827fd3a8607589e5ad7f9398816f540fe # v3 with: workflow: linting.yml workflow_conclusion: completed diff --git a/.github/workflows/release-announcements.yml b/.github/workflows/release-announcements.yml index d468aeaa..03ecfcf7 100644 --- a/.github/workflows/release-announcements.yml +++ b/.github/workflows/release-announcements.yml @@ -12,7 +12,7 @@ jobs: - name: get topics and convert to hashtags id: get_topics run: | - curl -s https://nf-co.re/pipelines.json | jq -r '.remote_workflows[] | select(.full_name == "${{ github.repository }}") | .topics[]' | awk '{print "#"$0}' | tr '\n' ' ' >> $GITHUB_OUTPUT + echo "topics=$(curl -s https://nf-co.re/pipelines.json | jq -r '.remote_workflows[] | select(.full_name == "${{ github.repository }}") | .topics[]' | awk '{print "#"$0}' | tr '\n' ' ')" >> $GITHUB_OUTPUT - uses: rzr/fediverse-action@master with: @@ -25,13 +25,13 @@ jobs: Please see the changelog: ${{ github.event.release.html_url }} - ${{ steps.get_topics.outputs.GITHUB_OUTPUT }} #nfcore #openscience #nextflow #bioinformatics + ${{ steps.get_topics.outputs.topics }} #nfcore #openscience #nextflow #bioinformatics send-tweet: runs-on: ubuntu-latest steps: - - uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5 + - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5 with: python-version: "3.10" - name: Install dependencies diff --git a/.nf-core.yml b/.nf-core.yml index 3805dc81..d6daa403 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1 +1,2 @@ repository_type: pipeline +nf_core_version: "2.14.0" diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index af57081f..4dc0f1dc 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,6 +3,9 @@ repos: rev: "v3.1.0" hooks: - id: prettier + additional_dependencies: + - prettier@3.2.5 + - repo: https://github.com/editorconfig-checker/editorconfig-checker.python rev: "2.7.3" hooks: diff --git a/CHANGELOG.md b/CHANGELOG.md index ea1ed1ce..27e90f51 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). -## v1.5.0dev - [date] +## v1.5.0 - [date] Initial release of nf-core/differentialabundance, created with the [nf-core](https://nf-co.re/) template. diff --git a/README.md b/README.md index 71f2cd2a..d09ab926 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ [![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/) -[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://tower.nf/launch?pipeline=https://github.com/nf-core/differentialabundance) +[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/differentialabundance) [![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23differentialabundance-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/differentialabundance)[![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?labelColor=000000&logo=twitter)](https://twitter.com/nf_core)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core) diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index 3c2228d0..b85f6704 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -1,7 +1,9 @@ report_comment: > - This report has been generated by the nf-core/differentialabundance + + This report has been generated by the nf-core/differentialabundance analysis pipeline. For information about how to interpret these results, please see the - documentation. + documentation. + report_section_order: "nf-core-differentialabundance-methods-description": order: -1000 diff --git a/conf/base.config b/conf/base.config index 264a24b8..a63db502 100644 --- a/conf/base.config +++ b/conf/base.config @@ -59,7 +59,4 @@ process { errorStrategy = 'retry' maxRetries = 2 } - withName:CUSTOM_DUMPSOFTWAREVERSIONS { - cache = false - } } diff --git a/conf/modules.config b/conf/modules.config index e3ea8fa6..d203d2b6 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -22,14 +22,6 @@ process { ext.args = '--quiet' } - withName: CUSTOM_DUMPSOFTWAREVERSIONS { - publishDir = [ - path: { "${params.outdir}/pipeline_info" }, - mode: params.publish_dir_mode, - pattern: '*_versions.yml' - ] - } - withName: 'MULTIQC' { ext.args = { params.multiqc_title ? "--title \"$params.multiqc_title\"" : '' } publishDir = [ diff --git a/conf/test.config b/conf/test.config index 970e8194..ea55c6c3 100644 --- a/conf/test.config +++ b/conf/test.config @@ -22,7 +22,7 @@ params { // 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' + input = params.pipelines_testdata_base_path + 'viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv' // Genome references genome = 'R64-1-1' diff --git a/conf/test_full.config b/conf/test_full.config index 06108ad0..553892a3 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -17,7 +17,7 @@ params { // 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' + input = params.pipelines_testdata_base_path + 'viralrecon/samplesheet/samplesheet_full_illumina_amplicon.csv' // Genome references genome = 'R64-1-1' diff --git a/docs/usage.md b/docs/usage.md index 37a94691..55beaabc 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -156,6 +156,8 @@ If `-profile` is not specified, the pipeline will run locally and expect all sof - A generic configuration profile to be used with [Charliecloud](https://hpc.github.io/charliecloud/) - `apptainer` - A generic configuration profile to be used with [Apptainer](https://apptainer.org/) +- `wave` + - A generic configuration profile to enable [Wave](https://seqera.io/wave/) containers. Use together with one of the above (requires Nextflow ` 24.03.0-edge` or later). - `conda` - A generic configuration profile to be used with [Conda](https://conda.io/docs/). Please only use Conda as a last resort i.e. when it's not possible to run the pipeline with Docker, Singularity, Podman, Shifter, Charliecloud, or Apptainer. diff --git a/modules.json b/modules.json index de94d3f2..3e976078 100644 --- a/modules.json +++ b/modules.json @@ -7,7 +7,7 @@ "nf-core": { "fastqc": { "branch": "master", - "git_sha": "f4ae1d942bd50c5c0b9bd2de1393ce38315ba57c", + "git_sha": "285a50500f9e02578d90b3ce6382ea3c30216acd", "installed_by": ["modules"] }, "multiqc": { @@ -26,7 +26,7 @@ }, "utils_nfcore_pipeline": { "branch": "master", - "git_sha": "5caf7640a9ef1d18d765d55339be751bb0969dfa", + "git_sha": "92de218a329bfc9a9033116eb5f65fd270e72ba3", "installed_by": ["subworkflows"] }, "utils_nfvalidation_plugin": { diff --git a/modules/nf-core/fastqc/main.nf b/modules/nf-core/fastqc/main.nf index 9e19a74c..d79f1c86 100644 --- a/modules/nf-core/fastqc/main.nf +++ b/modules/nf-core/fastqc/main.nf @@ -25,6 +25,11 @@ process FASTQC { def old_new_pairs = reads instanceof Path || reads.size() == 1 ? [[ reads, "${prefix}.${reads.extension}" ]] : reads.withIndex().collect { entry, index -> [ entry, "${prefix}_${index + 1}.${entry.extension}" ] } def rename_to = old_new_pairs*.join(' ').join(' ') def renamed_files = old_new_pairs.collect{ old_name, new_name -> new_name }.join(' ') + + def memory_in_mb = MemoryUnit.of("${task.memory}").toUnit('MB') + // FastQC memory value allowed range (100 - 10000) + def fastqc_memory = memory_in_mb > 10000 ? 10000 : (memory_in_mb < 100 ? 100 : memory_in_mb) + """ printf "%s %s\\n" $rename_to | while read old_name new_name; do [ -f "\${new_name}" ] || ln -s \$old_name \$new_name @@ -33,6 +38,7 @@ process FASTQC { fastqc \\ $args \\ --threads $task.cpus \\ + --memory $fastqc_memory \\ $renamed_files cat <<-END_VERSIONS > versions.yml diff --git a/nextflow.config b/nextflow.config index 4ee95a64..862544ff 100644 --- a/nextflow.config +++ b/nextflow.config @@ -16,7 +16,8 @@ params { genome = null igenomes_base = 's3://ngi-igenomes/igenomes/' igenomes_ignore = false - fasta = null// MultiQC options + + // MultiQC options multiqc_config = null multiqc_title = null multiqc_logo = null @@ -24,15 +25,16 @@ params { multiqc_methods_description = null // Boilerplate options - outdir = null - publish_dir_mode = 'copy' - email = null - email_on_fail = null - plaintext_email = false - monochrome_logs = false - hook_url = null - help = false - version = false + outdir = null + publish_dir_mode = 'copy' + email = null + email_on_fail = null + plaintext_email = false + monochrome_logs = false + hook_url = null + help = false + version = false + pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/' // Config options config_profile_name = null @@ -68,103 +70,109 @@ try { } // Load nf-core/differentialabundance 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/differentialabundance.config" -// } catch (Exception e) { -// System.err.println("WARNING: Could not load nf-core/config/differentialabundance profiles: ${params.custom_config_base}/pipeline/differentialabundance.config") -// } +try { + includeConfig "${params.custom_config_base}/pipeline/differentialabundance.config" +} catch (Exception e) { + System.err.println("WARNING: Could not load nf-core/config/differentialabundance profiles: ${params.custom_config_base}/pipeline/differentialabundance.config") +} profiles { debug { - dumpHashes = true - process.beforeScript = 'echo $HOSTNAME' - cleanup = false + dumpHashes = true + process.beforeScript = 'echo $HOSTNAME' + cleanup = false nextflow.enable.configProcessNamesValidation = true } conda { - conda.enabled = true - docker.enabled = false - singularity.enabled = false - podman.enabled = false - shifter.enabled = false - charliecloud.enabled = false - channels = ['conda-forge', 'bioconda', 'defaults'] - apptainer.enabled = false + conda.enabled = true + docker.enabled = false + singularity.enabled = false + podman.enabled = false + shifter.enabled = false + charliecloud.enabled = false + conda.channels = ['conda-forge', 'bioconda', 'defaults'] + apptainer.enabled = false } mamba { - conda.enabled = true - conda.useMamba = true - docker.enabled = false - singularity.enabled = false - podman.enabled = false - shifter.enabled = false - charliecloud.enabled = false - apptainer.enabled = false + conda.enabled = true + conda.useMamba = true + docker.enabled = false + singularity.enabled = false + podman.enabled = false + shifter.enabled = false + charliecloud.enabled = false + apptainer.enabled = false } docker { - docker.enabled = true - conda.enabled = false - singularity.enabled = false - podman.enabled = false - shifter.enabled = false - charliecloud.enabled = false - apptainer.enabled = false - docker.runOptions = '-u $(id -u):$(id -g)' + docker.enabled = true + conda.enabled = false + singularity.enabled = false + podman.enabled = false + shifter.enabled = false + charliecloud.enabled = false + apptainer.enabled = false + docker.runOptions = '-u $(id -u):$(id -g)' } arm { - docker.runOptions = '-u $(id -u):$(id -g) --platform=linux/amd64' + docker.runOptions = '-u $(id -u):$(id -g) --platform=linux/amd64' } singularity { - singularity.enabled = true - singularity.autoMounts = true - conda.enabled = false - docker.enabled = false - podman.enabled = false - shifter.enabled = false - charliecloud.enabled = false - apptainer.enabled = false + singularity.enabled = true + singularity.autoMounts = true + conda.enabled = false + docker.enabled = false + podman.enabled = false + shifter.enabled = false + charliecloud.enabled = false + apptainer.enabled = false } podman { - podman.enabled = true - conda.enabled = false - docker.enabled = false - singularity.enabled = false - shifter.enabled = false - charliecloud.enabled = false - apptainer.enabled = false + podman.enabled = true + conda.enabled = false + docker.enabled = false + singularity.enabled = false + shifter.enabled = false + charliecloud.enabled = false + apptainer.enabled = false } shifter { - shifter.enabled = true - conda.enabled = false - docker.enabled = false - singularity.enabled = false - podman.enabled = false - charliecloud.enabled = false - apptainer.enabled = false + shifter.enabled = true + conda.enabled = false + docker.enabled = false + singularity.enabled = false + podman.enabled = false + charliecloud.enabled = false + apptainer.enabled = false } charliecloud { - charliecloud.enabled = true - conda.enabled = false - docker.enabled = false - singularity.enabled = false - podman.enabled = false - shifter.enabled = false - apptainer.enabled = false + charliecloud.enabled = true + conda.enabled = false + docker.enabled = false + singularity.enabled = false + podman.enabled = false + shifter.enabled = false + apptainer.enabled = false } apptainer { - apptainer.enabled = true - apptainer.autoMounts = true - conda.enabled = false - docker.enabled = false - singularity.enabled = false - podman.enabled = false - shifter.enabled = false - charliecloud.enabled = false + apptainer.enabled = true + apptainer.autoMounts = true + conda.enabled = false + docker.enabled = false + singularity.enabled = false + podman.enabled = false + shifter.enabled = false + charliecloud.enabled = false + } + wave { + apptainer.ociAutoPull = true + singularity.ociAutoPull = true + wave.enabled = true + wave.freeze = true + wave.strategy = 'conda,container' } gitpod { - executor.name = 'local' - executor.cpus = 4 - executor.memory = 8.GB + executor.name = 'local' + executor.cpus = 4 + executor.memory = 8.GB } test { includeConfig 'conf/test.config' } test_full { includeConfig 'conf/test_full.config' } @@ -231,7 +239,7 @@ manifest { description = """Differential abundance analysis""" mainScript = 'main.nf' nextflowVersion = '!>=23.04.0' - version = '1.5.0dev' + version = '1.5.0' doi = '' } diff --git a/nextflow_schema.json b/nextflow_schema.json index 1354b449..ae89f23d 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -265,6 +265,13 @@ "description": "Validation of parameters in lenient more.", "hidden": true, "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)." + }, + "pipelines_testdata_base_path": { + "type": "string", + "fa_icon": "far fa-check-circle", + "description": "Base URL or local path to location of pipeline test dataset files", + "default": "https://raw.githubusercontent.com/nf-core/test-datasets/", + "hidden": true } } } diff --git a/pyproject.toml b/pyproject.toml deleted file mode 100644 index 56110621..00000000 --- a/pyproject.toml +++ /dev/null @@ -1,15 +0,0 @@ -# Config file for Python. Mostly used to configure linting of bin/*.py with Ruff. -# Should be kept the same as nf-core/tools to avoid fighting with template synchronisation. -[tool.ruff] -line-length = 120 -target-version = "py38" -cache-dir = "~/.cache/ruff" - -[tool.ruff.lint] -select = ["I", "E1", "E4", "E7", "E9", "F", "UP", "N"] - -[tool.ruff.lint.isort] -known-first-party = ["nf_core"] - -[tool.ruff.lint.per-file-ignores] -"__init__.py" = ["E402", "F401"] diff --git a/subworkflows/local/utils_nfcore_differentialabundance_pipeline/main.nf b/subworkflows/local/utils_nfcore_differentialabundance_pipeline/main.nf index 10379724..8bf1f22b 100644 --- a/subworkflows/local/utils_nfcore_differentialabundance_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_differentialabundance_pipeline/main.nf @@ -140,6 +140,10 @@ workflow PIPELINE_COMPLETION { imNotification(summary_params, hook_url) } } + + workflow.onError { + log.error "Pipeline failed. Please refer to troubleshooting docs: https://nf-co.re/docs/usage/troubleshooting" + } } /* @@ -230,8 +234,16 @@ def methodsDescriptionText(mqc_methods_yaml) { meta["manifest_map"] = workflow.manifest.toMap() // Pipeline DOI - meta["doi_text"] = meta.manifest_map.doi ? "(doi: ${meta.manifest_map.doi})" : "" - meta["nodoi_text"] = meta.manifest_map.doi ? "": "
  • If available, make sure to update the text to include the Zenodo DOI of version of the pipeline used.
  • " + if (meta.manifest_map.doi) { + // Using a loop to handle multiple DOIs + // Removing `https://doi.org/` to handle pipelines using DOIs vs DOI resolvers + // Removing ` ` since the manifest.doi is a string and not a proper list + def temp_doi_ref = "" + String[] manifest_doi = meta.manifest_map.doi.tokenize(",") + for (String doi_ref: manifest_doi) temp_doi_ref += "(doi: ${doi_ref.replace("https://doi.org/", "").replace(" ", "")}), " + meta["doi_text"] = temp_doi_ref.substring(0, temp_doi_ref.length() - 2) + } else meta["doi_text"] = "" + meta["nodoi_text"] = meta.manifest_map.doi ? "" : "
  • If available, make sure to update the text to include the Zenodo DOI of version of the pipeline used.
  • " // Tool references meta["tool_citations"] = "" diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf index a8b55d6f..14558c39 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf +++ b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf @@ -65,9 +65,15 @@ def checkProfileProvided(nextflow_cli_args) { // Citation string for pipeline // def workflowCitation() { + def temp_doi_ref = "" + String[] manifest_doi = workflow.manifest.doi.tokenize(",") + // Using a loop to handle multiple DOIs + // Removing `https://doi.org/` to handle pipelines using DOIs vs DOI resolvers + // Removing ` ` since the manifest.doi is a string and not a proper list + for (String doi_ref: manifest_doi) temp_doi_ref += " https://doi.org/${doi_ref.replace('https://doi.org/', '').replace(' ', '')}\n" return "If you use ${workflow.manifest.name} for your analysis please cite:\n\n" + "* The pipeline\n" + - " ${workflow.manifest.doi}\n\n" + + temp_doi_ref + "\n" + "* The nf-core framework\n" + " https://doi.org/10.1038/s41587-020-0439-x\n\n" + "* Software dependencies\n" + diff --git a/workflows/differentialabundance.nf b/workflows/differentialabundance.nf index ccc14aaf..29dec88a 100644 --- a/workflows/differentialabundance.nf +++ b/workflows/differentialabundance.nf @@ -40,22 +40,44 @@ workflow DIFFERENTIALABUNDANCE { // Collate and save software versions // softwareVersionsToYAML(ch_versions) - .collectFile(storeDir: "${params.outdir}/pipeline_info", name: 'nf_core_pipeline_software_mqc_versions.yml', sort: true, newLine: true) - .set { ch_collated_versions } + .collectFile( + storeDir: "${params.outdir}/pipeline_info", + name: 'nf_core_pipeline_software_mqc_versions.yml', + sort: true, + newLine: true + ).set { ch_collated_versions } // // MODULE: MultiQC // - ch_multiqc_config = Channel.fromPath("$projectDir/assets/multiqc_config.yml", checkIfExists: true) - ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multiqc_config, checkIfExists: true) : Channel.empty() - ch_multiqc_logo = params.multiqc_logo ? Channel.fromPath(params.multiqc_logo, checkIfExists: true) : Channel.empty() - summary_params = paramsSummaryMap(workflow, parameters_schema: "nextflow_schema.json") - ch_workflow_summary = Channel.value(paramsSummaryMultiqc(summary_params)) - ch_multiqc_custom_methods_description = params.multiqc_methods_description ? file(params.multiqc_methods_description, checkIfExists: true) : file("$projectDir/assets/methods_description_template.yml", checkIfExists: true) - ch_methods_description = Channel.value(methodsDescriptionText(ch_multiqc_custom_methods_description)) - ch_multiqc_files = ch_multiqc_files.mix(ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) - ch_multiqc_files = ch_multiqc_files.mix(ch_collated_versions) - ch_multiqc_files = ch_multiqc_files.mix(ch_methods_description.collectFile(name: 'methods_description_mqc.yaml', sort: false)) + ch_multiqc_config = Channel.fromPath( + "$projectDir/assets/multiqc_config.yml", checkIfExists: true) + ch_multiqc_custom_config = params.multiqc_config ? + Channel.fromPath(params.multiqc_config, checkIfExists: true) : + Channel.empty() + ch_multiqc_logo = params.multiqc_logo ? + Channel.fromPath(params.multiqc_logo, checkIfExists: true) : + Channel.empty() + + summary_params = paramsSummaryMap( + workflow, parameters_schema: "nextflow_schema.json") + ch_workflow_summary = Channel.value(paramsSummaryMultiqc(summary_params)) + + ch_multiqc_custom_methods_description = params.multiqc_methods_description ? + file(params.multiqc_methods_description, checkIfExists: true) : + file("$projectDir/assets/methods_description_template.yml", checkIfExists: true) + ch_methods_description = Channel.value( + methodsDescriptionText(ch_multiqc_custom_methods_description)) + + ch_multiqc_files = ch_multiqc_files.mix( + ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) + ch_multiqc_files = ch_multiqc_files.mix(ch_collated_versions) + ch_multiqc_files = ch_multiqc_files.mix( + ch_methods_description.collectFile( + name: 'methods_description_mqc.yaml', + sort: true + ) + ) MULTIQC ( ch_multiqc_files.collect(), From 41729bcdab636ff2ee78d5b235ccd52a2309d202 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Thu, 9 May 2024 11:41:51 +0000 Subject: [PATCH 002/154] Template update for nf-core/tools version 2.14.1 --- .github/workflows/linting.yml | 1 - .nf-core.yml | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index a3fb2541..1fcafe88 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -20,7 +20,6 @@ jobs: uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5 with: python-version: "3.12" - cache: "pip" - name: Install pre-commit run: pip install pre-commit diff --git a/.nf-core.yml b/.nf-core.yml index d6daa403..e0b85a77 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,2 +1,2 @@ repository_type: pipeline -nf_core_version: "2.14.0" +nf_core_version: "2.14.1" From d6041289e3d82cf7e2c8bd132fd89a1384b7b110 Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Wed, 22 May 2024 09:03:16 +0100 Subject: [PATCH 003/154] Update differentialabundance_report.Rmd --- assets/differentialabundance_report.Rmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/differentialabundance_report.Rmd b/assets/differentialabundance_report.Rmd index 7bf41c12..861f55e0 100644 --- a/assets/differentialabundance_report.Rmd +++ b/assets/differentialabundance_report.Rmd @@ -510,7 +510,7 @@ contrasts_to_print$model <- sapply(contrasts_to_print$Id, function(id) { } }) -print( htmltools::tagList(datatable(contrasts_to_print, caption = paste0("Table of contrasts"), rownames = FALSE, options = list(dom = 't')) )) +print( htmltools::tagList(datatable(contrasts_to_print, caption = paste0("Table of contrasts"), rownames = FALSE, options = list(dom = ifelse(nrow(contrasts_to_print) > 10, 'tp', 't'))) )) ``` # Results From 20a44d626e08553ae9c1c9fc59088fd0bed23cf3 Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Wed, 22 May 2024 09:06:36 +0100 Subject: [PATCH 004/154] Update CHANGELOG.md --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d844a1e..8c24f8d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +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). +## v1.6.0dev - xxxx-xx-xx + +### Added + +### Fixed + +- [[#272](https://github.com/nf-core/differentialabundance/pull/272)] - Show >10 contrasts in report ([@pinin4fjords](https://github.com/pinin4fjords), review by [@WackerO](https://github.com/WackerO)) + +### Changed + ## v1.5.0 ### `Added` From c05522a34bb4b081f2cb824979f3dcfabec5a4e8 Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Wed, 22 May 2024 09:08:02 +0100 Subject: [PATCH 005/154] Update CHANGELOG.md --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c24f8d6..c5825d81 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). -## v1.6.0dev - xxxx-xx-xx +## v1.6.0dev - 2024-05-08 ### Added @@ -13,7 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed -## v1.5.0 +## v1.5.0 - 2024-11-27 ### `Added` From e623b0d2ffd2383ddd7e98ad9023439d20dd1821 Mon Sep 17 00:00:00 2001 From: WackerO Date: Wed, 22 May 2024 11:11:03 +0200 Subject: [PATCH 006/154] prettier --- 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 b85f6704..0dcde718 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -1,9 +1,9 @@ report_comment: > - + This report has been generated by the nf-core/differentialabundance analysis pipeline. For information about how to interpret these results, please see the documentation. - + report_section_order: "nf-core-differentialabundance-methods-description": order: -1000 From ab26e4c9f9543b58d18bc8758300f45e39ecb31d Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Wed, 22 May 2024 12:08:41 +0100 Subject: [PATCH 007/154] fix files_unchanged --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- .github/workflows/linting.yml | 19 +++++++++---------- .github/workflows/linting_comment.yml | 2 +- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 70d62a73..89778df2 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -18,7 +18,7 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/diff - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/differentialabundance/tree/master/.github/CONTRIBUTING.md) - [ ] If necessary, also make a PR on the nf-core/differentialabundance _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. - [ ] Make sure your code lints (`nf-core lint`). -- [ ] Ensure the test suite passes (`nf-test test main.nf.test -profile test,docker`). +- [ ] Ensure the test suite passes (`nextflow run . -profile test,docker --outdir `). - [ ] Check for unexpected warnings in debug mode (`nextflow run . -profile debug,test,docker --outdir `). - [ ] Usage Documentation in `docs/usage.md` is updated. - [ ] Output Documentation in `docs/output.md` is updated. diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 073e1876..1fcafe88 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -14,13 +14,12 @@ jobs: pre-commit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4 - - name: Set up Python 3.11 - uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5 + - name: Set up Python 3.12 + uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5 with: - python-version: 3.11 - cache: "pip" + python-version: "3.12" - name: Install pre-commit run: pip install pre-commit @@ -32,14 +31,14 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out pipeline code - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4 - name: Install Nextflow - uses: nf-core/setup-nextflow@v1 + uses: nf-core/setup-nextflow@v2 - - uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5 + - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5 with: - python-version: "3.11" + python-version: "3.12" architecture: "x64" - name: Install dependencies @@ -60,7 +59,7 @@ jobs: - name: Upload linting log file artifact if: ${{ always() }} - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4 + uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4 with: name: linting-logs path: | diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index b706875f..40acc23f 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Download lint results - uses: dawidd6/action-download-artifact@f6b0bace624032e30a85a8fd9c1a7f8f611f5737 # v3 + uses: dawidd6/action-download-artifact@09f2f74827fd3a8607589e5ad7f9398816f540fe # v3 with: workflow: linting.yml workflow_conclusion: completed From bcfde263d117382137b6f4fe515b5817d9a1fc5e Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Wed, 22 May 2024 13:22:02 +0100 Subject: [PATCH 008/154] Update CHANGELOG.md --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 49e93d17..2325f46c 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). -## v1.6.0dev - 2024-05-08 +## v1.6.0dev - xxxx-xx-xx ### Added @@ -13,7 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed -## v1.5.0 - 2024-11-27 +## v1.5.0 - 2024-05-08 ### `Added` From dadf5dbfc6f98632f272cf6e8f153155b6c79064 Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Fri, 24 May 2024 09:20:16 +0100 Subject: [PATCH 009/154] Fix pagination on samples tableee --- assets/differentialabundance_report.Rmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/differentialabundance_report.Rmd b/assets/differentialabundance_report.Rmd index 861f55e0..b13d321c 100644 --- a/assets/differentialabundance_report.Rmd +++ b/assets/differentialabundance_report.Rmd @@ -487,7 +487,7 @@ display_columns <- head(union(display_columns, additional_useful_cols), 5) display_columns <- unique(c(display_columns, informative_variables)) observations_to_print <- observations[,unique(display_columns)] colnames(observations_to_print) <- prettifyVariablename(colnames(observations_to_print)) -print( htmltools::tagList(datatable(observations_to_print, caption = paste(ucfirst(params$observations_type), 'metadata'), rownames = FALSE, options = list(dom = 'tb')) )) +print( htmltools::tagList(datatable(observations_to_print, caption = paste(ucfirst(params$observations_type), 'metadata'), rownames = FALSE, options = list(dom = 'tp')) )) ``` ## Contrasts From 04635ef33d5bee6a74d54723b6e80761903dae0a Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Fri, 24 May 2024 09:22:36 +0100 Subject: [PATCH 010/154] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2325f46c..6201791b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - [[#272](https://github.com/nf-core/differentialabundance/pull/272)] - Show >10 contrasts in report ([@pinin4fjords](https://github.com/pinin4fjords), review by [@WackerO](https://github.com/WackerO)) +- [[#274](https://github.com/nf-core/differentialabundance/pull/274)] - Fix pagination on samples table ([@pinin4fjords](https://github.com/pinin4fjords), review by [@WackerO](https://github.com/WackerO)) + ### Changed From 8353e974a9d6be01ed05be17d27e4df985a6020b Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Fri, 24 May 2024 09:29:12 +0100 Subject: [PATCH 011/154] Fix CHANGELOG --- CHANGELOG.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6201791b..254f0ab4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,9 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed -- [[#272](https://github.com/nf-core/differentialabundance/pull/272)] - Show >10 contrasts in report ([@pinin4fjords](https://github.com/pinin4fjords), review by [@WackerO](https://github.com/WackerO)) - [[#274](https://github.com/nf-core/differentialabundance/pull/274)] - Fix pagination on samples table ([@pinin4fjords](https://github.com/pinin4fjords), review by [@WackerO](https://github.com/WackerO)) - +- [[#272](https://github.com/nf-core/differentialabundance/pull/272)] - Show >10 contrasts in report ([@pinin4fjords](https://github.com/pinin4fjords), review by [@WackerO](https://github.com/WackerO)) ### Changed From 2d1f602c6d219b3bd360db4db42957d5b194ad58 Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Fri, 24 May 2024 09:45:49 +0100 Subject: [PATCH 012/154] Reset versions after release --- 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 0dcde718..f371f256 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -1,8 +1,8 @@ report_comment: > - This report has been generated by the nf-core/differentialabundance + This report has been generated by the nf-core/differentialabundance analysis pipeline. For information about how to interpret these results, please see the - documentation. + documentation. report_section_order: "nf-core-differentialabundance-methods-description": diff --git a/nextflow.config b/nextflow.config index 8ddd6b3e..f0ba3763 100644 --- a/nextflow.config +++ b/nextflow.config @@ -416,7 +416,7 @@ manifest { description = 'Differential abundance analysis' mainScript = 'main.nf' nextflowVersion = '!>=23.10.0' - version = '1.5.0' + version = '1.6.0dev' doi = '10.5281/zenodo.7568000' } From 349273f8fe1f2308c7caaec13be5b2b760455896 Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Fri, 24 May 2024 09:50:09 +0100 Subject: [PATCH 013/154] Fix linting --- assets/multiqc_config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index f371f256..a6dff49c 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -1,6 +1,6 @@ report_comment: > - This report has been generated by the nf-core/differentialabundance + This report has been generated by the nf-core/differentialabundance analysis pipeline. For information about how to interpret these results, please see the documentation. From 925527d4f1f713bdf9e10d654a3aa2b91b48f46c Mon Sep 17 00:00:00 2001 From: WackerO Date: Thu, 13 Jun 2024 13:05:40 +0200 Subject: [PATCH 014/154] bugfix for gprofiler without gene_sets --- workflows/differentialabundance.nf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/workflows/differentialabundance.nf b/workflows/differentialabundance.nf index 020c0747..cfeb6e65 100644 --- a/workflows/differentialabundance.nf +++ b/workflows/differentialabundance.nf @@ -73,6 +73,8 @@ if (run_gene_set_analysis) { } else if (params.gprofiler2_run) { if (!params.gprofiler2_token && !params.gprofiler2_organism) { error("To run gprofiler2, please provide a run token, GMT file or organism!") + } else { + ch_gene_sets = [[]] // If one of token or organism is provided, make gene_sets empty } } else { ch_gene_sets = [] // For methods that can run without gene sets From ccb9aa4d88f1a4de0e3ef5295aabbfb8dd835ec3 Mon Sep 17 00:00:00 2001 From: WackerO Date: Thu, 13 Jun 2024 14:40:52 +0200 Subject: [PATCH 015/154] add comment, update changelog --- CHANGELOG.md | 1 + workflows/differentialabundance.nf | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d844a1e..d2791a4c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### `Fixed` +- [[#278](https://github.com/nf-core/differentialabundance/pull/278)] - Fix missing ch_gene_sets when running gprofiler without gene sets ([@WackerO](https://github.com/WackerO), review by [@pinin4fjords](https://github.com/pinin4fjords)) - [[#267](https://github.com/nf-core/differentialabundance/pull/267)] - Whitespace fix, remove TODO, also update changelog for release release 1.5.0 ([@WackerO](https://github.com/WackerO), review by [@pinin4fjords](https://github.com/pinin4fjords)) - [[#265](https://github.com/nf-core/differentialabundance/pull/265)] - GSEA- pngs and htmls in same place ([@pinin4fjords](https://github.com/pinin4fjords), review by [@WackerO](https://github.com/WackerO)) - [[#257](https://github.com/nf-core/differentialabundance/pull/257)] - Fixed FILTER_DIFFTABLE module, updated PROTEUS module to better handle whitespace in prefix param, made docs clearer ([@WackerO](https://github.com/WackerO), review by [@pinin4fjords](https://github.com/pinin4fjords)) diff --git a/workflows/differentialabundance.nf b/workflows/differentialabundance.nf index cfeb6e65..4442091d 100644 --- a/workflows/differentialabundance.nf +++ b/workflows/differentialabundance.nf @@ -74,7 +74,7 @@ if (run_gene_set_analysis) { if (!params.gprofiler2_token && !params.gprofiler2_organism) { error("To run gprofiler2, please provide a run token, GMT file or organism!") } else { - ch_gene_sets = [[]] // If one of token or organism is provided, make gene_sets empty + ch_gene_sets = [[]] // If one of token or organism is provided, make gene_sets empty (nested because of .first() in the gprofiler call) } } else { ch_gene_sets = [] // For methods that can run without gene sets From af2436f8500758f088ecc1b045b042576bef516e Mon Sep 17 00:00:00 2001 From: WackerO Date: Fri, 14 Jun 2024 10:17:52 +0200 Subject: [PATCH 016/154] simplified gene_sets logic --- workflows/differentialabundance.nf | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/workflows/differentialabundance.nf b/workflows/differentialabundance.nf index 4442091d..eba669bd 100644 --- a/workflows/differentialabundance.nf +++ b/workflows/differentialabundance.nf @@ -62,6 +62,7 @@ if (params.control_features) { ch_control_features = Channel.of([ exp_meta, file def run_gene_set_analysis = params.gsea_run || params.gprofiler2_run if (run_gene_set_analysis) { + ch_gene_sets = Channel.of([]) // For methods that can run without gene sets if (params.gene_sets_files) { gene_sets_files = params.gene_sets_files.split(",") ch_gene_sets = Channel.of(gene_sets_files).map { file(it, checkIfExists: true) } @@ -73,11 +74,7 @@ if (run_gene_set_analysis) { } else if (params.gprofiler2_run) { if (!params.gprofiler2_token && !params.gprofiler2_organism) { error("To run gprofiler2, please provide a run token, GMT file or organism!") - } else { - ch_gene_sets = [[]] // If one of token or organism is provided, make gene_sets empty (nested because of .first() in the gprofiler call) } - } else { - ch_gene_sets = [] // For methods that can run without gene sets } } From 4c608dabf14b1a9b8c5ba6794683792ab93819a9 Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Tue, 25 Jun 2024 11:19:17 +0100 Subject: [PATCH 017/154] bump_shinyngs --- modules.json | 16 ++++++++-------- modules/nf-core/shinyngs/app/environment.yml | 2 +- modules/nf-core/shinyngs/app/main.nf | 4 ++-- .../nf-core/shinyngs/app/tests/main.nf.test.snap | 12 ++++++------ .../shinyngs/staticdifferential/environment.yml | 2 +- .../nf-core/shinyngs/staticdifferential/main.nf | 4 ++-- .../shinyngs/staticexploratory/environment.yml | 2 +- .../nf-core/shinyngs/staticexploratory/main.nf | 4 ++-- .../staticexploratory/tests/main.nf.test.snap | 16 ++++++++-------- .../validatefomcomponents/environment.yml | 2 +- .../shinyngs/validatefomcomponents/main.nf | 4 ++-- 11 files changed, 34 insertions(+), 34 deletions(-) diff --git a/modules.json b/modules.json index ff141997..b336cd59 100644 --- a/modules.json +++ b/modules.json @@ -71,23 +71,23 @@ "installed_by": ["modules"] }, "shinyngs/app": { - "branch": "master", - "git_sha": "85519fe9deccf2c5f7ff1f3b5d3494c61a794643", + "branch": "bump_shinyngs", + "git_sha": "fc5e93b84073ed8367fa6215f9ca52aac3d7dd9a", "installed_by": ["modules"] }, "shinyngs/staticdifferential": { - "branch": "master", - "git_sha": "85519fe9deccf2c5f7ff1f3b5d3494c61a794643", + "branch": "bump_shinyngs", + "git_sha": "1cf0fc9ef6d1e4f3fd8ff3812e369da1c7970133", "installed_by": ["modules"] }, "shinyngs/staticexploratory": { - "branch": "master", - "git_sha": "85519fe9deccf2c5f7ff1f3b5d3494c61a794643", + "branch": "bump_shinyngs", + "git_sha": "fc5e93b84073ed8367fa6215f9ca52aac3d7dd9a", "installed_by": ["modules"] }, "shinyngs/validatefomcomponents": { - "branch": "master", - "git_sha": "85519fe9deccf2c5f7ff1f3b5d3494c61a794643", + "branch": "bump_shinyngs", + "git_sha": "1cf0fc9ef6d1e4f3fd8ff3812e369da1c7970133", "installed_by": ["modules"] }, "untar": { diff --git a/modules/nf-core/shinyngs/app/environment.yml b/modules/nf-core/shinyngs/app/environment.yml index 0e6de401..43a09fff 100644 --- a/modules/nf-core/shinyngs/app/environment.yml +++ b/modules/nf-core/shinyngs/app/environment.yml @@ -4,4 +4,4 @@ channels: - bioconda - defaults dependencies: - - bioconda::r-shinyngs=1.8.8 + - bioconda::r-shinyngs=2.0.0 diff --git a/modules/nf-core/shinyngs/app/main.nf b/modules/nf-core/shinyngs/app/main.nf index ef05a863..39b2db46 100644 --- a/modules/nf-core/shinyngs/app/main.nf +++ b/modules/nf-core/shinyngs/app/main.nf @@ -15,8 +15,8 @@ process SHINYNGS_APP { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/r-shinyngs:1.8.8--r43hdfd78af_0' : - 'biocontainers/r-shinyngs:1.8.8--r43hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/r-shinyngs:2.0.0--r43hdfd78af_0' : + 'biocontainers/r-shinyngs:2.0.0--r43hdfd78af_0' }" input: tuple val(meta), path(sample), path(feature_meta), path(assay_files) // Experiment-level info diff --git a/modules/nf-core/shinyngs/app/tests/main.nf.test.snap b/modules/nf-core/shinyngs/app/tests/main.nf.test.snap index f87c17d7..434d540c 100644 --- a/modules/nf-core/shinyngs/app/tests/main.nf.test.snap +++ b/modules/nf-core/shinyngs/app/tests/main.nf.test.snap @@ -4,41 +4,41 @@ "data.rds", "app.R:md5,d41d8cd98f00b204e9800998ecf8427e", [ - "versions.yml:md5,9a3135ae8ff362a9671b280dcc5781da" + "versions.yml:md5,a6c3af4b2fd261b4049c92449ea6bb4d" ] ], "meta": { "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-05-03T08:47:11.758494" + "timestamp": "2024-06-25T09:43:49.880332" }, "mouse - multi matrix": { "content": [ "data.rds", "app.R:md5,bedcfc45b6cdcc2b8fe3627987e2b17a", [ - "versions.yml:md5,9a3135ae8ff362a9671b280dcc5781da" + "versions.yml:md5,a6c3af4b2fd261b4049c92449ea6bb4d" ] ], "meta": { "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-05-03T08:46:37.144273" + "timestamp": "2024-06-25T09:43:15.455356" }, "mouse - single matrix": { "content": [ "data.rds", "app.R:md5,bedcfc45b6cdcc2b8fe3627987e2b17a", [ - "versions.yml:md5,9a3135ae8ff362a9671b280dcc5781da" + "versions.yml:md5,a6c3af4b2fd261b4049c92449ea6bb4d" ] ], "meta": { "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-05-03T08:46:57.227288" + "timestamp": "2024-06-25T09:43:35.309081" } } \ No newline at end of file diff --git a/modules/nf-core/shinyngs/staticdifferential/environment.yml b/modules/nf-core/shinyngs/staticdifferential/environment.yml index bec57084..f352c61e 100644 --- a/modules/nf-core/shinyngs/staticdifferential/environment.yml +++ b/modules/nf-core/shinyngs/staticdifferential/environment.yml @@ -4,4 +4,4 @@ channels: - bioconda - defaults dependencies: - - bioconda::r-shinyngs=1.8.8 + - bioconda::r-shinyngs=2.0.0 diff --git a/modules/nf-core/shinyngs/staticdifferential/main.nf b/modules/nf-core/shinyngs/staticdifferential/main.nf index c61ccb4a..40582d66 100644 --- a/modules/nf-core/shinyngs/staticdifferential/main.nf +++ b/modules/nf-core/shinyngs/staticdifferential/main.nf @@ -4,8 +4,8 @@ process SHINYNGS_STATICDIFFERENTIAL { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/r-shinyngs:1.8.8--r43hdfd78af_0' : - 'biocontainers/r-shinyngs:1.8.8--r43hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/r-shinyngs:2.0.0--r43hdfd78af_0' : + 'biocontainers/r-shinyngs:2.0.0--r43hdfd78af_0' }" input: tuple val(meta), path(differential_result) // Differential info: contrast and differential stats diff --git a/modules/nf-core/shinyngs/staticexploratory/environment.yml b/modules/nf-core/shinyngs/staticexploratory/environment.yml index 1c923f1b..74f9d52f 100644 --- a/modules/nf-core/shinyngs/staticexploratory/environment.yml +++ b/modules/nf-core/shinyngs/staticexploratory/environment.yml @@ -4,4 +4,4 @@ channels: - bioconda - defaults dependencies: - - bioconda::r-shinyngs=1.8.8 + - bioconda::r-shinyngs=2.0.0 diff --git a/modules/nf-core/shinyngs/staticexploratory/main.nf b/modules/nf-core/shinyngs/staticexploratory/main.nf index 1a3104b3..379a2b11 100644 --- a/modules/nf-core/shinyngs/staticexploratory/main.nf +++ b/modules/nf-core/shinyngs/staticexploratory/main.nf @@ -4,8 +4,8 @@ process SHINYNGS_STATICEXPLORATORY { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/r-shinyngs:1.8.8--r43hdfd78af_0' : - 'biocontainers/r-shinyngs:1.8.8--r43hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/r-shinyngs:2.0.0--r43hdfd78af_0' : + 'biocontainers/r-shinyngs:2.0.0--r43hdfd78af_0' }" input: tuple val(meta), path(sample), path(feature_meta), path(assay_files) diff --git a/modules/nf-core/shinyngs/staticexploratory/tests/main.nf.test.snap b/modules/nf-core/shinyngs/staticexploratory/tests/main.nf.test.snap index b95d031c..289428ef 100644 --- a/modules/nf-core/shinyngs/staticexploratory/tests/main.nf.test.snap +++ b/modules/nf-core/shinyngs/staticexploratory/tests/main.nf.test.snap @@ -8,14 +8,14 @@ "pca3d.png", "sample_dendrogram.png", [ - "versions.yml:md5,526fbe61b95ad3a722d7470ca1874ca3" + "versions.yml:md5,e04025d7790ddfa09ba5bd719cfba8c7" ] ], "meta": { "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-05-03T08:48:20.908769" + "timestamp": "2024-06-25T10:24:53.456056" }, "mouse - defaults": { "content": [ @@ -26,14 +26,14 @@ "pca3d.png", "sample_dendrogram.png", [ - "versions.yml:md5,526fbe61b95ad3a722d7470ca1874ca3" + "versions.yml:md5,e04025d7790ddfa09ba5bd719cfba8c7" ] ], "meta": { "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-05-03T08:48:06.589763" + "timestamp": "2024-06-25T10:24:39.111271" }, "mouse - specify log": { "content": [ @@ -44,14 +44,14 @@ "pca3d.png", "sample_dendrogram.png", [ - "versions.yml:md5,526fbe61b95ad3a722d7470ca1874ca3" + "versions.yml:md5,e04025d7790ddfa09ba5bd719cfba8c7" ] ], "meta": { "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-05-03T08:48:41.352789" + "timestamp": "2024-06-25T10:25:14.646472" }, "mouse - html": { "content": [ @@ -67,13 +67,13 @@ false, false, [ - "versions.yml:md5,526fbe61b95ad3a722d7470ca1874ca3" + "versions.yml:md5,e04025d7790ddfa09ba5bd719cfba8c7" ] ], "meta": { "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-05-03T08:49:04.969108" + "timestamp": "2024-06-25T10:25:38.256352" } } \ No newline at end of file diff --git a/modules/nf-core/shinyngs/validatefomcomponents/environment.yml b/modules/nf-core/shinyngs/validatefomcomponents/environment.yml index 4f3067bc..07485298 100644 --- a/modules/nf-core/shinyngs/validatefomcomponents/environment.yml +++ b/modules/nf-core/shinyngs/validatefomcomponents/environment.yml @@ -4,4 +4,4 @@ channels: - bioconda - defaults dependencies: - - bioconda::r-shinyngs=1.8.8 + - bioconda::r-shinyngs=2.0.0 diff --git a/modules/nf-core/shinyngs/validatefomcomponents/main.nf b/modules/nf-core/shinyngs/validatefomcomponents/main.nf index fad3948a..bedab3e6 100644 --- a/modules/nf-core/shinyngs/validatefomcomponents/main.nf +++ b/modules/nf-core/shinyngs/validatefomcomponents/main.nf @@ -4,8 +4,8 @@ process SHINYNGS_VALIDATEFOMCOMPONENTS { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/r-shinyngs:1.8.8--r43hdfd78af_0' : - 'biocontainers/r-shinyngs:1.8.8--r43hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/r-shinyngs:2.0.0--r43hdfd78af_0' : + 'biocontainers/r-shinyngs:2.0.0--r43hdfd78af_0' }" input: tuple val(meta), path(sample), path(assay_files) From 2ab83e7b48063226d422ee3fe9bbeca9208c3b4d Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Tue, 25 Jun 2024 12:41:03 +0100 Subject: [PATCH 018/154] Wire in new shinyngs log options, remove deprecated guessing option --- conf/modules.config | 2 +- nextflow.config | 1 - nextflow_schema.json | 6 ------ 3 files changed, 1 insertion(+), 8 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 9313457d..f416d155 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -420,7 +420,7 @@ process { ((params.report_title == null) ? '' : "--title \"$params.report_title\""), ((params.report_author == null) ? '' : "--author \"$params.report_author\""), ((params.report_description == null) ? '' : "--description \"$params.report_description\""), - ((params.shinyngs_guess_unlog_matrices) ? "--guess_unlog_matrices" : ''), + ( (params.study_type == 'maxquant') ? "--log2_assays ''" : (((params.exploratory_log2_assays == null) ? '' : "--log2_assays \"$params.exploratory_log2_assays\"".replace('[', '').replace(']', ''))) ), ((params.shinyngs_deploy_to_shinyapps_io) ? "--deploy_app" : ''), ((params.shinyngs_shinyapps_account == null) ? '' : "--shinyapps_account \"$params.shinyngs_shinyapps_account\""), ((params.shinyngs_shinyapps_app_name == null) ? '' : "--shinyapps_name \"$params.shinyngs_shinyapps_app_name\"") diff --git a/nextflow.config b/nextflow.config index f0ba3763..70f46da3 100644 --- a/nextflow.config +++ b/nextflow.config @@ -176,7 +176,6 @@ params { // ShinyNGS shinyngs_build_app = true - shinyngs_guess_unlog_matrices = true // Note: for shinyapps deployment, in addition to setting these values, // SHINYAPPS_TOKEN and SHINYAPPS_SECRET must be available to the diff --git a/nextflow_schema.json b/nextflow_schema.json index 4238ce23..50042bd9 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -979,12 +979,6 @@ "default": "null", "description": "The name of the app to push to in your shinyapps.io account", "fa_icon": "fas fa-file-signature" - }, - "shinyngs_guess_unlog_matrices": { - "type": "boolean", - "default": true, - "description": "Should we guess the log status of matrices and unlog for the app?", - "help_text": "In the app context, it's usually helpful if things are not in log scale, so that e.g. fold changes make some sense with respect to observed values. This flag will cause the shinyngs app-building script to make a guess based on observed values as to the log status of input matrices, and adjust the loading accordingly." } }, "fa_icon": "fab fa-app-store-ios" From 57574cf5c637393649550ee8dc0d0700f3291373 Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Tue, 25 Jun 2024 13:56:56 +0100 Subject: [PATCH 019/154] Fix contrast specification to app creation --- workflows/differentialabundance.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workflows/differentialabundance.nf b/workflows/differentialabundance.nf index eba669bd..1baacf50 100644 --- a/workflows/differentialabundance.nf +++ b/workflows/differentialabundance.nf @@ -584,9 +584,9 @@ workflow DIFFERENTIALABUNDANCE { // Make a new contrasts file from the differential metas to guarantee the // same order as the differential results - ch_app_differential = ch_differential.first().map{it[0].keySet().join(',')} + ch_app_differential = ch_differential.first().map{it[0].keySet().tail().join(',')} .concat( - ch_differential.map{it[0].values().join(',')} + ch_differential.map{it[0].values().tail().join(',')} ) .collectFile(name: 'contrasts.csv', newLine: true, sort: false) .map{ From b7af68a89b3b72f9da72c8871f481b882ce91018 Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Tue, 25 Jun 2024 15:21:22 +0100 Subject: [PATCH 020/154] Can install from master now --- modules.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/modules.json b/modules.json index b336cd59..3bc80e21 100644 --- a/modules.json +++ b/modules.json @@ -71,23 +71,23 @@ "installed_by": ["modules"] }, "shinyngs/app": { - "branch": "bump_shinyngs", - "git_sha": "fc5e93b84073ed8367fa6215f9ca52aac3d7dd9a", + "branch": "master", + "git_sha": "91fc36585a50f9bae98cb5b3dff36ce64c83a6b4", "installed_by": ["modules"] }, "shinyngs/staticdifferential": { - "branch": "bump_shinyngs", - "git_sha": "1cf0fc9ef6d1e4f3fd8ff3812e369da1c7970133", + "branch": "master", + "git_sha": "91fc36585a50f9bae98cb5b3dff36ce64c83a6b4", "installed_by": ["modules"] }, "shinyngs/staticexploratory": { - "branch": "bump_shinyngs", - "git_sha": "fc5e93b84073ed8367fa6215f9ca52aac3d7dd9a", + "branch": "master", + "git_sha": "91fc36585a50f9bae98cb5b3dff36ce64c83a6b4", "installed_by": ["modules"] }, "shinyngs/validatefomcomponents": { - "branch": "bump_shinyngs", - "git_sha": "1cf0fc9ef6d1e4f3fd8ff3812e369da1c7970133", + "branch": "master", + "git_sha": "91fc36585a50f9bae98cb5b3dff36ce64c83a6b4", "installed_by": ["modules"] }, "untar": { From 8fb05ca7d761981d3ed09469e4dea751b081785e Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Tue, 25 Jun 2024 15:38:06 +0100 Subject: [PATCH 021/154] Update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ef92e913..e98713bf 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 ### Fixed +- [[#280](https://github.com/nf-core/differentialabundance/pull/280)] - Bump shinyngs, fix contrasts passed to app creation ([@pinin4fjords](https://github.com/pinin4fjords), review by [@WackerO](https://github.com/WackerO)) - [[#274](https://github.com/nf-core/differentialabundance/pull/274)] - Fix pagination on samples table ([@pinin4fjords](https://github.com/pinin4fjords), review by [@WackerO](https://github.com/WackerO)) - [[#272](https://github.com/nf-core/differentialabundance/pull/272)] - Show >10 contrasts in report ([@pinin4fjords](https://github.com/pinin4fjords), review by [@WackerO](https://github.com/WackerO)) From eff2e81713a13b273ea51b51c75baed6a23be422 Mon Sep 17 00:00:00 2001 From: Cristina Araiz Date: Thu, 18 Jul 2024 10:38:04 +0200 Subject: [PATCH 022/154] add propr, mygene and fiter_var module --- modules/local/filtervar/main.nf | 23 + modules/local/filtervar/templates/filtervar.R | 275 +++++++++++ modules/nf-core/mygene/environment.yml | 7 + modules/nf-core/mygene/main.nf | 23 + modules/nf-core/mygene/meta.yml | 54 +++ modules/nf-core/mygene/templates/mygene.py | 307 ++++++++++++ .../nf-core/mygene/tests/default_tsv.config | 3 + .../nf-core/mygene/tests/go_category.config | 3 + .../nf-core/mygene/tests/go_evidence.config | 3 + modules/nf-core/mygene/tests/main.nf.test | 106 ++++ .../nf-core/mygene/tests/main.nf.test.snap | 135 ++++++ modules/nf-core/mygene/tests/tags.yml | 2 + modules/nf-core/propr/grea/environment.yml | 7 + modules/nf-core/propr/grea/main.nf | 24 + modules/nf-core/propr/grea/meta.yml | 57 +++ modules/nf-core/propr/grea/templates/grea.R | 253 ++++++++++ .../nf-core/propr/grea/tests/grea_test.config | 8 + modules/nf-core/propr/grea/tests/main.nf.test | 62 +++ .../propr/grea/tests/main.nf.test.snap | 31 ++ modules/nf-core/propr/grea/tests/tags.yml | 2 + modules/nf-core/propr/propd/environment.yml | 7 + modules/nf-core/propr/propd/main.nf | 28 ++ modules/nf-core/propr/propd/meta.yml | 68 +++ modules/nf-core/propr/propd/templates/propd.R | 372 ++++++++++++++ .../propr/propd/tests/adjacency.config | 3 + .../propr/propd/tests/boxcox_theta_e.config | 4 + .../propr/propd/tests/default_boxcox.config | 4 + .../propd/tests/default_permutation.config | 4 + .../nf-core/propr/propd/tests/main.nf.test | 154 ++++++ .../propr/propd/tests/main.nf.test.snap | 133 ++++++ modules/nf-core/propr/propd/tests/tags.yml | 2 + .../nf-core/propr/propd/tests/theta_e.config | 4 + modules/nf-core/propr/propr/environment.yml | 7 + modules/nf-core/propr/propr/main.nf | 27 ++ modules/nf-core/propr/propr/meta.yml | 76 +++ modules/nf-core/propr/propr/templates/propr.R | 452 ++++++++++++++++++ .../propr/propr/tests/adjacency.config | 3 + .../propr/propr/tests/adjacency_pcor.config | 3 + .../propr/propr/tests/adjacency_phs.config | 3 + .../propr/propr/tests/adjacency_rho.config | 3 + .../propr/propr/tests/alr_pcorbshrink.config | 3 + .../nf-core/propr/propr/tests/clr_pcor.config | 3 + .../propr/propr/tests/clr_pcorbshrink.config | 3 + .../nf-core/propr/propr/tests/clr_rho.config | 3 + .../propr/propr/tests/clr_rho_alpha.config | 3 + .../nf-core/propr/propr/tests/main.nf.test | 240 ++++++++++ .../propr/propr/tests/main.nf.test.snap | 354 ++++++++++++++ modules/nf-core/propr/propr/tests/tags.yml | 2 + 48 files changed, 3353 insertions(+) create mode 100644 modules/local/filtervar/main.nf create mode 100644 modules/local/filtervar/templates/filtervar.R create mode 100644 modules/nf-core/mygene/environment.yml create mode 100644 modules/nf-core/mygene/main.nf create mode 100644 modules/nf-core/mygene/meta.yml create mode 100644 modules/nf-core/mygene/templates/mygene.py create mode 100644 modules/nf-core/mygene/tests/default_tsv.config create mode 100644 modules/nf-core/mygene/tests/go_category.config create mode 100644 modules/nf-core/mygene/tests/go_evidence.config create mode 100644 modules/nf-core/mygene/tests/main.nf.test create mode 100644 modules/nf-core/mygene/tests/main.nf.test.snap create mode 100644 modules/nf-core/mygene/tests/tags.yml create mode 100644 modules/nf-core/propr/grea/environment.yml create mode 100644 modules/nf-core/propr/grea/main.nf create mode 100644 modules/nf-core/propr/grea/meta.yml create mode 100644 modules/nf-core/propr/grea/templates/grea.R create mode 100644 modules/nf-core/propr/grea/tests/grea_test.config create mode 100644 modules/nf-core/propr/grea/tests/main.nf.test create mode 100644 modules/nf-core/propr/grea/tests/main.nf.test.snap create mode 100644 modules/nf-core/propr/grea/tests/tags.yml create mode 100644 modules/nf-core/propr/propd/environment.yml create mode 100644 modules/nf-core/propr/propd/main.nf create mode 100644 modules/nf-core/propr/propd/meta.yml create mode 100644 modules/nf-core/propr/propd/templates/propd.R create mode 100644 modules/nf-core/propr/propd/tests/adjacency.config create mode 100755 modules/nf-core/propr/propd/tests/boxcox_theta_e.config create mode 100755 modules/nf-core/propr/propd/tests/default_boxcox.config create mode 100755 modules/nf-core/propr/propd/tests/default_permutation.config create mode 100755 modules/nf-core/propr/propd/tests/main.nf.test create mode 100644 modules/nf-core/propr/propd/tests/main.nf.test.snap create mode 100755 modules/nf-core/propr/propd/tests/tags.yml create mode 100755 modules/nf-core/propr/propd/tests/theta_e.config create mode 100644 modules/nf-core/propr/propr/environment.yml create mode 100644 modules/nf-core/propr/propr/main.nf create mode 100644 modules/nf-core/propr/propr/meta.yml create mode 100644 modules/nf-core/propr/propr/templates/propr.R create mode 100644 modules/nf-core/propr/propr/tests/adjacency.config create mode 100644 modules/nf-core/propr/propr/tests/adjacency_pcor.config create mode 100644 modules/nf-core/propr/propr/tests/adjacency_phs.config create mode 100644 modules/nf-core/propr/propr/tests/adjacency_rho.config create mode 100644 modules/nf-core/propr/propr/tests/alr_pcorbshrink.config create mode 100644 modules/nf-core/propr/propr/tests/clr_pcor.config create mode 100644 modules/nf-core/propr/propr/tests/clr_pcorbshrink.config create mode 100644 modules/nf-core/propr/propr/tests/clr_rho.config create mode 100644 modules/nf-core/propr/propr/tests/clr_rho_alpha.config create mode 100644 modules/nf-core/propr/propr/tests/main.nf.test create mode 100644 modules/nf-core/propr/propr/tests/main.nf.test.snap create mode 100644 modules/nf-core/propr/propr/tests/tags.yml diff --git a/modules/local/filtervar/main.nf b/modules/local/filtervar/main.nf new file mode 100644 index 00000000..bf8e3ae2 --- /dev/null +++ b/modules/local/filtervar/main.nf @@ -0,0 +1,23 @@ +process FILTERVAR { + tag "$meta.id" + label 'process_single' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/r-propr:5.0.3': + 'quay.io/biocontainers/r-propr:5.0.3' }" + + input: + tuple val(meta), path(count), path(adj_matrix) + + output: + tuple val(meta), path("*.count_filtered.tsv"), emit: count + path "*.R_sessionInfo.log", emit: session_info + path "versions.yml", emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + template 'filtervar.R' +} \ No newline at end of file diff --git a/modules/local/filtervar/templates/filtervar.R b/modules/local/filtervar/templates/filtervar.R new file mode 100644 index 00000000..cf5159c9 --- /dev/null +++ b/modules/local/filtervar/templates/filtervar.R @@ -0,0 +1,275 @@ + + +#!/usr/bin/env Rscript + + +################################################ +################################################ +## Functions ## +################################################ +################################################ + +#' Parse out options from a string without recourse to optparse +#' +#' @param x Long-form argument list like --opt1 val1 --opt2 val2 +#' +#' @return named list of options and values similar to optparse + +parse_args <- function(x){ + args_list <- unlist(strsplit(x, ' ?--')[[1]])[-1] + args_vals <- lapply(args_list, function(x) scan(text=x, what='character', quiet = TRUE)) + + # Ensure the option vectors are length 2 (key/ value) to catch empty ones + args_vals <- lapply(args_vals, function(z){ length(z) <- 2; z}) + + parsed_args <- structure(lapply(args_vals, function(x) x[2]), names = lapply(args_vals, function(x) x[1])) + parsed_args[! is.na(parsed_args)] +} + +#' Flexibly read CSV or TSV files +#' +#' @param file Input file +#' @param header Boolean. TRUE if first row is header. False without header. +#' @param row.names The first column is used as row names by default. +#' Otherwise, give another number. Or use NULL when no row.names are present. +#' +#' @return output Data frame +read_delim_flexible <- function(file, header = TRUE, row.names = 1, check.names = TRUE){ + + ext <- tolower(tail(strsplit(basename(file), split = "\\\\.")[[1]], 1)) + + if (ext == "tsv" || ext == "txt") { + separator <- "\\t" + } else if (ext == "csv") { + separator <- "," + } else { + stop(paste("Unknown separator for", ext)) + } + + mat <- read.delim( + file, + sep = separator, + header = header, + row.names = row.names, + check.names = check.names + ) + + if ( (row.names == 'gene_id') & ('gene_name' %in% colnames(mat)) ){ + mat <- mat[, -which(colnames(mat) == 'gene_name')] + } else if ( (row.names == 'gene_name') & ('gene_id' %in% colnames(mat)) ){ + mat <- mat[, -which(colnames(mat) == 'gene_id')] + } + + return(mat) +} + +read_delim_flexible2 <- function(file, header = TRUE){ + + ext <- tolower(tail(strsplit(basename(file), split = "\\\\.")[[1]], 1)) + + if (ext == "tsv" || ext == "txt") { + separator <- "\\t" + } else if (ext == "csv") { + separator <- "," + } else { + stop(paste("Unknown separator for", ext)) + } + + mat <- read.delim( + file, + sep = separator, + header = header + ) + return(mat) +} + + + +################################################ +################################################ +## Parse arguments ## +################################################ +################################################ + +opt <- list( + count = '$count', + prefix = ifelse('$task.ext.prefix' == 'null', '$meta.pathway_name', '$task.ext.prefix'), + transformation = 'clr', + reference = NA, + alpha = NA, + metric = 'pcor.bshrink', + permutation = 0, + cutoff_min = NA, + cutoff_max = NA, + cutoff_interval = NA, + ncores = as.integer('$task.cpus'), + features_id_col = 'gene_id', + fixseed = FALSE, + adjacency = FALSE, + fdrVal = 0.05, + adj_matrix = '$adj_matrix', + filterVar = 'yes' +) +opt_types <- list( + count = 'character', + prefix = 'character', + transformation = 'character', + reference = 'character', + alpha = 'numeric', + metric = 'character', + permutation = 'numeric', + cutoff_min = 'numeric', + cutoff_max = 'numeric', + cutoff_interval = 'numeric', + ncores = 'numeric', + features_id_col = 'character', + fixseed = 'logical', + adjacency = 'logical', + fdrVal = 'numeric', + adj_matrix = 'character', + filterVar = 'character' +) + + +# Apply parameter overrides +args_opt <- parse_args('$task.ext.args') + +for ( ao in names(args_opt)){ + if (! ao %in% names(opt)){ + stop(paste("Invalid option:", ao)) + } else { + + # Preserve classes from defaults where possible + if (! is.null(opt[[ao]])){ + args_opt[[ao]] <- as(args_opt[[ao]], opt_types[[ao]]) + } + # set NA + if (args_opt[[ao]] %in% c('NA', NA, 'null')){ + args_opt[[ao]] <- NA + } + opt[[ao]] <- args_opt[[ao]] + } +} + +# Check if required parameters have been provided +required_opts <- c('count') +missing <- required_opts[unlist(lapply(opt[required_opts], is.null)) | ! required_opts %in% names(opt)] +if (length(missing) > 0){ + stop(paste("Missing required options:", paste(missing, collapse=', '))) +} + +################################################ +################################################ +## Perform variable selection ## +################################################ +################################################ + +# read matrix +A <- read_delim_flexible( + opt\$adj_matrix, + header = TRUE, + row.names = 1, + check.names = TRUE +) + +count <- read_delim_flexible2( + opt\$count, + header = TRUE +) + +### Determine most differentially proportional genes + +# Set diagonal in A to 0 +diag(A) <- 0 + +# Sum values in adjacency and add as an extra column +per_gene_connection <- rowSums(A) + +A\$per_gene <- per_gene_connection + +A <- A[order(A\$per_gene, decreasing = TRUE),] + +# Define selection criteria + +max_gene_number <- ncol(count)*10 # 10x samples for technical reasons (pcor) + +#Calculate connection threshold +total_connections <- sum(per_gene_connection)/2 # 2 because the matrix is symmetric +possible_connections <- nrow(count)*(nrow(count)-1)/2 + +percentage_expected <- total_connections/possible_connections +connection_threshold <- percentage_expected * nrow(count) + +# Filter count matrix according to selected genes + +col_genes <- which(names(count) == opt\$features_id_col) + +if (opt\$filterVar == 'yes'){ + # select only differentially proportional genes + top_genes <- rownames(A[which(A\$per_gene > connection_threshold),]) + count_filtered <- count[count[,col_genes] %in% top_genes,] + warning("non differentially proportional genes were removed before correlation analysis") + +} else if (max_gene_number < nrow(count) & opt\$metric== 'pcor.bshrink'){ + # select the maximum number of genes to perform partial correlation + top_genes <- rownames(A[1:gene_number,]) + count_filtered <- count[count[,col_genes] %in% top_genes,] + warning("some genes were removed to perform partial correlation") + +}else{ + # no genes were removed + count_filtered <- count + warning("No genes were removed") +} + + +################################################ +################################################ +## Generate outputs ## +################################################ +################################################ + +write.table( + count_filtered, + file = paste0(opt\$prefix, '.count_filtered.tsv'), + col.names = TRUE, + row.names = FALSE, + sep = '\t', + quote = FALSE +) + +################################################ +################################################ +## WARNINGS ## +################################################ +################################################ + +sink(paste0(opt\$prefix, ".warnings.log")) +print(warnings()) +sink() + +################################################ +################################################ +## R SESSION INFO ## +################################################ +################################################ + +sink(paste0(opt\$prefix, ".R_sessionInfo.log")) +print(sessionInfo()) +sink() + +################################################ +################################################ +## VERSIONS FILE ## +################################################ +################################################ + +propr.version <- as.character(packageVersion('propr')) + +writeLines( + c( + '"${task.process}":', + paste(' r-propr:', propr.version) + ), +'versions.yml') + diff --git a/modules/nf-core/mygene/environment.yml b/modules/nf-core/mygene/environment.yml new file mode 100644 index 00000000..45442c49 --- /dev/null +++ b/modules/nf-core/mygene/environment.yml @@ -0,0 +1,7 @@ +name: mygene +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::mygene=3.2.2 diff --git a/modules/nf-core/mygene/main.nf b/modules/nf-core/mygene/main.nf new file mode 100644 index 00000000..27066b71 --- /dev/null +++ b/modules/nf-core/mygene/main.nf @@ -0,0 +1,23 @@ +process MYGENE { + tag "$meta.id" + label 'process_low' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mygene:3.2.2--pyh5e36f6f_0': + 'quay.io/biocontainers/mygene:3.2.2--pyh5e36f6f_0' }" + + input: + tuple val(meta), path(gene_list) + + output: + tuple val(meta), path("*.gmt"), emit: gmt + tuple val(meta), path("*.tsv"), emit: tsv , optional: true + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + template "mygene.py" +} diff --git a/modules/nf-core/mygene/meta.yml b/modules/nf-core/mygene/meta.yml new file mode 100644 index 00000000..f7aaa455 --- /dev/null +++ b/modules/nf-core/mygene/meta.yml @@ -0,0 +1,54 @@ +name: "mygene" +description: Fetch the GO concepts for a list of genes +keywords: + - mygene + - go + - annotation +tools: + - "mygene": + description: "A python wrapper to query/retrieve gene annotation data from Mygene.info." + homepage: "https://mygene.info/" + documentation: "https://docs.mygene.info/projects/mygene-py/en/latest/" + tool_dev_url: "https://github.com/biothings/mygene.py" + doi: "10.1093/nar/gks1114" + licence: ["Apache-2.0"] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - gene_list: + type: file + description: A tsv/csv file that contains a list of gene ids in one of the columns. + By default, the column name should be "gene_id", but this can be changed + by using "--columname gene_id" in ext.args. + pattern: "*.{csv,tsv}" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - gmt: + type: file + description: | + Each row contains the GO id, a description, and a list of gene ids. + pattern: "*.gmt" + - tsv: + type: file + description: | + (optional) A tsv file with the following columns: + query, mygene_id, go_id, go_term, go_evidence, go_category, symbol, name, taxid + pattern: "*.tsv" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@suzannejin" +maintainers: + - "@suzannejin" diff --git a/modules/nf-core/mygene/templates/mygene.py b/modules/nf-core/mygene/templates/mygene.py new file mode 100644 index 00000000..201977a0 --- /dev/null +++ b/modules/nf-core/mygene/templates/mygene.py @@ -0,0 +1,307 @@ +#!/usr/bin/env python3 +import argparse +import mygene +import shlex + + +""" +This python script uses the mygene module to query the MyGene.info API and +retrieve the go terms associated with a list of gene ids. The gene ids should +ideally be Ensembl or Entrez ids. The script generates two outputs: + 1. A tsv file containing information related to each query. The columns + include query, mygene_id, go_id, go_term, go_evidence, go_category, + symbol, name, and taxid. + 2. A gmt file containing information related to each go term. Each row + includes the go id, go term, and the genes associated with that go term. + +Author: Suzanne Jin +License: Apache 2.0 (same as the mygene library) +""" + + +class Arguments: + """ + Parses the argments, including the ones coming from $task.ext.args. + """ + def __init__(self) -> None: + self.input = "$gene_list" + self.prefix = ( + "$task.ext.prefix" + if "$task.ext.prefix" != "null" + else "$meta.id" + ) + self.output_gmt = self.prefix + ".gmt" + self.output_tsv = self.prefix + ".tsv" + self.parse_ext_args("$task.ext.args") + + def parse_ext_args(self, args_string: str) -> None: + """ + It parses the extended arguments. + """ + # skip when there are no extended arguments + if args_string == "null": + args_string = "" + + # Parse the extended arguments + args_list = shlex.split(args_string) # Split the string into a list of arguments + parser = argparse.ArgumentParser() + # input parameters + parser.add_argument('--columname', default='"gene_id"', help='Name of the column where the gene ids are stored in the input file. Default: gene_id') + # filtering parameters + parser.add_argument('--species', default=None, help="Comma separated of common name of the species or taxon ids") + parser.add_argument('--go_category', default=None, help="Comma separated list of GO categories to keep. Default: all") + parser.add_argument('--go_evidence', default=None, help="Comma separated list of GO evidence codes to keep. Default: all") + # additional parameters for querymany + parser.add_argument('--scopes', default=None, help="Comma separated list of scopes to search for.") + parser.add_argument('--entrezonly', default=False, help="When true, the query returns only the hits with valid Entrez gene ids. Default: false.") + parser.add_argument('--ensemblonly', default=False, help="When true, the query returns only the hits with valid Ensembl gene ids. Default: False") + # output parameters + parser.add_argument('--generate_tsv', default=False, help="Also generate a tsv file with the gene based information. Default: False") + args = parser.parse_args(args_list) + + # Convert "null" values to default values + # convert true to True and false to False + for attr in vars(args): + value = getattr(args, attr) + if value == "null": + setattr(args, attr, parser.get_default(attr)) + elif value == "true": + setattr(args, attr, True) + elif value == "false": + setattr(args, attr, False) + + # check if the arguments are valid + if args.go_category: + args.go_category = args.go_category.upper() + for category in args.go_category.split(","): + if category not in ["BP", "MF", "CC"]: + raise ValueError("The GO category should be one of BP, MF, or CC.") + if args.go_evidence: + args.go_evidence = args.go_evidence.upper() + + # Assign args attributes to self attributes + for attr in vars(args): + setattr(self, attr, getattr(args, attr)) + + def print_args(self) -> None: + """ + Print the arguments. + """ + for attr in vars(self): + print(f"{attr}: {getattr(self, attr)}") + + +class Version: + """ + Parse the versions of the modules used in the script. + """ + + @staticmethod + def get_versions(modules: list) -> dict: + """ + This function takes a list of modules and returns a dictionary with the + versions of each module. + """ + return {module.__name__: module.__version__ for module in modules} + + @staticmethod + def format_yaml_like(data: dict, indent: int = 0) -> str: + """ + Formats a dictionary to a YAML-like string. + + Args: + data (dict): The dictionary to format. + indent (int): The current indentation level. + + Returns: + yaml_str: A string formatted as YAML. + """ + yaml_str = "" + for key, value in data.items(): + spaces = " " * indent + if isinstance(value, dict): + yaml_str += f"{spaces}{key}:\\n{Version.format_yaml_like(value, indent + 1)}" + else: + yaml_str += f"{spaces}{key}: {value}\\n" + return yaml_str + + +class MyGene: + """ + This class will query the MyGene.info API and retrieve the go terms + associated with a list of gene ids. + + In concrete, if first queries the mygene API to get the mygene ids for each + of the query gene. Then, it queries for the annotations, and parses the go + terms all together with all the other information. + """ + def __init__(self, query: list, species: str, scopes: str, entrezonly: bool, ensemblonly: bool, go_category: str = None, go_evidence: str = None) -> None: + self.query = query + self.fields = "go,symbol,name,taxid" + self.species = species + self.scopes = scopes + self.entrezonly = entrezonly + self.ensemblonly = ensemblonly + self.go_category = go_category + self.go_evidence = go_evidence + self.mg = mygene.MyGeneInfo() + self.idmap = self.query2idmap() + print(f"fetched {len(self.idmap)} ids from {len(self.query)} queries") + + def query2idmap(self) -> dict: + """ + It returns a dictionary with the mygene ids as keys and the query ids as values. + """ + q = self.mg.querymany( + self.query, + scopes=self.scopes, + species=self.species, + entrezonly=self.entrezonly, + ensemblonly=self.ensemblonly, + returnall=True + ) + return {dic['_id']: dic['query'] for dic in q['out'] if '_id' in dic} + + def id2info(self) -> list: + """ + It returns a list of dictionaries with the info returned from getgenes for all the query ids. + Each dictionary contains the annotations for the corresponding query gene. + """ + return self.mg.getgenes(list(set(self.idmap)), fields=self.fields, species=self.species) + + def parse_go_based_info(self) -> dict: + """ + It queries the annotations for all query ids and then parses a go + centric dictionary. It is a dictionary of dictionaries with the + following format: {{go_id1: [go_term, gene1, gene2, ...]}, ...} + """ + info = {} + for dic in self.id2info(): + + if 'go' not in dic: + continue + if self.go_category: + dic['go'] = {category: dic['go'][category] for category in self.go_category.split(",") if category in dic['go']} + for category, go_list in dic['go'].items(): + if not isinstance(go_list, list): + go_list = [go_list] + for go in go_list: + if (self.go_evidence) and (go['evidence'] not in self.go_evidence.split(",")): + continue + + if go['id'] not in info: + info[go['id']] = [go['term'], self.idmap[dic['_id']]] + else: + info[go['id']].append(self.idmap[dic['_id']]) + return info + + def parse_gene_based_info(self) -> dict: + """ + It queries the annotations for all query ids and then parses a go + centric dictionary. + + At the end it returns a dictionary {query gene: {}} of dictionaries + with the following keys: query, mygene_id, go_id, go_term, go_evidence, + go_category, symbol, name, taxid. + """ + info = {} + for dic in self.id2info(): + + if 'go' not in dic: + continue + if self.go_category: + dic['go'] = {category: dic['go'][category] for category in self.go_category.split(",") if category in dic['go']} + for category, go_list in dic['go'].items(): + if not isinstance(go_list, list): + go_list = [go_list] + for go in go_list: + if (self.go_evidence) and (go['evidence'] not in self.go_evidence.split(",")): + continue + + current_info = { + 'query': self.idmap[dic['_id']], + 'mygene_id': dic['_id'], + 'go_id': go['id'], + 'go_term': go['term'], + 'go_evidence': go['evidence'], + 'go_category': category, + 'symbol': dic['symbol'], + 'name': dic['name'], + 'taxid': dic['taxid'] + } + info[self.idmap[dic['_id']]] = current_info + return info + + def parse_and_save_to_gmt(self, filename: str) -> list: + """ + It parses and saves go centric information to a gmt file. + The final gmt output will be sorted following the go id order. + """ + info = self.parse_go_based_info() + info = dict(sorted(info.items(), key=lambda x: x[0])) + with open(filename, 'w') as f: + for go_id, go_list in info.items(): + tmp = sorted(go_list[1:]) + f.write(go_id + "\\t" + go_list[0] + "\\t" + "\\t".join(tmp) + "\\n") + print(f"saved {len(info)} go terms to {filename}") + + def parse_and_save_to_tsv(self, filename: str) -> None: + """ + It parses and saves gene centric information in a tsv file. + The final tsv output will be sorted following the input query gene list order. + """ + info = self.parse_gene_based_info() + with open(filename, 'w') as f: + f.write("\\t".join(info[self.query[0]].keys()) + "\\n") + for gene in self.query: # sorted by query gene list + if gene in info: + f.write("\\t".join([str(val) for val in info[gene].values()]) + "\\n") + print(f"saved {len(info)} gene centric info to {filename}") + + +def load_list(filename: str, columname: str) -> list: + """ + It loads the list of gene ids from a file. + The columname is the name of the column where the gene ids are stored. + """ + if filename.split('.')[-1] == 'tsv': + sep = "\\t" + elif filename.split('.')[-1] == 'csv': + sep = "," + else: + raise ValueError("The input file extension should be either tsv or csv.") + with open(filename, 'r') as f: + idx = f.readline().strip().split(sep).index(columname) + return [line.strip().split(sep)[idx] for line in f] + + +if __name__ == "__main__": + + # parse and print arguments + args = Arguments() + args.print_args() + + # load gene list + gene_list = load_list(args.input, args.columname) + + # run mygene api + mg = MyGene( + gene_list, + species=args.species, + scopes=args.scopes, + entrezonly=args.entrezonly, + ensemblonly=args.ensemblonly, + go_category=args.go_category, + go_evidence=args.go_evidence + ) + + # parse annotations and save output files + mg.parse_and_save_to_gmt(args.output_gmt) + if args.generate_tsv: + mg.parse_and_save_to_tsv(args.output_tsv) + + # write versions to file + versions_this_module = {} + versions_this_module["${task.process}"] = Version.get_versions([argparse, mygene]) + with open("versions.yml", "w") as f: + f.write(Version.format_yaml_like(versions_this_module)) diff --git a/modules/nf-core/mygene/tests/default_tsv.config b/modules/nf-core/mygene/tests/default_tsv.config new file mode 100644 index 00000000..08bd6fac --- /dev/null +++ b/modules/nf-core/mygene/tests/default_tsv.config @@ -0,0 +1,3 @@ +process{ + ext.args = "--generate_tsv true" +} \ No newline at end of file diff --git a/modules/nf-core/mygene/tests/go_category.config b/modules/nf-core/mygene/tests/go_category.config new file mode 100644 index 00000000..771f8f4d --- /dev/null +++ b/modules/nf-core/mygene/tests/go_category.config @@ -0,0 +1,3 @@ +process { + ext.args = "--go_category bp,mf" +} \ No newline at end of file diff --git a/modules/nf-core/mygene/tests/go_evidence.config b/modules/nf-core/mygene/tests/go_evidence.config new file mode 100644 index 00000000..b19de214 --- /dev/null +++ b/modules/nf-core/mygene/tests/go_evidence.config @@ -0,0 +1,3 @@ +process { + ext.args = "--go_evidence EXP,IDA" +} \ No newline at end of file diff --git a/modules/nf-core/mygene/tests/main.nf.test b/modules/nf-core/mygene/tests/main.nf.test new file mode 100644 index 00000000..e5ba64ca --- /dev/null +++ b/modules/nf-core/mygene/tests/main.nf.test @@ -0,0 +1,106 @@ +nextflow_process { + + name "Test Process MYGENE" + script "../main.nf" + process "MYGENE" + + tag "modules" + tag "modules_nfcore" + tag "mygene" + + test("mygene - default options") { + + tag "default" + + when { + process { + """ + input[0] = [ + [id : 'test'], + file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.gene_meta.tsv") + ] + """ + } + } + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.gmt).match("mygene - default options - gmt") }, + { assert snapshot(process.out.versions).match("mygene - default options - versions") } + ) + } + } + + test("mygene - default with tsv file") { + + tag "default_with_tsv" + config "./default_tsv.config" + + when { + process { + """ + input[0] = [ + [id : 'test'], + file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.gene_meta.tsv") + ] + """ + } + } + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.gmt).match("mygene - default with tsv file - gmt") }, + { assert snapshot(process.out.tsv).match("mygene - default with tsv file - tsv") }, + { assert snapshot(process.out.versions).match("mygene - default with tsv file - versions") } + ) + } + } + + test("mygene - filter by go category") { + + tag "filter_by_go_category" + config "./go_category.config" + + when { + process { + """ + input[0] = [ + [id : 'test'], + file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.gene_meta.tsv") + ] + """ + } + } + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.gmt).match("mygene - filter by go category - gmt") }, + { assert snapshot(process.out.versions).match("mygene - filter by go category - versions") } + ) + } + } + + test("mygene - filter by go evidence") { + + tag "filter_by_go_evidence" + config "./go_evidence.config" + + when { + process { + """ + input[0] = [ + [id : 'test'], + file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.gene_meta.tsv") + ] + """ + } + } + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.gmt).match("mygene - filter by go evidence - gmt") }, + { assert snapshot(process.out.versions).match("mygene - filter by go evidence - versions") } + ) + } + } +} diff --git a/modules/nf-core/mygene/tests/main.nf.test.snap b/modules/nf-core/mygene/tests/main.nf.test.snap new file mode 100644 index 00000000..d6a334c7 --- /dev/null +++ b/modules/nf-core/mygene/tests/main.nf.test.snap @@ -0,0 +1,135 @@ +{ + "mygene - filter by go evidence - versions": { + "content": [ + [ + "versions.yml:md5,09d72645c3ae7e886af6e8bd2876c72b" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-20T17:20:31.854823" + }, + "mygene - default options - versions": { + "content": [ + [ + "versions.yml:md5,09d72645c3ae7e886af6e8bd2876c72b" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-20T17:19:43.081388" + }, + "mygene - default with tsv file - versions": { + "content": [ + [ + "versions.yml:md5,09d72645c3ae7e886af6e8bd2876c72b" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-20T17:20:01.837699" + }, + "mygene - default options - gmt": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.gmt:md5,d76d4d06dad199c5e3ecef7060876834" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-20T17:19:43.060437" + }, + "mygene - filter by go category - versions": { + "content": [ + [ + "versions.yml:md5,09d72645c3ae7e886af6e8bd2876c72b" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-20T17:20:17.233994" + }, + "mygene - filter by go evidence - gmt": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.gmt:md5,da6b31a5f889e3aedb16b4154f9652af" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-20T17:20:31.827798" + }, + "mygene - default with tsv file - tsv": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.tsv:md5,018e23173b224cbf328751006593900e" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-20T17:20:01.81872" + }, + "mygene - default with tsv file - gmt": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.gmt:md5,d76d4d06dad199c5e3ecef7060876834" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-20T17:20:01.79811" + }, + "mygene - filter by go category - gmt": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.gmt:md5,213c1d1d2345df8ea51d67cb1670f4f7" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-20T17:20:17.208509" + } +} \ No newline at end of file diff --git a/modules/nf-core/mygene/tests/tags.yml b/modules/nf-core/mygene/tests/tags.yml new file mode 100644 index 00000000..c867c978 --- /dev/null +++ b/modules/nf-core/mygene/tests/tags.yml @@ -0,0 +1,2 @@ +mygene: + - "modules/nf-core/mygene/**" diff --git a/modules/nf-core/propr/grea/environment.yml b/modules/nf-core/propr/grea/environment.yml new file mode 100644 index 00000000..c6897c73 --- /dev/null +++ b/modules/nf-core/propr/grea/environment.yml @@ -0,0 +1,7 @@ +name: propr_grea +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - conda-forge::r-propr=5.0.4 diff --git a/modules/nf-core/propr/grea/main.nf b/modules/nf-core/propr/grea/main.nf new file mode 100644 index 00000000..66cf3c05 --- /dev/null +++ b/modules/nf-core/propr/grea/main.nf @@ -0,0 +1,24 @@ +process PROPR_GREA { + tag "$meta.id" + label 'process_high' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/r-propr:5.0.4': + 'quay.io/biocontainers/r-propr:5.0.4' }" + + input: + tuple val(meta), path(adj) + tuple val(meta2), path(gmt) + + output: + tuple val(meta), path("*.go.tsv"), emit: enrichedGO + path "versions.yml", emit: versions + path "*.R_sessionInfo.log", emit: session_info + + when: + task.ext.when == null || task.ext.when + + script: + template 'grea.R' +} diff --git a/modules/nf-core/propr/grea/meta.yml b/modules/nf-core/propr/grea/meta.yml new file mode 100644 index 00000000..de40abd3 --- /dev/null +++ b/modules/nf-core/propr/grea/meta.yml @@ -0,0 +1,57 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "propr_grea" +description: Perform Gene Ratio Enrichment Analysis +keywords: + - logratio + - differential + - propr + - grea + - enrichment + - expression +tools: + - "grea": + description: "Gene Ratio Enrichment Analysis" + homepage: "https://github.com/tpq/propr" + documentation: "https://rdrr.io/cran/propr/man/propr.html" + tool_dev_url: "https://github.com/tpq/propr" + doi: "10.2202/1544-6115.1175" + licence: ["GPL-2"] +input: + - meta: + type: map + description: | + Groovy Map containing sample information. + This can be used at the workflow level to pass optional parameters to the module. + [id: 'test', ...] + - meta2: + type: map + description: | + Groovy map containing study-wide metadata related to the knowledge database + - adj: + type: file + description: adjacency matrix for gene ratio proportionality/differential proportionality + pattern: "*.{csv,tsv}" + - gmt: + type: file + description: relational database containing genes and GO terms (generated by mygene module) + pattern: "*.{gmt}" +output: + - meta: + type: map + description: | + Groovy Map containing sample information. + This can be used at the workflow level to pass optional parameters to the module. + [id: 'test', ...] + - enrichedGO: + type: file + description: File containing GO terms and their enrichment values + pattern: "*.{csv}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@caraiz2001" +maintainers: + - "@caraiz2001" diff --git a/modules/nf-core/propr/grea/templates/grea.R b/modules/nf-core/propr/grea/templates/grea.R new file mode 100644 index 00000000..6e1c6a00 --- /dev/null +++ b/modules/nf-core/propr/grea/templates/grea.R @@ -0,0 +1,253 @@ +#!/usr/bin/env Rscript + +################################################ +################################################ +## Functions ## +################################################ +################################################ + +#' Parse out options from a string without recourse to optparse +#' +#' @param x Long-form argument list like --opt1 val1 --opt2 val2 +#' +#' @return named list of options and values similar to optparse +parse_args <- function(x){ + args_list <- unlist(strsplit(x, ' ?--')[[1]])[-1] + args_vals <- lapply(args_list, function(x) scan(text=x, what='character', quiet = TRUE)) + + # Ensure the option vectors are length 2 (key/ value) to catch empty ones + args_vals <- lapply(args_vals, function(z){ length(z) <- 2; z}) + + parsed_args <- structure(lapply(args_vals, function(x) x[2]), names = lapply(args_vals, function(x) x[1])) + parsed_args[! is.na(parsed_args)] +} + +#' Flexibly read CSV or TSV files (determined by file extension) +#' +#' @param file Input file +#' @param header Boolean. TRUE if first row is header. False without header. +#' @param row.names The first column is used as row names by default. +#' Otherwise, give another number. Or use NULL when no row.names are present. +#' +#' @return output Data frame +read_delim_flexible <- function(file, header = TRUE, row.names = 1, check.names = TRUE){ + + ext <- tolower(tail(strsplit(basename(file), split = "\\\\.")[[1]], 1)) # Get the file extension + + if (ext == "tsv" || ext == "txt") { # If the file is a tsv or txt file + separator <- "\\t" # Set the separator variable to tab + } else if (ext == "csv") { # If the file is a csv file + separator <- "," + } else { + stop(paste("Unknown separator for", ext)) + } + + mat <- read.delim( # Read the file + file, + sep = separator, # Set the separator defined above + header = header, + row.names = row.names, + check.names = check.names + ) +} + +#' Converts the .gmt file into a df +#' +#' @param file_gmt_path path of the .gmt file provided by mygene module. +#' @return output dataframe a Dataframe: 1st column = GOterm, 2nd = Description, 3d to end = genes. +process_gmt_file <- function(file_gmt_path) { + + lines <- readLines(file_gmt_path) + data_list <- list() + + for (line in lines) { + fields <- strsplit(line, "\\t")[[1]] # Split the line based on the tab character + go_term <- fields[1] # Extract the GO term + + # Create a data frame with the GO term in the first column + # Fill in missing values with NA to ensure consistent column lengths + data_list[[go_term]] <- data.frame(GOterm = go_term, + Description = fields[2], + GeneIDs = c(fields[3:length(fields)], rep(NA, max(0, 3 - length(fields))))) + } + + gmt_df <- do.call(rbind, data_list) # Combine all data frames into a single data frame + gmt_df\$GeneIDs <- as.character(gmt_df\$GeneIDs) # Convert gene IDs to character to avoid coercion + + return(gmt_df) +} + +#' Converts the .gmt data frame into a knowledge matrix (contingency table) +#' +#' @param gmt_df .gmt df created by process_gmt_file +#' @return output dataframe. A knowledge database where each row is a graph node (gene) +#' and each column is a concept (GO term). +gmt_to_K<- function(gmt_df){ + + summ_df <- as.data.frame(gmt_df\$GeneIDs) + summ_df <- cbind(summ_df, as.data.frame(gmt_df\$GOterm)) + colnames(summ_df)<- c("GeneIDs", "GOterm") + summ_df<- unique(summ_df) + + summ_df\$value <- 1 + + K <- table(summ_df\$GeneIDs, summ_df\$GOterm) + K <- as.data.frame.matrix(K) + + return(K) +} + +#' Expands knowledge matrix with missing genes to ensure same number of rows for A and K +#' +#' @param adjacency_matrix gene x gene correlation or proportionality adjacency matrix (output propr/propd) +#' @return output dataframe. A knowledge database where each row is a graph node (gene) +#' and each column is a concept (GO term). +add_missing <- function(adjacency_matrix, knowledge_matrix){ + + missing_genes <- setdiff(rownames(adjacency_matrix), rownames(knowledge_matrix)) + extra_rows <- data.frame(matrix(0, nrow = length(missing_genes), ncol = ncol(knowledge_matrix))) + rownames(extra_rows) <- missing_genes + colnames(extra_rows) <- colnames(knowledge_matrix) + + knowledge_matrix <- rbind(knowledge_matrix, extra_rows) + return(knowledge_matrix) +} + +################################################ +################################################ +## Parse arguments ## +################################################ +################################################ + +opt <- list( + adj = '$adj', + gmt = '$gmt', + prefix = ifelse('$task.ext.prefix' == 'null', '$meta.pathway_name', '$task.ext.prefix'), + permutation = 10, + fixseed = TRUE, + ncores = as.integer('$task.cpus') +) + +opt_types <- list( + adj = 'character', + gmt = 'character', + prefix = 'character', + permutation = 'numeric', + fixseed = 'logical', + ncores = 'numeric' +) + +# Apply parameter overrides +args_opt <- parse_args('$task.ext.args') + +for ( ao in names(args_opt)){ + if (! ao %in% names(opt)){ + stop(paste("Invalid option:", ao)) + } else { + + # Preserve classes from defaults where possible + if (! is.null(opt[[ao]])){ + args_opt[[ao]] <- as(args_opt[[ao]], opt_types[[ao]]) + } + # set NA + if (args_opt[[ao]] %in% c('NA', NA, 'null')){ + args_opt[[ao]] <- NA + } + opt[[ao]] <- args_opt[[ao]] + } +} + +# Check if required parameters have been provided +required_opts <- c('adj', 'gmt') # defines a vector required_opts containing the names of the required parameters. +missing <- required_opts[unlist(lapply(opt[required_opts], is.null)) | ! required_opts %in% names(opt)] +if (length(missing) > 0){ + stop(paste("Missing required options:", paste(missing, collapse=', '))) +} + + +# Check file inputs are valid +for (file_input in c('adj', 'gmt')){ + if (is.null(opt[[file_input]])) { + stop(paste("Please provide", file_input), call. = FALSE) + } + if (! file.exists(opt[[file_input]])){ + stop(paste0('Value of ', file_input, ': ', opt[[file_input]], ' is not a valid file')) + } +} + +################################################ +################################################ +## Finish loading libraries ## +################################################ +################################################ + +library(propr) + +################################################ +################################################ +## Enrichment analysis ## +################################################ +################################################ + +# Read gene x gene adjacency matrix +A <- read_delim_flexible(opt\$adj, header = TRUE, row.names = 1, check.names = TRUE) + +# Read and process gene x GO term matrix +gmt_df <- process_gmt_file(opt\$gmt) +K <- gmt_to_K(gmt_df) + +# Ensure same number of rows (genes) +if (nrow(A) != nrow(K)){ + K <- add_missing(A, K) +} + +# Run Graflex +G <- runGraflex(A, K, opt\$permutation, opt\$fixseed) + +################################################ +################################################ +## Generate outputs ## +################################################ +################################################ + +write.table( + G, + file = paste0(opt\$prefix, '.go.tsv'), + col.names = TRUE, + row.names = TRUE, # False + sep = '\\t', + quote = FALSE + +) + +################################################ +################################################ +## R SESSION INFO ## +################################################ +################################################ + +sink(paste0(opt\$prefix, ".R_sessionInfo.log")) +print(sessionInfo()) +sink() + +################################################ +################################################ +## VERSIONS FILE ## +################################################ +################################################ + +r.version <- strsplit(version[['version.string']], ' ')[[1]][3] +propr.version <- as.character(packageVersion('propr')) + +writeLines( + c( + '"${task.process}":', + paste(' r-base:', r.version), + paste(' r-propr:', propr.version) + ), +'versions.yml') + +################################################ +################################################ +################################################ +################################################ diff --git a/modules/nf-core/propr/grea/tests/grea_test.config b/modules/nf-core/propr/grea/tests/grea_test.config new file mode 100644 index 00000000..8d0d229a --- /dev/null +++ b/modules/nf-core/propr/grea/tests/grea_test.config @@ -0,0 +1,8 @@ +process { + withName: "PROPR_PROPR"{ + ext.args = { "--adjacency true --permutation 5 --fixseed true --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05"} + } + withName: "PROPR_GREA"{ + ext.args = { "--permutation 5 --fixseed true"} + } +} \ No newline at end of file diff --git a/modules/nf-core/propr/grea/tests/main.nf.test b/modules/nf-core/propr/grea/tests/main.nf.test new file mode 100644 index 00000000..afac1dec --- /dev/null +++ b/modules/nf-core/propr/grea/tests/main.nf.test @@ -0,0 +1,62 @@ +nextflow_process { + + name "Test Process PROPR_GREA" + script "../main.nf" + process "PROPR_GREA" + + tag "modules" + tag "modules_nfcore" + tag "propr" + tag "propr/grea" + tag "mygene" + tag "propr/propr" + + test("grea chained to propr using default options") { + + tag "default" + config "./grea_test.config" + + setup { + run("PROPR_PROPR") { + script "../../propr/main.nf" + process { + """ + input[0] = [ + [ id:'test' ], + file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv") + ] + """ + } + } + run("MYGENE") { + script "../../../mygene/main.nf" + process { + """ + input[0] = [ + [id : 'test'], + file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.gene_meta.tsv") + ] + """ + } + } + } + + when { + process { + """ + input[0] = PROPR_PROPR.out.adj.collect{ meta, adj -> adj }.map{ adj -> [[ id: 'test_adj'], adj]} + input[1] = MYGENE.out.gmt.collect{ meta, gmt -> gmt }.map{ gmt -> [[ id: 'test_gmt'], gmt]} + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.enrichedGO).match("grea chained to propr using default options - enrichedGO") }, + { assert snapshot(process.out.versions).match("versions") } + + ) + } + } +} \ No newline at end of file diff --git a/modules/nf-core/propr/grea/tests/main.nf.test.snap b/modules/nf-core/propr/grea/tests/main.nf.test.snap new file mode 100644 index 00000000..a915603d --- /dev/null +++ b/modules/nf-core/propr/grea/tests/main.nf.test.snap @@ -0,0 +1,31 @@ +{ + "versions": { + "content": [ + [ + "versions.yml:md5,222a7a8b79b5a2987637279847c609d1" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-29T10:45:07.582509" + }, + "grea chained to propr using default options - enrichedGO": { + "content": [ + [ + [ + { + "id": "test_adj" + }, + "test_adj.go.tsv:md5,914d8b750ba303a297efb7331ec238b7" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-29T10:45:07.508934" + } +} \ No newline at end of file diff --git a/modules/nf-core/propr/grea/tests/tags.yml b/modules/nf-core/propr/grea/tests/tags.yml new file mode 100644 index 00000000..e7f80baf --- /dev/null +++ b/modules/nf-core/propr/grea/tests/tags.yml @@ -0,0 +1,2 @@ +propr/grea: + - "modules/nf-core/propr/grea/**" diff --git a/modules/nf-core/propr/propd/environment.yml b/modules/nf-core/propr/propd/environment.yml new file mode 100644 index 00000000..058f30a0 --- /dev/null +++ b/modules/nf-core/propr/propd/environment.yml @@ -0,0 +1,7 @@ +name: propr_propd +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - conda-forge::r-propr=5.0.3 diff --git a/modules/nf-core/propr/propd/main.nf b/modules/nf-core/propr/propd/main.nf new file mode 100644 index 00000000..d7ada4ab --- /dev/null +++ b/modules/nf-core/propr/propd/main.nf @@ -0,0 +1,28 @@ +process PROPR_PROPD { + 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/r-propr:5.0.3': + 'quay.io/biocontainers/r-propr:5.0.3' }" + + input: + tuple val(meta), path(count) + tuple val(meta2), path(samplesheet) + + output: + tuple val(meta), path("*.propd.rds"), emit: propd + tuple val(meta), path("*.propd.tsv"), emit: results + tuple val(meta), path("*.fdr.tsv") , emit: fdr , optional:true + tuple val(meta), path("*.adj.csv"), emit: adj , optional:true + path "*.warnings.log", emit: warnings + path "*.R_sessionInfo.log" , emit: session_info + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + template 'propd.R' +} diff --git a/modules/nf-core/propr/propd/meta.yml b/modules/nf-core/propr/propd/meta.yml new file mode 100644 index 00000000..1c408d73 --- /dev/null +++ b/modules/nf-core/propr/propd/meta.yml @@ -0,0 +1,68 @@ +name: "propr_propd" +description: Perform differential proportionality analysis +keywords: + - differential + - proportionality + - logratio + - expression + - propr +tools: + - "propr": + description: "Logratio methods for omics data" + homepage: "https://github.com/tpq/propr" + documentation: "https://rdrr.io/cran/propr/man/propr.html" + tool_dev_url: "https://github.com/tpq/propr" + doi: "10.1038/s41598-017-16520-0" + licence: ["GPL-2"] +input: + - meta: + type: map + description: | + Groovy Map containing additional information. + This can be used at the workflow level to pass optional parameters to the module. + [id: 'test', ...] + - count: + type: file + description: | + Count matrix, where rows = variables or genes, columns = samples or cells. + This matrix should not contain zeros. One should plug this module after another one that handles the zeros. + pattern: "*.{csv,tsv}" + - meta2: + type: map + description: | + Groovy map containing study-wide metadata related to the sample sheet and matrix + - samplesheet: + type: file + description: | + CSV or TSV format sample sheet with sample metadata +output: + - meta: + type: map + description: | + Groovy Map containing additional information. + This can be used at the workflow level to pass optional parameters to the module. + [id: 'test', ...] + - propd: + type: file + description: R propd object + pattern: "*.propd.rds" + - results: + type: file + description: Results table + pattern: "*.propd.tsv" + - fdr: + type: file + description: (optional) propr fdr table + pattern: "*.fdr.tsv" + - session_info: + type: file + description: dump of R SessionInfo + pattern: "*.R_sessionInfo.log" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@suzannejin" +maintainers: + - "@suzannejin" diff --git a/modules/nf-core/propr/propd/templates/propd.R b/modules/nf-core/propr/propd/templates/propd.R new file mode 100644 index 00000000..1bdae252 --- /dev/null +++ b/modules/nf-core/propr/propd/templates/propd.R @@ -0,0 +1,372 @@ +#!/usr/bin/env Rscript + + +################################################ +################################################ +## Functions ## +################################################ +################################################ + +#' Parse out options from a string without recourse to optparse +#' +#' @param x Long-form argument list like --opt1 val1 --opt2 val2 +#' +#' @return named list of options and values similar to optparse + +parse_args <- function(x){ + args_list <- unlist(strsplit(x, ' ?--')[[1]])[-1] + args_vals <- lapply(args_list, function(x) scan(text=x, what='character', quiet = TRUE)) + + # Ensure the option vectors are length 2 (key/ value) to catch empty ones + args_vals <- lapply(args_vals, function(z){ length(z) <- 2; z}) + + parsed_args <- structure(lapply(args_vals, function(x) x[2]), names = lapply(args_vals, function(x) x[1])) + parsed_args[! is.na(parsed_args)] +} + +#' Flexibly read CSV or TSV files +#' +#' @param file Input file +#' @param header Boolean. TRUE if first row is header. False without header. +#' @param row.names The first column is used as row names by default. +#' Otherwise, give another number. Or use NULL when no row.names are present. +#' +#' @return output Data frame +read_delim_flexible <- function(file, header = TRUE, row.names = 1, check.names = TRUE){ + + ext <- tolower(tail(strsplit(basename(file), split = "\\\\.")[[1]], 1)) + + if (ext == "tsv" || ext == "txt") { + separator <- "\\t" + } else if (ext == "csv") { + separator <- "," + } else { + stop(paste("Unknown separator for", ext)) + } + + mat <- read.delim( + file, + sep = separator, + header = header, + row.names = row.names, + check.names = check.names + ) + + if (!is.null(row.names)){ + if ( (row.names == 'gene_id') & ('gene_name' %in% colnames(mat)) ){ + mat <- mat[, -which(colnames(mat) == 'gene_name')] + } else if ( (row.names == 'gene_name') & ('gene_id' %in% colnames(mat)) ){ + mat <- mat[, -which(colnames(mat) == 'gene_id')] + } + } + + return(mat) +} + +#' Extract the values for a single metric and convert it into a genes x genes matrix. +#' +#' @param object propd object +one_metric_df <- function(object) { + results <- getResults(object) + #keep only the metric of interest + one_metric <- cbind(results\$Partner, results\$Pair, results\$theta) + colnames(one_metric) <- c("Partner", "Pair", "theta") + one_metric <- as.data.frame(one_metric) + + # Extract the unique gene names + gene_names <- sort(unique(c(one_metric\$Partner, one_metric\$Pair))) + # Initialize a square matrix with NA + square_matrix <- matrix(NA, nrow = length(gene_names), ncol = length(gene_names)) + rownames(square_matrix) <- gene_names + colnames(square_matrix) <- gene_names + + # Use the `match` function to get the row and column indices + row_indices <- match(one_metric\$Partner, gene_names) + col_indices <- match(one_metric\$Pair, gene_names) + # Use these indices to populate the matrix + square_matrix[cbind(row_indices, col_indices)] <- one_metric[["theta"]] + # Populate the reverse pairs to ensure symmetry + square_matrix[cbind(col_indices, row_indices)] <- one_metric[["theta"]] + return(square_matrix) +} + +#' Extract the differential proportionality cutoff for a specified FDR value. +#' Gene pairs with a value higher than the extracted cutoff will be considered significantly differentially proportional. +#' +#' @param object propd object. Output from propd function. updateCutoffs function should be applied to the object previous to valCutoff. +#' @param fdrVal FDR value to extract the cutoff for. Per default 0.05. +#' +#' @return cutoff value. Differential proportionality values lower than this cutoff are considered significant. +valCutoff <- function(object, fdrVal = 0.05){ + fdr_df <- object@fdr + if (prod(dim(fdr_df) == 0)){ + warning("Please run updateCutoff on propd first") + }else{ + fdr_vals <- fdr_df\$FDR + if (any(!is.na(fdr_vals))){ # Si hay algun valor de FDR correcto + threshold <- any(fdr_vals <= fdrVal) + if (threshold){ + fdr_threshold <- fdr_vals[which.min(fdr_vals <= fdrVal) - 1] + }else{ + warning("FDR is higher than the specified threshold for all proportionality values. Using the lowest fdr instead") + fdr_threshold <- fdr_vals[1] + } + }else{ + stop("No true counts in the given interval. FDR values are not defined") + geterrmessage() + } + } + cutoff <- fdr_df\$cutoff[fdr_df\$FDR == fdr_threshold] + return(cutoff) +} + +#' Convert a proportionality matrix to an adjacency matrix based on a threshold. +#' +#' @param matrix proportionality matrix. Can be extracted from propr object with getMatrix(). +#' @param cutoff Significant proportionality value extracted from valCutoff function. +#' +#' @return Adjacency matrix. Gene pairs with a proportionality value lower than the threshold will have 1, otherwise 0. +convert_to_adjacency <- function(matrix, cutoff) { + adjacency <- ifelse(matrix < cutoff, 1, 0) + return(adjacency) +} + +################################################ +################################################ +## Parse arguments ## +################################################ +################################################ + +opt <- list( + prefix = ifelse('$task.ext.prefix' == 'null','$meta.pathway_name', '$task.ext.prefix'), + count = '$count', + samplesheet = '$samplesheet', + features_id_col = 'gene_id', # column name of feature ids + obs_id_col = 'sample', # column name of observation ids + group_col = 'treatment', # column name of grouping variable + metric = 'theta_d', # differential proportionality metric: theta_d, theta_e or theta_f + alpha = NA, # alpha for boxcox transformation + permutation = 0, # permutation cycles for computing FDR + cutoff_min = 0.05, # minimun threshold to test + cutoff_max = 0.95, # maximun threshold to test + cutoff_interval = 0.05, # interval between thresholds + fixseed = FALSE, + adjacency = FALSE, + fdrVal = 0.05, + ncores = as.integer('$task.cpus') +) +opt_types <- list( + prefix = 'character', + count = 'character', + samplesheet = 'character', + features_id_col = 'character', + obs_id_col = 'character', + group_col = 'character', + metric = 'character', + alpha = 'numeric', + permutation = 'numeric', + cutoff_min = 'numeric', + cutoff_max = 'numeric', + cutoff_interval = 'numeric', + fixseed = 'logical', + adjacency = 'logical', + fdrVal = 'numeric', + ncores = 'numeric' +) + +# Apply parameter overrides +args_opt <- parse_args('$task.ext.args') +for ( ao in names(args_opt)){ + if (! ao %in% names(opt)){ + stop(paste("Invalid option:", ao)) + } else { + + # Preserve classes from defaults where possible + if (! is.null(opt[[ao]])){ + args_opt[[ao]] <- as(args_opt[[ao]], opt_types[[ao]]) + } + # set NA + if (args_opt[[ao]] %in% c('NA', NA, 'null')){ + args_opt[[ao]] <- NA + } + opt[[ao]] <- args_opt[[ao]] + } +} + +# Check if required parameters have been provided +required_opts <- c('count','samplesheet') +missing <- required_opts[unlist(lapply(opt[required_opts], is.null)) | ! required_opts %in% names(opt)] +if (length(missing) > 0){ + stop(paste("Missing required options:", paste(missing, collapse=', '))) +} + +# Check file inputs are valid +for (file_input in c('count','samplesheet')){ + if (is.null(opt[[file_input]])) { + stop(paste("Please provide", file_input), call. = FALSE) + } + if (! file.exists(opt[[file_input]])){ + stop(paste0('Value of ', file_input, ': ', opt[[file_input]], ' is not a valid file')) + } +} + +# check parameters +if (! opt\$metric %in% c('theta_d', 'theta_e', 'theta_f')) stop('Please provide a valid differential proportionality metric') + +################################################ +################################################ +## Finish loading libraries ## +################################################ +################################################ + +library(propr) + +################################################ +################################################ +## Perform differential proportionality ## +################################################ +################################################ + +# read matrix +mat <- read_delim_flexible( + opt\$count, + header = TRUE, + row.names = opt\$features_id_col, + check.names = FALSE +) +mat <- t(mat) + +# check zeros +# log transformation should be applied on non-zero data +# otherwise Inf values are generated +if (any(mat == 0)) print("Zeros will be replaced by minimun value before logratio analysis") + +# parse group +# this creates a vector referring to the group id for each observation +samplesheet <- read_delim_flexible( + opt\$samplesheet, + header = TRUE, + row.names = NULL, + check.names = FALSE +) +tmp <- samplesheet[[opt\$group_col]] +names(tmp) <- samplesheet[[opt\$obs_id_col]] +group <- as.vector(tmp[rownames(mat)]) +if (length(group) != nrow(mat)) stop('Error when parsing group') + +# perform differential proportionality +pd <- propd( + mat, + group = group, + alpha = opt\$alpha, + weighted = FALSE, + p = opt\$permutation, + fixseed = opt\$fixseed +) + +if (opt\$metric == 'theta_d'){ + pd <- setDisjointed(pd) +} else if (opt\$metric == 'theta_e'){ + pd <- setEmergent(pd) +} else if (opt\$metric == 'theta_f'){ + pd <- setActive(pd, what = "theta_f") +} + +# update FDR by permutation, if required +if (opt\$permutation > 0) { + cutoff <- seq( + opt\$cutoff_min, + opt\$cutoff_max, + opt\$cutoff_interval + ) + pd <- updateCutoffs(pd, cutoff=cutoff, ncores=opt\$ncores) + if (opt\$metric == 'theta_d') pd <- updateF(pd) +} + +# Extract adjacency matrix if required +if (opt\$adjacency == TRUE) { + matrix <- one_metric_df(pd) + cutoff <- valCutoff(pd, opt\$fdrVal) + adj <- convert_to_adjacency(matrix, cutoff) +} + +################################################ +################################################ +## Generate outputs ## +################################################ +################################################ + +saveRDS( + pd, + file = paste0(opt\$prefix, '.propd.rds') +) + +write.table( + getResults(pd), + file = paste0(opt\$prefix, '.propd.tsv'), + col.names = TRUE, + row.names = FALSE, + sep = '\\t', + quote = FALSE +) + +if (opt\$permutation > 0) { + write.table( + pd@fdr, + file = paste0(opt\$prefix, '.fdr.tsv'), + col.names = TRUE, + sep = '\\t', + quote = FALSE + ) +} + +if (opt\$adjacency == TRUE) { + write.table( + adj, + file = paste0(opt\$prefix, '.adj.csv'), + col.names = TRUE, + row.names = TRUE, + sep = ',', + quote = FALSE + ) +} + +################################################ +################################################ +## WARNINGS ## +################################################ +################################################ + +sink(paste0(opt\$prefix, ".warnings.log")) +print(warnings()) +sink() + +################################################ +################################################ +## R SESSION INFO ## +################################################ +################################################ + +sink(paste0(opt\$prefix, ".R_sessionInfo.log")) +print(sessionInfo()) +sink() + +################################################ +################################################ +## VERSIONS FILE ## +################################################ +################################################ + +propr.version <- as.character(packageVersion('propr')) + +writeLines( + c( + '"${task.process}":', + paste(' r-propr:', propr.version) + ), +'versions.yml') + +################################################ +################################################ +################################################ +################################################ diff --git a/modules/nf-core/propr/propd/tests/adjacency.config b/modules/nf-core/propr/propd/tests/adjacency.config new file mode 100644 index 00000000..072a4d75 --- /dev/null +++ b/modules/nf-core/propr/propd/tests/adjacency.config @@ -0,0 +1,3 @@ +process { + ext.args = {"--permutation 10 --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.1 --fixseed true --adjacency true"} +} \ No newline at end of file diff --git a/modules/nf-core/propr/propd/tests/boxcox_theta_e.config b/modules/nf-core/propr/propd/tests/boxcox_theta_e.config new file mode 100755 index 00000000..40c0548d --- /dev/null +++ b/modules/nf-core/propr/propd/tests/boxcox_theta_e.config @@ -0,0 +1,4 @@ +process { + ext.args = {"--metric theta_e --alpha 0.2 --permutation 10 --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --fixseed true"} + ext.prefix = {"test+theta_e+0.2"} +} \ No newline at end of file diff --git a/modules/nf-core/propr/propd/tests/default_boxcox.config b/modules/nf-core/propr/propd/tests/default_boxcox.config new file mode 100755 index 00000000..831002d9 --- /dev/null +++ b/modules/nf-core/propr/propd/tests/default_boxcox.config @@ -0,0 +1,4 @@ +process { + ext.args = {"--alpha 0.2 --permutation 10 --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --fixseed true"} + ext.prefix = {"test+theta_d+0.2"} +} \ No newline at end of file diff --git a/modules/nf-core/propr/propd/tests/default_permutation.config b/modules/nf-core/propr/propd/tests/default_permutation.config new file mode 100755 index 00000000..e89c239f --- /dev/null +++ b/modules/nf-core/propr/propd/tests/default_permutation.config @@ -0,0 +1,4 @@ +process { + ext.args = {"--permutation 10 --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --fixseed true"} + ext.prefix = {"test+theta_d+NA"} +} \ No newline at end of file diff --git a/modules/nf-core/propr/propd/tests/main.nf.test b/modules/nf-core/propr/propd/tests/main.nf.test new file mode 100755 index 00000000..9fcaf93a --- /dev/null +++ b/modules/nf-core/propr/propd/tests/main.nf.test @@ -0,0 +1,154 @@ +nextflow_process { + + name "Test Process PROPR_PROPD" + script "../main.nf" + process "PROPR_PROPD" + + tag "modules" + tag "modules_nfcore" + tag "propr" + tag "propr/propd" + + test("Test propr/propd using default permutation") { + + tag "default" + config "./default_permutation.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv") + ] + input[1] = [ + [ id: 'test'], + file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.samplesheet.csv") + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.results).match("Test propr/propd using default permutation - results") }, + { assert snapshot(process.out.versions).match("versions") } + ) + } + } + + test("Test propr/propd using default boxcox permutation") { + + tag "default_boxcox" + config "./default_boxcox.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv") + ] + input[1] = [ + [ id: 'test'], + file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.samplesheet.csv") + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.results).match(" Test propr/propd using default boxcox permutation - results") }, + { assert snapshot(process.out.fdr).match(" Test propr/propd using default boxcox permutation - fdr") } + ) + } + } + + test("Test propr/propd using theta_e permutation") { + + tag "theta_e" + config "./theta_e.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv") + ] + input[1] = [ + [ id: 'test'], + file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.samplesheet.csv") + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.results).match("Test propr/propd using theta_e permutation - results") } + ) + } + } + + test("Test propr/propd using theta_e and boxcox permutation") { + + tag "boxcox_theta_e" + config "./boxcox_theta_e.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv") + ] + input[1] = [ + [ id: 'test'], + file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.samplesheet.csv") + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.results).match("Test propr/propd using theta_e and boxcox permutation - results") } + ) + } + } + + test("Test propr/propd with adjacency matrix") { + + tag "adjacency" + config "./adjacency.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv") + ] + input[1] = [ + [ id: 'test'], + file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.samplesheet.csv") + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.adj).match("Test propr/propd with adjacency matrix - adj") }, + { assert snapshot(process.out.results).match(" - results") } + ) + } + } +} \ No newline at end of file diff --git a/modules/nf-core/propr/propd/tests/main.nf.test.snap b/modules/nf-core/propr/propd/tests/main.nf.test.snap new file mode 100644 index 00000000..58199b4b --- /dev/null +++ b/modules/nf-core/propr/propd/tests/main.nf.test.snap @@ -0,0 +1,133 @@ +{ + " Test propr/propd using default boxcox permutation - fdr": { + "content": [ + [ + [ + { + "id": "test" + }, + "test+theta_d+0.2.fdr.tsv:md5,17e1c382e5f8275e2858a86e98c1aa6c" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-16T11:55:35.703293" + }, + "Test propr/propd using theta_e and boxcox permutation - results": { + "content": [ + [ + [ + { + "id": "test" + }, + "test+theta_e+0.2.propd.tsv:md5,d56fcc7c8ae0b0853ea9ca6ac6484a08" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-16T11:59:33.28078" + }, + "Test propr/propd using theta_e permutation - results": { + "content": [ + [ + [ + { + "id": "test" + }, + "test+theta_e+NA.propd.tsv:md5,c190d80c11ba99a0303a8dd5ab8ed76f" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-16T11:57:24.038188" + }, + "versions": { + "content": [ + [ + "versions.yml:md5,b41d17751970fc8bcf4f8e0326d239e2" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-16T11:53:45.165637" + }, + " - results": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.propd.tsv:md5,34fda117492faf9a60f5807f56c4be68" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-16T14:13:47.602525" + }, + " Test propr/propd using default boxcox permutation - results": { + "content": [ + [ + [ + { + "id": "test" + }, + "test+theta_d+0.2.propd.tsv:md5,f1886c538e6aeed1bbac4c8c1ef0c930" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-16T11:55:32.476341" + }, + "Test propr/propd using default permutation - results": { + "content": [ + [ + [ + { + "id": "test" + }, + "test+theta_d+NA.propd.tsv:md5,34fda117492faf9a60f5807f56c4be68" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-16T11:53:43.056295" + }, + "Test propr/propd with adjacency matrix - adj": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.adj.csv:md5,f9d19255f9400e6c4daa01f86d74f017" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-16T14:13:47.427246" + } +} \ No newline at end of file diff --git a/modules/nf-core/propr/propd/tests/tags.yml b/modules/nf-core/propr/propd/tests/tags.yml new file mode 100755 index 00000000..ba65ca0a --- /dev/null +++ b/modules/nf-core/propr/propd/tests/tags.yml @@ -0,0 +1,2 @@ +propr/propd: + - "modules/nf-core/propr/propd/**" diff --git a/modules/nf-core/propr/propd/tests/theta_e.config b/modules/nf-core/propr/propd/tests/theta_e.config new file mode 100755 index 00000000..37c0dd5a --- /dev/null +++ b/modules/nf-core/propr/propd/tests/theta_e.config @@ -0,0 +1,4 @@ +process { + ext.args = {"--metric theta_e --permutation 10 --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --fixseed true"} + ext.prefix = {"test+theta_e+NA"} +} \ No newline at end of file diff --git a/modules/nf-core/propr/propr/environment.yml b/modules/nf-core/propr/propr/environment.yml new file mode 100644 index 00000000..cb163068 --- /dev/null +++ b/modules/nf-core/propr/propr/environment.yml @@ -0,0 +1,7 @@ +name: propr_propr +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - conda-forge::r-propr=5.0.3 diff --git a/modules/nf-core/propr/propr/main.nf b/modules/nf-core/propr/propr/main.nf new file mode 100644 index 00000000..531e575c --- /dev/null +++ b/modules/nf-core/propr/propr/main.nf @@ -0,0 +1,27 @@ +process PROPR_PROPR { + 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/r-propr:5.0.3': + 'quay.io/biocontainers/r-propr:5.0.3' }" + + input: + tuple val(meta), path(count) + + output: + tuple val(meta), path("*.propr.rds"), emit: propr + tuple val(meta), path("*.propr.tsv"), emit: matrix + tuple val(meta), path("*.fdr.tsv"), emit: fdr , optional:true + tuple val(meta), path("*.adj.csv"), emit: adj , optional:true + path "*.warnings.log", emit: warnings + path "*.R_sessionInfo.log", emit: session_info + path "versions.yml", emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + template 'propr.R' +} diff --git a/modules/nf-core/propr/propr/meta.yml b/modules/nf-core/propr/propr/meta.yml new file mode 100644 index 00000000..c2c9a11d --- /dev/null +++ b/modules/nf-core/propr/propr/meta.yml @@ -0,0 +1,76 @@ +name: "propr_propr" +description: | + Perform logratio-based correlation analysis -> get proportionality & basis shrinkage partial correlation coefficients. + One can also compute standard correlation coefficients, if required. +keywords: + - coexpression + - correlation + - proportionality + - logratio + - propr + - corpcor + +tools: + - "propr": + description: "Logratio methods for omics data" + homepage: "https://github.com/tpq/propr" + documentation: "https://rdrr.io/cran/propr/man/propr.html" + tool_dev_url: "https://github.com/tpq/propr" + doi: "10.1038/s41598-017-16520-0" + licence: ["GPL-2"] + - "corpcor": + description: "Efficient Estimation of Covariance and (Partial) Correlation" + homepage: "https://cran.r-project.org/web/packages/corpcor/index.html" + documentation: "https://cran.r-project.org/web/packages/corpcor/corpcor.pdf" + doi: "10.2202/1544-6115.1175" + licence: ["GPL >=3"] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information. + This can be used at the workflow level to pass optional parameters to the module. + [id: 'test', ...] + - count: + type: file + description: | + Count matrix, where rows = variables or genes, columns = samples or cells. + This matrix should not contain zeros. Otherwise, they will be replaced by the minimun number. + It is recommended to handle the zeros beforehand with the method of preference. + pattern: "*.{csv,tsv}" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information. + This can be used at the workflow level to pass optional parameters to the module. + [id: 'test', ...] + - propr: + type: file + description: R propr object + pattern: "*.propr.rds" + - matrix: + type: file + description: Coefficient matrix + pattern: "*.propr.tsv" + - fdr: + type: file + description: (optional) propr fdr table + pattern: "*.fdr.tsv" + - adj: + type: file + description: (optional) propr adjacency table + pattern: "*.adj.csv" + - session_info: + type: file + description: dump of R SessionInfo + pattern: "*.R_sessionInfo.log" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@suzannejin" diff --git a/modules/nf-core/propr/propr/templates/propr.R b/modules/nf-core/propr/propr/templates/propr.R new file mode 100644 index 00000000..1f8c6769 --- /dev/null +++ b/modules/nf-core/propr/propr/templates/propr.R @@ -0,0 +1,452 @@ +#!/usr/bin/env Rscript + + +################################################ +################################################ +## Functions ## +################################################ +################################################ + +#' Parse out options from a string without recourse to optparse +#' +#' @param x Long-form argument list like --opt1 val1 --opt2 val2 +#' +#' @return named list of options and values similar to optparse + +parse_args <- function(x){ + args_list <- unlist(strsplit(x, ' ?--')[[1]])[-1] + args_vals <- lapply(args_list, function(x) scan(text=x, what='character', quiet = TRUE)) + + # Ensure the option vectors are length 2 (key/ value) to catch empty ones + args_vals <- lapply(args_vals, function(z){ length(z) <- 2; z}) + + parsed_args <- structure(lapply(args_vals, function(x) x[2]), names = lapply(args_vals, function(x) x[1])) + parsed_args[! is.na(parsed_args)] +} + +#' Flexibly read CSV or TSV files +#' +#' @param file Input file +#' @param header Boolean. TRUE if first row is header. False without header. +#' @param row.names The first column is used as row names by default. +#' Otherwise, give another number. Or use NULL when no row.names are present. +#' +#' @return output Data frame +read_delim_flexible <- function(file, header = TRUE, row.names = 1, check.names = TRUE){ + + ext <- tolower(tail(strsplit(basename(file), split = "\\\\.")[[1]], 1)) + + if (ext == "tsv" || ext == "txt") { + separator <- "\\t" + } else if (ext == "csv") { + separator <- "," + } else { + stop(paste("Unknown separator for", ext)) + } + + mat <- read.delim( + file, + sep = separator, + header = header, + row.names = row.names, + check.names = check.names + ) + + if ( (row.names == 'gene_id') & ('gene_name' %in% colnames(mat)) ){ + mat <- mat[, -which(colnames(mat) == 'gene_name')] + } else if ( (row.names == 'gene_name') & ('gene_id' %in% colnames(mat)) ){ + mat <- mat[, -which(colnames(mat) == 'gene_id')] + } + + return(mat) +} + +#' Check if a variable can be numeric or not +#' +#' @param x Input variable +#' @return True if it can be numeric, False otherwise +can_be_numeric <- function(x) { + stopifnot(is.atomic(x) || is.list(x)) # check if x is a vector + numNAs <- sum(is.na(x)) + numNAs_new <- suppressWarnings(sum(is.na(as.numeric(x)))) + return(numNAs_new == numNAs) +} + +#' Set the proper reference gene index. +#' This should be used for alr transformation only. +#' +#' @param ivar Reference variable given by user. +#' If it is 'null', then set the last column as reference (default). +#' Otherwise, it should refer to either gene name or gene index. +#' If the gene name is given, find its index. +#' @param mat Data matrix, with genes as columns +#' +#' @return The reference gene index +set_reference <- function(ivar, mat){ + if (is.na(ivar)){ + ivar <- ncol(mat) + } else { + isnumeric <- can_be_numeric(ivar) + if (!isnumeric){ + genes <- colnames(mat) + ivar <- which(genes == ivar) + } + ivar <- as.integer(ivar) + } + return(ivar) +} + +#' Set the appropiate range for the sequence of cutoffs used in updateCutoffs. +#' Adjusts the interval to the different metrics. +#' +#' @param object propr object. Output from propr function. +#' +#' @return sequence of cutoff values. +seqCutoff <- function(object){ + matrix <- getMatrix(object) + matrix[matrix <= 0] <- NA + diag(matrix) <- NA + min_cutoff <- round(min(matrix, na.rm = TRUE),3) + max_cutoff <- round(max(matrix, na.rm = TRUE),3) + step_cutoff <- (max_cutoff - min_cutoff)/ 20 + seq_cutoff <- seq(min_cutoff, max_cutoff, step_cutoff) + return(seq_cutoff) +} + +#' Extract the proportionality cutoff for a specified FDR value. +#' Gene pairs with a proportionality value higher than the extracted cutoff will be considered significantly proportional. +#' +#' @param object propr object. Output from propr function. updateCutoffs function should be applied to the object previous to valCutoff. +#' @param fdrVal FDR value to extract the cutoff for. Per default 0.05 +#' @param metric Metric used to calculate the proportionality values. Options are 'cor', 'rho', 'phi', 'phs', 'vlr', 'pcor', 'pcor.shrink', 'pcor.bshrink' +#' +#' @return cutoff value. Proportionality values higher than this cutoff are considered significant. +# valCutoff <- function(object, metric, fdrVal = 0.05){ +# fdr_df <- object@fdr +# print(fdr_df) +# metric_up <- c("rho", "cor", "pcor", "pcor.shrink", "pcor.bshrink") +# if (prod(dim(fdr_df) == 0)){ +# warning("Please run updateCutoff on propr first") +# }else{ +# fdr_vals <- fdr_df\$FDR +# if (any(is.na(fdr_vals))){ +# stop("FDR not defined. This metric is not appropiate for the given dataset") +# } +# threshold <- any(fdr_vals <= fdrVal) +# if (metric %in% metric_up){ +# if (threshold){ +# fdr_threshold <- fdr_vals[which.max(fdr_vals <= fdrVal)] +# }else{ +# warning("FDR is higher than the specified threshold for all proportionality values. Using the lowest fdr instead") +# fdr_threshold <- fdr_vals[length(fdr_vals)] +# } +# }else{ +# if (threshold){ +# fdr_threshold <- fdr_vals[which.min(fdr_vals <= fdrVal) - 1] +# }else{ +# warning("FDR is higher than the specified threshold for all proportionality values. Using the lowest fdr instead") +# fdr_threshold <- fdr_vals[1] +# } +# } +# cutoff <- fdr_df\$cutoff[fdr_df\$FDR == fdr_threshold] +# } +# return(cutoff) +# } + + +valCutoff <- function(object, metric, fdrVal = 0.05){ + fdr_df <- object@fdr + print(fdr_df) + # metric_up <- c("rho", "cor", "pcor", "pcor.shrink", "pcor.bshrink") + + if (prod(dim(fdr_df) == 0)){ + warning("Please run updateCutoff on propr first") + }else{ + fdr_vals <- fdr_df\$FDR + if(any(!is.na(fdr_vals))){ # if there is some defined value, continue, else out of range + if(any(fdr_vals <= fdrVal)){ # if there is some value that is belowe the FDR threshold, + fdr_threshold <- fdr_vals[which.max(fdr_vals <= fdrVal)] #choose the highest FDR that is lower than the threshold, else choose the lowest + }else{ + warning("FDR is higher than the specified threshold for all proportionality values. Using the lowest fdr instead") + fdr_threshold <- min(fdr_vals, na.rm = TRUE) + } + cutoff <- fdr_df\$cutoff[which(fdr_df\$FDR == fdr_threshold)] #select the corresponding cutoff value for the FDR + print(cutoff) + }else{ + stop("FDR not defined. This metric is not appropiate for the given dataset") + } + return(cutoff) + } +} + + +#' Convert a proportionality matrix to an adjacency matrix based on a threshold. +#' +#' @param matrix proportionality matrix. Can be extracted from propr object with getMatrix(). +#' @param cutoff Significant proportionality value extracted from valCutoff function. +#' +#' @return Adjacency matrix. Gene pairs with a proportionality value higher than the threshold will have 1, otherwise 0. +convert_to_adjacency <- function(matrix, cutoff, metric) { + if (metric == 'cor' || metric == 'rho' || metric == 'pcor' || metric == 'pcor.shrink' || metric == 'pcor.bshrink'){ + adjacency <- ifelse(matrix > cutoff, 1, 0) + } else { + adjacency <- ifelse(matrix < cutoff, 1, 0) + } + return(adjacency) +} + +################################################ +################################################ +## Parse arguments ## +################################################ +################################################ + +opt <- list( + count = '$count', + prefix = ifelse('$task.ext.prefix' == 'null', '$meta.pathway_name', '$task.ext.prefix'), + transformation = 'clr', + reference = NA, + alpha = NA, + metric = 'pcor.bshrink', + permutation = 0, + cutoff_min = NA, + cutoff_max = NA, + cutoff_interval = NA, + ncores = as.integer('$task.cpus'), + features_id_col = 'gene_id', + fixseed = FALSE, + adjacency = FALSE, + fdrVal = 0.05 +) +opt_types <- list( + count = 'character', + prefix = 'character', + transformation = 'character', + reference = 'character', + alpha = 'numeric', + metric = 'character', + permutation = 'numeric', + cutoff_min = 'numeric', + cutoff_max = 'numeric', + cutoff_interval = 'numeric', + ncores = 'numeric', + features_id_col = 'character', + fixseed = 'logical', + adjacency = 'logical', + fdrVal = 'numeric' +) + +# Apply parameter overrides +args_opt <- parse_args('$task.ext.args') + +for ( ao in names(args_opt)){ + if (! ao %in% names(opt)){ + stop(paste("Invalid option:", ao)) + } else { + + # Preserve classes from defaults where possible + if (! is.null(opt[[ao]])){ + args_opt[[ao]] <- as(args_opt[[ao]], opt_types[[ao]]) + } + # set NA + if (args_opt[[ao]] %in% c('NA', NA, 'null')){ + args_opt[[ao]] <- NA + } + opt[[ao]] <- args_opt[[ao]] + } +} + +# Check if required parameters have been provided +required_opts <- c('count') +missing <- required_opts[unlist(lapply(opt[required_opts], is.null)) | ! required_opts %in% names(opt)] +if (length(missing) > 0){ + stop(paste("Missing required options:", paste(missing, collapse=', '))) +} + +# Check file inputs are valid +for (file_input in c('count')){ + if (is.null(opt[[file_input]])) { + stop(paste("Please provide", file_input), call. = FALSE) + } + if (! file.exists(opt[[file_input]])){ + stop(paste0('Value of ', file_input, ': ', opt[[file_input]], ' is not a valid file')) + } +} + +# check parameters +if (!opt\$metric %in% c('rho', 'phi', 'phs', 'cor', 'vlr', 'pcor', 'pcor.shrink', 'pcor.bshrink')) { + stop('Please make sure you provided the correct metric') +} +if (opt\$metric == 'pcor.bshrink'){ + if (!is.na(opt\$alpha)) stop('Box-cox transformation is not implemented for pcor.bshrink yet.') + if (!opt\$transformation %in% c('clr', 'alr')) stop('Please make sure you provided the correct transformation: clr or alr') +} else { + if (!opt\$transformation %in% c('clr', 'alr', NA)) stop('Please make sure you provided the correct transformation: clr or alr. Or set NA if you dont want to transform the data.') + if (is.na(opt\$transformation)) print('Warning: No transformation is required by user. We assume the input count data was already properly transformed.') +} + +################################################ +################################################ +## Finish loading libraries ## +################################################ +################################################ + +library(corpcor) +library(propr) + +################################################ +################################################ +## Perform correlation analysis ## +################################################ +################################################ + +# read matrix +mat <- read_delim_flexible( + opt\$count, + header = TRUE, + row.names = opt\$features_id_col, + check.names = FALSE +) +mat <- t(mat) + +# check zeros +# log transformation should be applied on non-zero data +# otherwise Inf values are generated +if (any(mat == 0)) print("Warning: Zeros will be replaced by minimun value before logratio analysis") + +# set logratio transformation parameter -> ivar +# if alr, set the index of the reference gene as ivar +# if clr or NA, set same ivar +if (opt\$metric == 'pcor.bshrink'){ + opt\$ivar <- opt\$transformation +}else{ + if (opt\$transformation == 'alr'){ + opt\$ivar <- set_reference(opt\$reference, mat) + gene_name <- colnames(mat)[opt\$ivar] + } else { + opt\$ivar <- opt\$transformation + } +} + +# Compute correlation coefficients +pro <- propr( + mat, + metric = opt\$metric, + ivar = opt\$ivar, + alpha = opt\$alpha, + p = opt\$permutation, + fixseed = opt\$fixseed +) + +# update FDR by permutation, if required + +if (opt\$permutation > 0) { + cutoff <- seq( + opt\$cutoff_min, + opt\$cutoff_max, + opt\$cutoff_interval + ) + if (is.na(opt\$cutoff_min) || is.na(opt\$cutoff_max) || is.na(opt\$cutoff_interval)) { + warning("cutoff values were not provided. Using the default cutoff values.") + cutoff <- seqCutoff(pro) + } + m <- getMatrix(pro) + diag(m) <- NA + print((opt\$cutoff_max - opt\$cutoff_min)/2 + opt\$cutoff_min) + print(max(m, na.rm = TRUE)) + if ((opt\$cutoff_max - opt\$cutoff_min)/2 + opt\$cutoff_min > max(m, na.rm = TRUE)) { + warning("The provided cutoff values are out of range. Using the default cutoff values.") + cutoff <- seqCutoff(pro) + } + pro <- updateCutoffs(pro, cutoff=cutoff, ncores=opt\$ncores) +} + +# calculate cutoff and adjacency matrix, if required + +if (opt\$adjacency == TRUE) { + cutoff <- valCutoff(pro, opt\$metric, opt\$fdrVal) + matrix <- getMatrix(pro) + adj <- convert_to_adjacency(matrix, cutoff, opt\$metric) +} + +################################################ +################################################ +## Generate outputs ## +################################################ +################################################ + +saveRDS( + pro, + file = paste0(opt\$prefix, '.propr.rds') +) + +write.table( + round(pro@matrix, 8), # round matrix decimals to avoid floating point inconsistencies + file = paste0(opt\$prefix, '.propr.tsv'), + col.names = TRUE, + row.names = TRUE, + sep = '\t', + quote = FALSE +) + +if (opt\$permutation > 0) { + write.table( + pro@fdr, + file = paste0(opt\$prefix, '.fdr.tsv'), + col.names = TRUE, + row.names = FALSE, + sep = '\t', + quote = FALSE + ) +} + +if (opt\$adjacency == TRUE) { + write.table( + adj, + file = paste0(opt\$prefix, '.adj.csv'), + col.names = TRUE, + row.names = TRUE, + sep = ',', + quote = FALSE + ) +} + +################################################ +################################################ +## WARNINGS ## +################################################ +################################################ + +sink(paste0(opt\$prefix, ".warnings.log")) +print(warnings()) +sink() + +################################################ +################################################ +## R SESSION INFO ## +################################################ +################################################ + +sink(paste0(opt\$prefix, ".R_sessionInfo.log")) +print(sessionInfo()) +sink() + +################################################ +################################################ +## VERSIONS FILE ## +################################################ +################################################ + +propr.version <- as.character(packageVersion('propr')) + +writeLines( + c( + '"${task.process}":', + paste(' r-propr:', propr.version) + ), +'versions.yml') + +################################################ +################################################ +################################################ +################################################ diff --git a/modules/nf-core/propr/propr/tests/adjacency.config b/modules/nf-core/propr/propr/tests/adjacency.config new file mode 100644 index 00000000..cc0b3894 --- /dev/null +++ b/modules/nf-core/propr/propr/tests/adjacency.config @@ -0,0 +1,3 @@ +process { + ext.args = {"--metric rho --permutation 10 --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.1 --fixseed true --adjacency true"} +} diff --git a/modules/nf-core/propr/propr/tests/adjacency_pcor.config b/modules/nf-core/propr/propr/tests/adjacency_pcor.config new file mode 100644 index 00000000..0dda6b73 --- /dev/null +++ b/modules/nf-core/propr/propr/tests/adjacency_pcor.config @@ -0,0 +1,3 @@ +process { + ext.args = {"--metric pcor.bshrink --permutation 10 --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.1 --fixseed true --adjacency true"} +} \ No newline at end of file diff --git a/modules/nf-core/propr/propr/tests/adjacency_phs.config b/modules/nf-core/propr/propr/tests/adjacency_phs.config new file mode 100644 index 00000000..923570b4 --- /dev/null +++ b/modules/nf-core/propr/propr/tests/adjacency_phs.config @@ -0,0 +1,3 @@ +process { + ext.args = {"--metric phs --permutation 10 --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.1 --fixseed true --adjacency true"} +} \ No newline at end of file diff --git a/modules/nf-core/propr/propr/tests/adjacency_rho.config b/modules/nf-core/propr/propr/tests/adjacency_rho.config new file mode 100644 index 00000000..cc0b3894 --- /dev/null +++ b/modules/nf-core/propr/propr/tests/adjacency_rho.config @@ -0,0 +1,3 @@ +process { + ext.args = {"--metric rho --permutation 10 --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.1 --fixseed true --adjacency true"} +} diff --git a/modules/nf-core/propr/propr/tests/alr_pcorbshrink.config b/modules/nf-core/propr/propr/tests/alr_pcorbshrink.config new file mode 100644 index 00000000..c0c3b211 --- /dev/null +++ b/modules/nf-core/propr/propr/tests/alr_pcorbshrink.config @@ -0,0 +1,3 @@ +process { + ext.args = {"--transformation alr --metric pcor.bshrink --permutation 10 --cutoff_min 0.001 --cutoff_max 0.01 --cutoff_interval 0.001 --fixseed true"} +} \ No newline at end of file diff --git a/modules/nf-core/propr/propr/tests/clr_pcor.config b/modules/nf-core/propr/propr/tests/clr_pcor.config new file mode 100644 index 00000000..2e6d1b19 --- /dev/null +++ b/modules/nf-core/propr/propr/tests/clr_pcor.config @@ -0,0 +1,3 @@ +process { + ext.args = {"--transformation clr --metric pcor --permutation 10 --cutoff_min 0.001 --cutoff_max 0.01 --cutoff_interval 0.001 --fixseed true"} +} \ No newline at end of file diff --git a/modules/nf-core/propr/propr/tests/clr_pcorbshrink.config b/modules/nf-core/propr/propr/tests/clr_pcorbshrink.config new file mode 100644 index 00000000..435440c8 --- /dev/null +++ b/modules/nf-core/propr/propr/tests/clr_pcorbshrink.config @@ -0,0 +1,3 @@ +process { + ext.args = {"--transformation clr --metric pcor.bshrink --permutation 10 --cutoff_min 0.001 --cutoff_max 0.01 --cutoff_interval 0.001 --fixseed true"} +} \ No newline at end of file diff --git a/modules/nf-core/propr/propr/tests/clr_rho.config b/modules/nf-core/propr/propr/tests/clr_rho.config new file mode 100644 index 00000000..6b32ac27 --- /dev/null +++ b/modules/nf-core/propr/propr/tests/clr_rho.config @@ -0,0 +1,3 @@ +process { + ext.args = {"--transformation clr --metric rho --permutation 10 --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.1 --fixseed true"} +} \ No newline at end of file diff --git a/modules/nf-core/propr/propr/tests/clr_rho_alpha.config b/modules/nf-core/propr/propr/tests/clr_rho_alpha.config new file mode 100644 index 00000000..7f151a80 --- /dev/null +++ b/modules/nf-core/propr/propr/tests/clr_rho_alpha.config @@ -0,0 +1,3 @@ +process { + ext.args = {"--transformation alr --alpha 0.2 --metric rho --permutation 10 --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.1 --fixseed true"} +} \ No newline at end of file diff --git a/modules/nf-core/propr/propr/tests/main.nf.test b/modules/nf-core/propr/propr/tests/main.nf.test new file mode 100644 index 00000000..e262d2cf --- /dev/null +++ b/modules/nf-core/propr/propr/tests/main.nf.test @@ -0,0 +1,240 @@ +nextflow_process { + + name "Test Process PROPR_PROPR" + script "../main.nf" + process "PROPR_PROPR" + + tag "modules" + tag "modules_nfcore" + tag "propr" + tag "propr/propr" + + test("Test propr/propr using default options") { + + tag "default" + + when { + process { + """ + input[0] = [ + [ id:'test' ], + //file(params.test_data['mus_musculus']['genome']['rnaseq_matrix'], checkIfExists: true) + file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv") + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.matrix).match("Test propr/propr using default options - matrix") }, + { assert snapshot(process.out.versions).match("versions") } + ) + } + } + + test("Test propr/propr while running clr+pcor.bshrink explicitly") { + + tag "clr_pcorbshrink" + config "./clr_pcorbshrink.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file(params.test_data['mus_musculus']['genome']['rnaseq_matrix'], checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.matrix).match("Test propr/propr while running clr+pcor.bshrink explicitly - matrix")}, + { assert snapshot(process.out.fdr).match("Test propr/propr while running clr+pcor.bshrink explicitly - fdr")} + ) + } + } + + test("Test propr/propr while running alr+pcor.bshrink") { + + tag "alr_pcorbshrink" + config "./alr_pcorbshrink.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file(params.test_data['mus_musculus']['genome']['rnaseq_matrix'], checkIfExists: true) + ] + """ + } + } + + then { + // TODO also check that the first columns are the same as the above processes + assertAll( + { assert process.success }, + { assert snapshot(process.out.matrix).match("Test propr/propr while running alr+pcor.bshrink - matrix") }, + { assert snapshot(process.out.fdr).match("Test propr/propr while running alr+pcor.bshrink - fdr") } + ) + } + } + + test("Test propr/propr while running clr+rho") { + + tag "clr_rho" + config "./clr_rho.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file(params.test_data['mus_musculus']['genome']['rnaseq_matrix'], checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.matrix).match("Test propr/propr while running clr+rho - matrix") }, + { assert snapshot(process.out.fdr).match("Test propr/propr while running clr+rho - fdr") } + ) + } + } + + test("Test propr/propr while running clr+pcor") { + + tag "clr_pcor" + config "./clr_pcor.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file(params.test_data['mus_musculus']['genome']['rnaseq_matrix'], checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.matrix).match("Test propr/propr while running clr+pcor - matrix") }, + { assert snapshot(process.out.fdr).match("Test propr/propr while running clr+pcor - fdr") } + ) + } + } + + test("Test propr/propr while running clr+rho with boxcox transformation") { + + tag "clr_rho_alpha" + config "./clr_rho_alpha.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file(params.test_data['mus_musculus']['genome']['rnaseq_matrix'], checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.matrix).match("Test propr/propr while running clr+rho with boxcox transformation - matrix") }, + { assert snapshot(process.out.fdr).match("Test propr/propr while running clr+rho with boxcox transformation - fdr") } + ) + } + } + + test("Test propr/propr calculating adjacency_matrix for rho") { + + tag "adjacency_rho" + config "./adjacency_rho.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv") + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.matrix).match("Test propr/propr calculating adjacency_matrix for rho - matrix") }, + { assert snapshot(process.out.fdr).match("Test propr/propr calculating adjacency_matrix for rho - fdr") }, + { assert snapshot(process.out.adj).match("Test propr/propr calculating adjacency_matrix for rho - adj") } + ) + } + } + + test("Test propr/propr calculating adjacency_matrix for phs") { + + tag "adjacency_phs" + config "./adjacency_phs.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv") + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.matrix).match("Test propr/propr calculating adjacency_matrix for phs - matrix") }, + { assert snapshot(process.out.fdr).match("Test propr/propr calculating adjacency_matrix for phs - fdr") }, + { assert snapshot(process.out.adj).match("Test propr/propr calculating adjacency_matrix for phs - adj") } + ) + } + } + + test("Test propr/propr calculating adjacency_matrix for pcor") { + + tag "adjacency_pcor" + config "./adjacency_pcor.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv") + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.matrix).match("Test propr/propr calculating adjacency_matrix for pcor - matrix") }, + { assert snapshot(process.out.fdr).match("Test propr/propr calculating adjacency_matrix for pcor - fdr") }, + { assert snapshot(process.out.adj).match("Test propr/propr calculating adjacency_matrix for pcor - adj") } + ) + } + } +} diff --git a/modules/nf-core/propr/propr/tests/main.nf.test.snap b/modules/nf-core/propr/propr/tests/main.nf.test.snap new file mode 100644 index 00000000..cde969bc --- /dev/null +++ b/modules/nf-core/propr/propr/tests/main.nf.test.snap @@ -0,0 +1,354 @@ +{ + "Test propr/propr while running clr+pcor - fdr": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.fdr.tsv:md5,c0147540e44c63a439c28d24315bbc83" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-05T11:22:00.577754" + }, + "Test propr/propr calculating adjacency_matrix for rho - fdr": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.fdr.tsv:md5,32be6cc96d2d5563f779d2eec9c7ed34" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-05T11:23:04.464473" + }, + "Test propr/propr calculating adjacency_matrix for pcor - adj": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.adj.csv:md5,d5ba274e1313177ddf28881b036885c5" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-05T11:24:45.008049" + }, + "Test propr/propr while running alr+pcor.bshrink - fdr": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.fdr.tsv:md5,d446cc30af27643df8555b2924e3c0a1" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-05T11:20:50.487477" + }, + "Test propr/propr using default options - matrix": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.propr.tsv:md5,1aed2bed28b3f6cff481065f535e6d24" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-05T11:19:27.698729" + }, + "Test propr/propr calculating adjacency_matrix for phs - adj": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.adj.csv:md5,1cb74934c2dbb93ad6416b5410dee1c4" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-05T11:23:45.966557" + }, + "Test propr/propr while running clr+pcor.bshrink explicitly - matrix": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.propr.tsv:md5,1aed2bed28b3f6cff481065f535e6d24" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-05T11:20:07.836881" + }, + "Test propr/propr while running clr+pcor - matrix": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.propr.tsv:md5,5bd6a9c2d5899dedfec8ebfbabeb532e" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-05T11:21:59.693747" + }, + "Test propr/propr while running alr+pcor.bshrink - matrix": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.propr.tsv:md5,e2cbc066fa7635e9ea4ec198987d11d0" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-05T11:20:49.898429" + }, + "Test propr/propr calculating adjacency_matrix for pcor - fdr": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.fdr.tsv:md5,08d35cc8a7f5dd39ea4e3471cee7b2ec" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-05T11:24:43.724784" + }, + "Test propr/propr while running clr+rho - fdr": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.fdr.tsv:md5,32be6cc96d2d5563f779d2eec9c7ed34" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-05T11:21:19.887004" + }, + "Test propr/propr while running clr+rho - matrix": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.propr.tsv:md5,53865e6c2b05e022277df6dc1188c461" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-05T11:21:19.194321" + }, + "versions": { + "content": [ + [ + "versions.yml:md5,2e3159924c190ab42e22a4d0e192b1e6" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-05T11:19:27.963267" + }, + "Test propr/propr calculating adjacency_matrix for phs - fdr": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.fdr.tsv:md5,d7e540af9ed2d59ffbc69caae819648d" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-05T11:23:44.841504" + }, + "Test propr/propr calculating adjacency_matrix for pcor - matrix": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.propr.tsv:md5,1aed2bed28b3f6cff481065f535e6d24" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-05T11:24:41.975415" + }, + "Test propr/propr while running clr+rho with boxcox transformation - fdr": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.fdr.tsv:md5,a0fc0d01dddb4bd285306766eefeff67" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-05T11:22:29.830787" + }, + "Test propr/propr calculating adjacency_matrix for rho - adj": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.adj.csv:md5,e1b6e50216976397655066f17f0703de" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-05T11:23:05.438967" + }, + "Test propr/propr while running clr+rho with boxcox transformation - matrix": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.propr.tsv:md5,e30643e340aa88e3acd4c181f9e4ba81" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-05T11:22:28.793097" + }, + "Test propr/propr calculating adjacency_matrix for rho - matrix": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.propr.tsv:md5,53865e6c2b05e022277df6dc1188c461" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-05T11:23:03.240604" + }, + "Test propr/propr while running clr+pcor.bshrink explicitly - fdr": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.fdr.tsv:md5,dc9e6f135064363c503e83105a9c9b69" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-05T11:20:08.230977" + }, + "Test propr/propr calculating adjacency_matrix for phs - matrix": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.propr.tsv:md5,67ba22131ebd747404a3037f922a77f5" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-04-05T11:23:43.441629" + } +} \ No newline at end of file diff --git a/modules/nf-core/propr/propr/tests/tags.yml b/modules/nf-core/propr/propr/tests/tags.yml new file mode 100644 index 00000000..539706d4 --- /dev/null +++ b/modules/nf-core/propr/propr/tests/tags.yml @@ -0,0 +1,2 @@ +propr/propr: + - "modules/nf-core/propr/propr/**" From 708c4db047398e9188f7ab7ac8e3b56f2653570b Mon Sep 17 00:00:00 2001 From: Cristina Araiz Date: Thu, 18 Jul 2024 10:53:14 +0200 Subject: [PATCH 023/154] add functional subworkflows into subworkflows/local --- subworkflows/local/correlation/main.nf | 48 ++++++++++++ subworkflows/local/differential/main.nf | 33 +++++++++ subworkflows/local/enrichment/main.nf | 46 ++++++++++++ subworkflows/local/experimental/main.nf | 73 +++++++++++++++++++ subworkflows/local/variable_selection/main.nf | 40 ++++++++++ 5 files changed, 240 insertions(+) create mode 100644 subworkflows/local/correlation/main.nf create mode 100644 subworkflows/local/differential/main.nf create mode 100644 subworkflows/local/enrichment/main.nf create mode 100644 subworkflows/local/experimental/main.nf create mode 100644 subworkflows/local/variable_selection/main.nf diff --git a/subworkflows/local/correlation/main.nf b/subworkflows/local/correlation/main.nf new file mode 100644 index 00000000..5aaad2e2 --- /dev/null +++ b/subworkflows/local/correlation/main.nf @@ -0,0 +1,48 @@ + +// include nf-core modules +include {PROPR_PROPR as PROPR} from "../../modules/nf-core/propr/propr/main.nf" + + +workflow CORRELATION { + take: + ch_counts + ch_tools + ch_counts_filtered + + main: + ch_counts + .combine(ch_tools) + .map { + metacounts, counts, metatools -> + [ metacounts+metatools, counts ] + } + .branch { + propr: it[0]["cor_method"] == "propr" + } + .set { ch_counts_cor } + + // Hacer un branch del channel para coger las counts normales cuando no hay variable selection + + ch_counts_cor.propr + .branch{ + no_sel: it[0]["sel_method"] == null + sel: it[0]["sel_method"] != null + } + .set { ch_counts_selection } + + //ch_counts_selection.no_sel.view() + //ch_counts_filtered.view() + + ch_propr = ch_counts_filtered.mix(ch_counts_selection.no_sel) + //ch_propr.view() + + PROPR(ch_propr) + ch_matrix = PROPR.out.matrix + ch_adjacency = PROPR.out.adj + + + emit: + matrix = ch_matrix + adjacency = ch_adjacency + +} \ No newline at end of file diff --git a/subworkflows/local/differential/main.nf b/subworkflows/local/differential/main.nf new file mode 100644 index 00000000..15948b9c --- /dev/null +++ b/subworkflows/local/differential/main.nf @@ -0,0 +1,33 @@ +// include modules +include {PROPR_PROPD as PROPD} from "../../modules/nf-core/propr/propd/main.nf" + + +workflow DIFFERENTIAL { + take: + ch_counts + ch_tools + ch_samplesheet + + main: + ch_counts + .combine(ch_tools) + .map { + metacounts, counts, meta -> + [ metacounts+meta, counts ] + } + //.view() + .branch { + propd: it[0]["diff_method"] == "propd" + deseq2: it[0]["diff_method"] == "deseq2" + } + .set { ch_counts_tools } + + PROPD(ch_counts_tools.propd, ch_samplesheet) + ch_results = PROPD.out.results + ch_adjacency = PROPD.out.adj + + emit: + results = ch_results + adjacency = ch_adjacency + +} \ No newline at end of file diff --git a/subworkflows/local/enrichment/main.nf b/subworkflows/local/enrichment/main.nf new file mode 100644 index 00000000..442014a3 --- /dev/null +++ b/subworkflows/local/enrichment/main.nf @@ -0,0 +1,46 @@ +// include modules + +include { PROPR_GREA as GREA_DIFF } from "../../modules/nf-core/propr/grea/main.nf" +include { PROPR_GREA as GREA_COR } from "../../modules/nf-core/propr/grea/main.nf" +include { MYGENE } from "../../modules/nf-core/mygene/main.nf" + + +workflow ENRICHMENT { + take: + ch_diff_adjacency + ch_cor_adjacency + ch_counts + + + main: + + MYGENE(ch_counts) + ch_gmt = MYGENE.out.gmt + + + ch_diff_adjacency + .branch { + grea: it[0]["enr_diff_method"] == "grea" + gsea: it[0]["enr_diff_method"] == "gsea" + } + .set { ch_diff_grea } + + GREA_DIFF(ch_diff_grea.grea, ch_gmt.collect()) + ch_enriched_diff = GREA_DIFF.out.enrichedGO + + ch_cor_adjacency + .branch { + grea: it[0]["enr_cor_method"] == "grea" } + .set { ch_cor_grea } + + ch_cor_grea.grea.view() + ch_diff_grea.grea.view() + + GREA_COR(ch_cor_grea.grea, ch_gmt.collect()) + ch_enriched_cor = GREA_COR.out.enrichedGO + + + emit: + enriched_diff = ch_enriched_diff + enriched_cor = ch_enriched_cor +} \ No newline at end of file diff --git a/subworkflows/local/experimental/main.nf b/subworkflows/local/experimental/main.nf new file mode 100644 index 00000000..6e26eb6d --- /dev/null +++ b/subworkflows/local/experimental/main.nf @@ -0,0 +1,73 @@ +// include subworkflows + +include { CORRELATION } from '../correlation/main.nf' +include { DIFFERENTIAL } from '../differential/main.nf' +include { VARIABLE_SELECTION } from '../variable_selection/main.nf' +include { ENRICHMENT } from '../enrichment/main.nf' + + +workflow EXPERIMENTAL { + take: + ch_samples_and_matrix // [meta, samplesheet, matrix] que viene de differentialabundance + ch_tools + + + main: + // Dividir el ch_samples_and_matrix en un channel de samplesheet y otro de matrix (PROPD los coge por separado) + ch_samples_and_matrix + .map { + meta, samplesheet, counts -> + [ meta, samplesheet ] + } + .set { ch_samplesheet } + + ch_samples_and_matrix + .map { + meta, samplesheet, counts -> + [ meta, counts ] + } + .set { ch_counts } + // ch_counts.view() + + ch_counts + .combine(ch_tools) + .map { + metacounts, counts, metatools -> + [ metacounts+metatools, counts ] + } + .set { ch_counts_tools } + + // Perform CODA analysis + ch_out = Channel.empty() + + // Perform differential analysis + + DIFFERENTIAL(ch_counts, ch_tools, ch_samplesheet.collect()) + ch_diff_results = DIFFERENTIAL.out.results + ch_diff_adjacency = DIFFERENTIAL.out.adjacency + + // Perform variable selection + ch_counts_filtered = VARIABLE_SELECTION(ch_diff_adjacency, ch_counts) + + //VARIABLE_SELECTION.out.count.view() + + // Perform correlation analysis + CORRELATION(ch_counts, ch_tools, ch_counts_filtered) + ch_matrix = CORRELATION.out.matrix + ch_cor_adjacency = CORRELATION.out.adjacency + ch_out.mix(ch_matrix) + + //ch_diff_adjacency.view() + //ch_cor_adjacency.view() + + // Perform enrichment analysis + ENRICHMENT(ch_diff_adjacency, ch_cor_adjacency, ch_counts) + ch_enriched_cor = ENRICHMENT.out.enriched_cor + ch_enriched_diff = ENRICHMENT.out.enriched_diff + + ch_out.mix(ch_enriched_diff, ch_enriched_cor) + + + emit: + output = ch_out +} \ No newline at end of file diff --git a/subworkflows/local/variable_selection/main.nf b/subworkflows/local/variable_selection/main.nf new file mode 100644 index 00000000..d7a176c8 --- /dev/null +++ b/subworkflows/local/variable_selection/main.nf @@ -0,0 +1,40 @@ +// include modules +include { FILTERVAR } from "../../modules/local/filtervar/main.nf" + +workflow VARIABLE_SELECTION { + take: + ch_adj//meta_tools, adj + ch_counts //meta_id, counts + + + main: + ch_counts + .map { + metacounts, counts -> + [counts] + } + .combine(ch_adj) + //.view() + .map{ + counts, meta, adj -> + [ meta, counts, adj] + } + //.view() + .branch { + filtervar: it[0]["sel_method"] == "filtervar" + deseqfilter: it[0]["sel_method"] == "deseqfilter" + } + .set { ch_counts_adj_sel } + + //ch_counts_adj_sel.nofilter.view() + + + FILTERVAR(ch_counts_adj_sel.filtervar) + + ch_counts_cor = FILTERVAR.out.count + //ch_counts_cor.view() + + + emit: + count = ch_counts_cor +} \ No newline at end of file From 4a76cefec21ec6b4784218e305c275e962733ad3 Mon Sep 17 00:00:00 2001 From: Cristina Araiz Date: Thu, 18 Jul 2024 14:18:19 +0200 Subject: [PATCH 024/154] add schema_tools and tools_samplesheet to assets --- assets/schema_tools.json | 61 ++++++++++++++++++++++++++++++++++++ assets/tools_samplesheet.csv | 6 ++++ 2 files changed, 67 insertions(+) create mode 100644 assets/schema_tools.json create mode 100644 assets/tools_samplesheet.csv diff --git a/assets/schema_tools.json b/assets/schema_tools.json new file mode 100644 index 00000000..4119c58e --- /dev/null +++ b/assets/schema_tools.json @@ -0,0 +1,61 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "title": "nf-core/differentialabundance - params.tools schema", + "description": "Schema for the file provided with params.tools", + "type": "array", + "items": { + "type": "object", + "properties": { + "pathway_name": { + "type": "string", + "meta": ["pathway_name"] + }, + "diff_method": { + "type": "string", + "errorMessage": "choose propd, DESeq2 or none", + "meta": ["diff_method"] + }, + "args_diff": { + "type": "string", + "meta": ["args_diff"] + }, + "enr_diff_method": { + "type": "string", + "meta": ["enr_diff_method"], + "errorMessage": "choose grea, gsea or none" + }, + "args_enr_diff": { + "type": "string", + "meta": ["args_enr_diff"] + }, + "cor_method": { + "type": "string", + "meta": ["cor_method"], + "errorMessage": "choose correlation,proportionality, partial correlation or none" + }, + "args_cor": { + "type": "string", + "meta": ["args_cor"] + }, + "enr_cor_method": { + "type": "string", + "meta": ["enr_cor_method"], + "errorMessage": "choose grea or none" + }, + "args_enr_cor": { + "type": "string", + "meta": ["args_enr_cor"] + }, + "sel_method":{ + "type": "string", + "meta": ["sel_method"], + "errorMessage": "choose filtervar or none" + }, + "args_sel": { + "type": "string", + "meta": ["args_sel"] + } + }, + "required": [] + } +} diff --git a/assets/tools_samplesheet.csv b/assets/tools_samplesheet.csv new file mode 100644 index 00000000..f6147f34 --- /dev/null +++ b/assets/tools_samplesheet.csv @@ -0,0 +1,6 @@ +pathway_name,diff_method,args_diff,enr_diff_method,args_enr_diff,cor_method,args_cor,enr_cor_method,args_enr_cor,sel_method,args_sel +diff_prop,propd, --adjacency true --permutation 100 --fixseed true, , ,,, , ,, +filtered_pcor,propd, --adjacency true --permutation 100 --fixseed true, , ,propr, --permutation 10 --adjacency true --cutoff_min 0.005 --cutoff_max 0.5 --cutoff_interval 0.01 --metric pcor.bshrink, , , filtervar, +prop,, , , ,propr, --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --fixseed true --metric rho --permutation 100 --adjacency true, , , , +diff_grea,propd,--group_col fase --adjacency true --permutation 10,grea, --permutation 10, , , , ,, +deseq2,deseq2,,gsea,,,,,,, \ No newline at end of file From 93ae92db8f3190356d5ab7cbe7700d8f84109447 Mon Sep 17 00:00:00 2001 From: Cristina Araiz Date: Thu, 18 Jul 2024 14:25:33 +0200 Subject: [PATCH 025/154] add crg.config and modules.config (as modules_coda) to conf --- conf/crg.config | 41 ++++++++++++++++++++++++++++++++++++ conf/modules_coda.config | 45 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 conf/crg.config create mode 100644 conf/modules_coda.config diff --git a/conf/crg.config b/conf/crg.config new file mode 100644 index 00000000..07da3727 --- /dev/null +++ b/conf/crg.config @@ -0,0 +1,41 @@ +params { + config_profile_name = 'CRG profile' + config_profile_description = 'Configuration to run on CRG cluster' + + max_cpus = 64 + max_memory = 100.GB + max_time = 48.h +} + + +process { + executor = 'crg' + //maxRetries = params.max_retries + //errorStrategy = params.err_start + + withLabel:process_low { + queue = 'cn-el7,short-centos79' + cpus = { check_max( 2 , 'cpus' ) } + memory = { check_max( 12.GB * task.attempt, 'memory' ) } + time = { check_max( 4.h * task.attempt, 'time' ) } + } + withLabel:process_medium{ + queue = 'cn-el7,short-centos79' + cpus = { check_max( 6 , 'cpus' ) } + memory = { check_max( 36.GB * task.attempt, 'memory' ) } + time = { check_max( 8.h * task.attempt, 'time' ) } + } + withLabel:process_high { + queue = 'cn-el7,long-centos79' + cpus = { check_max( 12 , 'cpus' ) } + memory = { check_max( 56.GB * task.attempt, 'memory' ) } + time = { check_max( 12.h * task.attempt, 'time' ) } + + } +} + + +singularity { + enabled = true + cacheDir = 'singularity_cache' +} \ No newline at end of file diff --git a/conf/modules_coda.config b/conf/modules_coda.config new file mode 100644 index 00000000..a783c00e --- /dev/null +++ b/conf/modules_coda.config @@ -0,0 +1,45 @@ +process { + withName: "PROPR"{ + ext.args = { "${meta.args_cor}" == "null" ? '' : "${meta.args_cor}" } + publishDir = [ + path: { "${params.outdir}/correlation_analysis/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: "PROPD"{ + ext.args = { "${meta.args_diff}" == "null" ? '' : "${meta.args_diff}" } + publishDir = [ + path: { "${params.outdir}/differential_analysis/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: "FILTERVAR"{ + ext.args = { "${meta.args_cor}" == "null" ? '' : "${meta.args_cor}" } + publishDir = [ + path: { "${params.outdir}/variable_selection/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: "GREA_DIFF"{ + ext.args = { "${meta.args_enr_diff}" == "null" ? '' : "${meta.args_enr_diff}" } + publishDir = [ + path: { "${params.outdir}/enrichment_differential/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: "GREA_COR"{ + ext.args = { "${meta.args_enr_cor}" == "null" ? '' : "${meta.args_enr_cor}" } + publishDir = [ + path: { "${params.outdir}/enrichment_correlation/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } +} \ No newline at end of file From da30859515965628e461ab6062fe721eefe8bfaf Mon Sep 17 00:00:00 2001 From: Cristina Araiz Date: Thu, 18 Jul 2024 14:35:32 +0200 Subject: [PATCH 026/154] add main.nf as main_coda.nf --- main_coda.nf | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 main_coda.nf diff --git a/main_coda.nf b/main_coda.nf new file mode 100644 index 00000000..6a62390e --- /dev/null +++ b/main_coda.nf @@ -0,0 +1,40 @@ +// include { PROPR_PROPR } from '../../../modules/nf-core/propr/propr/main' +// include { PROPR_PROPD } from '../../../modules/nf-core/propr/propd/main' +// include { PROPR_GREA } from '../../../modules/nf-core/propr/grea/main' +// include { MYGENE } from '../../../modules/nf-core/mygene/main' +include { EXPERIMENTAL } from './subworkflows/experimental/main.nf' +include { fromSamplesheet } from 'plugin/nf-validation' + + +// These are local files from my Bachelor Thesis project, I am creating the ch_samples_and_matrix +// manually for testing but it should be be provided by the processing section of nf-core/differentialabundance +Counts_ch = Channel.fromPath("../YMC/counts_sin0.csv") + +Sample_ch = Channel.fromPath("../YMC/samplesheet_RCvsOX.csv") + .map{ it -> [[id: 'YMC'], it]} + +ch_samples_and_matrix = Sample_ch.combine(Counts_ch) + +// Convert the samplesheet.csv in a channel with the proper format +ch_tools = Channel.fromSamplesheet('tools') + + +// TO DO: This should be modified to run one path per default, not all +if (params.pathway == "all") { + ch_tools + .set{ ch_tools_single } +} else { + ch_tools + .filter{ + it[0]["pathway_name"] == params.pathway // TO DO: change pathway to path also in the tools_samplesheet file + } + //.view() + .set{ ch_tools_single } +} +ch_tools_single.view() + +workflow { + EXPERIMENTAL(ch_samples_and_matrix, ch_tools_single) + EXPERIMENTAL.out.output.view() +} + From 748778915726732f73c9212b6858b47077bf1552 Mon Sep 17 00:00:00 2001 From: Cristina Araiz Date: Thu, 18 Jul 2024 14:43:34 +0200 Subject: [PATCH 027/154] add nextflow.config and nextflow schema as nextflow_coda and nextflow_schema_coda --- nextflow_coda.config | 55 +++++++++++++++++++++++++++++++++++++++ nextflow_schema_coda.json | 25 ++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 nextflow_coda.config create mode 100644 nextflow_schema_coda.json diff --git a/nextflow_coda.config b/nextflow_coda.config new file mode 100644 index 00000000..3ed7f425 --- /dev/null +++ b/nextflow_coda.config @@ -0,0 +1,55 @@ +//parametros generales, para el usuario (que se pueden arrancar poniendo los flags como el command line) + +params.tools = "./assets/tools_samplesheet.csv" +params.outdir = "../results_pipeline" +params.validationSkipDuplicateCheck = true +params.publish_dir_mode = 'copy' +params.pathway = 'all' +//params.maxRetries = 0 +includeConfig 'conf/modules.config' // now it should refer to modules_coda.config + + + +profiles { + debug { + dumpHashes = true + process.beforeScript = 'echo $HOSTNAME' + process.debug = true + cleanup = false + nextflow.enable.configProcessNamesValidation = true + } + crg { includeConfig "conf/crg.config" } +} + +// Function to ensure that resource requirements don't go beyond +// a maximum limit +def check_max(obj, type) { + if (type == 'memory') { + try { + if (obj.compareTo(params.max_memory as nextflow.util.MemoryUnit) == 1) + return params.max_memory as nextflow.util.MemoryUnit + else + return obj + } catch (all) { + println " ### ERROR ### Max memory '${params.max_memory}' is not valid! Using default value: $obj" + return obj + } + } else if (type == 'time') { + try { + if (obj.compareTo(params.max_time as nextflow.util.Duration) == 1) + return params.max_time as nextflow.util.Duration + else + return obj + } catch (all) { + println " ### ERROR ### Max time '${params.max_time}' is not valid! Using default value: $obj" + return obj + } + } else if (type == 'cpus') { + try { + return Math.min( obj, params.max_cpus as int ) + } catch (all) { + println " ### ERROR ### Max cpus '${params.max_cpus}' is not valid! Using default value: $obj" + return obj + } + } +} \ No newline at end of file diff --git a/nextflow_schema_coda.json b/nextflow_schema_coda.json new file mode 100644 index 00000000..76b4f1dd --- /dev/null +++ b/nextflow_schema_coda.json @@ -0,0 +1,25 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "title": "nf-core/testpipeline pipeline parameters", + "description": "this is a test", + "type": "object", + "definitions": { + "tools_options": { + "title": "Tools options", + "type": "object", + "description": "Define where the pipeline should find input data", + "required": ["tools"], + "properties": { + "tools": { + "type": "string", + "format": "file-path", + "mimetype": "text/csv", + "schema": "assets/schema_tools.json", + "pattern": "^\\S+\\.(csv|tsv|yaml)$", + "description": "Path to comma-separated file containing samplesheet", + "help_text": "this is just a test" + } + } + } + } +} \ No newline at end of file From a91626b78b67dbd42a5bd86204137e8c8be86762 Mon Sep 17 00:00:00 2001 From: Cristina Araiz Date: Thu, 18 Jul 2024 15:00:33 +0200 Subject: [PATCH 028/154] add YMC counts and samplesheet to help for testing --- test_data/YMC/counts_sin0.csv | 5840 ++++++++++++++++++++++++++ test_data/YMC/samplesheet_RCvsOX.csv | 10 + 2 files changed, 5850 insertions(+) create mode 100644 test_data/YMC/counts_sin0.csv create mode 100644 test_data/YMC/samplesheet_RCvsOX.csv diff --git a/test_data/YMC/counts_sin0.csv b/test_data/YMC/counts_sin0.csv new file mode 100644 index 00000000..58ea62af --- /dev/null +++ b/test_data/YMC/counts_sin0.csv @@ -0,0 +1,5840 @@ +"gene_id","Time.1","Time.2","Time.3","Time.4","Time.5","Time.13","Time.14","Time.15","Time.16" +"YAL068C",57,52,82,93,66,12,33,34,52 +"YAL063C",82,94,62,69,99,99,64,72,105 +"YAL062W",2280,2753,2819,2270,1033,2942,1535,2444,4300 +"YAL061W",2970,2391,1049,64,170,4379,2215,2849,4953 +"YAL060W",2354,1727,1039,378,578,5618,2218,2790,4385 +"YAL059W",339,534,832,1966,2627,51,185,189,360 +"YAL058W",362,459,447,574,546,229,266,279,491 +"YAL056W",1440,1269,894,233,393,1094,1083,1122,1763 +"YAL055W",266,305,255,61,108,190,246,277,477 +"YAL054C",27781,19019,8956,842,151,65763,49692,34469,45068 +"YAL053W",2027,2120,2779,3995,1796,963,1298,1864,2887 +"YAL051W",738,774,529,417,516,471,515,590,849 +"YAL049C",1752,1677,1138,592,382,1650,1602,1692,2793 +"YAL048C",594,557,428,361,305,434,393,401,619 +"YAL047C",361,393,343,276,335,195,225,222,341 +"YAL046C",212,223,211,170,207,377,201,221,344 +"YAL044W-A",543,477,401,403,350,566,570,599,895 +"YAL044C",1313,1345,1376,1512,1792,1237,1033,1109,1959 +"YAL043C",662,765,740,610,608,421,524,478,781 +"YAL042W",1402,1561,1514,1458,1497,1612,1611,1525,2301 +"YAL041W",874,1009,931,806,780,569,603,541,939 +"YAL040C",461,496,781,1188,1398,268,354,485,527 +"YAL039C",597,784,1003,891,658,1037,770,694,1154 +"YAL038W",58112,51535,41160,35725,15242,7632,8910,23994,59573 +"YAL037C-A",17,15,10,6,9,3,2,7,16 +"YAL037W",136,135,103,97,123,92,104,132,188 +"YAL036C",585,819,1099,2182,1675,86,371,381,651 +"YAL035W",3563,4130,4675,7945,6950,2337,3169,2701,4412 +"YAL034W-A",189,173,127,128,290,218,182,147,226 +"YAL034C",1341,1171,699,345,283,945,912,906,1595 +"YAL033W",148,157,186,238,434,150,148,137,241 +"YAL032C",365,410,408,281,374,531,506,417,632 +"YAL031C",584,509,439,278,434,432,419,392,628 +"YAL030W",686,630,442,216,153,662,613,618,1098 +"YAL029C",784,1113,1433,2741,957,506,615,538,774 +"YAL028W",307,292,174,43,34,287,244,254,388 +"YAL027W",457,449,256,106,267,611,522,515,690 +"YAL026C",924,1013,1035,1041,887,589,659,586,1017 +"YNCA0001W",3,5,3,8,6,2,2,2,2 +"YAL025C",594,1044,2169,5174,3574,39,286,273,530 +"YAL024C",281,311,342,393,397,170,232,172,241 +"YAL023C",1330,1558,1528,2354,2915,1130,1206,1067,1590 +"YAL022C",586,667,687,756,872,518,617,581,812 +"YAL021C",1123,1192,1026,1191,1137,809,948,806,1318 +"YAL020C",224,220,254,256,256,205,192,225,394 +"YAL019W",610,799,1044,1726,1689,175,292,266,525 +"YAL018C",53,49,49,34,44,38,30,35,73 +"YAL017W",1716,1423,967,212,299,1823,1233,1198,2090 +"YAL016W",3105,2860,2027,1115,1273,2640,2398,2550,3939 +"YAL015C",384,440,423,525,425,672,341,326,520 +"YAL014C",485,486,486,408,373,399,451,448,714 +"YAL013W",522,532,514,478,603,469,544,503,828 +"YAL012W",1420,2450,4168,10720,7247,527,834,742,1259 +"YAL011W",438,392,392,367,451,299,391,328,528 +"YAL010C",512,491,465,303,178,305,373,351,540 +"YAL009W",434,416,380,297,336,288,348,332,619 +"YAL008W",1069,952,631,323,232,1182,834,908,1585 +"YAL007C",403,451,445,469,530,362,384,348,528 +"YAL005C",39259,28272,16583,3934,2053,32018,23096,25421,47879 +"YAL003W",6226,6713,6934,10417,11213,1064,2494,2881,6539 +"YNCA0003W",28,22,28,40,30,2,11,9,33 +"YAL002W",862,914,757,563,520,453,508,493,847 +"YAL001C",1160,1147,944,515,621,950,841,877,1373 +"YAR002W",553,606,721,1095,883,320,423,467,696 +"YAR002C-A",1296,1328,1228,1305,1661,1263,982,1027,1821 +"YAR003W",391,369,347,338,550,317,299,319,484 +"YAR007C",1489,1606,1312,665,1118,1083,1052,1353,1918 +"YAR008W",192,281,273,215,398,152,153,242,249 +"YAR009C",2,3,3,2,1,2,2,1,3 +"YAR014C",1140,1171,1212,1528,2111,840,873,821,1354 +"YAR015W",1406,1807,2073,4611,4758,783,683,885,1518 +"YAR018C",161,162,214,248,162,236,593,362,298 +"YAR019C",356,376,315,271,277,265,253,222,359 +"YAR020C",43,43,28,11,21,46,25,25,63 +"YAR023C",110,114,75,38,65,89,62,77,162 +"YAR027W",800,652,445,293,373,771,702,802,1329 +"YAR028W",88,100,95,144,86,93,89,84,133 +"YAR029W",9,6,2,8,15,11,14,15,14 +"YAR031W",60,53,24,19,52,50,41,54,84 +"YAR033W",39,27,28,24,29,36,19,20,50 +"YAR035W",1012,721,516,232,320,3248,3775,1985,2524 +"YAR035C-A",13,7,4,5,5,21,29,14,18 +"YAR042W",1108,1029,1048,868,508,974,932,939,1385 +"YAR050W",76,64,41,19,97,76,78,101,123 +"YAR068W",9,6,10,14,19,3,4,6,10 +"YAR071W",39,42,42,23,29,24,35,40,50 +"YBL113C",294,322,327,194,379,277,239,262,404 +"YBL107C",565,650,591,568,644,966,545,471,788 +"YBL106C",601,675,573,400,315,527,561,478,738 +"YBL105C",1592,1711,1382,1066,1112,1008,1024,1131,1617 +"YBL104C",565,708,671,652,503,335,470,418,660 +"YBL103C",754,766,688,625,675,394,596,611,894 +"YBL102W",1092,1002,700,412,731,1334,1176,1239,1851 +"YBL101C",1820,1870,1454,658,483,895,1011,1053,1650 +"YBL100W-C",20,26,14,8,8,11,8,6,22 +"YBL100W-B",68,75,80,70,35,56,38,49,54 +"YBL099W",7753,7604,5782,4330,6259,13973,11072,9175,11914 +"YBL098W",1161,991,817,681,832,1137,1182,1317,1772 +"YBL097W",260,300,336,409,274,119,186,133,198 +"YBL095W",386,425,386,345,274,680,405,344,588 +"YBL093C",660,921,1528,2287,853,318,364,484,902 +"YBL092W",5976,6726,7267,12014,21385,1810,4469,4847,8498 +"YBL091C-A",186,204,151,105,99,242,202,194,319 +"YBL091C",662,652,682,712,514,622,648,567,1081 +"YBL090W",325,432,396,405,445,1254,419,352,567 +"YBL089W",310,403,352,337,378,285,307,266,463 +"YBL088C",1324,1350,1146,759,553,713,691,746,1262 +"YBL087C",1222,1664,2036,3500,6142,422,867,982,1842 +"YBL086C",545,437,326,108,127,561,393,443,742 +"YBL085W",742,847,762,538,783,882,714,642,949 +"YBL084C",725,724,592,515,667,690,671,603,891 +"YBL082C",237,312,392,610,526,226,219,194,293 +"YBL081W",132,239,553,1565,1104,47,109,79,94 +"YBL080C",301,324,250,146,135,939,338,319,476 +"YBL079W",1290,1621,1629,2243,2033,841,875,732,1158 +"YBL078C",1235,1111,670,177,156,1304,1177,1106,1988 +"YBL076C",4574,5141,5455,9294,10336,1577,2613,2695,4487 +"YBL075C",63397,44458,24068,5006,681,10390,25176,33960,76517 +"YBL074C",197,176,149,212,130,97,122,147,266 +"YBL072C",2289,2630,2623,3925,6868,827,1561,1709,3212 +"YBL071C-B",4,3,1,6,6,3,4,3,7 +"YBL071W-A",183,267,383,728,440,73,103,149,254 +"YBL071C",102,129,212,387,286,43,61,66,135 +"YBL069W",199,275,420,1286,484,128,160,152,224 +"YBL068W",400,573,714,1071,1299,139,288,268,464 +"YBL067C",3191,3187,2219,1065,899,2359,2384,2366,3622 +"YBL066C",710,728,689,660,780,678,705,539,700 +"YBL064C",5724,4390,2749,1042,605,6591,5216,5884,9855 +"YBL063W",418,442,409,334,340,506,407,329,460 +"YBL061C",445,554,640,1054,1236,240,370,328,473 +"YBL060W",544,607,431,375,514,459,376,401,662 +"YBL059C-A",352,339,287,229,325,1166,394,332,427 +"YBL059W",190,232,160,144,179,305,207,210,305 +"YBL058W",2894,2537,2032,1124,1187,2988,2809,2620,4145 +"YBL057C",405,475,446,464,474,375,367,380,612 +"YBL056W",2233,2204,1706,1547,1856,2703,2332,2120,3318 +"YBL055C",442,518,552,1017,824,494,378,371,583 +"YBL054W",418,588,938,1842,1507,134,195,202,453 +"YBL052C",768,803,735,637,520,668,747,568,921 +"YBL051C",1058,1185,1087,1273,1200,759,954,850,1102 +"YBL050W",1332,1258,868,572,942,1333,1246,1366,2033 +"YBL049W",1641,1486,969,670,418,1041,860,1325,2436 +"YBL048W",579,494,359,210,188,398,311,441,761 +"YBL047C",3682,3519,2573,1333,1120,4036,2992,2878,4136 +"YBL046W",507,449,540,582,676,356,457,455,707 +"YBL045C",6974,6367,4703,2984,5475,14818,11652,9445,11245 +"YBL044W",4,2,3,3,1,3,3,2,3 +"YBL043W",535,493,516,298,1798,315,791,700,991 +"YBL042C",1341,2008,3831,6389,3437,330,1027,884,1382 +"YBL041W",2451,2440,2142,1738,1420,2431,2735,2594,4065 +"YBL040C",636,727,566,500,881,721,650,681,1144 +"YBL039W-B",259,266,161,65,25,280,268,247,440 +"YBL039C",730,1546,3177,8847,6349,44,277,298,628 +"YBL038W",498,619,521,404,638,1280,631,471,764 +"YBL037W",561,638,528,303,320,512,511,407,589 +"YBL036C",682,777,807,928,1012,335,472,520,878 +"YBL035C",332,403,408,300,542,180,200,249,427 +"YBL034C",677,644,596,494,588,389,424,427,698 +"YBL033C",1007,1092,1523,1283,974,889,1181,1156,1735 +"YBL032W",497,511,450,462,582,716,589,477,575 +"YBL031W",91,108,105,93,82,99,98,65,102 +"YBL030C",5432,5919,5542,5272,9715,11038,6188,4945,6545 +"YBL029C-A",443,409,263,138,186,409,447,509,784 +"YBL029W",420,474,387,383,430,298,309,305,662 +"YBL028C",382,579,887,2016,2035,33,152,206,386 +"YBL027W",8082,8372,8984,13622,20029,2265,5201,5868,10786 +"YBL026W",587,603,578,647,771,498,493,500,749 +"YBL025W",206,220,213,175,187,125,166,172,280 +"YBL024W",821,1174,1495,3007,2739,222,493,471,897 +"YBL023C",672,672,735,821,1274,311,508,520,747 +"YBL022C",3321,3315,2772,1874,1606,5532,2647,2313,3582 +"YBL021C",257,261,256,272,505,341,333,278,433 +"YBL020W",635,815,772,905,799,362,416,456,720 +"YBL019W",467,481,386,297,317,360,385,398,615 +"YBL018C",333,336,357,379,386,209,213,316,511 +"YBL017C",2107,2075,1742,1516,1387,1755,1260,1394,2162 +"YBL016W",361,525,628,1032,1379,321,222,249,463 +"YBL015W",2064,2061,1743,796,1563,5749,3214,2461,3064 +"YBL014C",543,622,649,1014,640,275,376,414,559 +"YBL013W",73,81,59,51,35,82,88,78,101 +"YBL011W",695,719,681,805,846,1036,742,551,810 +"YBL010C",198,233,234,188,287,142,192,153,279 +"YBL009W",428,552,575,677,905,450,408,351,482 +"YBL008W-A",4,5,2,2,5,2,3,2,8 +"YBL008W",409,504,489,572,597,310,275,252,431 +"YBL007C",2902,2579,1865,1144,1116,2598,2284,2236,3442 +"YBL006C",515,559,495,412,592,364,445,505,831 +"YBL005W",446,556,485,447,419,286,287,272,475 +"YBL004W",1215,1790,2261,4983,5563,289,672,624,1163 +"YBL003C",588,715,559,502,853,2360,882,543,885 +"YBL002W",838,982,1137,1739,2317,3692,1260,555,852 +"YBL001C",3406,2865,2061,1436,1035,2721,2704,3221,5361 +"YBR001C",1446,1236,784,212,621,1537,1114,1113,1722 +"YBR002C",274,381,426,653,530,199,276,250,426 +"YBR003W",422,418,307,166,188,1040,404,405,549 +"YBR004C",288,376,466,542,643,165,197,186,327 +"YBR005W",524,568,351,264,314,422,440,501,849 +"YBR006W",1653,1460,1103,402,158,1311,1064,1264,2252 +"YBR007C",172,268,333,461,638,112,105,118,179 +"YBR008C",758,1113,1096,482,289,243,289,345,752 +"YBR009C",3256,2976,2349,1725,1616,7163,4415,3298,5180 +"YBR010W",2358,2115,1767,1787,2590,5335,3302,2617,3914 +"YBR011C",4914,4942,4541,4900,4373,3396,2959,3437,5950 +"YBR013C",95,101,76,39,60,90,70,68,129 +"YBR014C",583,579,508,455,603,634,496,529,910 +"YBR015C",1535,1737,1567,1890,1917,1035,1101,1069,1832 +"YBR016W",579,585,530,369,617,729,721,556,805 +"YBR017C",1010,1153,1326,1891,1928,501,746,747,1194 +"YBR018C",66,61,33,2,8,46,42,59,103 +"YBR019C",40,32,29,10,11,33,28,41,63 +"YNCB0008W",58,47,50,35,32,39,37,41,53 +"YBR021W",324,545,945,1860,2363,129,229,184,337 +"YBR022W",337,408,345,360,398,368,245,289,440 +"YBR023C",1220,1558,1520,2082,2649,617,934,971,1520 +"YBR024W",395,409,317,141,72,922,387,370,541 +"YBR025C",6537,6368,5853,6980,7678,2982,3592,4187,8632 +"YBR026C",13543,11243,7855,3764,619,10569,11642,11766,18300 +"YBR027C",37,39,32,29,18,29,37,31,35 +"YBR028C",478,566,636,934,740,410,346,298,478 +"YBR029C",1624,1803,1969,2722,2827,1713,2482,1759,2148 +"YBR030W",319,398,479,588,487,132,259,267,385 +"YBR031W",861,1205,1563,2934,3696,322,755,576,1109 +"YBR032W",14,14,3,11,31,10,13,13,14 +"YBR033W",400,401,295,217,588,372,325,283,474 +"YBR034C",605,1146,2923,6179,2233,157,372,403,664 +"YBR035C",1484,1459,1209,1122,1236,1481,1363,1441,2183 +"YNCB0010W",333,333,331,378,587,689,374,408,546 +"YBR036C",2178,1971,1693,1610,2303,2405,2091,2149,3308 +"YBR037C",237,241,198,86,149,1292,321,294,363 +"YBR038W",241,313,242,190,118,1324,1870,1066,636 +"YBR039W",3776,3803,3095,2548,3248,5927,4742,4130,5834 +"YBR040W",28,16,20,24,31,33,14,19,37 +"YBR041W",598,614,442,398,614,507,453,448,694 +"YBR042C",354,431,514,672,426,265,263,267,400 +"YBR043C",1538,1709,1332,871,579,1373,1413,1269,1925 +"YBR044C",456,440,370,256,356,1096,515,397,571 +"YBR045C",1045,541,246,86,271,1011,1070,1071,1616 +"YBR046C",5817,4754,3010,1214,1016,2997,3649,4445,7647 +"YBR047W",905,838,520,205,244,326,526,737,1362 +"YBR048W",2030,2427,2775,4420,6541,686,1285,1238,2219 +"YBR049C",1455,1466,1239,968,1230,1734,1697,1236,1684 +"YBR050C",254,251,136,65,161,620,474,362,524 +"YBR052C",804,771,617,437,451,1750,1064,1128,1637 +"YBR053C",1967,1704,1093,305,163,2260,1773,2020,3131 +"YBR054W",30851,23564,13500,5214,1032,4433,4830,12544,36015 +"YBR055C",660,709,718,947,1093,314,380,389,637 +"YBR056W",3023,2554,1542,309,104,2454,1952,2395,4171 +"YBR056W-A",192,153,152,126,273,176,185,193,354 +"YBR057C",1154,1061,1030,880,596,982,949,965,1502 +"YBR058C",1275,1294,1134,1106,1293,1011,1099,1042,1719 +"YBR058C-A",1083,1035,945,755,954,791,861,1045,1643 +"YBR059C",1580,1535,1092,464,456,1244,1077,1114,1633 +"YBR060C",402,526,505,578,521,255,310,330,437 +"YBR061C",375,507,640,1252,1401,156,258,243,414 +"YBR062C",979,944,655,453,472,979,978,948,1522 +"YBR063C",574,631,731,1033,700,258,358,383,651 +"YBR065C",424,495,668,982,399,126,196,245,385 +"YBR066C",358,506,359,255,927,253,174,265,426 +"YBR067C",65719,50360,38714,21346,8746,75249,105452,72701,97418 +"YBR068C",3444,3395,5146,4784,3113,3585,3762,3124,4584 +"YNCB0014W",11,18,14,29,18,4,3,3,12 +"YBR070C",234,224,179,100,251,238,193,282,373 +"YBR071W",1172,1076,812,252,544,1078,1099,2547,2333 +"YBR072W",253833,163101,80247,12808,1027,124016,161416,183996,352923 +"YBR072C-A",16,17,10,3,1,6,12,19,36 +"YBR073W",1055,1194,1087,850,1395,857,720,704,1079 +"YBR074W",970,1121,1171,1654,1705,400,534,587,917 +"YBR076W",135,112,65,27,28,167,111,158,223 +"YBR077C",493,508,456,331,323,404,463,536,745 +"YBR078W",4708,7001,8653,15844,17087,6251,5364,4441,4564 +"YBR079C",2125,2771,3502,6833,6364,796,1448,1251,2160 +"YBR080C",997,1142,972,859,1040,729,724,747,1187 +"YBR081C",1674,1742,1495,1067,1015,1178,1272,1158,1738 +"YBR082C",2846,3037,3450,4576,4255,2696,2225,2270,3939 +"YBR083W",920,945,847,607,1599,1783,1025,815,1073 +"YBR084W",994,1734,3036,8133,6841,231,423,523,846 +"YBR084C-A",5770,6303,6582,10543,14327,1605,3725,4041,7457 +"YBR085W",11,12,35,95,25,19,15,20,26 +"YBR085C-A",6305,4535,2714,1179,621,7396,4702,5677,9893 +"YBR086C",3482,3395,2448,1959,1461,2650,2293,2146,3675 +"YBR087W",435,501,411,477,609,232,275,349,525 +"YBR088C",418,490,508,303,893,299,285,420,659 +"YBR089C-A",637,544,392,264,267,1488,1267,919,1231 +"YBR090C",37,19,13,23,13,37,54,23,35 +"YBR091C",93,126,138,187,242,133,112,92,152 +"YBR092C",191,164,180,95,108,190,141,155,275 +"YBR093C",57,51,54,39,34,52,47,52,81 +"YBR094W",1392,1449,1091,592,462,865,837,941,1549 +"YBR095C",668,637,590,510,630,374,452,432,798 +"YBR096W",381,388,311,291,569,461,375,384,551 +"YBR097W",891,825,698,262,116,408,467,512,793 +"YBR098W",649,598,441,187,421,782,676,630,964 +"YBR101C",4270,3717,2116,811,1326,2468,2788,3527,6870 +"YBR102C",680,788,652,614,448,352,423,419,651 +"YBR103W",748,826,690,473,407,808,752,685,1126 +"YBR104W",226,327,546,940,640,35,103,130,261 +"YBR105C",275,762,3007,4207,486,74,98,150,281 +"YBR106W",2298,2996,3942,6863,6114,1369,2011,1994,3220 +"YBR107C",177,210,203,143,161,168,198,182,292 +"YBR108W",764,796,510,167,202,722,637,572,884 +"YBR109C",2353,2208,1651,1314,1353,2450,2327,2500,4057 +"YBR110W",724,843,765,636,447,537,541,537,950 +"YBR111C",1710,1612,1177,861,606,1932,1625,1683,2882 +"YBR111W-A",512,508,356,299,329,320,344,431,642 +"YBR112C",1689,1605,1656,1784,1442,2308,1766,1396,2020 +"YBR114W",422,557,1226,2080,331,174,174,218,432 +"YBR115C",2971,3899,4177,7072,6970,519,1053,1353,2563 +"YBR117C",11877,7622,3623,589,78,7683,5734,8163,18182 +"YBR118W",10103,8292,6973,7137,7346,4034,7334,8123,16158 +"YBR119W",983,872,595,390,622,671,736,853,1337 +"YBR120C",255,246,198,140,256,1201,313,285,341 +"YBR121C",3741,4615,4949,8423,10818,2898,3306,2941,4521 +"YBR122C",511,545,461,458,611,1900,644,513,758 +"YBR123C",438,480,439,282,272,432,421,298,495 +"YBR125C",542,543,632,561,493,587,592,540,891 +"YBR126C",5160,3836,1841,194,438,7324,4269,4801,7897 +"YBR126W-A",746,541,331,159,212,1647,1051,1120,1752 +"YBR127C",5442,5160,4679,4984,3819,4202,4117,4219,7457 +"YBR128C",341,274,185,26,31,262,246,296,460 +"YBR129C",584,621,458,440,575,413,508,493,825 +"YBR130C",181,262,258,323,375,214,214,162,226 +"YBR131W",270,346,320,307,274,101,142,160,275 +"YBR132C",546,506,299,33,134,892,534,452,571 +"YBR133C",585,750,641,582,834,538,582,492,728 +"YBR135W",385,420,413,395,525,466,467,452,682 +"YBR136W",713,779,612,461,451,546,450,452,711 +"YBR137W",702,587,484,263,216,990,774,678,1179 +"YBR138C",344,329,237,135,176,522,575,339,445 +"YBR139W",2462,2039,1169,228,277,2297,1838,1980,3055 +"YBR140C",3038,2857,2077,1293,1090,1943,1930,1956,3263 +"YBR141C",157,244,457,790,299,63,108,111,195 +"YBR142W",644,991,1944,5574,3368,119,278,316,513 +"YBR143C",2356,3132,3583,6782,8956,1185,2059,1997,2893 +"YBR145W",442,335,250,205,254,443,418,452,738 +"YBR146W",799,956,919,837,958,4780,1006,813,1046 +"YBR147W",982,1011,675,301,577,400,628,706,1230 +"YBR148W",201,165,95,83,160,240,197,182,284 +"YBR149W",8442,6670,4362,1612,540,14098,10683,9316,13504 +"YBR150C",771,749,547,335,581,474,688,541,794 +"YBR151W",1263,1140,757,475,943,2147,1381,1410,1980 +"YBR152W",186,239,267,250,234,154,119,125,196 +"YBR153W",267,330,388,477,382,255,240,237,361 +"YBR154C",693,950,1294,2947,2591,221,598,511,802 +"YBR155W",416,699,1190,2529,1080,92,180,213,446 +"YBR156C",140,159,156,190,192,181,152,110,187 +"YBR157C",1950,2159,2376,804,834,1725,1437,1378,2133 +"YBR158W",1451,1042,977,1783,1393,795,1528,4371,4168 +"YBR159W",1220,1327,1201,1076,1122,1560,1331,1323,1874 +"YBR160W",546,584,584,638,820,558,529,518,730 +"YBR161W",339,351,273,208,177,209,219,304,508 +"YBR162C",2329,2045,2007,3002,5960,3157,3350,3741,4486 +"YBR162W-A",381,441,436,531,931,393,424,470,658 +"YBR163W",491,512,524,521,635,387,400,378,576 +"YBR164C",605,671,642,714,908,487,572,616,817 +"YBR165W",343,401,305,340,442,282,374,348,533 +"YBR166C",738,883,892,941,953,406,598,586,910 +"YBR167C",367,417,333,257,309,504,497,378,522 +"YBR168W",572,593,423,259,262,1013,785,614,860 +"YBR169C",11190,8337,4561,788,253,5815,4885,6634,15074 +"YBR170C",1202,1351,1005,597,590,862,859,883,1493 +"YBR171W",614,666,672,805,910,470,613,492,842 +"YBR172C",645,784,1135,1927,2073,364,600,503,653 +"YBR173C",1938,1759,1511,1160,1079,1642,2134,1960,2872 +"YBR175W",228,241,340,436,327,112,144,168,285 +"YBR176W",267,273,261,223,282,345,245,246,373 +"YBR177C",1889,1669,1372,1190,1251,2457,2464,2098,2767 +"YBR179C",1159,1290,1058,721,986,1674,1014,931,1416 +"YBR180W",66,62,69,75,58,20,26,34,73 +"YBR181C",2369,2654,2828,4817,7182,688,1518,1776,3249 +"YBR182C",155,213,222,349,435,101,149,157,244 +"YBR182C-A",5,4,7,15,26,9,9,8,6 +"YBR183W",426,338,211,55,122,970,611,528,655 +"YBR184W",111,114,126,161,94,82,66,62,110 +"YBR185C",329,366,350,286,454,1660,408,301,447 +"YBR186W",133,155,119,106,80,54,87,75,165 +"YBR187W",760,907,1116,1726,1341,406,536,643,1025 +"YBR188C",340,354,298,256,292,224,252,294,490 +"YBR189W",4804,5890,6588,13011,21551,1157,3281,3397,6137 +"YBR191W",3667,4426,5004,9171,15601,807,2438,2494,4989 +"YBR192W",341,421,431,526,527,300,232,249,386 +"YBR193C",412,423,355,283,226,215,264,300,475 +"YBR194W",142,150,129,113,167,154,128,122,221 +"YBR195C",439,571,545,654,757,223,340,409,543 +"YBR196C",20565,16998,12334,9078,4583,8589,9623,14964,26331 +"YBR196C-A",8,6,6,3,8,1,4,10,5 +"YBR196C-B",11,8,7,7,11,3,8,6,13 +"YBR197C",234,318,276,292,201,117,156,184,283 +"YBR198C",981,969,1016,1109,1020,616,835,702,1168 +"YBR199W",2273,2157,1646,1189,1595,1574,1651,1795,2851 +"YBR200W",852,953,994,960,741,653,753,737,1067 +"YBR200W-A",10,12,5,7,4,2,6,10,16 +"YBR201W",299,291,277,144,177,204,222,310,476 +"YBR201C-A",158,158,161,88,131,60,66,114,178 +"YBR202W",1194,1401,1370,1087,1920,467,1188,1186,1608 +"YBR203W",1709,1740,1382,411,1154,1897,2117,1851,2279 +"YBR204C",617,559,394,135,200,670,568,569,900 +"YBR205W",710,686,672,678,840,738,605,531,887 +"YBR207W",1487,1398,1130,786,933,1850,1443,1484,2213 +"YBR208C",2861,4285,4213,4844,6019,1045,669,1688,2942 +"YBR209W",35,22,10,6,12,48,57,65,68 +"YBR210W",237,206,158,147,204,267,257,195,325 +"YBR211C",284,290,200,236,383,253,286,253,379 +"YBR212W",3241,2986,1954,826,1098,3211,2952,2841,4159 +"YBR213W",168,287,470,1033,321,74,110,102,193 +"YBR214W",3675,2728,1474,238,94,4296,3468,3263,4895 +"YBR215W",624,633,602,570,593,370,500,474,677 +"YBR216C",1033,1077,765,596,570,725,731,715,1206 +"YBR217W",253,264,224,162,170,190,198,221,347 +"YBR218C",4296,4441,3584,3763,3912,2258,2781,3124,4815 +"YBR220C",328,418,532,809,712,195,303,310,452 +"YBR221C",6200,5680,4337,3126,2424,8634,6365,6168,9702 +"YBR221W-A",100,74,37,39,64,24,59,75,101 +"YBR222C",10249,7512,5209,4270,5657,2464,5471,7832,13680 +"YBR223C",383,397,318,187,124,286,253,244,441 +"YBR225W",899,761,586,304,345,561,535,558,800 +"YBR227C",708,856,954,1270,942,320,563,523,940 +"YBR228W",298,317,285,322,290,142,182,184,324 +"YBR229C",1439,1543,1263,737,549,805,986,1001,1549 +"YBR230C",5941,4404,2412,773,861,11240,9350,9787,13208 +"YBR230W-A",299,198,169,93,117,648,698,545,741 +"YNCB0019C",411,330,349,381,372,277,343,302,577 +"YBR231C",548,590,557,447,447,305,443,463,796 +"YBR233W",423,480,381,271,372,403,389,364,527 +"YBR233W-A",188,222,203,254,269,269,232,179,257 +"YBR234C",1516,1411,1169,710,661,1689,1479,1495,2219 +"YBR235W",1165,1115,893,605,474,672,662,683,1117 +"YBR236C",611,736,775,806,833,522,620,592,814 +"YBR237W",884,968,852,782,809,598,696,652,1044 +"YBR238C",95,199,571,2580,512,53,59,42,90 +"YBR239C",127,185,242,421,331,91,99,117,159 +"YBR240C",1182,1245,1150,1636,2529,479,898,997,1579 +"YBR241C",3516,3022,1970,557,177,2407,2012,2484,5155 +"YBR242W",543,629,635,956,983,402,444,438,783 +"YBR243C",356,389,328,341,564,389,388,325,486 +"YBR244W",151,165,141,137,181,83,87,99,244 +"YBR245C",916,1116,1123,1255,1137,502,636,617,932 +"YBR246W",261,308,360,473,474,206,223,224,316 +"YBR247C",638,887,1562,3633,2587,101,311,336,555 +"YBR248C",1113,1291,1482,2677,2009,332,827,730,1302 +"YBR249C",3353,3351,3075,4628,6326,949,1913,2145,3964 +"YBR250W",124,132,127,131,73,66,80,69,136 +"YBR251W",403,405,427,337,458,1320,537,380,585 +"YBR252W",211,255,319,445,513,240,244,263,334 +"YBR253W",241,239,254,226,295,252,323,251,466 +"YBR254C",173,227,230,282,226,118,155,153,250 +"YBR255W",698,706,582,393,312,444,466,518,922 +"YBR255C-A",737,590,378,220,251,1092,929,805,1201 +"YBR256C",1592,1374,1276,1538,1196,1691,1658,1591,2438 +"YBR257W",410,475,433,433,541,230,328,369,584 +"YBR258C",111,102,105,95,100,130,100,132,154 +"YBR259W",463,570,481,435,449,229,285,297,472 +"YBR260C",569,621,620,512,464,452,470,427,606 +"YBR261C",270,351,492,727,673,189,256,241,468 +"YBR262C",408,329,274,250,428,1483,656,460,666 +"YBR263W",2073,2162,2135,2517,2509,1638,1593,1491,2665 +"YBR264C",256,274,220,172,249,326,307,273,461 +"YBR265W",854,927,853,782,805,652,744,730,1160 +"YBR267W",312,401,691,1540,1144,76,180,211,389 +"YBR268W",154,169,161,173,263,791,223,198,265 +"YBR269C",1204,1122,740,321,259,1688,1349,1266,2065 +"YBR270C",311,276,272,208,194,218,214,232,427 +"YBR271W",195,267,372,648,530,54,91,110,237 +"YBR272C",807,783,585,380,411,666,590,596,1057 +"YBR273C",1292,1233,912,646,742,1078,1031,1138,1944 +"YBR274W",554,560,501,378,476,380,427,432,662 +"YBR275C",984,1078,1020,984,851,589,573,628,1035 +"YBR276C",1069,1239,1070,942,940,949,875,911,1405 +"YBR278W",639,617,481,220,349,630,575,641,1058 +"YBR279W",987,1003,1249,1415,963,1040,1086,963,1453 +"YBR280C",1649,1313,675,60,101,1384,1184,1284,2239 +"YBR281C",797,1020,897,1262,917,472,717,587,906 +"YBR282W",289,308,279,248,404,996,351,283,464 +"YBR283C",2352,2558,2569,3164,3301,1358,1690,1693,2755 +"YBR284W",227,198,90,57,153,554,188,152,277 +"YBR285W",627,537,229,29,48,1265,628,599,995 +"YBR286W",11619,9176,6637,4099,2267,9842,9720,10070,16610 +"YBR287W",1556,1549,1233,1047,1336,984,997,1113,1862 +"YBR288C",562,614,558,569,838,317,420,392,607 +"YBR289W",949,982,950,740,617,691,829,654,1005 +"YBR290W",1024,1020,836,639,1170,1048,1086,1062,1526 +"YBR291C",641,1255,2122,5746,5861,149,256,333,594 +"YBR292C",27,40,39,24,41,21,26,22,38 +"YBR293W",393,439,432,433,391,334,303,313,481 +"YBR294W",3740,5676,7338,9146,5808,4549,2883,2708,3729 +"YBR295W",2256,2083,1374,576,471,1932,2019,2073,3292 +"YBR296C",375,367,312,276,232,186,226,304,525 +"YBR296C-A",8,7,8,5,14,2,9,5,11 +"YBR297W",696,606,425,318,1846,1845,1191,1038,1289 +"YBR298C",3123,2112,1143,381,1787,9106,6208,4275,6580 +"YBR299W",376,263,115,62,61,1861,662,425,688 +"YCL064C",64,46,41,24,116,64,56,66,98 +"YCL063W",255,349,370,435,428,357,473,331,382 +"YCL061C",633,674,584,310,404,268,277,396,665 +"YCL059C",554,893,1151,2377,3191,101,226,324,612 +"YCL058C",35,47,34,31,46,102,71,34,78 +"YCL057C-A",728,709,602,514,804,1716,1192,1113,1422 +"YCL057W",2316,2372,1858,1180,535,1476,1629,1489,2441 +"YCL056C",394,438,383,278,400,298,354,393,670 +"YCL055W",878,882,675,501,960,859,769,787,1083 +"YCL054W",829,1361,2490,6445,4271,96,460,452,907 +"YCL052C",1579,1338,1000,556,645,1602,1317,1427,2153 +"YCL051W",394,417,338,321,354,431,343,326,523 +"YCL050C",2026,2158,1897,1898,1771,959,1143,1352,2551 +"YCL049C",465,395,242,144,222,857,385,351,646 +"YCL048W-A",3186,2498,1723,959,438,386,668,1592,3758 +"YCL048W",77,87,51,31,20,72,47,65,100 +"YCL047C",272,346,301,383,281,311,213,256,371 +"YCL045C",1302,1502,1457,1398,1161,1076,1179,1113,1734 +"YCL044C",539,565,454,378,353,305,371,346,527 +"YCL043C",7055,6802,5925,5026,3884,4419,4845,4890,8164 +"YCL042W",14,6,5,6,9,13,11,16,13 +"YCL040W",10734,6506,3183,595,1007,24785,18060,17240,23249 +"YCL039W",959,901,529,106,227,958,828,832,1355 +"YCL038C",950,856,586,266,248,834,746,723,1382 +"YCL037C",38,71,170,385,135,9,13,13,22 +"YCL036W",283,421,992,2097,500,31,44,91,318 +"YCL035C",3053,2455,1687,1078,941,3968,3086,3041,4996 +"YCL034W",911,876,648,329,522,1466,1085,1018,1651 +"YCL033C",911,826,585,251,147,1005,964,1210,1981 +"YCL032W",792,770,720,416,463,635,707,738,1130 +"YCL031C",812,1036,1149,1945,1948,400,644,638,1007 +"YCL030C",3359,3258,2948,3863,6436,1301,2335,2203,3837 +"YCL029C",533,649,590,690,810,378,465,420,695 +"YCL028W",1843,1805,1650,1498,1732,1958,1723,1647,2468 +"YCL027W",196,192,154,192,569,300,145,169,238 +"YCL026C-B",180,229,254,243,525,391,267,207,270 +"YCL026C-A",18,21,18,40,50,19,16,15,29 +"YCL025C",1765,2356,3619,7083,8813,271,1155,1339,1987 +"YCL024W",633,664,527,238,1050,332,300,491,830 +"YCL021W-A",53,48,37,44,53,55,50,43,67 +"YCL019W",12,15,21,13,5,8,9,10,15 +"YNCC0002W",3,2,2,2,2,1,2,1,2 +"YCL018W",1840,2825,4990,7635,4960,1324,1173,1238,2070 +"YCL017C",1735,1798,1557,1288,1227,1479,1053,1245,2088 +"YCL016C",348,358,349,385,406,246,244,298,497 +"YCL014W",652,809,739,656,668,684,717,522,635 +"YCL012C",552,549,365,170,55,289,301,413,739 +"YCL011C",1485,1546,1450,1833,2398,1044,1398,1290,2128 +"YCL010C",480,568,476,411,312,372,390,463,794 +"YCL009C",2916,2620,2411,2363,2431,1753,2126,2152,3700 +"YCL008C",368,413,318,293,194,277,289,326,485 +"YCL005W-A",542,529,551,579,756,513,585,599,988 +"YNCC0003C",44,38,32,45,50,41,27,34,58 +"YCL005W",234,195,219,262,292,202,208,242,329 +"YCL004W",312,309,246,180,156,239,225,202,332 +"YCL002C",355,412,427,529,562,232,292,289,501 +"YCL001W",901,899,781,779,889,732,753,753,1251 +"YCL001W-A",35,22,44,25,30,30,40,29,50 +"YCL001W-B",38,56,29,27,31,46,43,48,91 +"YCR001W",33,53,60,68,50,18,26,31,59 +"YCR002C",818,906,791,874,1283,1053,905,771,1077 +"YCR003W",237,264,254,226,273,964,312,254,335 +"YCR004C",5591,4935,3323,1389,719,9039,7362,5953,9129 +"YCR005C",2091,2812,5461,1236,3277,2821,2883,1905,2932 +"YCR006C",98,98,67,41,52,136,136,145,169 +"YCR007C",270,259,186,179,255,267,186,213,378 +"YCR008W",808,916,992,1324,1527,532,567,588,859 +"YCR009C",1978,1961,1562,1108,1167,1545,1376,1627,2537 +"YCR010C",5044,3346,1786,240,42,45822,29944,16092,14578 +"YCR011C",3002,2943,2057,715,355,2090,1589,1878,2973 +"YCR012W",90042,64683,39856,14090,3534,44054,41238,70401,146503 +"YCR014C",907,932,708,477,477,674,626,660,1157 +"YCR015C",281,349,299,355,205,145,198,173,296 +"YNCC0006C",37,53,53,89,101,39,38,37,57 +"YCR016W",292,528,849,1941,1684,66,194,211,313 +"YCR017C",1845,1785,1312,1124,1482,1922,1625,1655,2400 +"YCR018C",1320,1053,630,378,548,1512,1455,1074,1966 +"YCR019W",350,409,380,422,449,293,329,314,522 +"YCR020C",669,874,775,1224,3263,998,522,577,942 +"YCR020C-A",287,304,231,263,291,152,164,216,407 +"YCR020W-B",129,194,189,296,226,49,96,111,156 +"YCR021C",4126,3107,1285,159,140,1436,1338,1525,5045 +"YCR023C",749,718,534,313,437,911,747,639,944 +"YCR024C",203,244,258,222,202,490,222,163,239 +"YCR024C-B",8128,7065,5932,7292,5460,3476,6227,5444,8701 +"YCR024C-A",5997,5397,4739,5820,4306,2585,4513,3854,6488 +"YCR025C",34,22,15,19,33,42,31,24,53 +"YCR026C",1017,1146,1235,1487,800,766,748,741,1236 +"YCR027C",228,251,328,341,317,162,150,155,231 +"YCR028C",607,739,679,748,818,327,476,449,792 +"YCR028C-A",1698,1755,1496,1470,1676,1941,1614,1679,2604 +"YCR030C",2166,1934,1408,649,479,1800,1651,1552,2536 +"YCR031C",3256,3832,4253,7139,9606,1130,1931,1969,3795 +"YCR032W",1128,1088,873,546,661,685,577,612,1070 +"YCR033W",1047,1074,1027,1004,834,976,919,814,1232 +"YCR034W",582,855,918,1765,2189,386,546,461,666 +"YCR035C",619,742,1096,1623,1156,415,533,549,815 +"YCR036W",819,836,722,542,505,864,791,757,1197 +"YCR037C",921,1011,1038,1192,1189,630,674,627,973 +"YCR038C",217,177,166,130,150,197,152,140,269 +"YCR042C",1567,1559,1565,1423,1186,773,1131,1054,1755 +"YCR043C",158,217,272,573,720,139,173,157,221 +"YCR044C",426,453,412,489,529,393,402,355,616 +"YCR045C",182,202,199,212,229,167,186,191,315 +"YCR046C",319,320,327,332,395,1549,468,384,530 +"YCR047C",414,594,853,1596,1692,160,312,355,726 +"YCR048W",340,393,509,538,293,183,260,298,467 +"YCR051W",939,1048,1083,1214,1356,928,1091,1097,1836 +"YCR052W",532,573,578,678,649,360,419,397,619 +"YCR053W",2302,2319,2236,2917,3119,1148,1675,1669,2574 +"YCR054C",404,429,472,624,468,173,247,272,482 +"YCR057C",554,868,1617,3894,2466,42,255,270,469 +"YCR059C",413,549,610,882,907,288,298,369,609 +"YCR060W",265,261,272,308,371,311,287,287,467 +"YCR061W",674,582,383,163,143,764,582,589,946 +"YCR063W",67,71,134,203,134,26,37,45,83 +"YCR065W",352,471,409,586,765,252,274,228,329 +"YCR066W",241,274,253,244,210,156,181,154,282 +"YCR067C",872,944,866,783,676,785,708,649,898 +"YCR068W",787,859,717,447,282,557,469,508,900 +"YCR069W",1777,1870,1340,737,456,1245,1282,1341,2368 +"YCR071C",275,250,246,220,266,1157,333,288,341 +"YCR072C",158,353,776,1958,841,12,69,80,141 +"YCR073C",404,400,367,337,299,233,247,283,458 +"YCR073W-A",926,805,658,263,450,903,898,942,1436 +"YCR075C",326,303,229,59,76,350,320,356,514 +"YCR075W-A",166,166,129,89,66,185,213,198,302 +"YCR076C",722,730,607,383,325,927,792,828,1356 +"YCR077C",1218,1259,1132,1162,1106,1052,1050,973,1552 +"YCR079W",703,624,525,260,234,914,859,898,1271 +"YCR081W",559,668,566,539,355,388,357,351,537 +"YCR082W",1922,1749,1288,904,1157,2141,2136,1961,3113 +"YCR083W",1198,1132,871,561,401,1002,845,1033,1779 +"YCR084C",1842,1859,1780,2149,2350,1929,1893,1459,2086 +"YCR085W",10,10,7,8,9,13,5,3,2 +"YCR086W",305,356,291,239,266,269,317,258,352 +"YCR087C-A",213,380,646,1555,2318,45,111,94,181 +"YCR088W",1275,1308,976,695,375,1448,1182,984,1564 +"YCR089W",470,496,463,501,600,438,277,253,348 +"YCR090C",287,350,311,416,551,340,338,344,503 +"YCR091W",703,581,280,53,117,1003,673,616,897 +"YCR092C",337,383,403,516,548,268,208,215,341 +"YCR093W",1926,1993,1928,1842,1454,1416,1468,1329,1881 +"YCR094W",506,504,467,412,415,359,374,319,524 +"YCR095C",389,438,374,262,440,219,275,343,510 +"YCR095W-A",21,33,20,32,21,10,12,14,26 +"YCR098C",164,175,133,106,165,100,114,129,196 +"YCR099C",71,67,52,38,22,56,52,48,95 +"YCR100C",116,102,66,46,26,69,64,81,131 +"YCR101C",70,62,43,18,5,35,30,36,58 +"YCR102C",352,318,247,314,1773,258,306,316,561 +"YDL248W",372,340,218,165,185,336,234,343,533 +"YDL247W",2,1,2,6,4,10,4,3,2 +"YDL246C",10,7,4,4,4,6,3,6,14 +"YDL245C",16,15,13,7,11,17,11,13,24 +"YDL244W",94,113,84,57,54,128,78,61,177 +"YDL243C",146,153,166,91,80,134,102,122,176 +"YDL242W",13,26,21,9,14,24,8,13,22 +"YDL241W",12,8,13,9,24,11,14,7,15 +"YDL240W",464,525,525,406,426,492,464,393,540 +"YDL239C",807,598,302,114,172,684,541,561,904 +"YDL238C",565,461,283,82,52,391,348,382,638 +"YDL237W",1181,1149,1021,853,625,806,636,720,1238 +"YDL236W",692,779,940,1621,1441,526,618,581,923 +"YDL235C",519,614,611,684,931,337,398,415,699 +"YDL234C",1711,1630,1111,470,562,1542,1295,1396,2249 +"YDL233W",419,392,359,220,281,282,316,347,560 +"YDL232W",171,213,176,230,270,247,227,194,261 +"YDL231C",1296,1405,1290,1331,1385,608,732,881,1349 +"YDL230W",212,231,218,132,149,302,275,257,381 +"YDL229W",2019,3292,5713,15742,15604,564,1261,1260,2402 +"YDL227C",429,628,690,874,1359,82,79,175,451 +"YDL226C",871,907,836,876,881,729,873,748,1227 +"YDL225W",958,1105,1044,1323,1494,1081,1115,886,1156 +"YDL224C",1535,1595,1340,1020,1032,892,1194,1093,1571 +"YDL223C",9550,5879,2642,376,103,7244,6427,6719,11931 +"YDL222C",4994,3349,1532,129,44,3238,2581,3816,7934 +"YDL220C",261,283,276,218,233,173,208,187,281 +"YDL219W",187,244,223,277,344,109,146,112,212 +"YDL218W",1953,2181,1329,147,92,168,181,294,1398 +"YDL217C",253,346,411,414,406,232,212,195,302 +"YDL216C",329,331,212,122,132,262,238,292,462 +"YDL215C",6325,5619,3676,1496,1174,10534,8536,6677,8463 +"YDL214C",3177,2104,960,54,131,5542,3877,3436,5049 +"YDL213C",691,941,1177,2151,3121,216,462,495,930 +"YDL212W",1357,1466,1300,1593,2026,1198,1300,1419,2162 +"YDL211C",98,141,142,110,158,136,104,92,149 +"YDL210W",129,150,161,195,182,124,75,79,144 +"YDL209C",218,316,295,321,287,86,165,175,302 +"YDL208W",915,1403,2104,4278,5332,198,760,708,1191 +"YDL207W",799,799,729,594,729,566,657,650,1109 +"YDL206W",549,485,290,122,258,627,419,418,666 +"YDL205C",445,471,508,846,983,453,453,482,705 +"YDL204W",12224,7051,2695,191,127,8413,8201,9167,18393 +"YDL203C",539,558,523,569,676,318,397,410,648 +"YDL202W",267,338,327,331,389,1024,323,270,387 +"YDL201W",409,592,802,1909,1759,185,222,208,421 +"YDL200C",762,772,634,532,473,542,607,678,1136 +"YDL199C",915,837,507,83,73,638,594,601,1104 +"YDL198C",515,660,852,1439,1111,859,651,493,669 +"YDL197C",989,761,452,107,280,741,580,607,1068 +"YDL195W",3780,3677,2958,1875,1609,2661,2305,2237,3488 +"YDL194W",729,651,426,151,511,738,577,587,894 +"YDL193W",825,758,513,312,437,662,586,612,1044 +"YDL192W",1667,2032,2191,3474,4850,1975,1694,1643,2360 +"YDL191W",1194,1363,1264,2096,3629,491,973,1077,1838 +"YDL190C",1424,1481,1310,968,1011,1002,1040,968,1409 +"YDL189W",469,512,626,772,670,239,343,252,432 +"YDL188C",1146,989,843,395,524,808,872,936,1479 +"YDL186W",22,32,44,43,22,12,29,37,83 +"YDL185W",6530,6905,6602,9591,4925,4119,4130,4672,7699 +"YDL184C",1086,1167,948,1088,2286,664,994,1166,2068 +"YDL183C",254,326,234,172,242,442,214,205,361 +"YDL182W",1437,2155,2844,4147,4369,150,436,703,1467 +"YDL181W",2124,1740,1223,626,845,2560,2631,2368,3331 +"YDL180W",582,668,646,405,688,317,382,414,661 +"YDL179W",389,219,207,199,175,115,572,1558,1220 +"YDL178W",1131,1333,1318,1919,2211,1648,1153,950,1398 +"YDL177C",203,251,285,283,264,158,209,190,308 +"YDL176W",520,582,478,339,384,253,371,354,572 +"YDL175C",363,293,228,206,484,351,332,310,456 +"YDL174C",2514,2423,1985,787,1053,7997,4795,3190,4451 +"YDL173W",1586,1577,1319,1038,1272,1488,1837,1701,2756 +"YDL171C",8107,8688,7530,8914,10227,7286,6007,6629,9873 +"YDL170W",725,828,1106,1432,817,265,483,438,798 +"YDL169C",714,710,473,86,42,592,546,622,1126 +"YDL168W",2220,2270,1943,1368,1371,1009,1143,1464,2966 +"YDL167C",492,671,1081,2526,1468,66,259,272,397 +"YDL166C",356,413,504,828,977,199,305,282,532 +"YDL165W",464,426,371,400,529,427,475,424,691 +"YDL164C",435,493,432,240,480,269,317,379,562 +"YDL161W",1452,1424,1223,918,1166,1272,1287,1289,1983 +"YDL160C-A",109,103,115,122,122,93,86,108,183 +"YDL160C",570,594,490,522,469,484,486,384,587 +"YDL159W",386,402,327,228,404,259,298,310,464 +"YDL157C",370,429,354,391,452,341,273,338,563 +"YDL156W",162,185,180,118,193,82,116,100,201 +"YDL155W",600,616,652,695,735,657,604,553,860 +"YDL154W",378,348,268,168,309,398,309,283,468 +"YDL153C",1166,1494,2101,4702,4840,193,613,634,1268 +"YDL150W",435,572,761,1476,1506,141,342,315,577 +"YDL149W",844,844,605,144,178,520,535,552,996 +"YDL148C",699,1191,1890,4386,3770,59,356,281,628 +"YDL147W",6863,6186,4603,3548,3450,4964,5653,5187,7623 +"YDL146W",228,213,145,109,172,220,177,185,270 +"YDL145C",2407,2588,2389,2533,2709,2585,2206,1868,2764 +"YDL144C",948,1054,957,844,642,926,929,900,1474 +"YDL143W",2538,2763,2664,3326,3680,1725,2296,2255,3488 +"YDL142C",369,404,279,139,176,410,362,383,524 +"YDL141W",636,709,625,586,621,406,491,430,676 +"YDL140C",3724,3713,3576,3904,3677,2364,2700,2396,3601 +"YDL139C",121,104,93,60,51,62,44,60,147 +"YDL138W",730,949,1192,1306,796,552,679,624,910 +"YDL137W",4292,3960,3056,2190,1925,6521,5478,5420,7775 +"YDL136W",996,1190,1294,2088,3522,237,646,710,1272 +"YDL135C",914,972,811,530,566,1039,885,862,1208 +"YDL134C",1383,1438,1262,1000,1220,1186,1375,1365,2131 +"YDL133C-A",2076,2063,1572,1643,2669,756,1109,1779,3093 +"YDL133W",791,848,676,362,533,551,663,614,1004 +"YDL132W",2781,2451,1679,716,811,2055,2126,2163,3361 +"YDL131W",1783,2106,2260,3121,3405,514,891,1005,1799 +"YDL130W-A",3042,2140,1267,448,309,4935,3559,3629,5270 +"YDL130W",2254,2681,2771,4278,6385,592,1471,1597,3003 +"YDL129W",231,232,202,195,367,141,203,223,316 +"YDL128W",1834,1765,1441,1351,1764,1258,1387,1791,2507 +"YDL127W",94,99,93,95,292,106,115,196,153 +"YDL126C",16809,14995,11537,7595,5092,13944,13995,13717,21427 +"YDL125C",2396,1997,1376,794,886,3014,3184,3222,4698 +"YDL124W",9172,7465,4732,1781,621,6561,4578,5884,11024 +"YDL123W",619,589,443,203,233,385,467,511,791 +"YDL122W",1410,1698,2449,4635,3652,646,865,849,1407 +"YDL121C",618,658,702,863,1043,218,463,515,807 +"YDL120W",474,388,315,228,512,919,681,563,765 +"YDL119C",125,138,139,119,92,200,164,176,251 +"YDL117W",523,517,529,768,733,325,653,1217,1023 +"YDL116W",1073,1160,1079,1273,1270,589,782,740,1122 +"YDL115C",1089,1049,807,500,602,986,1023,973,1626 +"YDL114W",45,44,35,37,18,18,15,28,58 +"YDL113C",1092,996,656,203,336,981,857,912,1419 +"YDL112W",1065,1274,1468,2226,2437,350,576,605,944 +"YDL111C",375,511,824,1432,952,267,339,307,478 +"YDL110C",4157,3189,1892,328,280,8847,6209,5564,7819 +"YDL109C",229,276,261,277,187,160,182,187,291 +"YDL108W",371,396,395,440,522,287,376,314,532 +"YDL107W",302,320,233,195,255,1000,355,282,431 +"YDL106C",837,770,507,334,569,765,753,684,969 +"YDL105W",166,203,200,159,252,93,82,95,175 +"YDL104C",352,312,374,231,221,361,281,242,447 +"YDL103C",840,927,824,629,747,908,860,769,1098 +"YDL102W",605,773,742,682,737,398,378,416,552 +"YDL101C",402,437,360,188,456,524,479,384,570 +"YDL100C",3606,3844,3251,3039,2600,2813,3163,3043,4732 +"YDL099W",1651,1754,1424,1179,1143,1303,1538,1450,2385 +"YDL098C",136,171,166,184,234,111,102,95,153 +"YDL097C",4342,3889,2913,2106,1961,3189,3618,3447,5235 +"YDL095W",1336,1528,1357,1651,2217,1194,1165,1140,1523 +"YDL093W",380,467,463,377,370,353,290,311,431 +"YDL092W",418,521,501,584,1038,418,471,440,690 +"YDL091C",1218,1160,785,412,476,1036,1005,1035,1533 +"YDL090C",531,465,420,201,286,499,435,466,664 +"YDL089W",462,436,316,163,378,470,400,380,573 +"YDL088C",863,897,923,1014,1171,729,714,674,1070 +"YDL087C",215,217,190,183,157,116,113,129,224 +"YDL086W",1292,1112,983,768,468,1408,1324,1182,2258 +"YDL085C-A",157,175,172,196,366,156,149,129,212 +"YDL085W",4555,3588,2067,383,55,5203,4008,3952,6717 +"YDL084W",3639,3878,3596,4094,5130,3463,3506,3270,4874 +"YDL083C",2897,3549,4043,7546,12254,715,1943,2063,3674 +"YDL082W",1777,2520,3070,6408,8202,439,1183,1080,2084 +"YDL081C",3882,4408,4657,7473,12946,1508,3069,3331,6326 +"YDL080C",768,802,675,871,1390,492,573,558,973 +"YDL079C",1057,885,532,172,619,2347,1218,1317,1787 +"YDL078C",6341,5350,3948,2040,1402,11238,7875,7872,11814 +"YDL077C",718,762,644,440,409,471,403,453,678 +"YDL076C",515,521,448,294,289,469,456,388,633 +"YDL075W",4219,4797,5099,8636,14712,1370,3168,3304,5902 +"YNCD0002C",9,6,8,6,56,6,4,1,7 +"YDL074C",1544,1746,1704,2281,2456,970,1237,1145,1797 +"YDL073W",828,924,881,935,983,331,540,525,837 +"YDL072C",1839,1788,1119,600,409,1707,1608,1846,2882 +"YDL070W",2087,1399,805,599,735,2223,2312,1924,2950 +"YDL069C",117,195,161,168,233,131,127,118,192 +"YDL067C",1543,1489,1227,1094,1603,2101,1900,1749,2333 +"YDL066W",1383,1555,1341,1105,1412,1543,1422,1340,2103 +"YDL065C",1271,1240,1110,781,1114,1073,1152,1081,1786 +"YDL064W",482,548,497,550,745,378,438,395,669 +"YDL063C",502,895,1394,3009,2398,60,226,244,437 +"YDL061C",1811,2018,1999,3344,4401,435,1172,1250,2188 +"YDL060W",922,1318,2069,4552,3591,127,471,491,910 +"YDL059C",288,374,405,503,365,193,227,216,376 +"YDL058W",1221,1307,1261,1235,777,875,837,907,1325 +"YDL057W",374,432,391,331,190,213,237,316,585 +"YDL056W",602,617,663,749,590,517,489,406,703 +"YDL055C",4579,4234,5056,10654,9441,2171,2519,7496,11105 +"YDL054C",1426,1430,1124,781,899,1526,1538,1363,1978 +"YDL053C",793,880,729,768,911,777,804,738,1096 +"YDL052C",277,327,310,394,432,336,266,233,315 +"YDL051W",1102,1444,1800,3557,4507,379,803,841,1484 +"YDL049C",1530,1677,1595,958,386,2422,1796,1488,2081 +"YDL048C",863,998,1077,647,536,311,317,443,939 +"YDL047W",814,910,910,1061,1123,615,773,850,1218 +"YDL046W",3676,3231,2573,1678,1411,5130,3820,3368,4736 +"YDL045W-A",207,218,229,203,302,809,287,236,369 +"YDL045C",629,646,550,380,501,797,618,617,836 +"YDL044C",349,378,356,364,445,503,351,294,413 +"YDL043C",451,441,483,568,567,228,296,308,530 +"YDL042C",414,520,466,542,592,224,276,259,416 +"YDL040C",1109,1289,1244,1624,1462,1088,943,869,1381 +"YDL039C",143,265,749,6523,799,62,63,57,96 +"YDL037C",35,75,217,1716,185,18,24,16,29 +"YDL036C",387,497,562,975,828,186,228,238,430 +"YDL035C",1247,1354,1252,1220,1187,965,982,1008,1552 +"YDL033C",160,166,193,203,243,241,191,189,267 +"YDL031W",1301,1676,2173,4234,3739,371,808,817,1513 +"YDL030W",385,437,480,491,478,277,309,301,473 +"YDL029W",2192,1961,1556,966,789,2849,2273,2265,3545 +"YDL028C",514,546,496,417,411,541,494,405,613 +"YDL027C",1607,1457,999,328,428,1750,1265,1286,2017 +"YDL025C",1200,1125,854,442,602,1126,859,809,1349 +"YDL024C",314,301,205,47,37,131,115,173,299 +"YDL022W",5582,4433,2834,341,327,3152,2948,4042,7579 +"YDL021W",750,744,583,207,55,656,465,688,1101 +"YDL020C",5269,4125,2470,886,2232,4674,3642,3859,6962 +"YDL019C",1953,1789,1138,285,377,2198,1699,1573,2476 +"YDL018C",438,378,277,78,337,661,420,468,657 +"YDL017W",235,276,232,228,320,211,194,209,342 +"YDL015C",1521,1788,1926,2921,1994,1405,1407,1330,2135 +"YDL014W",963,1783,3499,8718,8051,176,609,536,939 +"YDL013W",582,621,583,639,683,420,445,429,811 +"YDL012C",419,376,398,434,725,391,488,460,605 +"YDL010W",460,428,352,159,474,423,395,441,684 +"YDL009C",63,78,55,29,77,80,67,69,117 +"YDL008W",519,518,487,406,363,431,515,568,899 +"YDL007W",4752,4742,3827,3078,2761,3618,4562,4398,6748 +"YDL006W",465,447,371,297,506,380,384,382,621 +"YDL005C",1219,1239,1050,868,1327,874,1049,1006,1516 +"YDL004W",2621,2393,2091,1470,1775,4229,3536,3297,4551 +"YDL003W",217,327,309,364,642,276,176,165,241 +"YDL002C",530,586,520,607,557,447,466,473,750 +"YDL001W",489,583,544,504,615,323,385,399,635 +"YDR001C",3835,3270,2679,2246,923,2806,2364,2804,4969 +"YDR002W",2067,2646,3858,7306,7469,1894,1672,1985,3225 +"YDR003W",671,573,450,178,187,632,593,602,1078 +"YDR003W-A",225,174,116,44,60,169,166,138,282 +"YDR004W",757,813,658,562,554,568,629,669,1058 +"YDR005C",1731,1562,1062,624,818,1060,1093,1347,2286 +"YDR006C",1041,1285,1603,2091,970,586,735,698,983 +"YDR007W",585,622,586,689,495,873,719,774,1145 +"YDR009W",250,262,208,102,184,215,252,205,289 +"YDR010C",26,16,16,18,26,55,42,27,36 +"YDR011W",3376,3459,2849,1758,2476,1933,2079,2131,3933 +"YDR012W",1674,1997,2399,3853,4832,526,1147,1221,2131 +"YDR013W",190,206,158,181,321,132,148,213,276 +"YDR014W",359,401,321,227,268,189,177,210,323 +"YDR014W-A",22,24,26,18,14,50,19,22,20 +"YDR016C",173,170,113,61,94,302,223,183,321 +"YDR017C",1075,1252,1134,961,1099,749,734,794,1195 +"YDR018C",657,603,321,90,120,1009,718,663,960 +"YDR019C",1256,1302,1188,1891,1691,785,590,734,1438 +"YDR020C",130,186,268,417,372,62,105,112,162 +"YDR021W",152,250,436,937,766,15,79,79,128 +"YDR022C",517,477,342,160,151,460,381,434,741 +"YDR023W",2998,3539,3801,6391,7720,1736,2416,2187,3451 +"YDR025W",2549,2999,3469,5654,7738,607,1751,1790,3191 +"YDR026C",685,770,790,974,1065,423,509,551,881 +"YDR027C",982,910,660,329,501,822,774,680,1041 +"YDR028C",3003,2892,2325,1665,2112,2889,2210,2203,3498 +"YDR029W",141,141,113,67,86,104,94,90,118 +"YDR030C",642,610,509,331,262,416,448,505,841 +"YDR031W",246,235,155,85,102,631,241,291,394 +"YDR032C",6910,5954,4205,2164,782,8222,7242,8200,12963 +"YDR033W",12001,12439,10124,15394,11562,2422,2806,3724,9075 +"YDR034C",1126,1240,1158,1225,1564,451,741,748,1184 +"YDR034C-A",1,2,1,1,3,2,1,1,2 +"YDR034W-B",142,86,69,45,20,82,112,279,296 +"YDR035W",1781,1582,1713,2789,2130,771,1371,1718,2439 +"YDR036C",1403,1394,1004,383,410,5443,1673,1456,1977 +"YDR037W",1353,2415,4896,12280,7752,287,671,654,1168 +"YDR038C",69,86,64,36,130,30,37,50,102 +"YDR040C",108,140,124,46,145,61,68,118,152 +"YDR041W",445,487,443,411,584,1732,568,469,682 +"YDR042C",23,24,36,55,72,16,10,27,26 +"YNCD0010C",3,3,1,2,5,4,6,1,3 +"YDR043C",1834,1599,1443,1783,2760,1279,1922,1740,2386 +"YDR044W",462,521,541,612,798,325,419,465,674 +"YDR045C",166,221,291,580,577,54,102,131,197 +"YDR046C",68,99,99,152,143,58,46,45,63 +"YDR047W",753,818,784,977,836,757,733,730,1068 +"YDR049W",414,458,526,789,655,210,291,237,499 +"YDR050C",23167,18241,12605,8234,4811,15582,15468,24426,41598 +"YDR051C",878,901,857,819,1111,664,748,746,1188 +"YDR052C",1142,1196,1201,1177,905,869,890,987,1403 +"YDR054C",1804,1804,1845,1881,1954,1752,1723,1643,2467 +"YDR055W",3013,2956,2415,2007,716,547,1540,4280,4447 +"YDR056C",1000,975,895,728,682,925,922,865,1426 +"YDR057W",846,940,699,447,558,521,587,618,1071 +"YDR058C",291,368,311,375,493,238,278,240,409 +"YDR059C",1616,1633,1316,858,364,1389,1301,1437,2488 +"YDR060W",1823,2684,3914,8958,7759,341,960,974,1692 +"YDR061W",646,725,688,596,628,1332,602,572,833 +"YDR062W",1805,1922,1753,2123,2697,1396,1498,1423,2281 +"YDR063W",801,666,503,323,230,934,810,812,1217 +"YDR064W",5080,6132,6985,12121,19204,1496,3997,3954,7250 +"YDR065W",275,324,326,385,259,147,152,161,317 +"YDR066C",210,218,171,189,193,139,126,160,234 +"YDR067C",408,424,380,423,396,327,383,388,631 +"YDR068W",972,904,683,653,1001,828,935,741,1291 +"YDR069C",567,555,471,204,275,419,334,373,560 +"YDR070C",8733,6094,3585,1282,152,7892,7599,8262,14415 +"YDR071C",1669,1687,1396,1253,1284,1273,1461,1543,2376 +"YDR072C",1050,1178,1177,909,1331,1618,1259,975,1463 +"YDR073W",446,401,239,132,290,1078,765,577,778 +"YDR074W",6791,4676,2067,266,503,12103,6093,6587,9860 +"YDR075W",745,1026,1413,2109,1175,342,590,478,863 +"YDR076W",304,324,312,156,150,539,282,269,394 +"YDR077W",119989,94996,67525,22581,12579,135339,112867,86629,113020 +"YDR078C",259,253,155,117,183,220,251,282,482 +"YDR079W",266,293,244,202,264,657,270,242,410 +"YDR079C-A",140,135,107,110,147,115,140,178,242 +"YDR080W",1066,1104,946,740,556,709,568,680,1034 +"YDR081C",923,995,952,916,975,516,661,698,1057 +"YDR082W",484,482,417,408,396,302,345,389,607 +"YDR083W",488,867,1333,3082,2921,73,232,193,442 +"YDR084C",447,385,298,193,181,413,432,475,682 +"YDR085C",1492,1207,647,93,326,1668,1098,1222,1999 +"YDR086C",1085,1075,907,1096,1534,942,1120,1188,1716 +"YDR087C",510,753,1100,2250,2043,154,288,371,616 +"YDR088C",402,468,442,448,601,297,338,315,527 +"YDR089W",603,629,689,1075,848,591,386,361,578 +"YDR090C",500,520,510,451,689,304,464,513,787 +"YDR091C",1632,2305,2935,6229,6978,396,1020,1064,1703 +"YDR092W",966,981,805,590,732,707,794,897,1498 +"YDR093W",409,476,537,787,1121,416,363,260,390 +"YDR096W",1537,1298,701,171,576,1995,1314,1232,1714 +"YDR097C",828,991,847,424,752,419,440,622,987 +"YDR098C",575,769,904,1281,1193,404,459,461,740 +"YDR098C-B",8,12,3,9,16,5,4,7,5 +"YDR099W",8046,6788,4971,2708,2464,8271,7381,6509,9805 +"YDR100W",673,628,396,133,169,1045,811,870,1159 +"YDR101C",690,1281,2008,5057,3993,82,333,335,612 +"YDR102C",16,16,20,17,7,7,13,4,17 +"YDR103W",559,642,676,867,746,276,326,360,592 +"YDR104C",885,971,808,596,570,441,569,586,1045 +"YDR105C",1105,940,685,368,542,1010,898,927,1565 +"YDR106W",82,66,30,14,31,132,73,73,150 +"YDR107C",388,461,370,166,137,225,275,242,420 +"YDR108W",576,639,569,450,471,366,429,418,655 +"YDR109C",762,795,796,728,424,382,485,505,815 +"YDR110W",555,696,902,1283,1114,279,391,387,657 +"YDR111C",932,811,603,269,261,949,1498,1175,1640 +"YDR113C",345,405,376,257,417,511,308,237,482 +"YDR115W",206,234,167,144,302,1073,319,270,346 +"YDR116C",418,431,415,330,456,1598,501,420,608 +"YDR117C",457,544,466,518,645,302,378,328,558 +"YDR118W",541,544,373,243,372,467,399,420,639 +"YDR119W",1266,1468,1490,1584,1742,623,922,957,1538 +"YDR119W-A",3043,2260,1076,84,429,4199,3696,3987,6087 +"YDR120C",917,1163,1575,2801,2740,258,610,659,1140 +"YDR121W",327,363,344,376,580,244,305,316,519 +"YDR122W",1566,1476,986,234,504,1132,1055,1101,1764 +"YDR123C",399,474,582,578,378,163,275,265,454 +"YDR124W",238,204,124,76,132,188,156,159,248 +"YDR125C",237,238,153,87,91,176,145,135,233 +"YDR126W",260,213,160,172,254,171,197,176,338 +"YDR127W",3523,3238,2446,2411,2693,2061,2480,2504,3919 +"YDR128W",935,1033,903,629,570,555,651,670,1046 +"YDR129C",4198,3697,3000,2257,2516,4960,3896,3875,5968 +"YDR130C",373,357,337,335,353,387,380,300,431 +"YDR131C",474,428,356,297,377,310,336,359,536 +"YDR132C",549,596,549,458,497,371,422,468,740 +"YDR134C",5126,4118,4267,6484,6487,46878,22945,13044,10934 +"YDR135C",2199,2419,2201,2055,2050,1767,1202,1270,2140 +"YDR137W",776,807,702,645,689,675,700,637,950 +"YDR138W",435,443,407,395,510,324,360,323,552 +"YDR139C",541,583,529,527,567,356,395,425,803 +"YDR140W",337,367,328,375,374,263,258,249,463 +"YDR141C",1373,1454,1098,907,686,988,916,935,1454 +"YDR142C",550,521,444,383,465,529,553,546,803 +"YDR143C",553,483,445,538,1002,460,507,448,622 +"YDR144C",133,183,175,227,462,122,131,126,157 +"YDR145W",1638,1535,1354,1143,1638,1546,1586,1444,2110 +"YDR146C",182,180,139,150,129,1172,1558,794,490 +"YDR147W",428,447,496,512,464,295,445,393,522 +"YDR148C",5976,5319,3259,1283,2322,6687,5480,5506,8047 +"YDR150W",2295,2336,1880,1279,945,2058,2039,1704,2565 +"YDR151C",553,598,523,465,371,305,277,344,629 +"YDR152W",730,804,935,1628,2254,387,683,599,961 +"YDR153C",968,1140,1125,1480,1668,645,836,710,1082 +"YDR155C",37360,27849,19655,10813,3729,20845,24660,30538,61267 +"YDR156W",210,264,344,611,554,47,133,102,220 +"YDR157W",19,21,13,36,29,3,12,12,14 +"YDR158W",3761,3696,3462,5870,6102,2032,2433,2383,4487 +"YDR159W",481,567,629,693,605,443,453,385,637 +"YDR160W",727,738,645,687,649,386,492,450,883 +"YDR161W",549,737,895,1662,1867,200,400,430,755 +"YDR162C",570,535,459,316,430,486,605,513,857 +"YDR163W",517,517,408,345,574,393,464,566,759 +"YDR164C",783,857,815,856,577,511,563,498,805 +"YDR165W",380,686,1139,2497,2098,90,202,223,378 +"YDR166C",1427,1336,1012,788,689,954,997,974,1498 +"YDR167W",718,704,679,746,1032,872,687,691,1042 +"YDR168W",2840,2534,1887,1288,1288,2297,2102,2217,3362 +"YDR169C",1030,1017,726,431,621,793,787,687,972 +"YDR169C-A",18,21,13,3,5,18,14,20,21 +"YDR170C",2399,2640,2233,2249,1756,1716,1545,1589,2462 +"YDR171W",11798,7278,3558,297,274,16590,10837,11530,21147 +"YDR172W",3183,3717,4198,6745,6587,2117,2689,2478,3964 +"YDR173C",439,395,167,76,246,608,473,510,790 +"YDR174W",1007,1040,1099,1389,1138,1543,1365,1022,1479 +"YDR175C",465,506,468,374,497,1808,539,417,582 +"YDR176W",1526,1494,1207,853,986,1069,1306,1255,1993 +"YDR177W",1758,1767,1406,1005,1432,1876,2009,1926,2779 +"YDR178W",2342,2125,1522,810,1418,5568,3612,3158,4053 +"YDR179C",335,319,321,316,308,211,247,243,432 +"YDR179W-A",351,388,309,356,345,194,259,299,418 +"YDR180W",578,733,707,740,580,242,315,331,570 +"YDR181C",742,788,686,614,555,578,735,699,1019 +"YDR182W",974,905,728,533,710,791,736,722,1133 +"YDR182W-A",12,10,11,7,13,22,10,16,17 +"YDR183W",264,294,269,261,321,155,188,169,289 +"YDR184C",169,291,683,1433,944,51,70,64,142 +"YDR185C",82,113,149,200,298,184,151,88,158 +"YDR186C",2491,2441,2815,3598,2036,1629,1721,1608,2819 +"YDR188W",4427,4683,4415,4468,4087,3725,4124,4018,6358 +"YDR189W",1097,1283,1082,990,800,845,938,817,1347 +"YDR190C",1869,1929,1977,2803,3647,1026,1640,1604,2329 +"YDR191W",165,195,184,154,315,51,121,160,245 +"YDR192C",259,249,241,240,265,193,213,210,318 +"YDR194C",1210,1481,1425,1701,1827,2788,996,931,1442 +"YDR195W",580,568,466,451,910,623,541,590,955 +"YDR196C",848,812,572,256,250,1135,968,953,1449 +"YDR197W",384,403,322,248,237,530,354,318,514 +"YDR198C",449,549,506,642,659,284,343,344,543 +"YDR200C",672,701,559,384,512,669,636,590,842 +"YDR201W",312,250,220,164,202,399,398,332,496 +"YDR202C",1043,975,628,249,241,990,840,961,1417 +"YDR204W",1327,1168,765,202,109,1376,1177,1202,1852 +"YDR205W",395,393,392,304,368,291,298,344,465 +"YDR206W",1444,1576,1439,1647,1652,736,919,948,1615 +"YDR207C",733,905,928,1051,832,556,581,579,918 +"YDR208W",1412,1547,1636,1513,1101,1356,1282,1047,1557 +"YDR209C",68,84,66,113,110,102,101,75,94 +"YDR210W-B",13,19,16,13,15,8,11,5,15 +"YDR210C-D",19,16,14,27,19,8,4,9,10 +"YDR211W",1262,1569,1819,2891,3047,541,814,940,1399 +"YDR212W",2872,3232,3259,4208,3398,1600,2274,2165,3646 +"YDR213W",327,431,487,527,517,97,177,212,295 +"YDR214W",6997,5908,4054,1393,871,4916,4684,5425,10337 +"YDR215C",12,13,11,1,6,10,9,10,16 +"YDR216W",2647,2528,1686,458,703,2215,1928,1897,2977 +"YDR217C",822,1003,969,1226,951,352,462,458,797 +"YDR218C",398,343,256,133,97,249,270,329,591 +"YDR219C",704,677,561,396,595,777,662,642,923 +"YDR221W",1089,1206,1061,833,505,630,618,620,1115 +"YDR222W",479,608,655,1360,458,323,286,338,589 +"YDR223W",2071,1674,945,181,151,3189,1625,1769,2950 +"YDR224C",6159,5872,4590,3429,3656,6651,4813,4605,7860 +"YDR225W",5459,4454,3026,2319,2216,6080,5630,6127,10355 +"YDR226W",2504,2659,2460,3640,4991,2439,2051,2474,4039 +"YDR227W",1246,1330,1099,1072,1003,658,853,798,1331 +"YDR228C",858,797,646,652,1180,761,695,723,1122 +"YDR229W",790,852,633,352,356,767,699,788,1231 +"YDR231C",987,1009,719,371,450,1310,1103,1127,1635 +"YDR232W",1797,2122,2631,4237,2517,905,1325,1281,2004 +"YDR233C",3717,3607,3322,3856,4589,1979,2843,2734,4141 +"YDR234W",1779,3256,4590,9017,9837,282,621,614,1262 +"YDR235W",408,437,409,451,587,300,348,301,435 +"YDR236C",397,387,322,248,259,299,314,362,624 +"YDR237W",362,397,402,414,550,1906,496,338,490 +"YDR238C",3134,3406,3145,3394,3035,2634,2465,2275,3435 +"YDR239C",469,509,456,432,461,285,306,307,549 +"YDR240C",308,375,349,375,436,174,203,219,369 +"YDR242W",612,718,538,433,437,330,377,378,695 +"YDR243C",313,404,427,457,266,183,193,188,323 +"YDR244W",1233,1431,936,469,699,2307,1522,1281,1586 +"YDR245W",932,1195,1413,2031,2125,693,865,819,1199 +"YDR246W",548,545,386,166,189,389,448,428,772 +"YDR246W-A",23,14,10,5,9,37,25,22,49 +"YDR247W",724,568,300,85,254,787,706,666,987 +"YDR248C",1110,1382,1235,1071,493,841,738,852,1603 +"YDR249C",149,195,212,277,319,98,91,114,171 +"YDR251W",1078,1084,806,535,855,1182,906,906,1300 +"YDR252W",85,72,78,56,31,84,107,84,134 +"YDR253C",597,746,843,1312,526,255,453,471,775 +"YDR254W",608,502,320,172,283,530,502,453,736 +"YDR255C",855,769,486,154,281,585,567,603,904 +"YDR256C",10753,8212,4002,404,354,43475,29705,19465,22136 +"YDR257C",362,497,541,852,1011,243,320,315,413 +"YDR258C",11660,8819,5236,1133,1254,14785,7934,8183,14886 +"YDR259C",186,236,351,411,306,207,268,187,233 +"YDR260C",350,336,300,343,295,224,277,325,510 +"YDR261C",163,206,198,264,328,304,171,151,237 +"YDR261W-B",43,61,61,19,15,28,18,9,36 +"YDR261C-D",50,55,56,32,54,37,40,39,65 +"YNCD0020W",56,37,23,18,5,27,28,35,55 +"YDR262W",3255,2858,1987,1176,1054,1822,1955,2278,4505 +"YDR263C",114,115,72,54,144,201,131,97,176 +"YDR264C",1497,1675,1562,1190,1215,1105,1203,1288,1835 +"YDR265W",431,470,361,219,283,423,397,392,609 +"YDR266C",465,562,751,1256,1248,255,392,352,512 +"YDR267C",453,515,548,679,717,351,408,403,610 +"YDR268W",133,159,170,170,195,532,159,129,155 +"YDR270W",735,747,646,227,242,762,564,517,847 +"YDR272W",1842,1784,1415,1048,1146,1651,1605,1734,2634 +"YDR273W",158,132,104,97,151,222,140,139,257 +"YDR274C",180,159,114,68,85,200,211,156,236 +"YDR275W",1696,1807,1219,437,630,803,607,815,1964 +"YDR276C",4621,3514,2313,1149,1296,6672,5767,5327,7846 +"YDR277C",903,894,934,257,1236,606,846,812,1309 +"YDR279W",436,506,460,383,546,310,335,402,572 +"YDR280W",448,501,640,1003,1121,300,395,419,613 +"YDR281C",34,48,68,80,79,12,11,31,54 +"YDR282C",459,457,375,284,346,505,327,332,587 +"YDR283C",1301,1291,897,624,888,820,825,788,1261 +"YDR284C",793,729,578,203,287,686,697,733,1127 +"YDR285W",385,302,194,162,198,353,269,299,470 +"YDR286C",193,197,126,77,147,362,195,232,323 +"YDR287W",625,637,460,342,313,702,615,583,1003 +"YDR288W",353,368,285,363,534,382,363,344,515 +"YDR289C",678,706,568,535,782,526,653,630,997 +"YDR291W",735,814,706,785,747,396,447,481,829 +"YDR292C",1205,1361,1268,1675,1986,994,1044,997,1465 +"YDR293C",5005,4214,2675,1095,1361,4651,4098,4216,6634 +"YDR294C",2436,2386,1838,1005,676,2624,2541,2102,3285 +"YDR295C",559,590,558,615,882,319,398,444,619 +"YDR296W",363,403,479,381,494,1949,589,407,622 +"YDR297W",791,1014,1589,2404,1906,477,504,610,995 +"YDR298C",2740,2840,2510,2453,2903,4461,3556,3012,3815 +"YDR299W",660,1090,1968,4186,2850,53,265,257,522 +"YDR300C",479,644,741,1140,1974,278,525,463,708 +"YDR301W",440,535,623,528,459,248,342,308,468 +"YDR302W",306,356,455,485,439,368,351,312,470 +"YDR303C",636,775,596,601,755,518,523,430,752 +"YDR304C",1334,1315,1198,1116,1253,2413,1429,1387,2279 +"YDR305C",446,456,312,211,293,581,450,461,683 +"YDR306C",1070,1018,662,276,392,1038,1021,1030,1458 +"YDR307W",1297,1208,873,468,532,877,820,883,1475 +"YDR308C",341,379,403,487,415,323,322,301,450 +"YDR309C",75,163,240,676,2089,106,54,64,59 +"YDR310C",1539,1577,1544,1661,1681,818,1185,1236,1914 +"YDR311W",708,682,679,569,590,307,508,596,834 +"YDR312W",526,584,719,978,1074,227,349,352,566 +"YDR313C",1690,1425,1034,502,457,1194,990,1147,2080 +"YDR314C",336,370,289,220,150,298,214,225,350 +"YDR315C",251,234,199,100,78,200,234,218,339 +"YDR316W",374,423,423,367,443,1738,481,380,527 +"YDR317W",234,267,199,225,243,204,242,215,333 +"YDR318W",431,434,351,220,247,419,416,347,530 +"YDR319C",647,567,423,302,273,486,536,585,1014 +"YDR320C",537,613,495,429,278,340,309,334,521 +"YDR320C-A",325,314,277,259,144,453,403,366,559 +"YDR321W",561,738,923,1656,2100,148,319,412,648 +"YDR322W",345,392,377,409,557,1381,421,336,469 +"YDR322C-A",1077,1110,945,733,1371,2073,1771,1323,1850 +"YDR323C",365,402,322,216,213,211,269,279,487 +"YDR324C",886,1445,2163,4968,3619,149,494,459,815 +"YDR325W",675,761,866,1059,1015,579,673,521,717 +"YDR326C",793,838,947,1466,938,544,560,526,828 +"YDR328C",2760,2480,2016,1341,1757,3606,3279,3253,4966 +"YDR329C",2334,2155,1466,451,829,2215,2101,2216,3599 +"YDR330W",1261,1130,793,158,205,1208,1010,1086,1828 +"YDR331W",400,470,542,613,729,283,305,290,402 +"YDR332W",555,566,421,327,369,458,430,384,707 +"YDR333C",900,960,905,975,1387,511,640,618,969 +"YDR334W",1308,1258,1039,884,924,1292,1289,920,1394 +"YDR335W",2405,2376,1976,1227,1141,1622,1681,1645,2716 +"YDR336W",256,260,264,241,270,188,188,210,322 +"YDR337W",400,472,453,463,560,1799,558,432,687 +"YDR338C",638,636,436,326,450,481,468,575,763 +"YDR339C",410,548,711,1290,1642,196,363,380,558 +"YDR341C",2678,3178,3248,5273,7042,1185,1574,1907,3163 +"YDR342C",2012,2002,1925,1062,2982,6727,4769,2885,3118 +"YDR343C",2716,1591,895,280,1298,5826,4186,4340,5690 +"YDR344C",4,1,5,1,8,21,15,9,16 +"YDR345C",316,428,583,816,527,194,247,246,438 +"YDR346C",2636,3216,3348,4668,3776,1766,1879,1822,3058 +"YDR347W",428,507,508,590,555,1598,445,373,560 +"YDR348C",504,704,878,1411,1485,547,596,537,648 +"YDR349C",912,1000,978,1138,1328,544,572,603,1043 +"YDR350C",752,766,742,542,490,581,576,531,887 +"YDR351W",971,1126,981,1137,985,511,642,686,1037 +"YDR352W",498,601,596,585,640,316,404,449,722 +"YDR353W",1218,1552,1798,2634,3221,1449,1213,1571,1935 +"YDR354W",1043,1161,1214,863,864,559,1016,1007,1440 +"YDR356W",1145,1212,893,547,565,974,786,825,1218 +"YDR357C",1119,895,636,420,422,1272,1297,1129,1735 +"YDR358W",1393,1196,601,42,125,1344,1058,1150,1765 +"YDR359C",1203,880,582,471,599,995,1083,910,1190 +"YDR361C",526,713,960,1666,1822,118,259,294,638 +"YDR362C",610,720,592,534,719,625,538,570,913 +"YDR363W",477,529,482,525,324,283,338,321,601 +"YDR363W-A",1741,1525,1261,1004,950,1737,1773,1653,2566 +"YDR364C",488,550,516,731,669,220,275,330,586 +"YDR365C",4701,4352,3764,4281,4555,4755,4065,3094,5562 +"YDR365W-B",12,9,11,9,6,6,6,7,8 +"YDR366C",7,14,4,8,7,14,6,4,5 +"YDR367W",422,440,416,361,417,427,381,361,586 +"YDR368W",1515,1497,1197,682,284,1219,1090,1292,2069 +"YDR369C",613,666,557,278,222,344,423,441,710 +"YDR370C",468,541,481,410,597,294,384,381,577 +"YDR371W",445,489,381,218,251,383,378,359,564 +"YDR372C",1344,1423,1167,1285,1690,980,1110,1026,1672 +"YDR373W",1004,1056,854,701,736,776,859,943,1630 +"YDR374C",10,17,21,18,18,9,6,7,17 +"YDR374W-A",255,220,181,140,174,209,194,242,348 +"YDR375C",362,376,355,254,402,1662,509,397,539 +"YDR376W",404,509,498,420,482,544,370,366,539 +"YDR377W",2312,2350,1765,1242,1827,3446,3394,2997,3739 +"YDR378C",519,488,379,332,576,477,574,639,1020 +"YDR379W",985,1099,935,626,873,668,756,780,1245 +"YDR379C-A",564,435,272,114,58,665,631,650,1070 +"YDR380W",1454,1570,1312,451,119,1249,1696,1688,2136 +"YDR381W",3546,3083,2534,2757,4261,3758,3495,3293,4935 +"YDR381C-A",262,300,244,145,248,574,222,252,442 +"YDR382W",3179,3911,4243,7760,12972,829,2131,2418,4708 +"YDR383C",283,263,265,149,120,212,215,216,414 +"YDR384C",8020,6257,3372,817,672,10711,10359,8753,13233 +"YDR385W",2012,2384,2371,3696,4701,421,532,853,2059 +"YDR386W",433,478,408,224,274,425,363,366,531 +"YDR387C",575,577,460,338,426,485,344,414,685 +"YDR388W",1746,1718,1306,855,616,1734,1581,1722,2828 +"YDR389W",703,700,589,508,804,814,798,534,819 +"YDR390C",1069,1054,861,786,1128,1011,1048,972,1503 +"YDR391C",291,287,205,244,226,369,250,295,493 +"YDR392W",618,676,549,404,594,493,520,557,861 +"YDR393W",315,401,384,295,414,636,349,305,503 +"YDR394W",3982,3650,2857,1836,1792,2976,3639,3460,5814 +"YDR395W",1037,1411,1888,4302,3798,307,563,538,889 +"YDR397C",700,658,647,920,914,610,709,916,1281 +"YDR398W",413,815,2020,4231,1745,65,181,189,384 +"YDR399W",2836,3724,4636,7232,10342,1386,2260,2629,3881 +"YDR400W",200,264,266,311,454,142,120,136,238 +"YDR402C",166,127,64,39,81,255,167,149,238 +"YDR403W",125,139,110,90,96,282,166,127,195 +"YDR404C",375,370,411,460,726,400,423,385,569 +"YDR405W",590,668,519,312,529,1942,909,689,985 +"YDR406W",890,913,640,322,356,889,613,650,1014 +"YDR407C",632,673,671,500,521,420,475,434,612 +"YDR408C",438,468,475,841,1308,488,419,439,691 +"YDR409W",635,755,533,460,581,533,538,522,737 +"YDR410C",241,270,212,257,450,161,199,216,356 +"YDR411C",711,614,460,200,355,745,742,745,1062 +"YDR412W",400,577,858,1826,2238,145,251,282,491 +"YDR414C",268,304,281,270,333,222,211,208,361 +"YDR415C",414,502,463,439,492,336,389,357,542 +"YDR416W",609,664,651,723,706,292,419,423,690 +"YDR418W",3418,3896,4104,7315,10606,1130,2661,2748,4876 +"YDR419W",562,672,619,536,625,378,402,404,709 +"YDR420W",1010,1035,965,1070,842,396,513,554,953 +"YDR421W",776,832,626,464,513,584,585,564,917 +"YDR422C",983,876,685,586,753,698,745,756,1204 +"YDR423C",548,612,423,244,383,449,489,498,775 +"YDR424C",482,429,317,222,258,624,527,575,887 +"YDR425W",504,572,372,118,220,427,435,434,582 +"YDR427W",3152,3010,2261,1777,1935,2721,3046,2756,4046 +"YDR428C",348,421,406,519,545,305,303,327,526 +"YDR429C",1760,2004,2433,4141,5413,1208,1543,1384,2315 +"YDR430C",747,909,752,543,504,2601,824,644,877 +"YDR432W",2069,2966,3528,5030,3202,1049,931,1119,2137 +"YDR434W",1091,1159,941,822,932,799,812,825,1260 +"YDR435C",406,387,268,71,154,631,418,496,753 +"YDR436W",789,759,498,195,324,878,685,669,1121 +"YDR437W",82,93,66,77,94,49,50,75,127 +"YDR438W",364,350,272,243,433,399,308,312,447 +"YDR439W",289,298,295,291,338,164,212,214,333 +"YDR440W",312,357,436,302,339,190,252,268,430 +"YDR441C",708,743,881,1102,1175,334,514,521,795 +"YDR443C",766,839,672,308,326,591,585,521,825 +"YDR444W",287,321,273,304,371,406,307,279,416 +"YDR446W",1,9,4,10,8,2,12,5,8 +"YDR447C",2394,2651,2764,5066,9169,745,1846,2081,3542 +"YDR448W",322,359,379,431,457,184,224,227,357 +"YDR449C",357,567,886,1746,1498,32,149,162,323 +"YDR450W",4456,4763,5026,8272,14832,1811,3265,3448,5995 +"YDR451C",141,173,145,106,145,597,517,213,201 +"YDR452W",2557,2527,2060,1317,957,2629,2296,2121,3382 +"YDR453C",292,282,204,132,102,274,147,191,380 +"YDR454C",930,1098,1124,1881,2793,884,783,780,1445 +"YDR456W",1304,1190,928,561,691,1132,1123,1016,1684 +"YDR457W",2178,2356,2034,1758,1473,1640,1569,1543,2251 +"YDR458C",1394,1429,1291,1088,968,997,1000,1012,1587 +"YDR459C",384,423,408,395,419,273,345,335,580 +"YDR460W",446,433,413,366,573,373,428,379,604 +"YDR461W",52,40,47,38,78,49,34,39,82 +"YDR461C-A",372,325,226,104,83,375,445,535,712 +"YDR462W",342,332,285,171,330,1035,417,384,514 +"YDR463W",1631,1682,1809,2053,1811,966,1171,1204,1787 +"YDR464W",682,896,1102,1550,998,495,584,529,822 +"YDR465C",751,1239,1966,3810,3359,126,354,405,873 +"YDR466W",896,925,923,696,362,766,769,733,1143 +"YDR468C",644,684,589,625,684,634,631,611,906 +"YDR469W",319,367,428,569,490,270,305,289,428 +"YDR470C",509,540,397,184,229,847,470,493,649 +"YDR471W",3076,3584,4500,8255,11658,753,2373,2369,4075 +"YNCD0030W",3,2,2,3,4,2,2,1,3 +"YDR472W",302,350,407,508,452,172,253,229,424 +"YDR473C",707,736,635,652,739,573,642,594,937 +"YDR475C",958,916,730,500,522,772,775,739,1135 +"YDR476C",405,413,327,269,299,387,393,376,558 +"YDR477W",1593,1474,978,661,1035,1927,1429,1375,2030 +"YDR478W",141,193,198,338,233,61,94,109,168 +"YDR479C",991,817,529,358,583,980,820,800,1225 +"YDR480W",192,193,171,98,205,307,239,186,275 +"YDR481C",1344,1340,1195,912,1157,1230,1179,1346,1953 +"YDR482C",262,321,388,727,619,265,208,235,378 +"YDR483W",2363,2567,2651,3915,3452,1589,1455,1637,2785 +"YDR484W",566,484,454,321,449,377,383,416,538 +"YDR485C",995,1018,926,984,847,884,884,807,1387 +"YDR486C",985,980,857,717,664,895,814,827,1272 +"YDR487C",796,917,1001,1054,862,1221,952,903,1323 +"YDR488C",183,221,285,379,78,323,141,154,255 +"YDR489W",124,150,172,254,226,135,128,132,186 +"YDR490C",845,727,523,147,350,947,796,744,1097 +"YDR492W",658,794,878,940,725,470,544,439,642 +"YDR493W",173,209,166,179,234,635,225,193,283 +"YDR494W",773,892,641,524,792,3636,1010,829,1131 +"YDR495C",642,605,450,395,585,408,405,420,766 +"YDR496C",915,1424,2450,5710,4303,94,387,468,816 +"YDR497C",12708,11288,10671,11184,8083,21146,30051,24901,25571 +"YDR498C",453,507,478,349,396,351,452,397,599 +"YDR499W",847,844,742,444,389,509,556,586,915 +"YDR500C",2471,2750,2968,4759,7776,915,1850,2057,3620 +"YDR501W",179,182,149,170,198,162,157,121,213 +"YDR502C",4640,6548,8755,19712,10878,2883,6611,5070,6126 +"YDR503C",305,352,233,169,270,193,199,215,341 +"YDR504C",154,171,98,59,94,181,155,124,221 +"YDR505C",2251,2184,1443,615,723,2213,1816,1593,2363 +"YDR506C",481,486,402,227,115,274,285,296,563 +"YDR507C",1107,1383,1363,988,1653,818,882,1026,1183 +"YDR508C",421,739,1957,3796,1572,304,327,246,451 +"YDR510W",896,917,760,699,735,802,685,712,1201 +"YDR511W",368,352,302,174,238,1368,446,401,579 +"YDR512C",743,658,442,269,165,934,828,832,1177 +"YDR513W",3549,2839,1775,568,396,3925,2911,3366,5726 +"YDR514C",265,413,474,804,589,153,274,187,324 +"YDR515W",578,678,536,702,628,568,467,398,570 +"YDR516C",1699,1362,839,208,326,3443,1373,1754,2570 +"YDR517W",784,848,702,468,793,806,759,880,1238 +"YDR518W",345,379,318,283,313,175,200,251,384 +"YDR519W",679,759,626,574,438,536,538,657,1148 +"YDR520C",626,678,478,438,511,284,420,410,680 +"YDR522C",81,60,48,29,80,76,73,66,111 +"YDR523C",83,85,75,82,140,87,60,65,99 +"YDR524C",752,677,490,588,1094,394,467,540,815 +"YDR524W-C",2067,2475,2857,5142,6709,2573,2117,1738,2355 +"YDR524C-B",4729,5841,6346,11142,14558,7584,6322,5522,6857 +"YDR525W",7,5,5,1,5,7,7,4,18 +"YDR525W-A",406,310,234,114,141,311,394,375,562 +"YDR527W",476,773,1696,2280,735,123,240,277,506 +"YNCD0032C",44,41,52,44,57,21,39,28,48 +"YDR528W",259,359,427,431,763,73,148,164,281 +"YDR529C",4382,4061,3064,2205,4029,9141,7629,5881,7069 +"YDR530C",364,439,356,326,380,440,385,357,556 +"YDR531W",1696,1796,1552,1609,1067,790,1300,1354,2001 +"YDR532C",398,419,363,321,540,412,364,331,542 +"YDR533C",2275,2409,1604,990,645,543,588,959,2523 +"YDR534C",233,157,90,37,155,309,264,265,293 +"YDR536W",1021,844,412,73,163,1602,1316,1925,1931 +"YDR538W",359,352,230,174,262,177,225,296,505 +"YDR539W",342,292,252,205,310,401,290,317,484 +"YDR540C",28,15,27,33,56,48,31,34,41 +"YDR541C",232,300,251,289,300,191,171,177,360 +"YEL077C",129,125,115,87,150,81,82,108,181 +"YEL073C",345,323,286,200,301,595,572,489,699 +"YEL072W",201,342,399,672,432,169,170,178,280 +"YEL071W",2004,2751,4217,4587,3336,1891,2233,1423,2408 +"YEL070W",51,51,24,6,16,68,43,63,74 +"YEL069C",14,24,18,8,17,34,7,20,24 +"YEL068C",165,183,172,143,118,239,239,168,274 +"YEL067C",113,131,100,54,54,134,121,122,154 +"YEL066W",553,640,608,553,404,604,431,654,1036 +"YEL065W",207,265,256,180,419,158,144,167,271 +"YEL064C",340,377,278,182,262,200,234,287,395 +"YEL063C",1504,2020,3053,5438,4068,638,1014,1014,1400 +"YEL062W",467,541,549,528,425,283,345,362,588 +"YEL061C",585,634,659,635,525,682,466,420,604 +"YEL060C",18565,15128,10254,4207,3118,14864,14607,15288,26234 +"YEL059C-A",221,199,163,141,165,156,220,233,377 +"YEL059W",67,73,67,46,60,42,47,67,116 +"YEL058W",2036,2127,2011,1782,1599,1083,1580,1839,2990 +"YEL057C",637,424,194,38,55,1214,665,661,1113 +"YEL056W",632,624,493,246,394,427,506,501,800 +"YEL055C",1226,1633,1775,2750,2837,557,572,672,1054 +"YEL054C",2066,2759,3277,6365,8497,480,1332,1385,2614 +"YEL053C",625,718,704,817,721,332,393,385,636 +"YEL052W",766,783,688,544,680,1448,722,659,1034 +"YEL051W",1863,1892,1623,1772,1763,1425,1513,1611,2608 +"YEL050C",512,611,575,545,705,2482,650,554,739 +"YNCE0002W",2,6,5,4,13,5,2,8,4 +"YEL049W",75,73,32,18,38,61,61,74,114 +"YEL048C",117,136,144,222,161,34,68,91,136 +"YEL047C",470,543,485,637,455,397,298,345,662 +"YEL046C",1758,2185,2850,3843,2687,303,584,721,1542 +"YEL044W",701,733,584,531,731,790,854,859,1323 +"YEL043W",1046,1216,1237,1533,1187,846,772,726,1085 +"YEL042W",1008,1312,1910,3833,2571,964,822,749,1162 +"YEL041W",5207,6771,6072,1097,94,3361,2951,3452,5940 +"YEL040W",165,240,436,1166,1728,184,368,154,174 +"YEL039C",344,266,189,39,31,560,335,288,506 +"YEL038W",270,304,417,495,162,306,252,295,524 +"YEL037C",2655,2829,2735,3326,2920,1475,2231,1993,3349 +"YEL036C",1289,1608,2025,2669,2289,944,1073,1056,1636 +"YEL035C",20,29,10,11,13,66,55,42,63 +"YEL034W",30064,25153,19821,17772,19263,34531,37181,31901,49088 +"YEL033W",5076,4334,3520,3047,3573,5538,5280,4261,6050 +"YEL032W",1061,1408,1687,2254,2235,340,702,849,1172 +"YEL031W",3033,3501,3386,3389,2489,1403,1836,1804,3107 +"YEL030W",552,614,425,180,136,318,255,266,634 +"YEL029C",328,446,604,950,877,119,206,208,425 +"YEL028W",117,90,54,43,81,71,64,76,140 +"YEL027W",3852,4063,4214,5782,5214,2910,3068,3115,5068 +"YEL026W",302,698,1157,2645,2277,53,166,196,328 +"YEL025C",1015,981,807,572,637,572,699,678,1065 +"YEL024W",4031,3750,2772,1873,3316,6933,6374,5196,6466 +"YEL023C",453,472,384,278,290,245,332,315,579 +"YEL022W",900,1049,1024,1047,1384,349,525,518,806 +"YEL021W",587,698,759,1318,1538,605,604,540,895 +"YEL020W-A",643,652,788,843,848,1696,707,757,1002 +"YNCE0007C",3,4,5,2,8,4,9,2,13 +"YEL020C",1904,1671,1345,972,898,720,1090,1488,2671 +"YEL019C",109,163,159,186,114,36,62,52,115 +"YEL018W",382,444,403,474,564,280,360,300,531 +"YEL017C-A",902,899,803,1384,1362,357,424,575,995 +"YEL017W",449,473,328,206,250,769,566,430,669 +"YEL016C",400,419,379,438,437,369,314,302,482 +"YEL015W",1175,1267,1283,1730,1654,1065,1038,1004,1532 +"YEL014C",57,56,42,44,54,37,47,40,54 +"YEL013W",1608,1537,1155,921,804,1230,1164,1169,1949 +"YEL012W",1605,1455,975,190,409,1550,1637,1655,2618 +"YEL011W",7833,5773,2523,103,551,9324,6467,7188,11443 +"YEL009C-A",22,4,7,6,8,23,9,6,17 +"YEL009C",27370,23805,19814,21250,23648,17432,25826,24988,40088 +"YEL008W",35,26,20,4,12,38,39,26,50 +"YEL007W",1759,1399,1104,1018,2298,1652,1459,1267,1789 +"YEL006W",665,725,717,779,759,456,504,506,817 +"YEL005C",425,441,295,152,126,355,321,373,595 +"YEL004W",381,362,285,210,206,227,241,263,448 +"YEL003W",517,565,510,695,969,320,435,431,714 +"YEL002C",2198,2248,2001,1820,1685,1507,1618,1783,2816 +"YEL001C",872,983,942,1039,1465,866,767,748,1173 +"YER001W",679,1011,1180,1772,1156,254,292,355,621 +"YER002W",896,1188,1713,3280,3067,262,600,742,1214 +"YER003C",874,1005,853,782,820,660,598,741,1169 +"YER004W",5498,4820,3528,1933,1126,4397,5081,5144,8613 +"YER005W",582,620,631,865,916,395,370,385,667 +"YER006W",1207,1760,2623,5872,6115,202,546,537,1091 +"YER007W",352,325,359,342,368,290,239,232,383 +"YER007C-A",786,822,851,1147,1411,418,601,719,1116 +"YNCE0011C",14,11,12,10,5,9,3,10,14 +"YER008C",960,1031,974,994,766,660,657,634,1090 +"YER009W",1337,1495,1314,1645,2725,1353,1345,1415,2033 +"YER010C",1284,1292,977,588,536,1279,1171,1217,2012 +"YER011W",29,19,18,11,19,71,29,23,45 +"YER012W",2903,2865,2225,1732,1559,2439,2862,2681,4183 +"YER013W",470,544,542,621,521,235,319,326,616 +"YER014W",592,638,650,587,186,460,466,534,837 +"YER015W",4891,4697,3145,563,167,11855,6112,4574,6378 +"YER016W",330,388,410,415,537,331,321,314,472 +"YER017C",1300,1211,889,682,1065,2224,1179,1233,1710 +"YER018C",217,207,200,162,277,390,270,241,398 +"YER019W",451,495,435,340,457,475,448,447,714 +"YER019C-A",1165,1031,909,929,1383,1131,1221,1311,1973 +"YER020W",1797,1576,1147,603,956,1765,1410,1662,2718 +"YER021W",5239,5039,3662,2652,2695,4141,4462,4424,6709 +"YER022W",848,864,790,663,702,555,569,575,997 +"YER023W",1626,1514,1347,1305,1013,1847,1683,1773,2659 +"YER024W",5020,4472,3314,974,1427,8872,12120,7411,8699 +"YER025W",2279,2765,2864,4543,5069,1207,1727,1639,2689 +"YER026C",2393,2270,1880,1178,1162,4708,3941,3538,4126 +"YER027C",522,622,500,339,343,555,432,403,635 +"YER028C",84,92,90,63,28,49,49,53,124 +"YER029C",526,550,598,721,875,485,517,554,825 +"YER030W",2516,2289,2000,1377,1131,3118,2814,2475,3881 +"YER031C",816,919,693,708,878,778,960,893,1402 +"YER032W",367,469,435,396,299,450,398,259,419 +"YER033C",390,425,335,315,264,318,252,257,402 +"YER034W",366,337,334,303,268,244,355,384,609 +"YER035W",605,539,535,382,226,364,396,488,883 +"YER036C",2397,3561,5734,11910,5578,439,780,1089,2426 +"YER037W",486,522,508,443,228,265,263,348,626 +"YER038C",287,320,328,332,275,124,170,185,348 +"YER039C",251,213,171,69,56,167,192,218,377 +"YER039C-A",162,162,116,41,29,162,147,153,301 +"YER040W",645,724,632,602,548,333,404,392,557 +"YER041W",387,445,443,331,234,311,334,292,524 +"YER042W",1967,2124,1655,1593,1264,1452,1362,1661,2869 +"YER043C",2678,4151,6971,14450,9587,3209,3243,2504,3099 +"YER044C",1108,1042,734,469,476,2106,1354,1260,1805 +"YER044C-A",22,27,40,67,49,24,7,8,18 +"YER045C",255,294,459,624,605,217,155,212,315 +"YER046W",278,270,211,102,214,227,265,283,495 +"YER047C",771,905,765,713,709,640,675,625,956 +"YER048C",1675,1637,1323,1146,1293,2447,1719,1553,2316 +"YER048W-A",461,446,374,303,374,1199,543,469,648 +"YER049W",887,1251,1939,4128,3561,297,535,514,866 +"YER050C",523,533,465,401,601,1728,688,540,787 +"YER051W",533,558,414,305,368,331,383,409,642 +"YER052C",2925,2813,3683,5884,2056,343,1487,1476,3083 +"YER053C",1216,818,394,101,206,2177,985,1095,2013 +"YER053C-A",8510,4964,1771,515,1281,6126,7286,7060,10297 +"YER054C",5863,3758,1423,58,83,9871,5170,5525,9235 +"YER055C",2411,2731,3088,5522,6139,2392,2065,1920,3258 +"YER056C",2571,4575,10135,19583,10323,313,1108,1448,2500 +"YER056C-A",1415,1746,2063,3951,5164,281,808,775,1670 +"YER057C",1437,1390,1232,1254,1149,1311,1072,1173,1895 +"YER058W",240,219,170,122,138,1479,332,282,348 +"YER059W",578,542,420,196,274,388,483,515,778 +"YER060W",494,536,589,894,735,245,290,305,485 +"YER060W-A",271,361,443,637,437,133,131,183,259 +"YER061C",341,502,643,1009,415,170,140,175,303 +"YER062C",625,1330,4291,9256,1478,169,272,352,672 +"YER063W",564,675,596,569,519,515,525,565,872 +"YER064C",222,387,765,465,408,71,132,114,224 +"YER065C",1914,1957,1478,785,809,1933,2631,1913,3051 +"YNCE0015C",3,15,7,5,5,5,5,6,9 +"YER066W",257,292,192,90,112,343,295,304,441 +"YER067W",761,375,125,34,210,5226,889,2731,2721 +"YER068W",754,844,841,868,1090,569,770,617,901 +"YER069W",6500,5321,4666,7699,5692,1021,3717,3615,6808 +"YER070W",908,1310,1121,1022,2946,624,420,521,891 +"YER071C",228,257,194,176,225,305,254,227,377 +"YER072W",599,667,650,756,961,359,461,451,703 +"YER073W",2069,2675,4324,9510,2840,375,1028,1095,2120 +"YER074W",2784,3098,3248,5133,9063,859,2031,2276,4367 +"YER074W-A",505,547,406,362,468,466,471,485,796 +"YER075C",867,987,973,917,929,604,477,625,999 +"YER076C",180,193,169,144,168,165,153,172,261 +"YER077C",450,434,544,598,521,427,332,251,498 +"YER078C",395,369,273,239,458,851,324,304,494 +"YER079W",1064,915,618,271,264,1049,934,956,1509 +"YER080W",1838,1804,1370,767,690,2774,1606,1570,2431 +"YNCE0017W",126,81,50,49,153,103,83,88,140 +"YER081W",1141,1170,1313,4691,1893,697,1027,964,1565 +"YER082C",792,1127,1753,3076,2489,265,475,525,964 +"YER083C",670,695,720,669,648,300,368,436,717 +"YER084W",157,163,77,15,30,104,91,137,261 +"YER085C",14,9,31,58,19,4,9,10,16 +"YER086W",1968,2401,3258,6941,4281,706,1174,1312,2204 +"YER087W",282,314,320,202,164,1063,315,247,365 +"YER087C-B",545,561,452,479,629,478,482,444,726 +"YER088C",1847,1782,1694,1704,1519,2304,1650,1485,2332 +"YER089C",927,922,952,937,899,695,770,709,1146 +"YER090W",1391,1272,1321,1636,1376,567,1046,955,1682 +"YER091C",8908,13446,19294,51294,21193,2125,3171,4188,7890 +"YER092W",469,535,526,598,540,220,416,460,712 +"YER093C",642,717,727,782,690,454,424,418,633 +"YER093C-A",209,224,183,124,154,666,284,231,342 +"YER094C",2759,2475,1961,1333,1501,2786,3263,3165,4756 +"YER095W",1442,1487,1202,577,897,1289,1187,1482,2458 +"YER096W",846,907,701,378,142,125,325,468,1056 +"YER098W",403,449,433,267,576,328,269,247,471 +"YER099C",792,812,740,891,1041,723,711,718,1284 +"YER100W",1499,1526,1390,1211,1294,1098,1263,1250,2160 +"YER101C",482,472,359,175,169,407,353,342,683 +"YER102W",1273,1558,1899,3492,5955,371,933,899,1695 +"YER103W",11538,8717,6113,2090,444,7814,5677,6962,16286 +"YER104W",250,269,222,108,140,245,229,220,374 +"YER105C",1845,2022,1793,1792,1960,1185,1297,1290,1883 +"YER106W",91,106,94,92,51,37,56,67,109 +"YER107C",564,626,618,577,645,525,647,600,818 +"YER109C",283,355,372,498,383,180,221,183,292 +"YER110C",2163,2862,3426,6835,6802,513,1013,1118,1993 +"YER111C",1155,1181,946,382,1106,673,807,830,1166 +"YER112W",1067,1049,970,1020,1108,910,1063,939,1221 +"YER113C",493,591,537,647,878,328,330,292,537 +"YER114C",1168,1151,1151,1492,1312,600,679,669,1075 +"YER115C",224,190,133,104,123,171,175,180,332 +"YER116C",366,410,320,223,208,255,293,295,529 +"YER117W",3246,3689,3974,6765,11859,1286,3020,2867,5142 +"YER118C",508,632,603,721,904,323,381,381,628 +"YER119C",789,698,471,163,229,825,652,650,1119 +"YER120W",1720,1921,1662,1636,1647,1443,1583,1301,2177 +"YER121W",1295,963,462,78,55,3392,2245,2113,2892 +"YER122C",2118,2168,2307,3135,3575,1952,2078,1676,2514 +"YER123W",790,799,854,967,700,525,680,601,864 +"YER124C",3344,1938,1747,2913,1807,412,870,4740,7821 +"YER125W",2672,2571,1752,1262,1912,2668,2334,2340,3560 +"YER126C",825,1260,1992,4474,3724,70,435,469,871 +"YER127W",395,616,1175,2450,1608,64,204,219,371 +"YER128W",362,370,444,498,330,249,319,283,419 +"YER129W",1099,1121,1049,1076,1433,736,819,764,1319 +"YER130C",361,438,431,546,764,225,295,332,465 +"YER131W",2121,3007,3962,8133,14259,490,1255,1206,2572 +"YNCE0019W",44,37,28,48,98,37,39,41,69 +"YER132C",436,587,657,702,581,232,286,267,415 +"YER133W",3495,3355,2710,2815,3327,3223,3166,3312,4911 +"YER134C",267,304,234,288,361,373,264,279,406 +"YER135C",23,18,18,5,7,29,20,15,30 +"YER136W",3878,3812,2813,1338,1306,3699,3288,3246,4766 +"YER137C",91,110,190,321,398,23,42,45,88 +"YNCE0024W",42,27,29,31,78,66,112,78,158 +"YER139C",512,577,464,388,235,301,340,368,610 +"YER140W",328,410,475,485,484,151,250,267,386 +"YER141W",2011,1816,1336,790,770,5434,2257,1823,2708 +"YER142C",1387,1363,1081,388,329,728,889,1007,1667 +"YER143W",1897,1869,1499,599,623,1831,1794,1760,2650 +"YER144C",912,894,882,620,489,706,683,723,1036 +"YER145C",1738,2183,2311,2248,2283,1047,1370,1413,2437 +"YER145C-A",11,16,12,14,36,19,26,14,11 +"YER146W",36,22,29,44,75,41,56,49,81 +"YER147C",513,554,558,451,516,408,398,480,749 +"YER148W",945,1065,1212,2151,2526,788,992,898,1359 +"YER149C",414,545,625,744,685,267,278,299,490 +"YER150W",1058,905,555,221,132,2261,785,793,1479 +"YER151C",1064,1269,1593,2422,1115,912,793,784,1245 +"YER152C",922,799,703,560,458,1042,699,905,1596 +"YER153C",130,133,103,69,52,104,99,128,218 +"YER154W",484,511,498,642,777,721,403,390,629 +"YER155C",1681,1849,1575,1836,1981,1273,1164,1069,1588 +"YER156C",474,688,818,1599,1922,308,496,452,646 +"YER157W",613,696,682,785,623,353,447,396,681 +"YER158C",498,799,1356,2486,2184,321,234,355,478 +"YER159C",1580,1259,1159,1172,1676,1434,1917,1718,2532 +"YER161C",570,584,576,620,827,506,615,570,827 +"YER162C",905,884,738,576,603,586,610,633,1133 +"YER163C",209,263,223,250,407,488,195,179,257 +"YER164W",1226,1344,1180,1395,1285,808,798,756,1185 +"YER165W",6400,7258,8156,13026,10731,2314,3591,3872,6825 +"YER166W",1481,1592,1380,1038,779,1151,981,940,1555 +"YER167W",988,1120,1037,947,839,450,754,775,1208 +"YER168C",342,491,510,729,954,303,356,277,440 +"YER169W",808,937,1317,1997,302,447,413,555,1008 +"YER170W",238,234,160,80,262,853,358,302,329 +"YER171W",752,784,697,776,1212,487,572,528,827 +"YER172C",943,1115,1009,1101,1291,495,570,579,919 +"YER173W",477,475,372,282,354,371,413,383,620 +"YER174C",850,911,740,740,1317,646,755,841,1340 +"YER175C",864,729,538,361,243,466,537,528,891 +"YER175W-A",18,31,23,12,19,13,8,10,37 +"YER176W",802,881,953,1176,869,626,585,572,923 +"YER177W",10505,9524,7240,4638,2131,11209,9349,9914,15477 +"YER178W",5224,5017,3923,2952,1770,5660,4941,4696,7490 +"YER179W",121,121,66,46,44,256,128,98,170 +"YER180C",272,267,234,243,286,140,157,194,342 +"YER180C-A",73,87,65,69,59,36,71,56,94 +"YER181C",10,10,2,3,4,5,6,3,12 +"YER182W",997,872,607,271,378,4333,1241,1061,1668 +"YER183C",294,318,288,296,379,202,253,252,354 +"YER184C",348,396,342,266,157,167,162,187,358 +"YER185W",148,166,100,120,127,101,72,103,184 +"YER186C",452,488,400,348,524,325,383,324,620 +"YER187W",57,79,77,84,114,44,53,53,81 +"YER188W",69,69,65,34,48,76,75,67,103 +"YER188C-A",12,10,13,7,6,11,8,9,12 +"YER190W",3,4,3,2,2,6,2,6,3 +"YFL067W",38,36,39,28,54,39,39,43,45 +"YFL066C",5,7,5,4,10,2,4,1,11 +"YFL062W",38,17,11,12,7,21,19,23,49 +"YFL061W",10,19,12,6,13,6,10,10,12 +"YFL060C",22,39,46,48,52,13,16,15,35 +"YFL059W",125,182,175,200,313,336,86,101,176 +"YFL058W",154,168,117,79,33,150,127,122,230 +"YFL056C",268,268,232,262,242,182,213,244,370 +"YFL055W",435,575,575,445,313,306,292,299,508 +"YFL054C",828,851,635,129,447,1599,977,861,1206 +"YFL053W",83,61,74,62,63,235,62,48,71 +"YFL052W",120,152,92,24,170,302,115,126,150 +"YFL051C",59,50,41,9,75,136,64,54,46 +"YFL050C",337,364,434,501,505,210,233,288,424 +"YFL049W",892,867,796,675,862,727,817,774,1069 +"YFL048C",992,990,895,757,1067,896,929,897,1276 +"YFL047W",595,741,794,693,812,408,364,393,651 +"YFL046W",685,710,635,553,525,720,735,697,1006 +"YFL045C",1884,1795,1350,1449,3148,2023,1676,1639,2824 +"YFL044C",1866,1746,1320,885,601,1335,1428,1440,2586 +"YFL042C",1061,916,620,191,176,949,807,883,1351 +"YFL041W-A",40,35,24,3,9,31,32,40,68 +"YFL041W",1367,1425,1240,929,941,1690,1124,1126,1737 +"YFL040W",150,146,107,58,63,83,84,89,177 +"YFL039C",12457,10263,8306,7037,5979,10306,9749,11095,20043 +"YFL038C",4561,4433,3861,3045,3701,6411,5638,5482,8258 +"YFL037W",2131,2118,2105,2413,2113,3640,2762,2194,3110 +"YNCF0001C",51,46,42,57,50,65,46,25,40 +"YFL036W",1051,1214,1157,992,1167,2024,933,799,1195 +"YFL034C-B",221,306,395,358,304,164,192,169,262 +"YFL034C-A",736,888,1235,2318,2254,131,434,537,994 +"YFL034W",598,653,626,527,601,540,536,487,741 +"YFL033C",1448,1502,1206,811,379,897,775,844,1446 +"YFL031W",1282,1404,1283,1835,2711,768,855,820,1342 +"YFL030W",3775,3653,2932,1510,566,8868,4168,4163,6264 +"YFL029C",398,435,333,262,163,458,436,417,614 +"YFL028C",678,787,893,1131,1279,538,602,554,899 +"YFL027C",418,476,430,386,295,265,305,331,488 +"YFL026W",217,229,154,157,206,192,204,225,297 +"YFL025C",511,575,487,535,717,444,249,287,466 +"YFL024C",1357,870,615,761,865,1492,1538,1265,1635 +"YFL023W",503,736,964,1422,999,101,204,264,526 +"YFL022C",1006,1585,2217,3924,3653,399,600,581,1031 +"YFL021W",2284,2326,2649,3575,5780,616,1770,2025,2973 +"YFL020C",30,26,24,11,8,27,15,16,31 +"YFL019C",29,37,23,11,10,31,17,24,44 +"YFL018C",5382,5214,3957,2595,2951,7115,5437,5121,7512 +"YFL017W-A",152,211,171,162,191,139,193,200,268 +"YFL017C",247,264,256,238,285,428,324,269,384 +"YFL016C",2214,2006,1348,467,795,4725,2017,1901,3541 +"YFL014W",96319,57968,28940,8136,921,80232,95421,109971,203911 +"YFL013C",1308,1287,1120,790,975,1371,1294,1204,1900 +"YFL012W",29,34,20,29,33,14,14,37,48 +"YFL011W",408,381,237,53,12,424,224,261,462 +"YFL010W-A",46,52,60,79,93,23,39,24,63 +"YFL010C",430,547,627,792,864,256,312,301,509 +"YFL009W",505,509,511,624,816,399,412,421,713 +"YFL008W",1483,1575,1039,526,972,1175,1045,1299,1921 +"YFL007W",5816,5747,4276,2105,1373,3465,3665,3927,6468 +"YFL005W",2033,1994,1647,1453,1631,2244,2007,1936,3247 +"YNCF0003C",171,189,140,125,148,185,154,162,263 +"YFL004W",2108,2130,1672,1549,1563,1574,1318,1318,2332 +"YFL003C",95,112,110,158,81,81,79,85,130 +"YFL002C",668,811,1057,1775,1435,244,409,415,718 +"YFL001W",274,401,548,1031,1071,156,222,237,317 +"YFR001W",1104,1346,1547,2087,2672,575,871,819,1328 +"YFR002W",1261,1517,1419,1835,1856,730,941,903,1343 +"YFR003C",826,742,508,207,235,1082,856,811,1290 +"YFR004W",3279,2993,2278,1838,2109,2894,3203,3153,4770 +"YFR005C",296,327,328,336,375,178,255,278,439 +"YFR006W",2134,1885,1592,1158,904,2036,1940,1819,2946 +"YFR007W",264,242,201,123,169,847,288,228,334 +"YFR008W",358,337,251,96,157,298,306,292,547 +"YFR009W",985,1224,1426,2266,2461,592,713,698,1127 +"YFR010W",2772,2585,2163,1510,1182,2362,2311,2241,3686 +"YFR011C",568,628,651,694,665,1370,850,653,806 +"YFR012W",61,89,69,59,85,33,40,31,51 +"YFR012W-A",3,9,11,12,9,5,3,4,7 +"YFR013W",583,662,669,637,680,373,431,373,672 +"YFR014C",1510,1385,1211,878,549,1374,1142,1269,2118 +"YFR015C",1213,849,439,65,151,4499,1470,1336,2062 +"YFR016C",1532,1487,1269,953,1177,1411,1103,1142,1895 +"YFR017C",1481,994,529,81,266,2586,1672,1614,2221 +"YFR018C",533,529,373,308,461,658,503,569,959 +"YFR019W",999,930,741,334,277,716,651,686,1055 +"YFR020W",620,651,512,546,558,522,470,465,767 +"YFR021W",319,355,275,194,169,225,257,206,385 +"YFR022W",327,274,193,139,228,338,221,238,424 +"YFR023W",157,152,137,110,112,83,96,100,154 +"YFR024C-A",2289,2302,1715,1019,767,2081,2017,2058,3366 +"YFR025C",538,618,597,608,679,660,604,531,862 +"YFR026C",62,86,54,23,62,104,70,57,131 +"YFR027W",193,232,165,99,213,185,162,176,325 +"YFR028C",571,704,724,774,999,619,750,598,834 +"YFR029W",454,538,585,479,541,305,358,378,524 +"YFR030W",4963,7330,8424,17821,16411,2331,2466,2543,4288 +"YFR031C",770,829,837,801,650,607,597,540,851 +"YFR031C-A",2846,3558,4034,6634,10343,849,2329,2285,4143 +"YFR032C-A",1536,1591,1702,2481,4754,444,1213,1555,2740 +"YFR032C-B",59,44,46,57,54,10,48,44,63 +"YFR033C",4232,3404,2968,2574,4152,12185,10616,6438,8044 +"YFR034C",520,562,712,988,901,375,462,483,817 +"YFR035C",276,296,268,322,297,223,248,253,450 +"YFR036W",152,174,268,320,269,102,142,148,241 +"YFR037C",1615,1763,1759,1925,2138,1755,1899,1712,2788 +"YFR038W",680,780,689,518,612,376,397,472,771 +"YFR039C",835,924,796,714,797,580,731,737,1161 +"YFR040W",1999,1788,1459,1586,1893,1714,1554,1626,2140 +"YFR041C",519,518,360,282,481,387,397,336,615 +"YFR042W",231,247,195,121,191,292,216,200,297 +"YFR043C",464,440,357,279,332,419,392,358,538 +"YFR044C",1749,1520,1267,956,429,2248,1770,1568,2607 +"YFR045W",325,341,236,112,142,701,379,325,524 +"YFR046C",244,304,286,180,246,270,243,227,370 +"YFR047C",1623,1478,1171,986,811,1700,1281,1480,2768 +"YFR048W",379,395,393,493,522,277,298,253,406 +"YFR049W",1330,1207,843,308,517,1746,1447,1418,2080 +"YFR050C",2979,2823,2041,1374,1613,2929,3304,3087,4887 +"YFR051C",1065,1086,967,918,1028,877,878,791,1253 +"YFR052W",1968,1926,1451,1135,1153,1858,2022,1904,2830 +"YFR053C",13687,8721,4129,906,2149,81340,15955,12284,19440 +"YFR054C",12,10,8,4,13,34,9,7,14 +"YFR055W",31,44,59,150,154,22,28,23,30 +"YGL263W",6,8,8,13,4,9,3,12,10 +"YGL262W",17,28,11,8,9,20,18,20,29 +"YGL259W",2,5,3,1,1,17,7,7,13 +"YGL258W",27,28,19,25,26,19,21,22,43 +"YGL257C",826,882,750,692,602,576,665,628,1016 +"YGL256W",461,490,536,765,572,302,320,364,562 +"YGL255W",285,354,604,2642,808,163,165,195,390 +"YGL254W",427,485,443,403,386,239,345,352,594 +"YGL253W",2371,2993,3820,3195,7637,1395,2000,2024,2893 +"YGL252C",1479,1451,1365,1080,1642,1367,1490,1362,1882 +"YGL251C",363,277,190,151,185,356,303,259,453 +"YGL250W",507,437,316,68,119,582,512,504,838 +"YGL249W",15,12,12,17,11,11,9,15,24 +"YGL248W",567,666,555,482,508,657,574,533,845 +"YGL247W",179,162,154,180,262,194,171,198,317 +"YGL246C",269,440,595,1062,996,132,220,246,339 +"YGL245W",3935,4239,3788,4686,4535,2543,2670,2737,4622 +"YGL244W",1801,1837,1862,1975,2393,1322,1460,1330,2031 +"YGL243W",357,376,360,357,443,204,237,304,472 +"YGL242C",469,519,411,294,245,559,468,442,668 +"YGL241W",775,793,637,465,554,542,509,529,835 +"YGL240W",168,187,181,143,59,80,65,80,133 +"YGL238W",1726,1911,1782,2137,1830,1189,1194,1076,1693 +"YGL237C",442,374,332,209,377,660,441,447,582 +"YGL236C",255,302,352,374,419,859,236,194,308 +"YGL234W",2697,3320,3639,7480,8549,1275,1407,1674,2844 +"YGL233W",941,953,781,586,535,671,617,609,918 +"YGL232W",496,518,490,597,813,412,405,398,632 +"YGL231C",760,846,749,779,839,791,797,715,1105 +"YGL230C",37,40,29,23,37,41,34,34,81 +"YGL229C",81,57,42,12,39,395,128,143,153 +"YGL228W",2718,2351,1841,1190,1386,2119,2194,2256,3838 +"YGL227W",2030,1754,1030,112,284,1637,1213,1304,2163 +"YGL226C-A",461,465,359,372,433,669,498,495,784 +"YGL226W",193,153,138,92,157,509,222,259,333 +"YNCG0002C",10,13,4,10,10,13,6,7,15 +"YGL225W",848,1204,1833,3606,2541,384,575,563,829 +"YGL224C",383,396,332,351,542,364,348,342,556 +"YGL223C",613,742,664,849,674,547,549,552,840 +"YGL222C",171,185,148,149,126,91,100,116,132 +"YGL221C",1052,1090,985,951,949,1020,973,1029,1621 +"YGL220W",680,614,577,619,814,655,699,758,1130 +"YGL219C",1043,997,925,646,806,1380,994,878,1278 +"YGL216W",336,396,332,336,312,275,255,246,335 +"YGL215W",1346,1589,2169,4293,3327,1008,1072,911,1391 +"YGL213C",644,748,645,644,734,519,620,573,885 +"YGL212W",204,231,204,200,208,228,242,187,309 +"YGL211W",547,657,777,1164,1261,370,411,474,733 +"YGL210W",705,633,521,468,757,620,725,682,1044 +"YGL209W",326,267,246,43,67,425,246,259,489 +"YGL208W",510,495,326,65,200,1362,599,605,884 +"YGL207W",3769,3661,3019,2365,2699,2289,2683,2737,4300 +"YGL206C",4055,4203,3185,1928,1596,3085,2481,2608,3980 +"YGL205W",10069,8358,4365,380,68,37981,18630,13152,16311 +"YNCG0003C",7,8,2,2,2,39,11,7,11 +"YGL204C",132,118,73,75,159,122,123,106,169 +"YGL203C",929,1062,1134,1618,1341,755,759,674,1139 +"YGL202W",1348,1676,2264,4981,5029,745,1000,879,1311 +"YGL201C",924,1059,1001,1120,1582,426,657,702,1064 +"YGL200C",1578,1526,1315,1071,1709,1994,1614,1796,2639 +"YGL198W",555,477,431,226,336,649,609,639,1065 +"YGL197W",3093,2604,1776,830,768,2359,2164,2090,3204 +"YGL196W",3014,2731,1990,1640,1147,1669,2055,2368,4151 +"YGL195W",1917,2104,2026,2383,3589,1184,1329,1330,1994 +"YGL194C-A",100,109,69,66,124,147,120,124,186 +"YGL194C",315,362,340,307,314,165,173,190,269 +"YNCG0006C",7,5,3,5,5,6,5,4,12 +"YGL191W",3290,2790,2084,1331,2063,5678,5287,4037,5602 +"YGL190C",1616,1498,1157,694,737,990,1159,1189,1979 +"YGL189C",3672,4178,4448,7204,8934,941,2113,2301,4325 +"YGL188C-A",21,27,25,61,35,2,11,9,29 +"YGL187C",3219,2932,2232,1484,2313,4592,4838,3837,4923 +"YGL186C",1131,1295,1323,1746,1801,450,675,693,1287 +"YGL185C",629,673,589,540,499,452,531,596,912 +"YGL184C",1926,1915,1712,4070,888,216,845,906,1758 +"YGL183C",66,67,49,52,60,34,36,34,75 +"YGL181W",995,959,807,502,668,996,1014,919,1494 +"YGL180W",1352,1294,743,267,263,451,663,656,1376 +"YGL179C",94,85,77,69,101,334,96,72,121 +"YGL178W",590,701,794,1513,877,413,363,381,558 +"YGL176C",457,456,385,284,325,269,372,342,545 +"YGL175C",115,119,92,54,90,88,70,72,82 +"YGL174W",212,197,180,200,263,116,116,103,238 +"YGL173C",3565,3461,2627,2196,1798,2810,2484,2374,3624 +"YGL172W",699,826,809,804,866,658,734,617,1046 +"YGL171W",404,653,1040,2160,2084,84,207,225,407 +"YGL170C",83,80,65,65,91,70,46,74,112 +"YGL169W",361,552,664,1137,1162,174,204,219,474 +"YGL168W",69,67,48,64,111,52,61,51,95 +"YGL167C",1521,1434,1168,846,1392,903,1030,1036,1685 +"YGL166W",368,436,365,260,427,268,312,415,709 +"YGL164C",692,748,630,513,581,462,483,488,832 +"YGL163C",654,764,849,810,730,442,415,460,814 +"YGL162W",111,149,206,256,447,134,121,89,141 +"YGL161C",1053,995,657,315,347,1545,1259,1188,1810 +"YGL160W",870,766,545,272,543,965,910,809,1294 +"YGL159W",506,603,508,525,473,331,334,384,711 +"YGL158W",6,5,18,6,12,17,13,7,12 +"YGL157W",52,78,92,110,48,47,45,46,72 +"YGL156W",5411,4773,3045,948,126,4131,3393,3859,6489 +"YGL155W",367,435,398,460,481,264,268,291,443 +"YGL154C",487,454,287,184,299,718,608,529,822 +"YGL153W",745,842,662,415,471,1437,908,822,1192 +"YGL151W",1084,992,726,527,828,722,669,674,1030 +"YGL150C",1927,2084,1829,1787,1286,1032,1132,1199,1984 +"YGL149W",35,41,34,26,19,20,24,18,33 +"YGL148W",1117,1354,1673,2733,2676,427,922,931,1530 +"YGL147C",1360,2105,2764,6289,12439,273,721,834,1680 +"YGL146C",258,299,305,156,198,143,192,210,272 +"YGL145W",776,799,770,738,874,532,610,610,985 +"YGL144C",439,511,651,656,415,166,260,255,427 +"YGL143C",347,361,330,284,421,1523,388,329,462 +"YGL142C",706,765,575,403,546,565,554,506,790 +"YGL141W",1158,1167,901,509,479,704,730,703,1250 +"YGL140C",1277,1387,1355,1302,1193,705,711,729,1272 +"YGL139W",1374,1408,1323,1340,1495,1243,1168,1060,1565 +"YGL138C",8,9,8,1,6,4,4,5,10 +"YGL137W",3553,3489,2893,2704,2610,2865,2739,2690,4126 +"YGL136C",568,567,455,420,466,470,477,493,756 +"YGL135W",1621,1934,1961,3657,5803,393,1103,1252,2085 +"YGL134W",785,757,536,348,529,702,875,734,1156 +"YGL133W",1462,1705,1601,1581,901,656,798,778,1378 +"YGL131C",778,970,965,608,341,282,352,381,624 +"YGL130W",722,826,746,669,809,511,576,591,939 +"YGL129C",462,494,553,523,461,1626,492,412,590 +"YGL128C",253,253,261,196,135,179,138,133,261 +"YGL127C",156,180,227,248,149,130,173,126,247 +"YGL126W",372,381,407,510,315,417,475,449,704 +"YGL125W",1397,1523,1862,3269,1750,627,1128,994,1353 +"YGL124C",540,600,391,239,314,501,396,397,691 +"YGL123W",10225,12025,13508,23037,41360,3021,7537,7638,13693 +"YGL122C",1025,1241,1336,1691,1876,820,885,800,1196 +"YGL121C",4000,3589,2634,1423,424,2144,2150,3213,5655 +"YGL120C",586,1153,2325,6755,3660,62,242,272,561 +"YGL119W",427,477,605,607,275,419,281,276,440 +"YGL118C",22,13,6,6,14,8,15,16,21 +"YGL117W",814,706,1067,742,453,369,799,620,1189 +"YGL116W",407,419,386,179,166,365,698,501,581 +"YGL115W",827,785,584,446,924,1432,922,906,1261 +"YGL114W",988,1108,1008,931,910,637,701,704,1220 +"YGL113W",352,355,411,388,393,290,330,309,412 +"YGL112C",925,973,883,897,967,691,714,689,1085 +"YGL111W",525,715,990,2013,2055,170,302,317,557 +"YGL110C",766,839,771,759,888,594,541,559,997 +"YGL108C",408,378,342,394,439,353,361,377,548 +"YGL107C",457,535,476,577,686,1515,491,364,576 +"YGL106W",955,913,838,820,1098,1363,1191,1049,1641 +"YGL105W",3295,3592,3438,4230,3926,1834,2220,2095,3922 +"YGL104C",435,412,241,93,37,507,279,315,590 +"YGL103W",6750,7304,7948,13296,21788,2290,5875,6425,11292 +"YGL101W",300,331,352,368,382,357,458,286,407 +"YGL100W",886,930,895,902,925,749,785,765,1227 +"YGL099W",389,612,776,1596,1509,95,259,261,433 +"YNCG0010W",11,16,13,13,17,12,18,11,15 +"YGL098W",501,596,494,324,444,282,347,349,585 +"YGL097W",487,648,871,1767,2022,506,584,484,680 +"YGL096W",1102,826,823,605,587,1227,1136,1129,1819 +"YGL095C",1049,1105,873,650,877,875,854,797,1243 +"YGL094C",1153,1184,1153,940,696,639,706,755,1154 +"YGL093W",1063,1110,906,569,487,1091,870,834,1387 +"YGL092W",1121,1310,1404,2054,1847,906,913,786,1162 +"YGL091C",563,564,548,466,679,431,520,482,716 +"YGL090W",482,508,429,388,302,264,277,238,487 +"YGL089C",168,186,184,235,687,521,114,115,181 +"YGL087C",831,836,666,483,476,889,851,796,1314 +"YGL086W",937,916,921,1017,971,559,669,674,1064 +"YGL085W",338,407,449,539,459,313,370,277,489 +"YGL084C",1135,1111,885,524,483,1137,1011,910,1358 +"YGL083W",362,480,358,330,287,340,294,238,380 +"YGL082W",1002,985,857,526,563,1185,947,927,1385 +"YGL081W",252,250,179,90,65,234,125,161,330 +"YGL080W",1609,1459,1026,428,539,2837,2066,2106,2434 +"YGL079W",382,389,337,325,329,227,270,301,472 +"YGL078C",836,1471,2362,6416,5418,115,283,317,707 +"YGL077C",2220,2829,3295,5122,4037,1536,2980,2712,3495 +"YGL076C",2175,2414,2689,4454,6644,516,1363,1463,2547 +"YNCG0014C",18,14,14,41,27,6,12,8,11 +"YGL075C",245,266,203,130,189,145,151,161,267 +"YGL073W",1575,1502,1206,803,834,1007,1005,1041,1644 +"YGL071W",356,413,409,428,415,241,252,265,387 +"YGL070C",182,269,337,541,810,195,290,218,315 +"YGL068W",564,590,568,593,858,4507,833,594,855 +"YGL067W",429,455,473,549,711,266,287,268,426 +"YGL066W",1117,1099,887,667,870,723,879,815,1290 +"YGL065C",559,618,494,415,526,415,407,393,693 +"YGL064C",174,224,292,342,392,229,137,128,214 +"YGL063W",109,119,116,125,238,87,109,94,159 +"YGL062W",5963,6541,6134,4266,5677,7155,5086,4384,6905 +"YGL061C",296,343,317,276,443,261,259,226,430 +"YGL060W",515,541,421,234,276,324,327,379,616 +"YGL059W",1229,1053,707,234,206,663,856,931,1592 +"YGL058W",568,602,663,727,758,447,543,505,914 +"YGL057C",284,351,323,307,256,194,200,191,344 +"YGL056C",1183,1393,1614,1340,996,1127,1395,1050,1420 +"YGL055W",23708,24739,20332,13306,11545,29727,29506,15057,22387 +"YGL054C",1104,1103,965,1297,1596,872,889,1014,1476 +"YGL053W",310,294,227,92,124,425,312,354,544 +"YGL051W",54,64,47,52,36,71,41,48,76 +"YGL050W",416,399,355,464,810,315,357,337,534 +"YGL049C",623,757,841,1021,814,486,462,418,727 +"YGL048C",3820,4072,3367,2662,2264,3394,3628,3284,5384 +"YGL047W",419,457,398,185,92,313,384,420,668 +"YNCG0018C",4,5,2,1,1,2,2,6,4 +"YGL045W",645,575,400,393,533,441,546,571,968 +"YGL044C",524,517,490,473,799,408,454,396,673 +"YGL043W",652,761,776,916,934,413,516,526,821 +"YGL041W-A",322,325,290,329,430,445,374,331,565 +"YGL040C",671,745,792,712,948,1639,711,561,934 +"YGL039W",203,212,182,170,224,231,256,160,290 +"YGL038C",691,746,564,164,532,453,456,503,832 +"YGL037C",8087,5720,2987,541,568,10158,6713,7919,13992 +"YGL036W",1170,1251,852,627,757,938,820,805,1376 +"YGL035C",1297,1490,1730,627,821,1266,1207,1235,1677 +"YGL034C",2,2,3,1,5,10,2,9,7 +"YGL033W",35,33,29,27,12,28,17,22,44 +"YGL032C",39,32,19,14,11,26,37,35,60 +"YGL031C",4712,5507,5662,9342,16887,1233,2872,3159,6382 +"YGL030W",4061,4890,5045,7959,14517,1321,3027,3775,6581 +"YGL029W",464,658,1036,2200,2177,30,161,197,427 +"YGL028C",1558,1006,1090,2395,778,341,810,3279,3940 +"YGL027C",1045,1053,971,763,715,648,684,681,1136 +"YGL026C",2864,3008,3214,4926,2757,1050,1850,1915,3266 +"YGL025C",507,567,516,497,602,330,441,436,684 +"YGL023C",1570,1459,1394,1168,1332,1073,1216,1230,1858 +"YGL022W",1522,1609,1538,1495,1550,1357,1328,1316,1972 +"YGL021W",363,435,362,290,219,1318,1745,937,703 +"YGL020C",622,706,661,756,986,573,560,547,940 +"YGL019W",1067,1105,1208,1224,1377,1130,994,997,1775 +"YGL018C",158,177,212,232,104,225,122,109,192 +"YGL017W",357,356,428,373,156,248,269,299,508 +"YGL016W",613,645,481,433,1154,402,426,396,640 +"YGL015C",11,5,10,8,15,6,5,11,10 +"YGL014W",1448,1583,1701,2622,2502,986,1103,1045,1580 +"YGL013C",1677,1889,1748,1778,1054,889,973,934,1457 +"YGL012W",591,956,1470,3019,5191,970,539,516,642 +"YGL011C",2706,2405,2012,1496,1353,1998,2105,2001,3369 +"YGL010W",703,625,337,70,236,693,641,587,961 +"YGL009C",3538,4661,6317,13795,12213,2060,1959,2113,3689 +"YGL008C",18294,28140,37219,100452,64171,18336,24284,15198,16191 +"YGL007C-A",13,12,8,3,1,22,21,16,26 +"YGL007W",140,67,43,34,24,157,187,167,232 +"YGL006W-A",31,21,12,7,3,24,22,14,26 +"YGL006W",3643,3466,2622,1273,1057,3249,2588,2819,4477 +"YGL005C",860,933,857,705,681,856,754,773,1368 +"YGL004C",540,569,449,232,287,468,414,422,716 +"YGL003C",625,612,512,312,459,428,438,479,751 +"YGL002W",448,448,337,213,309,419,391,403,657 +"YGL001C",717,794,795,863,1121,896,840,759,1044 +"YGR001C",758,826,777,1063,1416,381,486,563,1014 +"YGR002C",424,460,430,411,499,426,380,333,553 +"YGR003W",746,827,783,735,733,320,422,514,841 +"YGR004W",249,282,282,354,451,141,183,183,293 +"YGR005C",1256,1253,1077,976,1517,1038,1039,1020,1641 +"YGR006W",194,189,159,104,114,113,147,151,240 +"YGR007W",542,623,614,649,736,561,555,516,815 +"YGR008C",5571,3400,1249,116,211,12456,6922,7643,11253 +"YGR009C",1296,1384,1753,1978,1310,1056,1105,1074,1818 +"YGR010W",856,871,754,493,476,807,788,795,1155 +"YGR012W",441,464,435,374,573,433,389,377,580 +"YGR013W",709,844,768,696,752,472,573,524,885 +"YGR014W",1306,1504,1327,767,2086,1444,1258,782,1168 +"YGR015C",255,285,228,166,203,174,222,230,321 +"YGR016W",166,154,101,87,113,107,117,146,210 +"YGR017W",573,651,563,703,868,564,540,491,802 +"YGR018C",12,20,26,13,19,17,13,15,35 +"YGR019W",1398,1321,998,558,245,1265,1065,1212,2140 +"YGR020C",948,1123,1112,1572,2026,739,761,878,1413 +"YGR021W",241,318,277,222,353,1601,295,255,350 +"YGR023W",509,530,410,270,460,701,407,422,519 +"YGR024C",714,743,622,519,669,480,618,633,1042 +"YGR025W",208,185,121,84,46,126,103,109,184 +"YGR026W",1996,2027,1493,877,467,1473,1296,1530,2604 +"YGR027C",5730,5797,5173,7173,12111,2376,4207,5042,9140 +"YGR028W",527,549,446,265,430,1024,483,480,717 +"YGR029W",602,637,528,418,610,1381,784,744,995 +"YNCG0024W",15,19,12,5,16,9,11,8,22 +"YGR030C",287,325,331,308,289,150,305,280,453 +"YGR031W",304,341,347,154,191,343,413,388,576 +"YGR032W",6232,6349,5000,3377,3764,4128,2736,3215,6384 +"YGR033C",1687,1648,1281,783,921,1395,1531,1577,2477 +"YGR034W",3278,3789,4338,7509,13050,723,2149,2365,4303 +"YGR035C",19,38,45,57,135,13,10,7,12 +"YGR035W-A",47,53,84,123,72,24,27,32,47 +"YGR036C",188,275,420,557,162,103,113,129,174 +"YGR037C",2447,2606,2175,1887,1239,3025,2559,2287,3313 +"YGR038W",457,465,345,218,481,576,440,482,653 +"YGR039W",31,40,37,32,51,50,24,21,35 +"YGR040W",390,462,470,515,660,267,308,324,447 +"YGR041W",437,338,206,173,253,310,291,557,762 +"YGR042W",578,584,503,344,412,444,503,584,789 +"YGR043C",9678,7875,4425,1120,102,8324,5960,8324,15946 +"YGR044C",2336,2136,1638,543,160,1482,1176,3258,4208 +"YGR045C",103,115,73,23,15,74,57,113,173 +"YGR046W",1307,1335,1179,863,976,927,1095,1110,1669 +"YGR047C",899,952,973,537,284,504,563,576,1030 +"YGR048W",1152,1185,891,542,619,900,975,1000,1662 +"YGR049W",438,497,509,469,413,406,495,409,625 +"YGR050C",76,71,41,44,96,145,115,115,145 +"YGR052W",627,397,155,12,18,1096,474,542,968 +"YGR053C",184,141,100,14,20,292,156,153,297 +"YGR054W",1050,1351,2013,3584,2023,566,769,692,991 +"YGR055W",1399,2751,5379,12377,1263,89,412,458,1326 +"YGR056W",676,662,829,829,718,351,430,396,636 +"YGR057C",337,432,517,564,354,179,231,309,443 +"YGR058W",242,291,353,430,371,154,164,211,269 +"YGR059W",153,160,110,37,37,78,69,91,190 +"YNCG0026W",5,6,1,3,5,3,8,4,5 +"YGR060W",12568,12119,10122,9027,6963,2248,6359,7362,14491 +"YGR061C",3242,4052,4695,10179,9899,1297,1531,1685,3215 +"YGR062C",190,217,232,186,242,334,179,169,298 +"YGR063C",265,280,320,406,521,234,274,266,405 +"YGR065C",4199,4188,4335,5787,6372,4805,4994,4735,6274 +"YGR066C",339,277,215,135,135,133,136,206,470 +"YGR067C",1648,1103,551,50,228,4365,2592,2083,2521 +"YGR068C",139,237,371,658,325,110,124,96,155 +"YGR070W",1904,1696,1113,252,307,1070,967,1099,1921 +"YGR071C",599,679,524,578,528,435,462,428,683 +"YGR072W",527,637,713,921,911,316,458,427,765 +"YGR074W",279,371,328,337,399,250,295,334,416 +"YGR075C",277,323,285,297,319,207,251,222,393 +"YGR076C",376,339,367,350,465,1694,475,399,474 +"YGR077C",608,612,557,383,254,453,416,470,707 +"YGR078C",214,275,380,742,384,87,156,166,252 +"YGR079W",169,343,1084,1588,342,37,66,91,181 +"YGR080W",683,625,560,429,329,722,658,631,1067 +"YGR081C",312,378,611,1153,1010,46,165,161,277 +"YGR082W",347,374,405,505,524,962,368,304,502 +"YGR083C",1119,1376,1529,2504,2299,483,749,746,1272 +"YGR084C",320,333,328,307,405,1343,392,322,404 +"YGR085C",1769,1806,2130,3621,5143,416,1140,1289,2173 +"YGR086C",19302,14074,8661,3058,1542,22037,23368,23822,32487 +"YGR087C",1365,2160,2522,2827,660,719,483,568,1354 +"YGR088W",9086,6011,2795,424,59,3804,7248,7554,13012 +"YGR089W",821,918,879,1237,1263,516,623,545,870 +"YGR090W",1505,2080,2602,5057,4431,255,708,756,1246 +"YGR091W",360,433,416,429,461,207,272,271,470 +"YGR092W",583,651,619,442,830,659,1176,908,881 +"YGR093W",543,656,822,1347,1259,258,341,344,613 +"YGR094W",4051,4598,4795,7732,8851,1916,2598,2475,4275 +"YGR095C",582,714,1039,1667,1196,289,460,471,848 +"YGR096W",145,135,140,197,104,59,86,84,200 +"YGR097W",878,972,985,1221,693,403,405,523,871 +"YGR098C",680,693,635,623,588,538,498,395,575 +"YGR099W",558,633,570,546,644,491,465,457,706 +"YGR100W",1467,1503,1238,825,592,1033,1088,1060,1719 +"YGR101W",494,489,520,341,512,785,549,521,690 +"YGR102C",429,404,362,344,372,346,351,290,601 +"YGR103W",1646,2504,3912,9940,11103,196,744,731,1559 +"YGR104C",460,434,383,340,406,304,367,326,571 +"YGR105W",463,471,364,373,422,415,453,418,671 +"YGR106C",1773,1992,1874,2005,2166,1544,1660,1676,2716 +"YGR108W",151,133,126,98,206,837,1218,614,367 +"YGR109C",27,35,25,29,62,24,19,20,30 +"YGR109W-B",286,322,240,195,172,180,160,190,264 +"YGR110W",687,631,449,187,260,509,616,622,1015 +"YGR111W",1034,1044,718,512,477,1238,915,840,1354 +"YGR112W",527,474,348,145,142,1326,471,427,697 +"YGR113W",414,417,377,255,344,438,419,370,556 +"YGR116W",3092,3184,2759,2556,2405,1783,1958,2124,3308 +"YGR117C",813,823,535,375,598,553,714,747,1128 +"YGR118W",4160,4310,4596,7102,11091,1661,3514,3793,6694 +"YGR119C",1329,1371,1401,1811,1954,1145,1351,1153,1740 +"YGR120C",267,282,319,281,354,191,205,206,381 +"YGR121C",1872,2277,2216,1963,3810,477,960,1255,2253 +"YGR122W",572,454,270,132,493,537,447,434,658 +"YGR123C",354,617,1080,2402,1903,55,162,158,279 +"YGR124W",2104,2587,3067,5165,6648,1000,1632,1378,2427 +"YGR125W",1211,1557,1881,2824,1922,525,644,665,1167 +"YGR126W",148,140,113,110,58,58,62,82,143 +"YGR127W",1863,1223,559,161,256,3141,2311,1964,2986 +"YGR128C",664,1156,1669,3773,3486,59,348,325,590 +"YGR129W",221,311,303,334,185,115,116,160,325 +"YGR130C",6512,5303,3337,745,815,8601,7085,6483,9734 +"YGR131W",40,40,18,12,19,57,36,52,84 +"YGR132C",3308,2945,2233,1134,1165,6054,3427,3440,5111 +"YGR133W",310,355,258,172,144,266,182,221,413 +"YGR134W",599,716,667,492,588,357,430,447,688 +"YGR135W",2717,2801,2262,2050,2058,2584,2988,2700,4131 +"YGR136W",510,589,627,761,652,579,479,463,721 +"YGR138C",69,63,40,876,469,92,74,73,94 +"YGR140W",465,545,529,657,619,397,358,375,563 +"YGR141W",799,796,619,294,389,725,558,700,1033 +"YGR142W",9593,7569,4232,448,630,5667,5083,6628,13451 +"YGR143W",2408,2277,1545,1043,1198,1350,1274,1551,2736 +"YGR144W",34825,32461,25248,14780,22033,31457,11600,20206,49642 +"YGR145W",774,1243,1817,4357,3975,122,443,455,758 +"YGR146C",1356,861,370,79,187,1319,1094,1147,1874 +"YGR146C-A",11,5,5,3,15,11,6,7,12 +"YGR147C",663,720,704,566,701,795,593,587,929 +"YGR148C",3553,4132,4446,7969,13027,1074,2441,2398,4728 +"YGR149W",718,721,466,144,251,481,638,840,995 +"YGR150C",706,860,795,814,759,1485,651,571,796 +"YGR152C",214,410,1039,2767,1777,176,228,217,239 +"YGR153W",96,119,138,140,156,123,88,91,145 +"YGR154C",859,889,607,177,89,486,400,541,1148 +"YGR155W",3859,5174,7368,14602,7782,2400,2559,2870,4777 +"YGR156W",275,291,240,178,450,246,288,220,391 +"YGR157W",5278,4902,3805,3233,1905,3114,4442,3958,5780 +"YGR158C",340,487,539,881,1096,116,269,280,426 +"YGR159C",1314,3614,9993,26920,11482,61,248,344,854 +"YGR161C",5895,3850,2746,497,740,2755,3610,4237,8060 +"YGR161W-C",759,600,454,114,245,1994,1192,963,1342 +"YGR161C-D",8,3,13,14,4,1,2,2,3 +"YNCG0037W",7,10,5,10,30,1,4,3,9 +"YGR162W",1874,2711,3903,8599,6406,455,894,912,1629 +"YGR163W",599,723,616,588,737,471,498,476,719 +"YGR164W",7,5,4,8,7,3,3,6,10 +"YGR165W",521,582,565,618,751,1977,549,461,632 +"YGR166W",271,307,367,419,365,236,204,159,305 +"YGR167W",1611,1349,936,686,862,2063,1489,1411,2170 +"YGR168C",423,420,275,232,336,409,378,387,625 +"YGR169C",141,200,274,490,451,178,134,112,184 +"YGR169C-A",535,591,648,857,875,347,507,454,730 +"YGR170W",1024,1016,942,768,693,815,803,805,1173 +"YGR171C",296,361,305,216,240,564,305,256,378 +"YGR172C",416,438,453,465,564,303,287,311,541 +"YGR173W",475,606,701,1098,1246,99,256,309,589 +"YGR174C",945,893,547,142,263,3596,1253,1074,1708 +"YGR174W-A",168,100,45,15,6,156,166,163,267 +"YGR175C",9724,10088,11249,16046,7299,3484,6562,7501,11558 +"YGR177C",64,86,90,134,256,81,73,70,123 +"YGR178C",1979,2070,1843,1654,1696,1979,1773,1656,2651 +"YGR179C",324,341,288,227,326,284,245,232,363 +"YGR180C",9882,9764,7948,6251,3642,5359,4281,6016,12073 +"YGR181W",313,321,297,266,381,627,314,258,390 +"YGR183C",1979,1921,1370,705,2103,4577,3010,2547,3013 +"YGR184C",2382,2493,2222,1756,1331,1347,1314,1347,2341 +"YGR185C",1091,1186,1218,1785,2723,684,1072,897,1565 +"YGR186W",1994,1939,1677,1393,1677,1932,1803,1787,2641 +"YGR187C",665,1045,1391,3000,2254,122,461,442,796 +"YGR188C",266,309,256,197,295,206,172,180,327 +"YGR189C",1370,1351,1509,1383,2224,640,1405,3566,2846 +"YGR191W",503,846,1760,4672,2184,258,402,425,629 +"YGR192C",149208,113487,75877,34853,8952,79006,92706,117154,224207 +"YGR193C",1002,1039,882,643,698,1293,963,833,1278 +"YGR194C",604,492,300,54,78,1819,653,625,899 +"YGR195W",182,252,309,487,604,111,207,194,302 +"YGR196C",1403,1273,1016,766,1087,872,1096,1097,1682 +"YGR197C",460,479,348,225,390,615,427,412,698 +"YGR198W",447,649,970,1289,593,240,288,240,430 +"YGR199W",971,971,856,550,736,857,717,725,1143 +"YGR200C",802,1157,1564,3049,3050,239,469,467,891 +"YGR201C",753,790,538,313,164,627,458,574,1100 +"YGR202C",649,683,618,500,618,735,672,583,957 +"YGR203W",389,266,234,156,167,345,431,415,601 +"YGR204W",2658,3396,4234,7487,5517,1833,2125,1826,2813 +"YGR204C-A",61,37,16,4,22,82,56,63,78 +"YGR205W",709,598,252,49,255,1256,931,745,982 +"YGR206W",215,227,165,164,174,186,208,213,334 +"YGR207C",691,910,875,1235,1312,1025,735,652,885 +"YGR208W",297,466,674,1854,1311,106,234,193,358 +"YGR209C",2993,2679,1940,1211,719,3130,2549,3167,5440 +"YGR210C",563,775,907,1035,1050,330,338,392,749 +"YGR211W",2798,2841,3032,3213,2053,700,1319,1652,3425 +"YGR212W",247,257,195,136,98,198,202,150,278 +"YGR213C",115,81,70,49,58,146,89,67,155 +"YGR214W",6385,7021,7227,11098,17484,1825,4355,4842,8992 +"YGR215W",296,338,339,339,454,1127,397,313,454 +"YGR216C",599,656,546,538,709,387,522,439,727 +"YGR217W",464,583,642,764,589,222,319,282,401 +"YGR218W",2199,2340,2010,2038,2068,1559,1539,1481,2279 +"YGR220C",504,506,497,487,732,1515,556,445,698 +"YGR221C",216,257,168,84,243,217,165,172,311 +"YGR222W",488,483,310,176,292,501,424,417,633 +"YGR223C",810,804,625,284,512,743,667,660,983 +"YGR224W",327,354,216,79,102,187,212,227,405 +"YGR225W",180,182,95,42,33,86,89,102,226 +"YGR227W",429,555,520,523,564,325,348,352,416 +"YGR227C-A",12,11,12,9,17,12,10,8,11 +"YGR229C",1174,1661,3257,4779,3893,1285,1383,1032,1351 +"YGR230W",393,391,321,164,140,1170,1626,962,995 +"YGR231C",3065,2957,2160,1257,1048,4779,3085,2668,4025 +"YGR232W",500,514,341,190,259,722,597,603,741 +"YGR233C",901,993,953,865,808,429,544,543,913 +"YGR234W",4888,6554,7417,12415,19918,5894,4996,6057,6286 +"YGR235C",1219,1179,1060,702,962,1554,1304,1220,1827 +"YGR236C",3458,2253,792,43,22,7031,4655,5354,7467 +"YGR237C",810,743,456,166,276,830,673,639,939 +"YGR238C",408,425,312,202,357,607,374,330,497 +"YGR239C",585,867,1399,1244,990,293,495,464,783 +"YGR240C",8947,7840,6556,7268,4401,3383,4020,5743,10694 +"YGR240C-A",50,59,52,63,30,14,33,46,94 +"YGR241C",673,668,696,584,600,1144,985,748,947 +"YGR243W",2876,2047,969,147,872,10303,7809,5865,6748 +"YGR244C",7984,7602,5533,2671,1081,19697,11148,9062,12204 +"YGR245C",1095,1704,2969,7151,5220,138,485,532,951 +"YGR246C",1204,1176,1001,784,893,890,942,1014,1538 +"YGR247W",370,341,225,53,70,631,371,416,626 +"YGR248W",2301,1673,795,85,31,2111,1530,2019,3649 +"YGR249W",102,64,35,28,72,227,92,97,127 +"YGR250C",5973,5308,3658,1438,1689,4364,4363,4692,7491 +"YGR251W",299,410,476,631,516,81,148,184,389 +"YGR252W",695,675,575,531,781,723,685,626,922 +"YGR253C",3539,3444,2758,2191,1843,2934,3413,3355,5256 +"YGR254W",36077,25763,14744,4360,782,12398,11057,26486,58024 +"YGR255C",1056,1084,1108,864,221,1371,894,950,1453 +"YGR256W",13537,10595,6764,2318,206,5451,5155,8225,17691 +"YGR257C",395,448,453,324,435,618,440,377,589 +"YGR258C",945,1033,1260,1638,233,451,510,581,1026 +"YGR260W",3432,3959,4464,6764,4337,1438,1506,1966,4288 +"YGR261C",985,1019,1023,1092,918,648,784,668,1053 +"YGR262C",456,517,537,560,647,396,452,416,689 +"YGR263C",323,379,337,302,248,253,325,271,455 +"YGR264C",1822,2411,3086,6252,5709,494,1187,1155,1745 +"YGR266W",919,894,812,451,438,1303,1259,957,1252 +"YGR267C",1155,1132,1120,1258,1643,874,1032,1046,1593 +"YGR268C",406,463,363,207,233,343,343,315,527 +"YGR270W",1798,1741,1401,1181,904,1301,1162,1145,1897 +"YGR271W",812,908,798,780,777,481,520,472,793 +"YGR271C-A",383,591,816,1758,1563,79,240,247,452 +"YGR273C",6,11,18,10,16,3,3,3,6 +"YGR274C",1066,1171,1119,991,972,720,849,788,1235 +"YGR275W",505,500,438,436,553,398,421,464,767 +"YGR276C",978,1123,1074,1155,1067,654,827,826,1301 +"YGR277C",668,825,755,701,687,492,592,613,1001 +"YGR278W",476,481,437,435,553,322,366,330,571 +"YGR279C",1152,1638,2330,5120,6986,5318,2912,1611,1552 +"YGR280C",373,574,1212,2774,1679,148,278,232,464 +"YGR281W",1799,1757,1501,832,742,857,1123,1137,1891 +"YGR282C",9119,9289,8304,9050,10875,12483,7824,7887,12396 +"YGR283C",175,304,462,1011,1014,44,79,81,190 +"YGR284C",3064,2976,2283,1268,518,2064,2048,2319,3820 +"YGR285C",1299,1729,2264,4165,4712,673,924,922,1458 +"YGR286C",10399,11328,11446,12690,17888,5854,9357,9321,14084 +"YGR287C",336,278,196,102,232,621,323,257,509 +"YGR288W",407,341,195,114,324,490,347,369,608 +"YGR289C",7393,4464,2149,770,598,20897,15039,10305,17062 +"YGR292W",949,611,306,147,123,3580,1792,1169,2041 +"YGR295C",1262,1010,632,325,629,1536,1100,1247,1979 +"YHL050C",51,45,44,32,56,36,41,34,45 +"YHL048W",22,16,13,11,5,17,18,13,29 +"YHL045W",38,14,5,2,7,95,39,43,79 +"YHL044W",15,12,4,3,5,25,14,10,18 +"YHL043W",383,304,287,348,380,188,191,239,525 +"YHL042W",404,367,288,248,238,149,181,237,524 +"YHL041W",5,4,8,4,13,8,5,3,10 +"YHL040C",712,834,913,1179,656,321,256,297,675 +"YHL039W",899,1296,1331,1775,1787,220,373,461,796 +"YHL038C",449,540,475,427,318,476,393,309,533 +"YHL037C",4,8,7,5,3,5,4,2,5 +"YHL036W",649,683,719,1803,315,195,357,434,686 +"YHL035C",571,559,395,206,103,347,296,331,545 +"YHL034C",5374,4570,3699,2711,1742,4726,4373,4398,7533 +"YHL033C",3026,3250,4336,8654,6679,780,2065,2118,4304 +"YHL032C",4718,3859,2547,685,783,12322,10937,8195,8500 +"YHL031C",506,528,468,357,432,513,402,439,819 +"YHL030W",1658,1506,1282,828,605,1261,1204,1147,1758 +"YHL029C",807,952,1105,1442,1110,331,629,552,950 +"YHL028W",119,125,86,40,40,145,118,113,154 +"YHL027W",2480,2554,2432,2167,1945,1461,2007,1989,3198 +"YHL026C",152,165,206,415,329,87,104,100,198 +"YHL025W",690,633,586,614,777,838,787,702,1212 +"YHL024W",4436,3821,2421,669,1966,6411,5331,4059,5392 +"YHL023C",857,976,887,834,698,528,690,649,1015 +"YHL022C",64,57,32,32,40,63,59,54,67 +"YHL021C",1117,808,395,93,379,6878,1790,1514,1796 +"YHL020C",1549,1538,1549,1396,1396,1604,2385,2193,2952 +"YHL019C",424,466,395,233,225,309,316,308,509 +"YHL018W",73,74,46,39,22,66,56,45,77 +"YHL017W",878,902,849,778,740,521,536,591,907 +"YHL016C",893,1162,1280,1466,1778,401,363,429,839 +"YHL015W-A",23,33,18,10,9,8,29,14,36 +"YHL015W",6850,8047,8990,15557,28349,2274,5057,5269,9250 +"YHL014C",246,293,266,238,260,503,212,209,323 +"YHL013C",305,389,601,1034,653,125,209,230,367 +"YHL012W",251,240,178,160,230,231,178,214,351 +"YHL011C",830,1168,1946,4535,4176,238,463,500,894 +"YHL010C",656,648,478,173,164,413,444,503,835 +"YHL009C",230,291,269,271,342,159,192,147,316 +"YHL008C",208,186,169,94,103,168,130,157,283 +"YHL007C",771,1121,1764,2700,1672,357,511,444,738 +"YHL006C",65,75,47,63,44,88,58,80,133 +"YHL005C",14,20,25,16,17,52,13,12,15 +"YHL004W",451,606,579,639,720,1579,453,376,507 +"YHL003C",806,830,693,672,1015,703,654,673,1115 +"YHL002W",780,778,558,435,681,844,800,737,1324 +"YHL001W",964,1099,1259,2062,2606,258,697,784,1518 +"YHR001W",1281,1354,1064,653,662,1319,1150,1160,1638 +"YHR001W-A",2093,1961,1300,799,1374,3536,3361,2727,3608 +"YHR002W",248,284,222,145,300,238,250,217,338 +"YHR003C",565,729,978,1644,1248,311,455,445,781 +"YHR004C",661,702,575,213,261,601,626,606,890 +"YHR005C",1501,1811,1671,1500,2625,880,1072,1206,1808 +"YHR005C-A",957,1036,934,1182,1638,3417,1171,1065,1363 +"YHR006W",1656,1722,1566,1728,1404,858,1183,1206,1846 +"YHR007C",19446,20010,18726,18998,10712,4315,10644,12794,23156 +"YHR007C-A",82,66,30,20,21,172,98,77,111 +"YHR008C",7611,6175,4541,1961,1081,8877,7695,7736,13283 +"YHR009C",1738,1852,1588,1536,1616,2210,1624,1388,2240 +"YHR010W",3657,4384,4810,8671,14971,1023,2791,2831,5269 +"YHR011W",243,269,210,142,141,577,209,197,293 +"YHR012W",728,739,761,724,564,487,617,560,982 +"YHR013C",464,530,564,735,709,253,323,296,561 +"YHR014W",58,39,34,40,92,27,28,35,62 +"YHR015W",233,217,208,194,217,104,136,149,289 +"YHR016C",1001,782,475,76,122,1892,1106,1025,1584 +"YHR017W",643,659,414,218,557,812,672,636,901 +"YHR018C",5827,4433,3734,3588,2602,2187,6244,5280,8372 +"YHR019C",1746,2305,2771,4893,4865,780,1255,1210,2031 +"YHR020W",2132,2727,3222,5645,6899,367,1225,1312,2397 +"YHR021C",2712,3137,3474,5269,9792,878,2320,2287,4084 +"YHR021W-A",28,24,20,14,31,42,33,32,63 +"YHR022C",67,41,35,24,53,88,66,66,105 +"YHR023W",691,758,737,743,956,905,1343,890,846 +"YHR024C",409,498,528,694,644,1010,428,365,480 +"YHR025W",1098,1291,1349,1919,2211,624,765,731,1186 +"YHR026W",898,988,909,1061,1352,805,814,780,1341 +"YHR027C",8032,7738,6360,4894,3660,5607,6401,6149,9510 +"YHR028C",2665,2816,2304,1826,1629,2109,1633,1762,2944 +"YHR029C",716,729,585,422,387,525,474,532,922 +"YHR030C",761,788,694,668,685,519,487,617,1125 +"YHR031C",364,431,492,740,356,309,311,280,534 +"YHR032W",472,638,904,1687,971,190,328,354,594 +"YHR033W",677,737,539,336,332,501,649,662,1116 +"YHR034C",362,350,331,258,243,254,316,363,555 +"YHR035W",211,176,129,73,106,168,156,204,248 +"YHR036W",266,287,330,405,549,233,284,210,369 +"YHR037W",2079,2229,2093,1466,1841,2241,1549,1486,2671 +"YHR038W",185,233,138,102,146,544,205,176,317 +"YHR039C",1512,1684,1581,1727,1374,856,1015,1299,1825 +"YHR039C-A",1375,1462,1331,1355,1324,1048,1183,1390,2293 +"YHR040W",239,320,481,763,652,72,127,168,316 +"YHR041C",229,261,268,305,338,226,260,250,441 +"YHR042W",1060,1235,1216,1558,1661,795,712,778,1188 +"YHR043C",297,317,300,217,705,702,433,376,562 +"YHR044C",52,67,58,58,110,129,49,58,83 +"YHR045W",736,844,769,862,1102,399,542,598,924 +"YHR046C",276,357,465,1069,809,96,180,158,341 +"YHR047C",1736,1558,1105,672,528,1470,1835,1510,2218 +"YHR048W",278,266,189,207,257,360,271,282,395 +"YHR049W",313,602,1573,5085,2181,247,172,195,364 +"YHR050W",747,851,788,488,886,941,832,773,1118 +"YHR050W-A",281,301,190,139,194,311,344,269,319 +"YHR051W",3013,3066,2228,1763,2694,4788,4540,3782,4633 +"YHR052W",711,1315,2287,5480,4558,109,365,379,706 +"YNCH0007W",6,2,2,3,1,1,3,4,17 +"YHR054C",6,7,5,11,4,9,7,3,14 +"YHR056C",524,495,502,427,369,494,403,371,504 +"YHR057C",1445,1382,1196,862,730,1596,1659,1601,2767 +"YHR058C",256,328,355,329,212,139,196,190,329 +"YHR059W",238,238,235,209,271,851,218,179,317 +"YHR060W",513,561,523,562,594,483,453,466,739 +"YHR061C",145,188,189,197,159,270,249,156,161 +"YHR062C",181,189,246,481,554,105,141,125,215 +"YHR063C",629,792,910,1401,1513,454,467,466,711 +"YHR064C",2798,3244,3682,6098,7078,1365,1989,2027,3518 +"YHR065C",661,984,1348,2620,2826,99,373,368,629 +"YHR066W",695,1133,1786,3956,2225,37,343,332,665 +"YHR067W",438,478,336,264,303,396,520,505,718 +"YHR068W",699,951,1329,2717,2249,352,529,508,849 +"YHR069C",628,854,1383,1955,1049,227,396,440,788 +"YHR070W",237,405,789,1744,648,87,135,175,290 +"YHR071W",1407,1148,1374,2049,1405,494,797,811,1719 +"YHR072W",1237,1514,1669,2082,1963,798,924,879,1456 +"YHR072W-A",908,978,1101,1865,2967,420,705,726,1253 +"YHR073W",1601,1668,1548,1373,1051,1233,1146,1130,1714 +"YHR074W",1867,1870,1573,973,937,1786,1359,1320,2265 +"YHR075C",595,495,301,96,88,439,404,454,785 +"YHR076W",601,616,500,531,519,830,556,513,833 +"YHR077C",2076,2156,1982,2646,2779,1130,1595,1383,2388 +"YHR078W",677,670,513,579,845,511,422,517,801 +"YHR079C",806,740,773,703,705,446,499,527,780 +"YHR079C-A",9,9,15,12,8,3,1,5,15 +"YHR080C",1403,1298,867,295,314,1247,1131,1041,1597 +"YHR081W",632,703,739,1111,1834,237,365,451,819 +"YHR082C",2300,2117,1511,867,1205,1698,1598,1633,2697 +"YHR083W",551,542,505,325,354,516,485,520,872 +"YHR084W",471,590,586,882,1193,436,414,341,546 +"YHR085W",224,357,602,1112,946,47,121,116,231 +"YHR086W",589,718,568,427,369,677,542,471,712 +"YHR087W",2730,1664,456,28,80,3200,1918,2613,5120 +"YHR088W",544,810,1272,2341,2276,113,347,318,577 +"YHR089C",714,1183,1788,4181,6781,185,512,492,920 +"YHR090C",529,551,489,485,543,573,619,561,873 +"YHR091C",415,469,419,271,298,878,484,374,544 +"YHR092C",251,592,1565,3583,4953,169,142,130,206 +"YHR093W",18,37,45,84,44,10,9,11,18 +"YHR094C",211,221,221,228,194,163,139,163,275 +"YHR096C",17652,13565,7590,1311,321,5292,10265,15250,25312 +"YHR097C",2197,2005,1187,270,447,2196,1587,1794,2910 +"YHR098C",1200,1229,1095,1316,1422,997,996,840,1329 +"YHR099W",804,975,1061,1255,1264,765,653,623,975 +"YHR100C",264,263,295,284,366,206,202,201,323 +"YHR101C",378,313,229,124,189,384,328,340,562 +"YHR102W",789,837,757,610,546,500,541,588,797 +"YHR103W",842,829,856,1001,989,793,615,810,1077 +"YHR104W",3698,2601,1156,273,394,5122,2660,3277,6065 +"YHR105W",269,266,157,46,49,191,184,195,308 +"YHR106W",2099,1911,1269,445,246,1841,1452,1627,2908 +"YHR107C",711,846,791,975,1148,695,744,554,897 +"YHR108W",1093,1178,1100,1119,769,953,876,748,1311 +"YHR109W",230,261,210,185,224,467,205,175,296 +"YHR110W",1133,1126,770,346,493,1346,1020,1077,1608 +"YHR111W",845,836,826,651,803,557,595,713,1187 +"YHR112C",1442,1437,1274,1172,803,1385,1021,1174,2236 +"YHR113W",1548,1558,1275,669,619,1737,1428,1445,2309 +"YHR114W",842,817,728,612,672,736,760,677,1072 +"YHR115C",691,814,677,621,927,624,676,546,827 +"YHR116W",196,179,139,98,114,1445,368,273,307 +"YHR117W",699,809,698,596,538,747,679,580,992 +"YHR118C",385,417,554,515,585,229,354,301,506 +"YHR119W",693,708,684,834,893,496,511,448,788 +"YHR120W",374,418,474,558,445,256,242,199,344 +"YHR121W",609,669,683,793,957,781,683,606,815 +"YHR122W",506,654,658,791,833,409,356,402,655 +"YHR123W",352,447,502,634,473,216,320,362,475 +"YHR124W",251,253,201,211,273,208,206,220,369 +"YHR125W",10,11,12,11,3,13,11,10,15 +"YHR126C",15,34,89,533,396,16,14,10,23 +"YHR127W",264,330,293,245,262,129,242,249,384 +"YHR128W",266,386,588,1468,1282,106,170,161,333 +"YHR129C",237,241,266,255,200,125,175,183,295 +"YHR130C",54,41,31,30,76,36,27,44,62 +"YHR131C",741,794,605,591,799,513,552,566,916 +"YHR132C",1564,1631,1336,1124,1390,1733,1521,1455,2317 +"YHR132W-A",1162,924,446,204,453,2108,1964,1606,2136 +"YHR133C",425,519,492,666,674,208,374,350,622 +"YHR134W",236,272,275,288,215,131,175,179,297 +"YHR135C",1929,1922,1719,1552,1548,1819,1854,1588,2270 +"YHR136C",16,14,7,1,4,20,19,10,21 +"YHR137W",1483,1362,886,173,44,3144,3078,2033,2433 +"YHR138C",2363,2203,1586,750,289,1955,1656,2044,3745 +"YHR139C",14,20,8,4,2,4,2,10,24 +"YHR140W",290,229,133,31,30,548,280,251,409 +"YNCH0012W",1,1,3,5,5,1,3,2,4 +"YHR141C",2210,2330,2409,4038,6677,811,1710,1897,3208 +"YHR142W",589,623,572,678,1059,343,555,534,823 +"YHR143W",2965,1771,1747,3177,3443,464,828,3841,6625 +"YHR143W-A",336,438,572,1008,1073,173,355,313,495 +"YHR144C",129,197,268,449,428,47,94,84,151 +"YHR146W",3821,3583,2997,2193,2002,3123,3040,3134,4944 +"YHR147C",406,407,340,313,416,1756,537,464,609 +"YHR148W",188,264,440,955,905,24,84,78,170 +"YHR149C",385,523,749,1240,1753,123,250,294,394 +"YHR150W",1057,1099,973,454,378,824,811,917,1503 +"YHR151C",301,361,499,591,375,172,239,267,342 +"YHR152W",344,414,400,426,329,884,1280,769,690 +"YHR153C",12,25,19,14,32,39,13,26,19 +"YHR154W",472,584,666,746,997,349,342,352,529 +"YHR155W",697,730,609,432,606,554,495,483,764 +"YNCH0014W",18,9,10,13,16,13,15,17,23 +"YHR156C",358,388,332,280,333,229,250,250,504 +"YHR157W",55,51,33,41,56,75,44,49,97 +"YHR158C",1212,1193,890,608,671,924,849,866,1319 +"YHR159W",358,346,214,61,79,347,276,242,416 +"YHR160C",413,377,215,25,47,422,287,289,523 +"YHR161C",3073,2546,1736,562,706,3248,2800,2746,4041 +"YHR162W",1118,1374,1851,3645,4023,1765,1549,1231,1984 +"YHR163W",1398,1946,2352,3107,1445,2039,1389,1198,1969 +"YHR164C",635,643,567,451,373,349,391,335,622 +"YHR165C",912,1048,1028,1080,1557,716,679,627,957 +"YHR166C",457,416,329,245,426,365,314,378,572 +"YHR167W",115,146,148,205,257,106,107,108,177 +"YHR168W",194,230,188,212,218,296,164,169,234 +"YHR169W",305,474,756,1615,972,136,254,236,448 +"YHR170W",1208,2001,3412,7888,5940,252,739,717,1132 +"YHR171W",1132,1104,608,42,72,817,873,999,1538 +"YHR172W",242,256,291,161,262,373,275,202,247 +"YHR173C",44,37,32,23,39,53,63,34,49 +"YHR174W",38349,33126,25905,19876,7285,10270,10023,21445,53234 +"YHR175W",289,293,295,214,284,343,357,323,469 +"YHR175W-A",22,26,29,19,36,38,39,42,46 +"YHR176W",260,335,317,390,322,319,160,162,292 +"YHR177W",129,138,114,62,191,154,119,111,144 +"YHR178W",665,706,626,365,331,470,605,592,877 +"YHR179W",2061,4108,9338,21829,10282,542,545,859,1735 +"YHR180W",213,210,152,68,113,210,176,191,314 +"YHR181W",434,472,386,373,437,315,380,358,603 +"YHR182W",322,374,379,359,347,286,213,188,359 +"YHR183W",9172,11677,13930,17953,7886,11234,8701,7588,12129 +"YHR184W",196,233,228,320,238,108,140,167,270 +"YHR185C",14,5,6,7,7,12,14,13,20 +"YHR186C",722,864,808,867,924,471,544,457,763 +"YHR187W",495,590,558,554,644,339,363,410,698 +"YHR188C",902,1042,812,623,779,1070,816,785,1275 +"YHR189W",129,121,94,46,51,115,105,99,167 +"YHR190W",3052,2779,2102,1143,1037,3474,3380,3059,4573 +"YHR191C",239,238,233,193,243,236,231,250,387 +"YHR192W",719,742,657,551,624,533,600,601,1055 +"YHR193C",3455,3493,3341,4485,6043,2353,3015,3300,5476 +"YHR194W",447,412,348,150,204,605,444,417,769 +"YHR195W",946,806,548,312,488,910,803,890,1399 +"YHR196W",449,900,1437,3336,2770,60,257,266,439 +"YHR197W",463,732,1191,2890,2528,56,158,178,328 +"YHR198C",774,724,520,277,471,1884,824,778,1216 +"YHR199C",745,795,625,444,483,691,574,620,1039 +"YHR199C-A",150,155,104,73,75,119,106,103,173 +"YHR200W",1592,1525,1451,1026,1029,1517,1959,1627,2691 +"YHR201C",650,824,1113,1937,1070,423,558,546,837 +"YHR202W",690,586,451,266,312,771,602,533,828 +"YHR203C",2059,2346,2706,4432,5864,600,1624,1802,3313 +"YHR204W",297,396,401,526,460,190,228,206,376 +"YHR205W",1423,1700,1852,2126,2084,942,1127,995,1517 +"YHR206W",1037,1168,1240,1403,1542,369,602,628,1064 +"YHR207C",846,888,1124,1420,806,569,625,604,1008 +"YHR208W",1654,2587,3933,10073,10731,570,1035,1056,1649 +"YHR209W",609,515,356,161,126,628,408,459,833 +"YHR210C",49,38,46,43,54,79,33,39,54 +"YHR211W",437,367,255,194,369,440,315,315,525 +"YHR213W-B",11,7,6,9,14,8,10,12,17 +"YHR214W",6,11,6,17,6,6,5,2,9 +"YHR214C-B",49,50,47,56,58,24,15,9,24 +"YHR214C-E",1,1,1,1,1,2,1,1,1 +"YHR215W",31,19,16,11,12,15,20,25,29 +"YHR216W",35,37,30,43,73,92,39,37,53 +"YIL173W",10,12,11,19,13,9,5,6,16 +"YIL171W",5,16,8,7,15,11,7,4,6 +"YIL170W",25,23,24,26,44,19,12,22,26 +"YIL169C",1665,1536,1219,876,907,1020,1018,1071,2074 +"YIL167W",239,315,340,314,338,181,176,208,341 +"YIL166C",578,502,393,315,471,178,266,353,603 +"YIL165C",158,182,199,286,240,118,128,127,256 +"YIL164C",204,275,287,394,276,192,174,189,341 +"YIL163C",30,32,30,41,66,13,29,26,42 +"YIL162W",1595,1433,973,575,1350,6950,1860,1123,1958 +"YIL161W",380,443,447,509,659,287,344,356,607 +"YIL160C",4240,3664,2469,804,121,14540,6902,5817,7926 +"YIL159W",352,402,436,612,441,150,197,212,328 +"YIL158W",130,114,128,87,80,746,957,402,268 +"YIL157C",671,667,466,338,448,3043,1036,804,1056 +"YIL156W-B",414,413,317,217,218,631,606,600,827 +"YIL156W",588,642,545,441,500,466,420,460,656 +"YIL155C",13593,9619,5610,1653,863,37171,24894,17367,22761 +"YIL154C",667,592,509,368,426,1183,713,637,1246 +"YIL153W",635,526,404,306,427,1399,897,782,1232 +"YIL152W",453,425,353,287,255,540,478,450,687 +"YIL151C",800,761,674,652,872,553,590,572,946 +"YIL150C",151,198,217,192,85,52,60,87,144 +"YIL149C",1522,1472,1420,1469,1225,1105,1256,1178,1719 +"YIL148W",4301,4756,4844,7321,13388,2001,3995,4098,7083 +"YIL147C",714,865,919,1019,1008,394,418,472,811 +"YIL146C",870,940,661,478,438,515,569,634,985 +"YIL145C",354,399,446,848,643,233,274,246,475 +"YIL144W",602,617,499,509,574,555,491,427,681 +"YIL143C",1083,1144,933,866,1452,966,928,967,1491 +"YIL142W",2847,3190,3317,4158,3852,1809,2661,2578,4225 +"YIL140W",380,495,406,241,539,507,192,268,483 +"YIL139C",308,350,286,228,251,140,228,207,444 +"YIL138C",1434,1392,1175,1070,927,1940,1645,1262,1819 +"YIL137C",917,861,703,586,619,955,804,658,1075 +"YIL136W",24222,16739,10452,2950,475,27758,24853,25245,42782 +"YIL135C",774,811,718,491,660,589,638,626,959 +"YNCI0001W",70,57,57,72,74,32,53,38,73 +"YIL134W",194,244,231,275,302,191,156,150,269 +"YIL133C",2080,2497,2812,5117,6607,482,1437,1389,2798 +"YIL132C",61,66,66,80,52,34,19,33,68 +"YIL131C",453,561,571,657,649,499,493,371,522 +"YIL130W",818,997,1354,1953,876,311,479,453,729 +"YIL129C",1442,1408,1229,823,828,1046,973,895,1439 +"YIL128W",824,933,909,1082,1102,446,477,505,801 +"YIL127C",566,729,941,1851,2073,91,332,303,669 +"YIL126W",2651,2593,2343,2628,2411,1477,1976,1854,2830 +"YIL125W",5398,4759,3108,1252,1983,6211,4762,4410,6406 +"YIL124W",8887,7179,4524,1629,246,7157,9313,10458,15840 +"YIL123W",565,699,671,629,779,1163,696,398,561 +"YIL122W",269,273,302,183,285,191,297,201,330 +"YIL121W",125,128,132,148,475,183,111,130,186 +"YIL120W",471,519,388,91,277,791,466,436,643 +"YIL119C",907,789,663,551,1332,545,746,683,934 +"YIL118W",400,603,1226,2789,1686,421,513,422,616 +"YIL117C",639,632,514,380,722,276,237,387,721 +"YIL116W",1626,1695,1538,1647,2148,914,1171,1285,2220 +"YIL115C",2190,2210,1937,1690,1360,1412,1719,1679,2409 +"YIL114C",190,248,379,669,228,125,200,182,296 +"YIL113W",223,215,115,21,35,236,221,242,342 +"YIL112W",1131,1148,955,770,855,981,922,863,1323 +"YIL111W",104,118,96,71,100,219,112,112,169 +"YIL110W",384,482,752,1301,1200,122,226,233,393 +"YIL109C",2439,2591,2228,2074,1572,2191,2030,1928,3118 +"YIL108W",617,639,556,484,579,672,578,575,836 +"YIL107C",3767,3034,1748,321,483,3870,3046,3160,4988 +"YIL106W",421,498,444,344,559,491,671,445,572 +"YIL105C",1959,1796,1107,436,663,1995,1620,1681,2517 +"YIL104C",241,314,462,1056,717,27,112,118,221 +"YIL103W",451,544,752,1329,1202,159,242,269,459 +"YIL102C-A",69,65,91,82,85,35,34,47,99 +"YIL102C",18,12,18,6,9,10,13,15,25 +"YIL101C",3240,2230,1135,95,286,5115,2888,2714,4126 +"YIL099W",331,260,170,42,45,420,335,380,532 +"YIL098C",225,239,170,110,187,926,232,230,334 +"YIL097W",1007,851,532,154,331,789,724,814,1281 +"YIL096C",231,399,654,1335,843,44,134,145,235 +"YIL095W",310,380,429,463,469,305,286,234,340 +"YIL094C",2903,4664,6433,12842,17664,873,1266,1453,2671 +"YIL093C",347,374,435,389,558,1504,368,326,483 +"YIL092W",343,331,416,483,398,106,195,205,381 +"YIL091C",563,946,1487,2982,2109,66,230,282,544 +"YIL090W",885,952,862,1054,964,432,587,645,1024 +"YIL089W",319,331,190,105,130,272,235,266,453 +"YIL088C",1338,1315,1135,842,518,1277,821,967,1638 +"YIL087C",1718,1318,849,292,222,1774,1491,1731,2872 +"YIL086C",74,55,33,8,10,88,60,74,132 +"YIL085C",895,911,936,1290,1196,526,635,603,1088 +"YIL084C",262,303,271,258,188,121,172,144,244 +"YIL083C",999,1020,842,489,368,789,737,803,1412 +"YIL082W-A",84,65,67,47,51,73,60,79,110 +"YIL079C",209,339,597,1171,649,48,108,105,232 +"YIL078W",4024,4539,4595,7544,10806,2007,2694,2820,4286 +"YIL077C",679,607,363,136,230,993,641,600,1065 +"YIL076W",950,964,880,792,889,933,842,809,1185 +"YIL075C",7122,6709,5500,3988,3473,6465,6533,5895,9130 +"YIL074C",1775,2707,3234,6443,4111,507,938,1039,1808 +"YIL073C",746,668,473,375,353,466,475,496,840 +"YIL072W",277,239,167,71,155,223,166,204,337 +"YIL071C",790,745,545,211,246,359,405,450,910 +"YIL070C",491,535,467,292,572,3902,605,479,686 +"YIL069C",1649,1979,2206,4132,5913,327,1278,1191,2231 +"YIL068C",680,725,589,550,582,635,652,565,888 +"YIL067C",444,511,570,566,505,207,292,304,545 +"YIL066C",262,224,143,95,45,118,87,140,280 +"YIL065C",600,547,380,298,437,807,718,740,1069 +"YIL064W",399,520,676,981,1298,124,246,297,584 +"YIL063C",1107,1075,977,969,1060,793,866,961,1548 +"YIL062C",1031,920,713,408,402,1462,1174,1339,1828 +"YIL061C",201,235,259,243,227,112,131,139,277 +"YIL060W",82,65,49,25,50,216,110,120,201 +"YIL057C",12815,6363,1916,247,113,48486,46081,35384,37389 +"YIL056W",562,508,502,449,421,557,326,326,559 +"YIL055C",1151,1068,713,132,88,684,726,717,1234 +"YIL054W",2,2,1,6,1,6,5,2,3 +"YIL053W",1977,4004,9556,23112,5484,118,255,571,1694 +"YIL052C",2491,2772,3059,4821,8814,771,1824,2002,3666 +"YIL051C",1149,1038,788,739,1130,997,835,834,1404 +"YIL050W",941,1030,875,825,864,1164,755,772,1323 +"YIL049W",120,119,86,67,114,145,134,145,194 +"YIL048W",1180,1295,1175,969,1047,689,763,771,1226 +"YIL047C",2759,2838,2642,3200,2641,1358,2179,2221,3628 +"YIL046W",1241,1470,1251,1121,1076,606,1007,1014,1795 +"YIL045W",3272,2551,1131,128,211,1869,1576,2102,4431 +"YIL044C",374,416,403,466,499,239,290,248,415 +"YIL043C",1788,1921,1615,1716,1982,2020,1806,1847,2910 +"YIL042C",696,673,565,268,173,642,607,616,981 +"YIL041W",3081,2796,2382,1971,1374,2387,2253,2285,3815 +"YIL040W",322,333,337,400,402,223,276,306,488 +"YIL039W",1462,1503,1370,1478,1525,1365,1254,1193,1848 +"YIL038C",1262,1254,1332,1700,1862,701,969,857,1283 +"YIL037C",375,384,275,202,186,261,244,263,447 +"YIL036W",1601,1296,752,338,770,1667,1387,1378,1965 +"YIL035C",823,949,840,1087,1417,596,792,737,1032 +"YIL034C",986,914,752,635,491,903,713,729,1177 +"YIL033C",2615,2349,1665,813,739,3016,2196,2401,3853 +"YIL031W",512,553,473,448,407,378,385,383,563 +"YIL030C",2820,2791,2402,2180,2017,1395,1849,1747,2857 +"YIL029C",44,68,64,10,13,38,47,57,71 +"YIL027C",395,431,311,394,468,416,383,443,648 +"YIL026C",1116,1179,821,330,721,755,618,776,1225 +"YIL024C",667,634,524,246,251,750,659,693,1136 +"YIL023C",594,512,468,422,485,487,510,517,883 +"YIL022W",803,922,961,1164,1174,1339,766,647,1030 +"YIL021W",824,893,950,1268,1563,642,930,791,1139 +"YIL020C",404,493,545,828,875,117,218,266,468 +"YIL019W",455,646,916,1950,2044,99,220,245,519 +"YIL018W",4640,5383,6233,10133,17720,1436,3814,3858,7240 +"YIL017C",1214,1048,572,131,184,922,779,859,1458 +"YIL016W",301,392,384,426,408,214,322,371,575 +"YIL015W",108,102,105,96,126,106,99,75,115 +"YIL014C-A",531,525,398,362,361,489,397,376,661 +"YIL014W",954,1028,905,791,962,463,589,641,1123 +"YIL013C",588,524,438,339,370,542,462,451,736 +"YIL012W",8,3,2,4,8,8,5,1,7 +"YIL011W",122,105,135,159,190,156,120,112,160 +"YIL010W",316,351,371,421,245,329,229,208,333 +"YIL009C-A",194,178,199,145,207,179,132,126,244 +"YIL009W",502,622,604,512,690,369,411,599,704 +"YIL008W",387,459,522,719,1208,246,273,326,530 +"YIL007C",580,636,485,217,309,660,585,645,984 +"YIL006W",170,191,139,75,92,204,141,136,204 +"YIL005W",908,985,823,774,844,734,654,626,1057 +"YIL004C",439,387,390,423,529,440,383,383,607 +"YIL003W",350,409,395,445,450,223,287,243,540 +"YIL002W-A",426,459,406,421,616,412,379,402,685 +"YIL002C",789,840,689,426,373,475,495,503,868 +"YIL001W",520,520,476,287,438,287,399,413,680 +"YIR001C",584,591,549,579,624,663,572,537,772 +"YIR002C",998,1025,917,791,882,694,550,638,1093 +"YIR003W",975,980,764,523,627,1205,870,810,1290 +"YIR004W",1034,1177,1050,1124,1226,1116,931,903,1415 +"YIR005W",178,197,155,164,174,116,135,173,236 +"YIR006C",2148,2231,1817,1520,1129,1579,1492,1415,2311 +"YIR007W",317,377,266,146,95,288,198,202,358 +"YIR008C",530,593,599,639,703,349,465,468,747 +"YIR009W",136,155,166,153,121,97,88,101,172 +"YIR010W",425,467,510,641,533,529,455,321,513 +"YIR011C",712,896,1177,1626,1069,620,695,731,1169 +"YIR012W",646,1059,1878,3922,2653,184,467,472,920 +"YIR013C",4,1,3,2,5,1,3,2,2 +"YIR014W",215,151,123,15,20,174,171,163,286 +"YIR015W",236,211,179,40,71,217,184,184,299 +"YIR016W",3395,2393,1195,191,384,7589,6987,5495,7675 +"YIR017C",901,964,796,984,343,277,647,757,1362 +"YIR018W",325,339,335,379,230,134,171,241,411 +"YIR018C-A",74,70,46,76,76,36,42,68,91 +"YIR019C",130,88,52,41,81,211,117,88,141 +"YNCI0012",114,132,117,39,54,82,81,79,137 +"YIR021W",152,172,216,171,249,334,192,191,254 +"YIR022W",802,805,691,581,663,1021,901,878,1339 +"YIR023W",557,624,690,811,895,315,454,368,531 +"YIR024C",338,336,325,246,310,556,318,303,461 +"YIR025W",451,466,389,257,268,282,358,376,651 +"YIR026C",354,581,1007,2349,1923,87,187,208,327 +"YIR027C",110,154,128,160,180,101,67,86,174 +"YIR028W",170,239,254,255,347,143,106,166,237 +"YIR029W",518,796,1071,1416,1694,190,263,326,572 +"YIR030C",128,126,146,229,285,57,82,68,127 +"YIR031C",546,907,1287,1951,1754,131,207,283,510 +"YIR032C",573,716,738,907,1502,460,469,652,867 +"YIR033W",1197,1380,1425,1645,986,946,1168,744,1039 +"YIR034C",1115,1836,2840,6824,7176,334,480,497,894 +"YIR035C",657,649,683,813,796,457,466,559,1081 +"YIR036C",1131,1037,700,293,74,893,982,1073,2077 +"YIR037W",3895,3481,2553,1701,763,2431,2604,2864,5283 +"YIR038C",4215,3875,2901,1746,676,2332,2171,2734,5709 +"YIR039C",145,123,72,20,16,356,154,150,195 +"YIR041W",13,4,1,1,1,34,8,8,23 +"YIR042C",152,204,173,190,181,190,137,146,225 +"YIR043C",60,52,42,39,55,62,36,51,88 +"YJL222W",6,18,11,10,11,7,5,6,2 +"YJL219W",57,44,51,33,12,44,42,34,77 +"YJL218W",17,24,14,28,34,84,42,56,29 +"YJL217W",437,366,337,211,265,2748,1277,1451,1217 +"YJL216C",186,187,142,47,104,1371,556,274,340 +"YJL214W",100,99,86,58,107,137,99,102,142 +"YJL213W",53,70,52,46,99,140,53,36,65 +"YJL212C",506,566,680,1267,220,210,190,257,485 +"YJL210W",945,865,705,548,324,1006,1128,1132,1740 +"YJL209W",265,338,571,801,311,228,234,203,296 +"YJL208C",229,355,621,1063,816,236,241,208,273 +"YJL207C",847,1036,1031,1010,1093,490,555,574,887 +"YJL206C",532,568,454,236,231,394,372,337,639 +"YJL205C",216,165,112,88,96,423,266,255,366 +"YJL204C",470,512,453,416,397,276,358,304,451 +"YJL203W",361,356,384,360,393,275,294,277,433 +"YJL201W",316,353,330,315,676,385,339,270,401 +"YJL200C",3624,5604,7502,15533,13805,275,1108,1251,2578 +"YJL199C",177,135,147,67,16,159,167,147,263 +"YJL198W",457,880,1961,4623,1622,123,306,313,460 +"YJL197W",779,946,1078,1311,1125,413,513,526,820 +"YJL196C",522,642,525,260,458,986,703,595,814 +"YJL194W",116,183,175,181,489,54,166,157,150 +"YJL193W",185,274,256,421,321,102,138,139,242 +"YJL192C",642,650,686,872,1029,511,500,538,819 +"YJL191W",1623,1607,1771,2818,3384,336,1168,1182,2269 +"YJL190C",1815,2489,2928,5874,9893,516,1188,1311,2555 +"YJL189W",3561,3710,3606,5627,10732,1182,2837,3370,5466 +"YJL187C",358,360,372,335,508,414,280,261,342 +"YJL186W",1695,2083,2210,2163,1927,1281,1431,1359,2029 +"YJL185C",562,565,355,122,85,411,372,400,712 +"YJL184W",456,431,362,326,526,419,422,502,726 +"YJL183W",770,852,868,1142,1341,862,816,724,1096 +"YJL181W",182,240,150,135,305,190,131,163,230 +"YJL180C",413,462,395,260,228,1383,490,396,611 +"YJL179W",296,309,294,394,466,195,284,282,397 +"YJL178C",1325,1307,1100,913,868,919,1020,1163,1859 +"YJL177W",2620,3015,3459,6047,9709,649,1796,1821,3499 +"YJL176C",1383,1433,1393,1292,1080,1216,1194,1012,1477 +"YJL174W",2047,2252,2710,4516,3698,1923,1952,2045,2911 +"YJL173C",725,715,547,306,297,575,478,698,1093 +"YJL172W",1525,1767,1394,731,370,835,859,1131,1592 +"YJL171C",372,440,563,1079,1023,415,352,341,543 +"YJL170C",31,26,18,17,28,19,34,29,50 +"YJL168C",611,681,807,1067,1047,438,617,518,722 +"YJL167W",4947,4869,4146,3182,2110,4533,4242,3890,6029 +"YJL166W",2300,2052,1394,1050,2304,4906,4476,3576,4459 +"YJL165C",943,925,709,624,750,759,683,690,1235 +"YJL164C",715,592,210,16,60,650,490,545,902 +"YJL163C",1232,1150,642,49,52,1264,948,1110,1744 +"YJL162C",352,402,425,468,428,130,193,216,353 +"YJL161W",453,368,193,27,32,505,288,450,727 +"YJL160C",51,61,51,38,35,43,44,55,98 +"YJL159W",23189,19082,17886,24005,26110,3281,10121,22512,29281 +"YJL158C",303,517,771,2125,2083,977,646,358,319 +"YJL157C",507,740,1017,1125,1668,284,406,463,519 +"YJL156C",1060,1104,999,1265,1331,689,751,744,1121 +"YJL155C",1056,944,614,238,434,1045,827,937,1424 +"YJL154C",1439,1449,1133,703,522,856,835,995,1632 +"YJL153C",12135,8979,7305,5451,1758,11012,33708,35782,29062 +"YJL151C",927,770,635,495,648,1246,1147,1219,1903 +"YJL149W",524,610,419,320,377,295,361,379,593 +"YNCJ0003C",1,1,1,4,8,5,4,1,3 +"YNCJ0004C",3,4,2,3,5,6,5,2,7 +"YJL148W",523,930,1409,3125,3091,68,346,371,625 +"YJL147C",400,407,319,265,333,233,312,287,452 +"YJL146W",748,722,646,404,535,469,579,600,938 +"YJL145W",539,679,762,915,769,380,391,412,669 +"YJL144W",1039,786,340,32,63,852,760,1023,1922 +"YJL143W",623,629,588,655,1026,1302,789,690,1066 +"YJL142C",27,21,15,10,30,34,25,28,30 +"YJL141C",2872,2370,1216,238,479,2389,2126,2284,3275 +"YJL140W",1710,1568,1309,1254,1973,1997,1723,1661,2591 +"YJL139C",439,496,459,471,439,265,250,258,532 +"YJL138C",509,615,659,1175,1509,332,393,478,774 +"YJL137C",876,788,503,112,119,860,780,686,1188 +"YJL136W-A",6,7,5,1,7,6,4,4,5 +"YJL136C",2130,2621,2840,4730,8472,801,1686,1733,3343 +"YJL134W",433,559,656,895,938,401,439,363,679 +"YJL133C-A",1063,1033,901,561,2453,2150,1988,1404,1719 +"YJL133W",188,279,527,851,642,222,205,179,234 +"YJL132W",656,478,275,61,149,646,492,603,896 +"YJL131C",402,386,284,148,236,756,432,352,579 +"YJL130C",7743,8422,8193,12568,10681,3421,5224,5099,7922 +"YJL129C",963,1196,1155,1500,1495,564,639,593,1057 +"YJL128C",756,826,833,755,724,474,504,519,835 +"YJL127C-B",227,205,176,147,166,211,238,278,402 +"YJL127C",405,397,406,447,338,202,255,263,423 +"YJL126W",299,290,308,292,236,263,275,253,423 +"YJL125C",480,536,798,1484,1404,219,350,343,556 +"YJL124C",680,708,604,680,1105,825,757,703,987 +"YJL123C",2715,2600,2355,1847,2065,2110,2281,2617,4036 +"YJL122W",353,688,1219,2856,2956,41,221,207,444 +"YJL121C",669,694,766,881,880,741,604,599,1144 +"YJL118W",65,83,85,92,115,82,87,61,87 +"YJL117W",985,939,771,575,603,845,911,957,1480 +"YJL116C",1061,1354,1903,3483,2659,557,408,499,1135 +"YJL115W",754,777,803,574,589,446,488,649,1053 +"YJL112W",1060,1059,785,509,764,1731,974,855,1307 +"YJL111W",2873,2995,3021,3896,3189,1616,2098,1962,3293 +"YJL110C",693,810,1046,1457,1227,223,436,435,592 +"YJL109C",1120,1873,2910,8208,4842,172,537,450,948 +"YJL108C",71,97,114,158,191,85,32,51,79 +"YJL107C",53,70,63,129,171,82,30,20,44 +"YJL106W",130,108,47,22,67,190,138,136,176 +"YJL105W",114,80,70,34,147,203,165,108,177 +"YJL104W",334,408,404,510,764,971,380,350,462 +"YNCJ0007C",5,7,2,6,3,4,13,5,3 +"YJL103C",1233,1219,787,395,679,878,965,1017,1486 +"YJL102W",599,689,505,321,438,660,556,469,698 +"YJL101C",2269,2729,2326,2115,1659,553,950,1245,2110 +"YJL100W",605,616,479,351,445,545,562,449,635 +"YJL099W",554,528,379,228,273,414,381,415,673 +"YJL098W",1104,1541,1870,3304,2346,377,519,561,1050 +"YJL097W",597,500,450,421,566,544,501,541,774 +"YJL096W",327,363,266,279,431,1519,364,298,464 +"YJL095W",635,652,615,484,427,279,358,326,550 +"YJL094C",1237,1211,974,549,675,842,972,1004,1576 +"YJL093C",735,796,629,486,628,712,624,699,961 +"YJL092W",595,594,500,393,312,763,709,502,688 +"YJL091C",594,568,438,416,548,481,434,484,704 +"YJL090C",438,516,480,539,781,363,360,367,634 +"YJL089W",1721,1182,570,165,238,836,1580,1488,2208 +"YJL088W",2796,2406,2522,3010,4190,907,2159,1780,3082 +"YJL087C",489,633,658,987,861,250,328,343,532 +"YJL085W",673,760,606,518,719,506,542,481,786 +"YJL084C",1125,1196,1111,1163,611,698,696,722,1144 +"YJL083W",313,283,262,283,120,256,222,215,356 +"YJL082W",1627,1584,1109,303,541,1053,1134,1248,2061 +"YJL081C",1336,1429,1281,1445,1061,1324,1355,1189,1905 +"YJL080C",1776,2382,2643,4413,3223,848,1268,1127,1656 +"YJL079C",2217,2679,2583,3349,9021,1890,3655,2278,2510 +"YJL078C",1385,1128,1030,1114,1237,928,1032,2002,2461 +"YJL077W-B",35,30,29,34,54,40,31,40,37 +"YJL077C",87,94,82,52,147,162,174,113,169 +"YJL076W",986,1175,1350,2182,1684,718,929,770,1036 +"YJL075C",14,12,17,23,19,9,8,6,9 +"YJL074C",1376,1450,1121,540,872,1346,723,972,1394 +"YJL073W",371,372,402,337,579,255,359,330,473 +"YJL072C",319,340,308,378,442,209,269,245,432 +"YJL071W",623,653,624,600,579,366,540,422,739 +"YJL070C",721,742,495,119,193,589,569,552,898 +"YJL069C",396,672,1148,2534,1611,111,264,271,490 +"YJL068C",1490,1306,991,483,281,1944,1559,1558,2415 +"YJL066C",1277,1021,739,266,155,3692,1613,1360,2196 +"YJL065C",246,263,213,276,284,254,243,211,377 +"YJL063C",367,367,356,307,399,2026,539,442,654 +"YJL062W-A",317,295,243,154,213,1753,492,433,597 +"YJL062W",429,488,469,414,320,365,394,328,499 +"YJL061W",814,1004,959,1303,1206,429,630,630,931 +"YJL060W",1452,1736,1663,1785,602,683,1168,1033,1861 +"YJL059W",351,326,156,71,164,360,354,301,549 +"YJL058C",184,228,215,248,239,162,183,126,190 +"YJL057C",2405,2111,1139,170,343,2642,1993,2082,3322 +"YJL056C",505,516,436,289,319,265,335,322,532 +"YJL055W",1342,1173,986,735,821,2331,1509,1420,2230 +"YJL054W",780,913,935,997,1168,1092,662,602,966 +"YJL053W",946,825,600,334,400,831,815,796,1287 +"YJL052W",21272,16913,11048,3722,738,19197,4335,10070,28539 +"YJL051W",184,199,164,169,250,393,519,297,260 +"YJL050W",1004,1577,2454,5604,4241,148,385,449,935 +"YJL049W",673,632,488,417,495,609,565,562,922 +"YJL048C",5440,4538,2986,1267,886,6630,6300,6097,8034 +"YJL047C-A",7,3,1,1,3,1,2,3,4 +"YJL047C",651,711,624,444,404,338,379,383,632 +"YJL046W",371,409,341,320,343,768,308,341,440 +"YJL045W",4390,3769,2524,1017,117,1297,2421,2965,5396 +"YJL044C",770,849,811,966,601,431,664,667,1018 +"YJL043W",34,25,28,31,16,39,27,27,39 +"YJL042W",1903,1735,1391,742,672,1867,1386,1399,2273 +"YJL041W",1314,1444,1322,1460,1377,807,998,935,1379 +"YJL039C",1461,1656,1528,1893,1838,720,885,871,1356 +"YJL038C",101,161,201,308,177,64,55,56,126 +"YJL037W",222,215,163,125,111,226,167,212,298 +"YJL036W",1574,1521,1059,337,459,1388,1352,1399,2235 +"YJL035C",84,73,68,74,163,93,53,55,106 +"YJL034W",9264,7920,5731,2203,1605,5035,4147,5161,10934 +"YJL033W",679,1047,1653,3891,3270,94,384,377,623 +"YJL031C",575,623,561,468,371,482,554,445,740 +"YJL030W",402,437,406,416,310,368,442,403,614 +"YJL029C",696,737,644,667,477,553,521,505,837 +"YJL028W",1,3,3,1,4,4,6,14,8 +"YJL027C",15,5,4,3,6,14,9,3,16 +"YJL026W",8793,8200,6790,5506,3266,3448,3284,5032,10584 +"YJL025W",123,180,257,445,268,64,113,93,190 +"YJL024C",432,464,465,544,559,276,303,329,564 +"YJL023C",547,524,365,217,419,496,540,506,787 +"YJL020C",2665,2351,1526,526,535,2594,1834,1896,3037 +"YJL019W",310,393,354,296,367,192,226,213,346 +"YJL016W",1646,1204,646,376,700,1061,798,993,1987 +"YJL014W",2667,3168,3118,4035,3684,1747,2343,2159,3296 +"YJL013C",587,586,440,361,534,653,647,530,843 +"YJL012C",1475,1627,1595,1749,1682,877,960,975,1596 +"YJL011C",138,205,284,600,514,45,112,106,189 +"YJL010C",597,885,1176,2670,2102,131,266,319,579 +"YJL008C",3656,3954,3531,3643,2967,2138,2807,2740,4292 +"YJL006C",321,325,336,308,375,206,256,245,352 +"YJL005W",2205,2102,1424,616,390,1848,1360,1461,2491 +"YJL004C",693,638,452,296,506,568,545,597,983 +"YJL003W",376,395,229,141,196,445,332,337,534 +"YJL002C",2102,2233,2029,1921,1797,1338,1411,1569,2470 +"YJL001W",3232,2863,2257,1579,948,2630,3237,3355,5176 +"YJR001W",1174,1205,934,721,867,1192,1008,1029,1698 +"YJR002W",1221,1468,1869,3346,3304,334,609,709,1357 +"YJR003C",613,662,545,706,1276,293,515,477,707 +"YJR004C",1021,1075,908,882,2032,3180,721,607,987 +"YJR005W",817,755,596,614,1122,820,747,652,1006 +"YJR006W",453,479,459,322,513,384,386,394,531 +"YJR007W",1394,1709,1980,3063,2603,768,982,940,1546 +"YJR008W",6372,4829,2510,347,408,8009,9183,8877,12127 +"YJR009C",10181,9365,8315,8050,3476,2576,1479,4709,13642 +"YJR010W",2024,3663,4963,12811,10598,1987,1114,1213,2013 +"YJR010C-A",203,215,180,152,231,162,174,187,307 +"YJR011C",343,368,295,200,309,264,255,309,428 +"YJR012C",246,299,232,177,218,247,290,281,416 +"YJR013W",536,581,516,465,632,550,511,442,705 +"YJR014W",776,996,1085,1762,1668,518,579,629,1061 +"YJR015W",1042,1117,1140,1194,1573,816,748,761,1156 +"YJR016C",3651,4469,5555,10242,7418,1227,2343,2278,4301 +"YJR017C",601,622,559,572,524,621,629,587,948 +"YJR019C",1479,1602,1337,361,146,5027,2458,1888,2405 +"YJR021C",567,543,400,183,238,635,516,528,835 +"YJR022W",131,121,101,57,104,109,89,85,182 +"YJR024C",879,1054,950,1121,1498,683,763,814,1454 +"YJR025C",1967,1842,1382,1103,967,1712,1534,1903,3067 +"YJR027W",178,183,135,188,105,102,75,91,138 +"YJR030C",235,273,240,147,510,223,162,199,279 +"YJR031C",812,830,726,742,821,517,540,470,823 +"YJR032W",548,747,757,962,747,249,382,392,636 +"YJR033C",1077,1037,688,308,221,780,695,712,1092 +"YJR034W",188,178,128,65,132,763,274,244,360 +"YJR035W",941,946,749,466,400,579,549,592,981 +"YJR036C",419,440,268,73,88,339,294,298,500 +"YJR039W",761,700,381,133,231,746,562,580,964 +"YJR040W",566,686,716,637,320,329,440,418,647 +"YJR041C",390,703,895,1810,1646,70,203,167,294 +"YJR042W",1165,1342,1224,1639,2188,824,1021,905,1392 +"YJR043C",207,296,344,375,427,155,195,196,268 +"YJR044C",856,889,678,349,288,1052,1007,928,1315 +"YJR045C",9794,8669,6306,3757,4874,26175,7924,6886,11035 +"YJR046W",958,1047,1043,721,580,360,420,533,1185 +"YJR047C",17,30,63,280,155,9,15,19,36 +"YJR048W",648,681,648,714,1960,4039,3481,1396,1064 +"YJR049C",1048,1053,898,640,572,730,760,923,1411 +"YJR050W",335,356,352,308,383,215,315,351,617 +"YJR051W",928,914,793,811,813,778,797,823,1242 +"YJR052W",745,770,802,797,553,446,476,515,885 +"YJR053W",185,231,217,236,150,158,135,120,183 +"YJR054W",278,327,560,825,381,197,196,201,332 +"YJR055W",135,148,170,222,197,52,65,92,151 +"YJR056C",341,390,382,508,452,242,290,283,495 +"YJR057W",283,304,259,248,364,244,227,250,422 +"YJR058C",329,273,213,192,304,333,300,280,500 +"YJR059W",1401,1131,705,219,446,1305,969,989,1603 +"YJR060W",478,443,415,299,444,407,449,453,695 +"YJR061W",2803,2825,2210,1107,1198,1878,2088,2214,3689 +"YJR062C",523,571,541,459,253,308,350,369,509 +"YJR063W",184,295,502,1148,1027,35,129,141,244 +"YJR064W",2388,2697,2643,3639,3444,1219,1875,1903,2996 +"YJR065C",1701,1644,1091,665,701,1742,1602,1433,2367 +"YJR066W",913,958,799,678,623,705,646,597,929 +"YJR067C",180,214,196,231,317,129,127,152,302 +"YJR068W",664,760,736,790,961,533,630,610,923 +"YJR069C",303,500,520,1019,1119,284,316,303,466 +"YJR070C",702,1094,1985,5035,4126,150,389,427,842 +"YJR072C",743,933,1069,1641,1644,449,617,643,1190 +"YJR073C",3865,3296,2725,1770,821,4467,5729,6405,9286 +"YJR074W",895,781,733,493,459,805,951,1057,1656 +"YJR075W",1155,1328,1320,1579,1635,752,797,837,1431 +"YJR076C",1105,1219,1202,1256,1248,1577,1314,1031,1526 +"YJR077C",1882,2224,2400,3189,4385,3953,2703,2096,2541 +"YJR078W",730,831,807,977,722,361,341,496,967 +"YJR079W",42,40,41,33,39,24,25,39,43 +"YJR080C",540,564,477,455,518,1351,610,532,754 +"YJR082C",684,669,637,582,539,395,468,565,916 +"YJR083C",267,311,272,176,161,322,298,272,436 +"YJR084W",332,409,414,376,320,313,399,374,585 +"YJR085C",1637,1496,1084,539,441,2524,2376,2381,3590 +"YJR086W",440,356,255,212,444,494,447,468,676 +"YJR088C",1127,1166,1081,1010,1342,987,1085,983,1554 +"YJR089W",1218,1284,1078,851,822,889,836,811,1324 +"YJR090C",1038,981,828,751,833,631,632,650,1005 +"YJR091C",1628,1483,1127,448,681,1412,1245,1248,1869 +"YJR092W",311,339,293,338,502,1029,1383,774,557 +"YJR093C",339,385,358,386,542,269,287,275,436 +"YJR094C",472,372,246,120,107,268,313,553,676 +"YNCJ0028C",4993,4015,2658,1883,792,1594,2050,2864,7632 +"YJR094W-A",1307,1566,1721,2951,5253,566,1437,1479,2380 +"YJR095W",2780,2998,2172,544,373,3234,5170,3516,4387 +"YJR096W",5017,4466,2444,462,194,4169,2004,2903,7081 +"YJR097W",261,369,528,909,807,88,193,192,351 +"YJR098C",185,168,146,91,144,332,288,258,314 +"YJR099W",514,496,423,235,180,780,691,572,787 +"YJR100C",565,541,514,380,522,934,550,485,768 +"YJR101W",308,354,278,338,524,1536,363,338,442 +"YJR102C",360,362,286,173,206,373,303,325,473 +"YJR103W",993,899,707,465,572,1680,1146,1218,1871 +"YJR104C",14696,10859,6865,3165,3962,18046,16876,20611,33584 +"YJR105W",3516,3931,4202,5464,7177,2447,3621,3792,5248 +"YJR106W",584,638,504,314,218,383,338,352,574 +"YJR107W",443,387,260,185,322,444,393,377,643 +"YJR107C-A",256,303,252,269,194,168,179,214,373 +"YJR108W",37,29,16,12,15,42,40,39,68 +"YJR109C",5604,4641,3872,4706,3461,1245,3716,3199,5715 +"YJR110W",442,470,458,325,345,291,328,330,485 +"YJR111C",251,325,401,663,433,88,181,208,309 +"YJR112W",226,256,347,343,117,148,204,186,368 +"YJR112W-A",253,302,223,157,182,271,301,300,573 +"YJR113C",680,658,609,411,571,2533,962,811,1208 +"YJR115W",263,195,78,11,116,294,151,190,352 +"YJR116W",186,196,196,105,136,195,155,170,306 +"YJR117W",2963,2485,1673,752,1146,2010,1989,2198,4101 +"YJR118C",434,500,421,394,403,479,504,403,684 +"YJR119C",578,660,675,758,997,187,307,402,580 +"YJR120W",151,221,145,119,129,333,207,172,206 +"YJR121W",9295,9662,7620,6829,9030,16551,12362,10538,12529 +"YJR122W",573,584,500,232,313,2250,635,515,759 +"YJR123W",13417,14884,15912,26821,45557,3918,9236,9813,17988 +"YJR124C",203,350,436,834,923,76,140,116,232 +"YJR125C",1458,1322,1037,484,689,1850,1645,1517,2188 +"YJR126C",1785,1676,1195,536,604,1415,1325,1459,2449 +"YJR127C",711,581,504,488,599,642,527,592,851 +"YJR128W",16,15,8,4,9,4,3,7,17 +"YNCJ0030W",57,67,80,100,91,28,25,29,55 +"YJR129C",262,322,390,456,286,119,83,125,276 +"YJR130C",1387,1309,1027,788,921,937,1008,997,1658 +"YJR131W",507,568,403,320,288,246,270,290,530 +"YJR132W",997,1231,1311,2350,2810,529,592,585,968 +"YJR133W",582,677,574,478,547,1567,905,785,949 +"YJR134C",984,994,805,717,848,849,852,840,1365 +"YJR135C",146,189,148,121,130,141,128,129,223 +"YJR135W-A",266,311,292,299,298,896,329,324,463 +"YJR136C",343,303,219,215,329,261,293,273,498 +"YJR137C",6455,8689,9678,16883,12461,1778,2593,3017,5410 +"YJR138W",924,946,739,606,520,451,493,553,884 +"YJR139C",3420,3781,3238,3548,4252,3904,3051,3436,5380 +"YJR140C",763,823,815,668,664,567,465,391,701 +"YJR141W",390,381,352,284,407,240,347,348,540 +"YJR142W",471,451,313,311,325,585,398,403,603 +"YJR143C",1066,1248,1382,1721,1986,605,729,702,1232 +"YJR144W",1162,1290,1206,1311,1173,887,1093,1160,1743 +"YJR145C",2529,2952,3354,5545,8705,721,1824,2013,3904 +"YJR146W",69,59,48,27,30,168,94,69,104 +"YJR147W",220,221,181,222,295,356,246,238,362 +"YJR148W",2235,2298,1909,1113,475,10416,4626,2845,3761 +"YJR149W",331,273,219,103,107,1565,584,310,433 +"YJR150C",30,23,29,14,10,32,21,26,51 +"YJR151C",613,522,449,139,166,439,392,386,572 +"YJR152W",415,566,527,467,736,213,218,264,468 +"YJR153W",159,165,151,176,147,78,76,95,171 +"YJR154W",675,712,655,998,943,170,313,435,828 +"YJR155W",1184,1187,1128,1539,1720,372,599,777,1547 +"YJR156C",115,137,85,51,51,134,71,89,177 +"YJR159W",5,14,4,6,5,6,4,10,16 +"YJR160C",7,13,8,6,13,26,7,10,16 +"YJR161C",61,55,34,42,37,35,42,52,86 +"YKL222C",483,488,357,331,353,347,340,319,521 +"YKL221W",257,202,141,39,61,148,120,121,287 +"YKL220C",149,97,53,51,122,225,128,102,182 +"YKL219W",422,443,299,237,393,442,367,411,640 +"YKL218C",230,167,106,97,168,1648,426,305,395 +"YKL217W",70201,46534,23665,1478,2666,155322,126111,100692,128185 +"YKL216W",778,1144,1389,2573,4091,178,380,520,935 +"YKL215C",975,1005,738,423,587,1017,761,711,1067 +"YKL214C",454,459,412,368,404,359,394,372,636 +"YKL213C",1464,1479,1264,880,510,1250,1267,1102,1840 +"YKL212W",1107,1250,1423,2413,3198,743,954,841,1295 +"YKL211C",881,972,1097,1348,1432,536,911,813,1208 +"YKL210W",9683,9346,7026,4452,2781,7347,8285,7835,11918 +"YKL209C",456,456,377,173,157,351,305,322,563 +"YKL208W",190,212,204,160,253,291,227,213,297 +"YKL207W",1029,1038,952,909,917,1019,909,988,1585 +"YKL206C",420,457,335,331,378,382,430,396,598 +"YKL205W",598,818,960,1665,1866,270,408,369,600 +"YKL204W",832,824,810,643,531,809,725,657,973 +"YKL203C",926,1040,876,580,706,654,658,635,972 +"YKL201C",2815,3051,3156,4446,2514,4047,2344,2430,3656 +"YKL198C",996,968,848,505,447,1134,860,751,1349 +"YKL197C",974,1083,881,354,115,662,457,583,1003 +"YKL196C",1839,1801,1538,1389,1445,1744,1963,1856,2812 +"YKL195W",2571,2262,1686,732,1124,11250,3597,2928,3981 +"YKL194C",192,237,187,127,165,905,250,221,310 +"YKL193C",939,945,610,216,193,939,806,823,1268 +"YKL192C",566,579,488,365,480,1428,686,546,861 +"YKL191W",842,1050,1344,2136,1581,270,453,506,928 +"YKL190W",934,882,869,815,710,766,850,844,1436 +"YKL189W",385,342,247,153,313,580,434,378,575 +"YKL188C",2741,2718,1484,67,33,5266,2999,2647,3633 +"YKL187C",6752,5401,2549,168,66,17738,8556,5441,8376 +"YKL186C",686,597,540,563,795,1416,978,910,1277 +"YKL185W",1481,1403,1084,642,817,295,1460,3023,2711 +"YKL184W",901,1007,997,1183,1282,504,556,533,933 +"YKL183C-A",12,13,9,15,13,8,13,5,14 +"YKL183W",168,176,267,395,412,135,266,257,276 +"YKL182W",45876,46671,37795,29485,14486,26538,40221,30103,42378 +"YKL181W",1955,2665,3156,5500,7367,938,1532,1603,2557 +"YKL180W",2675,2942,3340,5803,7885,744,1750,1680,3424 +"YKL179C",1232,1237,1104,730,701,888,998,879,1393 +"YKL178C",2374,2900,2290,1716,4849,2058,1071,1480,2560 +"YKL176C",1558,1617,1450,1436,1688,934,1054,1052,1664 +"YKL175W",848,920,856,759,725,566,658,664,1056 +"YKL174C",791,894,880,1000,917,380,528,538,1006 +"YKL173W",1047,1149,1030,1114,1084,505,658,614,1097 +"YKL172W",1498,2162,3517,7596,6660,271,918,958,1640 +"YKL171W",1335,1050,679,284,589,1943,1510,1443,1776 +"YKL170W",552,525,386,275,496,2188,791,618,942 +"YKL168C",537,510,323,80,144,355,335,384,600 +"YKL167C",322,316,246,231,328,843,338,274,436 +"YKL166C",294,398,471,774,978,162,194,210,330 +"YKL165C",523,587,575,383,535,421,369,361,537 +"YKL164C",2569,1447,1260,1174,1024,1174,4403,11709,7661 +"YKL163W",1906,1922,1229,334,179,303,260,666,1932 +"YKL162C",330,310,228,96,97,290,283,261,461 +"YKL161C",411,379,260,126,201,275,212,308,500 +"YKL160W",1068,1141,1035,961,1146,1394,1114,1080,1781 +"YKL159C",204,208,189,184,213,127,126,130,207 +"YKL157W",4095,3919,3012,1934,1250,3282,2845,2924,4634 +"YKL156W",1652,1883,2288,3917,4849,550,1420,1437,2317 +"YKL155C",436,578,601,695,613,594,463,305,497 +"YKL154W",339,473,478,600,561,239,359,279,453 +"YKL152C",60017,48273,33456,18293,7769,22083,18256,39608,90640 +"YKL151C",2962,2274,1444,440,77,4022,1677,2314,4841 +"YKL150W",9329,7080,4340,1657,1785,19562,10617,9886,14691 +"YKL149C",734,778,598,356,368,662,805,702,1057 +"YKL148C",5587,5282,3992,1762,3189,12875,8286,7028,8653 +"YKL146W",1315,1217,1094,575,1220,1304,1238,1156,1748 +"YKL145W",6888,6465,5158,3781,3198,5237,6526,6277,9592 +"YKL144C",236,367,397,724,841,158,222,225,322 +"YKL143W",567,884,1347,2630,3182,64,319,335,588 +"YKL142W",3925,3333,2040,593,611,4341,3422,3578,5545 +"YKL141W",4278,3937,2940,1819,2406,9826,6590,5693,7415 +"YKL140W",1051,947,727,361,426,921,762,965,1423 +"YKL139W",491,567,604,682,646,252,330,339,510 +"YKL138C-A",502,457,396,250,234,450,487,465,731 +"YKL138C",256,269,208,172,252,1196,360,269,382 +"YKL137W",303,317,248,179,293,1850,438,359,526 +"YKL135C",1496,1611,1190,1002,1163,1311,1333,1266,2007 +"YKL134C",666,698,556,376,403,621,539,476,717 +"YKL133C",625,539,369,154,285,572,468,519,788 +"YKL132C",164,148,150,146,197,156,116,123,195 +"YKL130C",419,433,415,358,446,324,340,326,499 +"YKL129C",1053,987,849,283,235,800,771,763,1123 +"YKL128C",214,262,330,598,472,277,206,185,301 +"YKL127W",769,744,661,458,291,869,526,701,1030 +"YKL126W",1414,1416,1129,574,833,1569,1246,1234,1859 +"YKL125W",583,531,458,668,1358,447,457,506,833 +"YKL124W",993,887,665,255,646,1239,996,899,1568 +"YKL122C",871,845,884,1034,1367,642,807,754,1102 +"YKL121W",557,609,447,226,250,519,430,490,749 +"YKL120W",461,1047,2398,5714,3898,108,319,286,513 +"YKL119C",272,343,270,237,311,362,316,347,446 +"YKL117W",6124,5459,4498,3239,2024,6265,5530,5370,8403 +"YKL116C",363,372,326,202,271,234,353,468,639 +"YKL114C",682,831,937,1410,1280,438,583,535,874 +"YKL113C",673,775,837,647,902,352,428,606,966 +"YKL112W",1550,1633,1532,1355,1776,1000,1435,1123,1657 +"YKL110C",425,452,563,854,704,722,285,334,509 +"YKL109W",1531,1627,1528,801,6090,2757,1966,1466,1740 +"YKL108W",263,337,312,185,391,182,201,244,371 +"YKL107W",1776,1388,861,148,30,621,686,1071,2539 +"YKL106C-A",29,21,13,4,2,15,16,28,56 +"YKL106W",927,996,924,1110,726,854,963,825,1298 +"YKL105C",960,1029,817,361,405,861,747,721,1060 +"YKL104C",3020,2972,2398,1648,2412,1922,2638,2440,3591 +"YKL103C",1932,1918,1273,309,177,1396,1237,1506,2571 +"YKL101W",643,861,797,526,859,731,488,462,677 +"YKL100C",3553,2958,1676,452,638,3670,2918,2933,4794 +"YKL099C",361,571,721,1367,1588,55,185,243,393 +"YKL098W",326,376,358,351,358,275,292,346,536 +"YKL096C-B",22,10,8,11,4,23,23,23,38 +"YKL096W-A",13816,15222,13819,11521,10658,13868,12476,8302,13192 +"YKL096W",141,114,51,25,26,461,94,101,191 +"YKL095W",339,357,340,314,331,180,180,211,365 +"YKL094W",2318,2331,1779,1296,1419,2121,2521,2500,3748 +"YKL093W",1943,1722,1279,416,497,1559,1442,1604,2670 +"YKL092C",413,487,387,326,463,340,317,254,387 +"YKL091C",1354,923,414,72,202,3505,1627,1600,2290 +"YKL090W",345,337,260,286,510,312,239,240,444 +"YKL089W",279,325,387,367,458,219,214,199,322 +"YKL088W",595,678,699,873,1173,529,531,464,742 +"YKL087C",410,418,312,235,540,2265,594,499,623 +"YKL086W",82,100,45,18,39,74,74,98,167 +"YKL085W",4150,3549,2044,1061,2996,7139,5058,5351,7661 +"YKL084W",113,137,118,138,123,168,90,99,161 +"YKL082C",1206,1443,2082,3836,3289,248,685,760,1381 +"YKL081W",1980,2713,3621,7329,8113,1024,1445,1369,2265 +"YKL080W",2031,2224,2070,2232,2231,1549,1669,1741,2726 +"YKL079W",644,752,874,1044,856,444,543,536,824 +"YKL078W",173,322,694,1538,847,31,50,70,123 +"YKL077W",1327,1569,1610,1760,1574,898,1085,1086,1682 +"YKL075C",783,847,777,834,960,511,654,676,1028 +"YKL074C",534,566,564,739,786,227,369,366,621 +"YKL073W",730,893,899,1045,997,430,540,472,833 +"YKL072W",287,389,455,501,437,102,111,120,261 +"YKL071W",263,223,184,256,286,200,179,222,370 +"YKL070W",242,262,209,190,220,163,202,172,365 +"YKL069W",711,682,567,463,303,664,598,650,1159 +"YKL068W-A",505,892,1565,5392,552,74,357,287,577 +"YKL068W",713,984,1281,2074,1109,274,526,509,765 +"YKL067W",2511,2140,1130,438,1046,4508,2331,2607,4092 +"YKL065W-A",1203,893,404,119,31,468,802,1049,2066 +"YKL065C",2369,2147,1332,606,679,2485,2126,2383,3742 +"YKL064W",2015,1746,1525,897,1179,1669,1513,1577,2449 +"YKL063C",401,476,580,800,699,315,381,378,575 +"YKL062W",760,791,774,565,480,515,521,694,953 +"YKL061W",312,265,228,181,270,304,304,278,427 +"YKL060C",141209,111932,89435,66194,38840,82001,75963,107121,204068 +"YKL059C",421,509,397,319,522,353,378,389,672 +"YKL058W",685,680,531,389,633,796,735,707,1171 +"YKL057C",1561,1856,1770,1684,1270,1160,1425,1195,1634 +"YKL056C",4769,6344,8092,15361,22683,1619,2105,3153,6609 +"YKL055C",70,86,130,136,46,27,33,36,73 +"YKL054C",3921,3733,3442,4207,5473,4179,3924,3189,4365 +"YKL053C-A",237,192,169,127,190,920,277,261,389 +"YKL052C",545,684,549,407,426,546,598,553,823 +"YKL051W",464,479,362,410,418,325,394,276,584 +"YKL050C",1741,1549,1056,223,205,479,498,676,1611 +"YKL049C",601,679,665,552,491,476,551,535,821 +"YKL048C",306,395,476,506,416,299,294,239,389 +"YKL047W",545,470,461,361,700,488,492,443,691 +"YKL046C",1163,1244,1136,1171,1573,1363,1247,1202,1806 +"YKL045W",651,806,669,540,844,592,490,625,883 +"YKL044W",174,104,84,61,150,249,167,176,201 +"YKL043W",1809,1235,976,808,1979,2465,1867,1862,2597 +"YKL042W",199,220,175,168,345,169,133,118,180 +"YKL041W",641,646,625,518,682,599,545,543,936 +"YKL040C",847,976,941,785,922,822,862,788,1151 +"YKL039W",1215,1269,1009,889,1027,1243,844,888,1496 +"YNCK0013W",15,21,14,17,18,8,11,16,23 +"YKL038W",838,807,603,380,411,840,605,609,998 +"YKL037W",21,19,7,8,8,41,32,24,32 +"YKL035W",3568,2892,1566,446,762,7656,3009,3104,4880 +"YKL034W",722,706,535,181,272,554,501,467,734 +"YKL033W-A",537,510,455,527,668,666,749,564,795 +"YKL033W",670,699,628,600,629,356,437,391,654 +"YKL032C",1087,943,880,753,909,1382,1335,976,1154 +"YKL029C",706,1458,3271,13765,5198,205,335,310,638 +"YKL028W",1208,1368,1382,1641,1589,872,1105,1026,1571 +"YKL027W",537,736,1190,2389,1370,339,593,461,662 +"YKL026C",2361,1870,837,188,96,2856,2052,2375,4009 +"YKL025C",677,756,594,388,450,474,460,407,660 +"YKL024C",324,458,602,1510,1385,240,215,280,433 +"YKL023C-A",115,159,261,642,516,94,99,98,98 +"YKL023W",802,691,559,316,293,596,572,585,1006 +"YKL022C",834,859,790,726,726,485,628,565,921 +"YKL021C",681,828,1153,2136,2648,297,462,468,736 +"YKL020C",2227,2122,1397,939,1124,1486,1525,1567,2466 +"YKL019W",733,757,659,558,594,837,682,754,1226 +"YKL018C-A",375,348,392,386,264,425,388,345,616 +"YKL018W",237,261,295,378,345,236,233,222,336 +"YKL017C",464,530,497,347,331,295,330,334,525 +"YKL016C",3444,3372,2813,2066,3067,5631,5430,4620,6104 +"YKL015W",2826,2732,2091,1730,1165,1854,2077,1961,2995 +"YKL014C",687,1000,1330,2740,2684,97,306,306,522 +"YKL013C",1470,1293,911,602,624,1859,1562,1498,2252 +"YKL012W",879,812,726,553,700,571,602,659,1084 +"YKL011C",279,292,200,178,241,320,256,239,329 +"YKL010C",2317,2319,1931,1376,1422,1147,1299,1355,2380 +"YKL009W",758,1221,2062,4898,3979,72,394,425,810 +"YKL008C",770,793,769,977,828,419,515,623,1111 +"YKL007W",1252,1310,1074,645,333,1001,1117,1105,1681 +"YKL006C-A",330,338,300,301,255,266,338,301,483 +"YNCK0015C",10,8,6,1,6,2,9,16,15 +"YKL006W",1348,1722,2062,3778,5690,375,933,980,1888 +"YKL005C",972,909,682,481,700,993,867,899,1454 +"YKL004W",862,1027,1283,2206,1883,402,627,542,897 +"YKL003C",299,290,279,231,296,941,386,302,442 +"YKL002W",1380,1219,959,591,680,1693,1329,1457,2362 +"YKL001C",1550,2410,3317,7579,6641,712,1071,1108,1754 +"YKR001C",3622,3579,2928,2242,2318,3032,2747,3028,4735 +"YKR002W",855,948,823,569,798,900,789,746,1021 +"YKR003W",701,797,539,177,207,704,609,618,1060 +"YKR004C",342,359,301,229,204,270,324,333,460 +"YKR005C",234,254,184,137,174,334,176,172,302 +"YKR006C",518,528,484,401,522,2418,538,475,718 +"YKR007W",576,593,430,358,600,468,520,599,938 +"YKR008W",637,713,784,814,886,548,583,518,750 +"YKR009C",10137,9502,5825,757,64,31733,15071,11308,15668 +"YKR010C",470,474,433,484,654,450,452,380,549 +"YKR011C",626,602,408,199,374,650,683,553,847 +"YKR013W",568,678,746,832,1625,366,259,381,715 +"YKR014C",2087,1780,1318,910,1104,2192,1941,1853,3028 +"YKR015C",302,278,184,121,360,182,191,223,368 +"YKR016W",1220,1458,1285,1204,2149,2120,1721,1312,1527 +"YKR017C",572,578,407,228,359,522,464,497,776 +"YKR018C",5284,4398,3042,1731,1238,3940,3364,3544,6031 +"YKR019C",214,277,284,266,263,166,175,174,269 +"YKR020W",399,384,289,197,262,324,336,356,585 +"YKR021W",1134,1150,987,784,778,765,969,876,1388 +"YKR022C",517,574,579,480,505,396,422,440,764 +"YKR023W",426,444,491,472,499,281,341,275,469 +"YKR024C",445,614,1032,2113,1399,77,195,201,438 +"YKR025W",373,490,1082,1794,891,116,231,259,483 +"YKR026C",367,542,679,1219,1108,95,289,271,469 +"YKR027W",373,412,341,319,295,279,372,300,462 +"YKR028W",1239,1237,1182,1129,1100,805,929,1000,1491 +"YKR029C",854,771,642,482,638,647,678,596,934 +"YKR030W",529,525,481,408,678,385,401,416,594 +"YKR031C",1859,1917,1389,913,839,1230,1229,1277,2026 +"YKR034W",161,231,228,215,215,116,63,97,208 +"YKR035W-A",862,889,876,676,766,1212,1019,947,1526 +"YKR036C",668,786,728,945,966,365,433,455,817 +"YKR037C",263,300,298,266,418,402,351,291,455 +"YKR038C",635,681,634,717,1091,568,642,575,879 +"YKR039W",12717,15900,16097,17013,17124,4648,8847,10771,16200 +"YKR041W",56,84,118,167,57,38,47,34,72 +"YKR042W",2699,3797,6669,17349,23569,3879,4451,2867,3658 +"YKR043C",818,1007,1302,2124,1852,343,584,545,1142 +"YKR044W",361,403,489,723,562,239,277,262,447 +"YKR045C",110,177,181,232,214,81,68,85,161 +"YKR046C",9256,8160,6503,4317,2332,11931,13962,10409,15776 +"YKR048C",1961,2137,2080,2363,2908,1853,1794,1592,2664 +"YKR049C",1602,1308,1008,613,264,1831,1392,1736,3201 +"YKR050W",631,643,500,367,289,526,429,403,723 +"YKR051W",550,538,391,176,263,474,429,419,640 +"YKR052C",239,222,152,86,193,267,199,227,314 +"YKR053C",161,149,139,142,263,227,152,169,252 +"YKR054C",947,1006,910,758,674,928,663,614,900 +"YKR055W",476,493,424,265,298,428,417,440,660 +"YKR056W",561,727,1196,2099,1383,138,392,373,729 +"YKR057W",1764,1999,2141,3338,6177,594,1620,1769,3121 +"YKR058W",1478,1177,665,103,353,1786,1328,1269,2002 +"YKR059W",1232,1381,1621,3037,4160,682,736,884,1331 +"YKR060W",203,298,421,763,890,39,122,127,211 +"YKR061W",239,337,476,1035,650,205,127,147,243 +"YNCK0020C",12,13,5,12,17,19,12,15,27 +"YKR062W",637,685,809,898,705,449,476,533,824 +"YKR063C",611,786,801,992,781,212,377,444,736 +"YKR064W",717,719,672,565,461,446,471,435,868 +"YKR065C",545,581,436,311,421,1063,544,510,715 +"YKR066C",1853,1623,1214,755,637,3056,1954,1838,2997 +"YKR067W",2487,1874,887,168,570,7910,3516,2568,3279 +"YKR068C",807,887,759,709,822,502,604,698,1201 +"YKR069W",819,1390,2051,4817,1270,316,505,451,761 +"YKR070W",558,561,433,324,239,501,507,490,821 +"YKR071C",1655,2320,4207,7874,4080,907,1239,1181,2034 +"YKR072C",1114,1170,1180,1409,1348,523,796,789,1368 +"YKR073C",27,30,32,28,33,10,14,12,24 +"YKR074W",812,735,544,554,805,710,690,809,1203 +"YKR075C",471,509,981,124,381,1201,820,524,719 +"YKR076W",4396,3780,2306,521,78,2503,1991,2428,5210 +"YKR077W",482,601,487,333,1137,159,216,377,494 +"YKR078W",418,374,338,249,271,298,328,293,494 +"YKR079C",386,480,599,1014,1354,121,154,146,300 +"YKR080W",820,901,1063,4436,3178,545,617,708,1081 +"YKR081C",591,922,1452,3474,3441,77,327,272,515 +"YKR082W",1150,1394,1463,2080,1700,611,691,679,1097 +"YKR083C",156,148,135,95,142,150,162,152,223 +"YKR084C",1212,1229,1148,1064,1050,723,778,780,1345 +"YKR085C",358,376,333,279,428,1675,508,353,483 +"YKR086W",790,877,775,783,911,326,459,463,870 +"YKR087C",427,466,369,382,577,370,444,377,618 +"YKR088C",532,591,469,407,536,458,425,464,706 +"YKR089C",1097,1050,759,528,749,1102,895,915,1448 +"YKR090W",467,557,609,733,819,354,430,403,605 +"YKR091W",456,470,231,25,76,297,275,354,565 +"YKR092C",631,1080,1953,5177,4698,258,482,378,638 +"YKR093W",491,585,656,571,190,659,808,264,489 +"YKR094C",3048,3540,3959,6753,11083,1213,2541,2539,4291 +"YKR095W",2683,2604,2313,2255,1815,2119,1952,1821,2921 +"YKR095W-A",184,173,162,174,226,158,183,181,252 +"YKR096W",1440,1416,1063,613,846,1109,1037,937,1545 +"YKR097W",168,263,183,154,265,250,273,203,308 +"YKR098C",222,230,261,94,148,282,175,231,278 +"YKR099W",385,530,1005,1536,704,63,264,264,390 +"YKR100C",681,694,616,633,1011,718,614,509,863 +"YKR101W",552,588,451,330,527,322,392,406,708 +"YKR102W",211,190,122,51,167,327,254,179,327 +"YKR103W",268,225,131,97,179,257,174,162,275 +"YKR104W",101,86,72,40,115,119,99,91,147 +"YKR105C",39,51,76,88,61,21,27,26,39 +"YKR106W",133,171,111,99,122,104,106,106,182 +"YLL062C",169,216,280,413,271,237,166,130,205 +"YLL061W",2196,2689,2634,2801,1175,927,1975,1726,3005 +"YLL060C",343,324,314,318,206,168,208,276,521 +"YLL058W",725,637,749,922,576,223,345,450,874 +"YLL057C",180,152,99,82,83,197,124,113,230 +"YLL056C",668,575,486,305,235,151,285,402,917 +"YLL055W",2247,2408,2308,3076,1424,816,643,1020,2367 +"YLL054C",418,489,480,443,417,490,252,239,400 +"YLL053C",974,1292,1360,2253,1891,280,635,596,1099 +"YLL052C",790,934,1080,1669,1343,187,479,525,916 +"YLL051C",564,599,589,604,468,284,366,377,591 +"YLL050C",3674,3298,2450,1952,1787,4091,3593,4004,6206 +"YLL049W",360,421,266,191,242,401,351,362,614 +"YLL048C",2490,2617,2154,1950,2655,1248,1423,1545,2560 +"YLL046C",11,10,9,4,3,3,6,5,14 +"YLL045C",6020,7125,8425,15438,24584,1377,4336,4551,8647 +"YLL043W",1085,1362,1370,1101,1308,880,1000,827,1501 +"YLL042C",103,99,73,76,111,112,104,100,160 +"YLL041C",8236,7168,4729,2162,3502,14362,11313,9857,13465 +"YLL040C",2948,2763,2019,1069,185,2510,1884,1940,3251 +"YLL039C",15255,12735,9456,6080,2939,11577,10866,13197,20734 +"YLL038C",147,186,213,365,198,94,119,102,180 +"YLL036C",446,524,595,833,798,303,428,376,595 +"YLL035W",228,341,479,818,525,46,112,126,223 +"YLL034C",592,956,1399,3046,2567,69,296,262,513 +"YLL033W",142,177,190,184,219,64,88,104,178 +"YLL032C",377,420,414,302,245,371,407,301,421 +"YLL031C",1200,1386,1287,1198,704,882,1015,968,1356 +"YLL029W",2091,2071,1666,1082,1391,1568,1659,1690,2817 +"YLL028W",837,834,1020,990,466,299,487,548,1049 +"YLL027W",1056,1102,918,779,1877,500,706,832,1286 +"YLL026W",57809,41741,22519,4471,1372,34578,30418,36697,73584 +"YLL025W",45,38,28,10,26,56,37,38,60 +"YLL024C",7709,6887,6024,4069,1532,6037,4827,4857,9315 +"YLL023C",1435,1238,800,362,325,1214,1026,1237,2180 +"YLL022C",523,573,608,388,420,350,300,415,749 +"YLL021W",1606,1728,1620,1265,1714,1042,984,1140,1903 +"YLL019C",3133,3187,2454,1559,1601,2471,2368,2272,3704 +"YLL018C-A",111,123,157,234,106,43,65,76,126 +"YLL018C",3579,3656,3462,4337,4157,1906,2115,2359,4131 +"YLL017W",71,69,52,22,43,48,55,56,106 +"YLL016W",787,762,608,301,370,465,569,564,921 +"YLL015W",2773,2620,1676,650,616,1756,1471,1700,2830 +"YLL014W",364,424,355,494,743,341,328,357,543 +"YLL013C",591,718,756,750,579,501,383,294,447 +"YLL012W",570,810,1188,1963,1140,176,299,297,604 +"YLL011W",578,827,1379,2729,2260,73,340,324,613 +"YLL010C",349,421,661,841,485,212,208,241,390 +"YLL009C",233,236,189,125,140,2272,355,291,489 +"YLL008W",593,1010,1881,4817,3415,47,253,280,521 +"YLL007C",325,287,235,137,230,200,203,187,324 +"YLL006W-A",5,8,10,2,5,4,4,1,6 +"YLL006W",441,488,403,279,207,324,275,252,438 +"YLL005C",616,598,409,199,359,433,422,386,701 +"YLL004W",289,420,611,915,403,158,208,215,339 +"YLL003W",889,1035,825,640,668,658,622,663,1126 +"YLL002W",204,205,143,72,151,199,203,170,250 +"YLL001W",1411,1512,1029,587,928,2613,1255,1065,1506 +"YLR001C",1487,1525,1137,580,701,1168,993,993,1559 +"YLR002C",536,812,1143,2400,2206,88,266,289,529 +"YLR003C",534,637,774,1209,1469,237,373,355,624 +"YLR004C",3454,4660,5381,7775,12544,645,923,1449,3318 +"YLR005W",1221,1294,1135,831,1362,886,930,1130,1730 +"YLR006C",622,658,445,309,433,514,476,466,783 +"YLR007W",700,826,1219,1459,742,459,505,630,995 +"YLR008C",246,331,437,720,646,407,267,213,290 +"YLR009W",807,1341,2165,5333,4626,127,415,450,891 +"YLR010C",166,176,142,75,52,152,173,200,286 +"YLR011W",227,244,207,117,91,198,202,222,349 +"YLR013W",9,6,3,1,1,6,4,7,8 +"YLR014C",351,462,669,1196,758,101,174,190,374 +"YLR015W",472,579,634,673,497,434,408,384,652 +"YLR016C",287,337,395,569,369,192,238,246,357 +"YLR017W",1192,1640,2164,4019,3240,394,808,1008,1672 +"YLR018C",761,836,1280,1856,1141,418,641,685,970 +"YLR019W",812,904,1138,1120,580,546,646,646,1024 +"YLR020C",342,513,654,983,938,235,292,254,394 +"YLR021W",285,300,315,307,260,250,277,256,403 +"YLR022C",256,312,466,922,684,92,141,133,269 +"YLR023C",1034,1701,3388,5026,5616,1227,978,694,968 +"YLR024C",721,953,1010,720,381,417,355,360,578 +"YLR025W",1671,1545,1189,1062,1339,1606,1644,1585,2602 +"YLR026C",274,329,413,602,564,253,257,200,336 +"YLR027C",2173,2220,1902,1494,2664,1900,1885,1815,3126 +"YNCL0003W",10,9,9,10,32,20,15,10,32 +"YLR028C",5236,4809,3842,2527,1814,4031,3389,3978,7252 +"YLR029C",6962,8204,9614,16808,25406,1796,5419,5071,9353 +"YLR030W",445,499,317,86,141,293,242,307,528 +"YLR031W",369,400,261,71,96,185,179,224,413 +"YLR032W",615,664,607,353,671,322,327,336,741 +"YLR033W",851,869,906,1046,1212,616,739,674,1011 +"YLR034C",878,858,648,451,919,607,768,748,1176 +"YLR035C",457,398,372,253,177,310,260,273,481 +"YLR036C",104,94,41,33,67,113,82,83,148 +"YLR037C",85,71,58,35,32,114,87,96,116 +"YLR038C",1731,1486,1071,749,1345,3360,3204,2437,2899 +"YLR039C",1018,1069,853,506,250,552,590,674,1035 +"YLR040C",811,1185,1351,2228,3231,895,526,580,942 +"YLR042C",110,144,155,177,312,87,54,57,147 +"YLR043C",2125,2156,1692,1396,1171,2773,2613,2362,3743 +"YLR044C",35399,36037,31968,39186,31877,6347,5218,12503,35690 +"YLR045C",550,595,586,538,585,841,715,485,756 +"YLR046C",199,193,157,134,188,145,166,161,260 +"YLR047C",391,463,454,428,202,226,255,234,386 +"YLR048W",3881,4668,5591,11000,14190,945,2419,2326,4515 +"YLR049C",291,257,192,72,389,241,393,917,780 +"YLR050C",499,508,406,331,423,558,345,502,888 +"YLR051C",441,674,1004,1941,1778,74,254,308,525 +"YLR052W",453,481,521,593,578,271,367,330,548 +"YLR053C",215,218,147,37,59,302,198,204,328 +"YLR054C",190,182,182,128,125,144,131,133,233 +"YLR055C",406,399,477,484,540,317,336,318,497 +"YLR056W",5165,6629,6477,5032,9245,1006,2002,2321,4824 +"YLR057W",651,704,665,781,1433,355,607,546,811 +"YLR058C",2072,3348,5091,21530,13011,691,583,788,1782 +"YLR059C",217,245,292,510,406,276,348,265,371 +"YLR060W",1180,1514,2094,4104,4484,611,1118,926,1351 +"YLR061W",1847,2313,2756,5212,7297,400,1181,1241,2507 +"YLR063W",138,221,462,737,221,13,48,57,95 +"YLR064W",822,897,844,748,636,557,516,566,1015 +"YLR065C",521,648,614,826,1058,265,389,415,720 +"YLR066W",672,647,545,515,593,472,641,598,932 +"YLR067C",265,336,353,399,355,333,268,196,276 +"YLR068W",274,349,521,1083,1058,59,138,130,267 +"YLR069C",855,899,828,674,1001,6435,1194,829,1196 +"YLR070C",913,788,527,98,32,1389,842,878,1441 +"YLR071C",667,820,817,871,985,485,518,440,723 +"YLR072W",855,835,694,425,427,539,660,703,983 +"YLR073C",112,196,390,818,462,22,45,64,109 +"YLR074C",342,556,1225,2788,1470,94,192,244,441 +"YLR075W",19502,21600,21284,30448,46818,6256,12518,14604,26334 +"YLR077W",750,812,716,515,357,965,650,611,1021 +"YLR078C",478,546,449,425,584,374,431,514,767 +"YLR079W",645,604,516,401,526,441,801,1371,1354 +"YLR080W",1014,923,606,151,58,715,511,651,1145 +"YLR081W",111,109,92,95,68,170,91,77,155 +"YLR082C",487,534,453,300,386,386,417,434,736 +"YLR083C",993,1274,1594,3067,3204,432,613,531,903 +"YLR084C",251,362,633,1074,804,439,493,315,269 +"YLR085C",491,538,475,399,445,383,446,428,715 +"YLR086W",1313,1237,1112,880,731,836,911,889,1396 +"YLR087C",656,755,518,445,461,448,444,422,736 +"YLR088W",994,953,813,784,647,674,652,683,1124 +"YLR089C",2563,2876,2394,2149,2918,3990,2478,2068,3109 +"YLR090W",439,485,515,532,683,1186,407,371,542 +"YLR091W",187,206,209,175,158,203,230,220,352 +"YLR092W",1218,1796,2278,5450,1815,332,713,631,1197 +"YLR093C",2196,1953,1335,697,821,2604,2379,2354,3460 +"YLR094C",342,382,346,187,183,158,200,209,380 +"YLR095C",559,655,663,591,627,440,494,426,609 +"YLR096W",884,1033,967,1312,1106,448,622,621,991 +"YLR097C",687,744,526,350,351,510,536,577,944 +"YLR098C",277,308,260,265,280,222,246,213,387 +"YLR099C",528,599,552,315,616,402,341,385,691 +"YLR099W-A",138,188,126,125,173,228,247,233,329 +"YLR100W",1082,1222,1046,906,1033,1254,1105,1020,1506 +"YLR102C",417,371,321,169,199,457,459,386,585 +"YLR103C",233,288,281,217,573,176,156,195,286 +"YLR104W",328,334,312,278,408,249,267,343,499 +"YLR105C",385,412,379,410,471,376,310,305,555 +"YLR106C",1784,2383,2850,6228,10021,806,878,855,1547 +"YLR107W",500,595,1036,1499,617,315,362,349,683 +"YLR108C",658,644,436,41,56,347,330,405,735 +"YLR109W",14877,11103,7220,2625,262,8668,8313,9358,20060 +"YLR110C",8625,9656,11606,19170,25239,22603,18463,13705,14099 +"YLR111W",13,8,4,3,2,15,15,11,15 +"YLR112W",16,10,21,12,22,70,60,42,34 +"YLR113W",746,782,1078,1574,1381,1317,901,943,1280 +"YLR114C",1872,1951,1627,1362,1215,1304,1331,1344,2150 +"YLR115W",735,794,701,724,324,477,443,457,695 +"YLR116W",449,556,622,598,418,246,279,299,509 +"YLR117C",965,1013,763,630,704,809,753,720,1118 +"YLR118C",501,511,464,356,226,384,330,351,707 +"YLR119W",239,226,190,114,135,225,169,175,349 +"YLR120C",1124,1114,877,522,556,962,787,799,1381 +"YLR121C",540,537,506,426,470,573,375,442,839 +"YLR122C",42,51,51,36,52,58,55,49,95 +"YLR125W",115,98,97,53,68,91,63,87,156 +"YLR126C",524,557,554,485,412,311,313,352,673 +"YLR127C",432,499,409,335,306,289,288,257,484 +"YLR128W",264,265,233,158,108,204,209,176,329 +"YLR129W",780,1162,1835,4152,3056,151,401,370,654 +"YLR130C",528,706,691,1220,1015,309,454,431,733 +"YLR131C",319,299,224,153,236,789,982,582,458 +"YLR132C",313,315,268,207,130,272,377,338,426 +"YLR133W",661,782,659,509,321,584,606,590,766 +"YLR134W",214,204,181,703,1155,259,247,225,298 +"YLR135W",388,455,362,417,528,289,293,312,488 +"YLR136C",106,104,92,43,19,59,43,40,92 +"YLR137W",168,139,87,43,105,221,195,169,281 +"YLR138W",1516,1663,1638,1779,2028,834,1073,1032,1869 +"YLR139C",143,193,177,261,247,220,121,88,143 +"YLR141W",327,291,222,211,197,398,380,444,612 +"YLR142W",3882,4749,4805,3901,9907,651,1752,2313,4128 +"YLR143W",372,512,579,691,580,153,218,217,373 +"YLR144C",542,552,551,478,484,387,391,324,608 +"YLR145W",217,209,213,288,325,161,212,181,314 +"YLR146C",122,191,223,404,593,107,94,113,185 +"YLR146W-A",79,88,80,105,130,91,91,90,132 +"YLR147C",241,249,233,315,422,188,234,216,301 +"YLR148W",873,957,658,512,550,631,627,678,1047 +"YLR149C",3269,2753,1185,71,165,3915,2973,3000,4526 +"YLR150W",6737,7458,7547,10626,14474,1836,3926,4246,8586 +"YLR151C",766,609,340,71,171,1394,860,794,1148 +"YLR152C",1410,1436,1133,609,337,1250,1073,1004,1695 +"YLR153C",5904,5968,4968,3766,3514,5631,5361,5124,8041 +"YLR154C",229,208,150,87,141,257,252,234,362 +"YNCL0018W",20,42,23,25,55,62,46,44,44 +"YLR162W",3,2,4,3,2,7,14,9,10 +"YLR162W-A",7,10,4,3,8,6,9,5,6 +"YLR163C",1021,1049,960,722,905,2335,966,861,1239 +"YLR164W",1207,1041,593,60,44,283,311,619,1538 +"YLR165C",213,200,166,144,156,233,176,187,307 +"YLR166C",1387,1337,1062,835,735,894,812,796,1464 +"YLR167W",12786,14656,15832,28397,54045,3297,7622,9145,17421 +"YLR168C",416,553,626,820,1931,470,632,427,680 +"YLR170C",441,442,396,289,393,387,503,547,812 +"YLR172C",761,806,868,1438,1646,283,472,521,909 +"YLR173W",724,692,653,470,324,341,482,538,837 +"YLR174W",6604,6317,4138,1182,475,7828,10930,8874,11179 +"YLR175W",1734,2809,4521,11273,10769,235,842,875,1666 +"YLR176C",155,169,196,263,388,112,135,91,150 +"YLR177W",603,502,269,97,368,1138,474,610,965 +"YLR178C",2941,2291,1356,311,119,3828,2393,2879,4929 +"YLR179C",311,433,624,1730,1979,397,273,326,479 +"YLR180W",828,1889,4237,14065,7613,215,504,494,849 +"YLR181C",959,1016,846,544,433,1096,1019,915,1310 +"YLR182W",782,838,680,620,787,1170,911,733,985 +"YLR183C",220,228,220,146,349,229,173,191,271 +"YLR185W",1865,2251,2216,4061,5643,392,989,1170,2117 +"YLR186W",388,644,879,1704,1883,77,330,323,527 +"YLR187W",303,303,286,307,325,122,161,166,261 +"YLR188W",947,1038,943,852,797,692,764,743,1179 +"YLR189C",2134,2108,1437,753,828,1691,1411,1444,2440 +"YLR190W",757,755,656,527,646,1354,2181,1190,1089 +"YLR191W",413,515,427,406,468,498,423,391,656 +"YLR192C",1547,1589,1422,1671,2096,1004,1199,1284,2207 +"YLR193C",728,675,638,440,582,1121,794,670,1013 +"YLR194C",1073,790,732,752,1094,555,1070,2100,2442 +"YLR195C",677,774,733,885,996,570,533,534,767 +"YLR196W",841,1386,2304,5501,4782,98,446,458,810 +"YLR197W",1612,2774,4318,10425,12853,292,821,795,1462 +"YLR199C",863,903,752,696,609,523,705,604,1159 +"YLR200W",416,470,582,765,714,266,337,322,569 +"YLR201C",719,677,511,318,271,884,645,625,903 +"YLR203C",640,776,539,447,659,2211,679,556,772 +"YLR204W",464,504,381,253,448,2074,629,583,754 +"YLR205C",624,631,464,150,260,1847,2462,1239,1253 +"YLR206W",1836,1620,1220,673,1166,2437,1851,1590,2429 +"YLR207W",495,499,478,350,322,391,361,360,555 +"YLR208W",1976,2093,1920,1850,1753,1850,2019,1792,2858 +"YLR209C",317,339,292,332,361,481,343,324,434 +"YLR210W",302,316,362,403,373,249,288,212,376 +"YLR211C",604,539,391,209,143,362,498,424,728 +"YLR212C",432,512,452,340,535,313,416,442,609 +"YLR213C",129,110,99,114,130,199,141,143,182 +"YLR214W",292,317,249,254,247,273,230,216,386 +"YLR215C",327,414,468,665,600,156,213,243,396 +"YLR216C",6287,5434,3937,1911,798,5161,4128,4813,9567 +"YLR218C",178,155,80,22,53,583,243,217,312 +"YLR219W",2208,2034,1406,340,420,1601,1501,1498,2447 +"YLR220W",2014,1972,1706,1339,1959,1327,1663,1720,2779 +"YLR221C",425,577,740,1583,1885,186,310,310,532 +"YLR222C",508,839,1391,3040,2123,32,196,190,348 +"YLR223C",708,1111,2491,4729,976,180,404,408,795 +"YLR224W",545,756,1178,1356,805,206,293,341,620 +"YLR225C",711,725,673,472,556,496,537,531,971 +"YLR226W",274,382,651,907,378,114,177,165,249 +"YLR227C",393,345,401,462,426,589,597,373,540 +"YNCL0032C",54,63,28,15,29,90,92,59,99 +"YLR227W-B",298,303,245,260,135,160,147,120,186 +"YLR228C",779,607,384,211,448,988,791,714,1096 +"YLR229C",1100,1190,1213,1237,1899,1468,1276,1202,1773 +"YLR231C",1528,1625,1453,1121,963,1162,1042,1304,2113 +"YLR233C",497,515,392,246,310,292,317,388,596 +"YLR234W",146,173,163,86,110,117,122,103,166 +"YLR236C",37,47,51,30,32,35,49,33,77 +"YLR237W",11694,13077,17222,35894,23359,3007,5240,6918,14377 +"YLR238W",358,366,333,352,353,309,332,299,501 +"YLR239C",348,336,305,241,245,877,338,305,460 +"YLR240W",870,846,696,364,347,616,584,572,918 +"YLR241W",1947,1858,1447,831,590,1363,1441,1440,2202 +"YLR242C",230,221,179,182,219,129,175,174,283 +"YLR243W",371,431,538,883,943,166,261,287,386 +"YLR244C",868,1216,1523,3214,2399,330,486,484,924 +"YLR245C",97,110,133,153,120,49,56,56,110 +"YLR246W",401,465,385,303,277,234,288,284,494 +"YLR247C",2033,1897,1278,897,1281,1117,1261,1287,1998 +"YLR248W",2420,2364,1894,1593,1697,1920,1537,1758,3177 +"YLR249W",11412,20268,34548,93334,78474,1799,4753,5354,10454 +"YLR250W",1060,1104,880,637,904,1065,1011,1007,1526 +"YLR251W",934,848,516,121,114,770,608,837,1527 +"YLR253W",632,664,660,722,761,1995,735,590,794 +"YLR254C",716,676,480,307,524,548,902,827,1262 +"YLR255C",11,7,5,1,6,10,8,8,15 +"YLR256W",2710,2336,1872,1237,1403,1167,1616,1811,2825 +"YLR256W-A",13,12,17,12,14,15,5,9,15 +"YLR257W",2973,2976,2014,1608,2373,2709,1793,2316,4053 +"YLR258W",2351,1618,800,180,156,3746,1670,2584,4075 +"YLR259C",9483,7693,5281,2382,2995,23725,8309,7155,13083 +"YLR260W",657,687,629,534,461,411,419,462,743 +"YLR261C",2,5,6,1,5,10,4,5,3 +"YLR262C",287,326,273,268,299,222,272,236,396 +"YLR262C-A",954,921,819,1033,1690,712,904,969,1619 +"YLR263W",383,432,338,428,385,184,201,212,391 +"YLR264W",1012,1187,1227,2071,3068,362,947,965,1679 +"YLR264C-A",598,646,679,1256,1997,175,453,418,699 +"YLR265C",502,453,300,177,217,380,347,418,720 +"YLR266C",668,637,453,253,507,500,543,557,832 +"YLR267W",644,669,352,70,131,531,469,510,793 +"YLR268W",637,692,655,667,719,699,668,623,954 +"YLR270W",2188,1859,1096,270,231,2347,1678,1778,2823 +"YLR271W",471,426,319,185,105,386,316,335,624 +"YLR272C",543,632,578,684,799,457,471,354,651 +"YLR273C",1239,1222,940,459,593,551,890,1224,1670 +"YLR274W",1720,1908,1709,1748,2709,540,1323,1716,2253 +"YLR275W",227,224,214,279,266,145,179,158,350 +"YLR276C",1145,1643,2274,5105,4731,199,685,657,1121 +"YLR277C",414,482,458,467,434,237,316,279,448 +"YLR278C",1157,1275,1407,2113,1525,709,842,832,1126 +"YLR281C",229,202,132,74,91,293,298,301,513 +"YLR283W",376,429,341,210,247,373,327,306,492 +"YLR284C",1648,1773,1171,328,80,4949,2822,2167,2998 +"YLR285W",331,423,557,718,767,321,352,280,386 +"YLR285C-A",151,84,65,93,114,26,45,164,238 +"YLR286C",9991,5329,4227,5798,5450,1119,2714,12524,22713 +"YLR287C",710,936,1038,1657,1108,151,422,435,769 +"YLR287C-A",4622,4677,4646,6433,10211,2209,3146,3226,5699 +"YLR288C",742,704,557,412,413,594,550,584,1024 +"YLR289W",266,305,239,225,246,1010,290,239,328 +"YLR290C",632,609,393,221,127,539,544,572,871 +"YLR291C",626,796,893,1357,1202,298,399,396,714 +"YLR292C",647,760,714,832,949,411,518,526,860 +"YLR293C",1413,2141,3354,6715,5659,480,906,876,1485 +"YLR295C",2628,2493,2274,2182,2829,4281,4032,3117,3907 +"YLR296W",7,8,5,1,11,6,8,3,3 +"YLR297W",803,645,327,241,508,529,498,621,1007 +"YLR298C",419,484,463,439,499,417,481,449,665 +"YLR299W",1336,1425,1430,1150,759,1267,1005,1073,1698 +"YLR300W",2810,3730,5340,9792,5923,1147,2843,6027,4786 +"YLR301W",928,1051,1073,1272,881,544,814,804,1324 +"YLR302C",11,4,8,4,2,8,12,10,7 +"YLR303W",14765,16884,17252,27615,29135,11996,11068,11742,19128 +"YLR304C",14027,11717,7606,2601,5897,22199,12818,12602,18952 +"YLR305C",1581,1728,1425,1391,1358,937,979,973,1491 +"YLR306W",194,176,111,118,116,157,188,174,256 +"YLR307W",215,255,212,133,128,137,184,223,345 +"YLR307C-A",1386,1356,1021,530,263,410,710,818,1802 +"YLR308W",16,12,9,4,3,13,15,16,34 +"YLR309C",1519,1618,1430,1329,1360,1512,1207,1142,1666 +"YLR310C",3539,3433,2632,1938,2037,2066,2225,2293,3626 +"YLR312C",2690,2364,1296,196,512,3011,2439,2709,4062 +"YLR312W-A",349,416,368,451,652,1346,484,371,521 +"YLR313C",220,226,201,133,194,93,133,138,226 +"YLR314C",1071,1319,1306,1571,2498,2360,1802,1339,1527 +"YLR315W",70,69,60,41,57,56,68,69,88 +"YLR316C",351,361,427,523,520,245,288,284,491 +"YLR318W",295,317,396,492,388,126,185,187,297 +"YLR319C",679,737,671,675,676,431,474,463,765 +"YLR320W",501,604,545,538,519,278,313,333,564 +"YLR321C",444,500,522,639,536,268,386,311,558 +"YLR323C",300,371,386,428,383,150,165,204,401 +"YLR324W",1165,1149,927,383,290,889,928,872,1593 +"YLR325C",3171,3820,4004,6619,12348,1028,2829,2640,4957 +"YLR326W",246,304,393,601,408,411,225,258,401 +"YLR327C",25203,13250,5601,1125,4717,72557,55048,46481,54732 +"YLR328W",463,563,559,648,725,449,394,423,577 +"YLR329W",58,51,36,19,55,62,55,65,87 +"YLR330W",2229,2037,1771,1328,1624,2793,2253,2096,3244 +"YLR331C",1,2,1,2,6,3,2,1,2 +"YLR332W",226,314,499,862,1180,390,239,233,243 +"YNCL0041C",6,6,8,4,32,21,10,12,15 +"YNCL0042C",9,11,4,7,8,5,8,5,14 +"YNCL0043C",8,11,13,8,7,11,4,5,14 +"YLR333C",1698,2106,2190,4101,6673,438,967,1232,2284 +"YLR335W",1268,1519,1460,1867,1707,926,954,946,1359 +"YLR336C",816,972,1360,2243,1608,217,395,456,863 +"YLR337C",1229,1228,1010,482,361,770,677,761,1195 +"YLR340W",6249,7238,8565,14743,19288,1595,3892,3885,7316 +"YLR341W",10,16,10,23,43,14,18,14,19 +"YLR342W",2490,3858,6113,21008,17485,970,1159,1370,1905 +"YLR342W-A",16,23,28,109,181,5,15,10,14 +"YLR343W",82,90,78,71,184,77,58,68,132 +"YLR344W",2655,3064,3532,5529,8533,861,2007,2276,3940 +"YLR345W",3448,2948,1838,355,654,3519,3023,3145,4907 +"YLR346C",295,394,312,181,28,83,93,139,367 +"YLR347C",1713,2096,2260,2589,1859,797,905,1113,1918 +"YLR348C",2537,2532,2108,1184,392,7207,4532,3394,4690 +"YLR350W",712,634,531,347,592,970,780,796,1367 +"YLR351C",1083,1117,1049,938,939,1352,1041,1146,1552 +"YLR352W",686,588,358,95,296,833,627,595,824 +"YLR353W",474,514,497,369,296,477,568,418,592 +"YLR354C",7669,6581,4957,3987,2675,11741,8838,8257,13385 +"YLR355C",9562,11696,15678,33852,22884,1817,6537,5913,10297 +"YLR356W",1350,1348,907,496,158,1005,1074,1143,1685 +"YLR357W",373,423,480,495,503,287,304,292,408 +"YLR358C",19,9,20,32,35,9,14,8,23 +"YLR359W",3020,3853,4056,9767,11313,2588,2175,2212,3499 +"YLR360W",452,489,436,315,378,360,388,419,597 +"YLR361C",685,657,538,438,542,468,400,395,725 +"YLR361C-A",229,216,162,171,146,415,237,244,415 +"YLR362W",1309,1225,921,584,510,699,764,789,1442 +"YLR363C",253,316,254,216,227,157,188,189,315 +"YLR363W-A",179,278,364,693,805,63,114,119,196 +"YLR364W",179,252,353,814,855,115,98,112,182 +"YLR367W",1853,2069,1955,3018,5505,973,1300,1507,2835 +"YNCL0046W",43,48,43,68,97,16,30,29,75 +"YLR368W",498,487,465,568,560,306,351,295,507 +"YLR369W",801,950,868,672,632,701,666,685,1006 +"YLR370C",1315,1125,746,486,524,1749,1396,1320,1961 +"YLR371W",1265,1157,875,675,854,865,952,950,1392 +"YLR372W",742,1131,1590,3324,5217,346,645,550,830 +"YLR373C",881,868,813,809,642,1025,890,748,950 +"YLR375W",619,786,777,1135,796,508,600,583,1008 +"YLR376C",215,251,197,134,157,120,142,135,229 +"YLR377C",279,301,211,65,79,393,639,723,696 +"YLR378C",2168,2240,1925,1425,1406,1380,1532,1415,2189 +"YLR380W",695,734,875,1048,909,402,448,501,825 +"YLR381W",291,328,277,201,243,373,266,268,428 +"YLR382C",496,546,439,325,453,1628,568,430,648 +"YLR383W",599,595,607,456,650,459,315,369,640 +"YLR384C",2027,2353,2410,3618,3816,910,1186,1273,2139 +"YLR385C",36,31,36,42,23,24,16,25,28 +"YLR386W",712,734,540,391,466,522,457,488,710 +"YLR387C",1556,1583,1427,1207,1338,1000,1193,1182,1883 +"YLR388W",944,1167,1298,2250,4296,296,677,687,1346 +"YLR389C",1178,1153,945,968,1265,911,852,797,1191 +"YLR390W",119,147,85,74,97,372,131,141,228 +"YLR390W-A",3105,3605,4233,6736,7313,3234,2481,2118,3056 +"YLR392C",709,703,482,164,375,647,643,630,940 +"YLR393W",107,103,114,117,147,92,79,52,107 +"YLR394W",187,224,202,217,434,221,168,139,179 +"YLR395C",2336,2252,1750,1289,1480,3679,3944,3112,3938 +"YLR396C",568,626,498,356,473,467,506,423,668 +"YLR397C",399,590,681,1451,1367,230,258,281,461 +"YLR398C",954,1061,1162,1199,968,555,614,530,909 +"YLR399C",2391,1763,1173,1050,1697,2355,2662,2745,3836 +"YLR401C",338,608,1198,2755,1864,69,158,129,327 +"YLR403W",1054,1293,1413,1671,1268,641,760,704,1086 +"YLR404W",331,401,320,199,200,161,271,259,477 +"YLR405W",214,286,350,501,447,130,209,174,343 +"YLR406C",2278,2740,3153,5558,9511,474,1406,1496,2982 +"YLR407W",526,828,1466,1656,878,200,344,411,731 +"YLR408C",89,109,78,28,54,89,77,98,145 +"YLR409C",711,1053,1679,4071,3404,84,347,364,678 +"YLR410W",1132,1204,1153,1456,1210,695,856,762,1272 +"YLR411W",83,77,48,3,26,96,64,48,146 +"YLR412W",340,364,444,541,495,178,247,253,414 +"YLR413W",114,182,272,1866,1370,92,73,61,134 +"YLR414C",940,865,744,897,1410,1110,824,1280,1438 +"YLR415C",18,10,13,10,16,25,20,16,24 +"YLR417W",459,438,308,148,279,529,526,495,754 +"YLR418C",677,801,792,838,806,475,678,722,1026 +"YLR419W",931,1030,1172,1279,818,547,680,618,1093 +"YLR420W",731,869,921,1171,1256,505,508,574,891 +"YLR421C",1286,1168,985,741,879,1065,1133,1156,1895 +"YLR422W",987,1039,761,475,432,826,734,735,1140 +"YLR423C",526,458,272,119,151,449,403,408,659 +"YLR424W",396,402,348,307,368,349,293,282,439 +"YLR425W",630,628,542,364,349,432,401,367,685 +"YLR426W",226,246,212,223,267,167,183,164,283 +"YLR427W",944,958,794,678,778,704,717,747,1178 +"YLR429W",1132,1290,1197,1235,1391,1228,1254,1039,1353 +"YLR430W",1039,1126,1025,1052,1588,655,778,715,1102 +"YLR431C",1073,954,668,451,309,824,855,879,1259 +"YLR432W",791,1215,1832,3830,3543,185,322,376,860 +"YLR433C",789,729,478,475,892,595,576,585,991 +"YLR435W",307,484,646,1499,1555,47,185,146,315 +"YLR436C",1434,1311,870,680,1107,1550,1269,1190,1602 +"YLR437C",206,224,320,454,292,346,359,247,361 +"YLR438W",1420,1483,1283,807,255,2313,1153,1034,1802 +"YLR438C-A",712,720,684,888,1042,816,861,881,1342 +"YLR439W",411,392,394,391,470,1679,498,352,447 +"YLR440C",795,836,782,716,720,404,503,501,888 +"YLR441C",9518,10586,11084,18005,29386,2751,6337,6964,12367 +"YLR442C",700,782,715,532,370,530,557,537,822 +"YLR443W",405,472,479,514,621,280,321,365,544 +"YLR445W",5,9,7,11,14,5,4,5,7 +"YLR446W",366,371,221,117,135,284,231,298,439 +"YLR447C",2353,2451,2101,2248,2337,1742,1882,1983,2958 +"YLR448W",1927,2344,2729,5342,5905,322,1001,1027,1909 +"YLR449W",656,906,1339,2970,2978,136,352,389,682 +"YLR450W",1654,1467,985,417,380,1298,1221,1307,2077 +"YLR451W",798,805,788,1018,1043,343,484,473,827 +"YLR452C",584,595,482,553,1762,587,419,437,569 +"YLR453C",325,263,248,202,216,160,176,224,371 +"YLR454W",2346,2264,1620,697,258,1669,1552,1540,2421 +"YLR455W",421,534,539,688,549,455,387,302,519 +"YLR456W",154,165,116,80,112,81,114,123,161 +"YLR457C",285,302,258,168,304,182,235,229,344 +"YLR459W",661,669,627,574,712,533,518,525,735 +"YLR460C",76,101,87,34,31,58,40,59,93 +"YML131W",22476,18622,12466,6080,1465,24778,21270,22060,33886 +"YML130C",852,1280,2510,4827,844,343,340,447,866 +"YML129C",351,301,226,153,272,1733,532,470,600 +"YML128C",35629,23394,12701,3442,360,29249,23505,29228,55825 +"YML127W",764,903,822,798,928,640,655,682,979 +"YML126C",4893,4194,3515,2325,1437,3379,5228,4134,6238 +"YML125C",925,1167,1478,2168,1302,308,600,611,1259 +"YML124C",562,748,887,1298,786,830,742,533,734 +"YNCM0001W",51,53,49,56,57,21,26,44,73 +"YML121W",896,1163,1387,1907,724,470,584,745,1267 +"YML120C",3477,3238,2069,1088,2752,8251,5464,4145,5074 +"YML119W",340,348,371,466,371,441,619,432,540 +"YML118W",164,175,140,57,31,68,68,65,174 +"YML117W",1878,1753,1352,802,885,1487,1197,1229,2019 +"YML116W",735,996,938,1530,1578,222,318,384,794 +"YML115C",980,1191,1193,1592,1618,587,675,679,1157 +"YML114C",426,476,481,544,447,289,304,254,464 +"YML113W",343,433,748,1338,935,73,199,218,344 +"YML112W",247,260,302,371,327,154,201,201,305 +"YML111W",681,845,839,866,928,536,531,460,790 +"YML110C",1941,1942,1303,728,418,3790,2114,1945,2928 +"YML109W",597,691,591,381,662,353,418,431,588 +"YML108W",175,297,379,771,521,93,130,163,299 +"YML107C",361,378,363,448,338,190,237,243,416 +"YML106W",1453,1766,2140,3597,4817,956,1397,1251,1925 +"YML105C",622,785,873,1350,1395,565,728,612,926 +"YML104C",810,874,838,885,650,633,670,645,837 +"YML103C",1646,1751,1543,1802,2020,882,1055,1028,1554 +"YNCM0002C",1,3,1,2,6,4,1,2,2 +"YML102W",362,452,402,366,579,237,263,367,555 +"YML101C",230,199,127,66,122,388,376,340,465 +"YML100W",4958,2918,1003,60,152,10639,4322,4908,7131 +"YML099C",644,748,786,1009,973,272,367,424,736 +"YML098W",796,876,799,719,808,427,622,735,1216 +"YML097C",486,574,710,772,538,323,451,393,667 +"YML096W",382,466,667,1035,720,193,280,261,421 +"YML095C",190,209,193,150,134,118,121,126,233 +"YML094W",375,442,483,785,951,232,296,309,527 +"YML093W",1002,1628,2576,5981,4918,91,550,473,987 +"YML092C",1980,1881,1597,1282,1248,2194,2247,2039,3061 +"YML091C",3325,3321,2593,1286,5641,3160,3065,2556,3690 +"YML088W",835,967,1015,839,572,326,452,541,1013 +"YML087C",199,219,149,117,357,600,193,184,292 +"YML086C",1685,1865,1679,1410,1266,836,962,1026,1834 +"YML085C",1278,1209,1065,979,926,3238,1772,1393,1785 +"YML083C",31,43,29,6,16,85,28,35,61 +"YML082W",278,415,530,859,769,59,203,181,345 +"YML081C-A",1382,1320,1067,975,1205,2655,2258,1867,2431 +"YML081W",724,862,942,1244,1331,324,497,488,759 +"YML080W",364,553,1027,2061,1337,128,259,256,378 +"YML079W",999,933,817,640,431,992,856,804,1376 +"YML078W",1403,1493,1298,1245,1282,2053,1305,1328,2027 +"YML077W",274,331,321,547,570,168,219,201,326 +"YML076C",563,575,597,549,597,317,423,383,640 +"YML075C",5985,5160,3834,1305,1345,5324,5726,4802,7306 +"YML074C",1537,1891,2027,2673,3142,1121,1070,1094,1865 +"YML073C",3336,3897,3832,6831,9372,739,1796,1930,3833 +"YML072C",3688,3693,2910,2120,783,2507,2233,2213,3721 +"YML071C",839,844,851,817,754,453,558,525,1015 +"YML070W",1997,1834,1546,1083,682,1953,1614,1722,2857 +"YML069W",2104,2049,1643,1044,1723,1832,1771,1701,2563 +"YML068W",469,447,325,249,267,296,324,387,597 +"YML067C",976,964,822,798,980,587,664,722,1182 +"YML066C",89,108,81,75,92,70,69,49,129 +"YML065W",931,1050,991,836,861,622,579,629,1117 +"YML064C",255,328,345,356,284,286,375,292,391 +"YML063W",7896,9027,9742,17592,27292,1782,4796,5118,9417 +"YML062C",715,726,763,660,717,470,594,550,892 +"YML061C",666,772,748,742,871,427,478,472,749 +"YML060W",200,305,344,548,751,67,94,111,198 +"YML059C",487,492,387,409,889,500,433,368,467 +"YML058W-A",2,4,6,2,4,6,6,7,9 +"YML058W",998,944,814,712,1125,1762,1689,1182,1595 +"YML057W",1047,953,730,406,471,994,749,761,1075 +"YML056C",239,521,1619,5757,2547,62,109,108,212 +"YML055W",461,459,491,618,693,216,226,308,551 +"YML054C",9392,6555,3263,555,451,66969,44215,22607,21185 +"YML054C-A",15,9,8,1,14,13,13,4,22 +"YML053C",902,795,475,398,781,743,1040,952,1161 +"YML052W",343,320,311,319,659,2505,2546,1226,847 +"YML051W",307,334,291,259,409,272,246,222,411 +"YML050W",235,254,229,145,182,741,236,182,312 +"YML049C",1274,1291,1083,683,651,792,879,794,1290 +"YML048W",3893,3742,3289,2343,2876,3708,3814,3458,4959 +"YML047C",19,27,18,10,25,16,10,22,25 +"YML046W",473,576,588,780,859,249,302,343,536 +"YML043C",120,255,921,1847,292,38,70,49,101 +"YML042W",4767,3939,2218,237,42,27198,10392,6373,7883 +"YML041C",285,313,277,239,366,319,316,321,460 +"YML038C",503,609,549,623,489,297,364,370,611 +"YML037C",98,105,131,101,73,46,58,57,67 +"YML036W",212,260,261,305,380,245,214,184,267 +"YML035C",853,1026,1310,1657,848,735,479,543,937 +"YML034W",1696,1517,1167,635,798,1467,1689,1401,1891 +"YML032C",822,813,739,642,581,715,752,669,1034 +"YML031W",655,695,701,718,679,552,650,551,845 +"YML030W",1325,1039,581,231,393,3736,1680,1608,2474 +"YML029W",960,1019,820,631,454,573,637,688,1183 +"YML028W",9957,8768,6447,3639,2092,13159,11297,11320,17165 +"YML027W",315,421,297,133,304,191,200,231,402 +"YML026C",4919,5610,6290,11531,20370,1282,3244,3255,5987 +"YML025C",312,369,356,367,434,878,413,324,456 +"YML024W",3837,4158,4234,7006,12373,1248,2761,2905,5095 +"YML023C",447,538,504,596,437,209,272,266,497 +"YML022W",998,1326,1560,2803,4289,443,657,735,1266 +"YML021C",232,269,282,263,390,131,159,180,287 +"YML020W",537,573,480,272,495,371,363,387,598 +"YML019W",556,602,594,600,738,357,442,435,754 +"YML018C",631,1139,1919,4522,1659,130,428,433,663 +"YML017W",607,726,580,420,560,405,415,415,674 +"YML016C",848,741,615,751,1634,1007,826,743,1002 +"YML015C",593,707,669,750,754,340,520,518,777 +"YML014W",285,367,418,649,762,120,160,221,395 +"YML013W",1151,1139,998,524,296,828,856,808,1313 +"YML012W",2206,2097,1633,1325,1788,2361,2257,2429,3873 +"YML011C",186,234,226,215,288,141,167,149,255 +"YML010W",2116,2107,1862,2032,2485,1773,1855,1722,2782 +"YML009C",286,280,258,188,357,1226,426,345,469 +"YML008C",7243,7198,5573,3113,1953,8847,7478,6141,9113 +"YML007C-A",14,5,1,2,14,7,8,6,9 +"YML007W",5473,4752,3717,2455,2293,3590,3892,3987,6408 +"YML006C",354,520,660,894,515,304,274,277,394 +"YML005W",523,556,628,679,654,282,337,390,603 +"YML004C",7135,4712,2397,776,749,5011,5376,6356,10679 +"YML003W",189,183,119,91,65,83,96,127,166 +"YML002W",802,707,470,304,446,457,435,502,876 +"YML001W",968,936,773,524,607,952,1078,1062,1780 +"YMR001C",270,296,357,417,354,870,1192,633,509 +"YMR001C-A",8,3,4,7,3,32,53,22,13 +"YMR002W",2355,2304,2141,2051,2853,4748,3489,2516,3543 +"YMR003W",156,200,207,179,223,433,268,188,201 +"YMR004W",884,876,763,505,446,599,591,625,981 +"YMR005W",822,925,888,992,1321,622,695,751,1187 +"YMR006C",2341,2176,1493,758,555,3400,3303,1852,2869 +"YMR007W",48,42,23,10,26,67,52,33,80 +"YMR008C",1863,1838,1383,875,947,1231,1211,1329,2287 +"YMR008C-A",36,36,20,11,14,63,53,48,79 +"YMR009W",1427,1512,1477,1216,701,1536,1898,1571,2298 +"YMR010W",346,541,973,1609,737,328,284,248,430 +"YMR011W",1724,2587,5598,2975,5437,2626,2455,2385,2436 +"YMR012W",2135,2687,2857,3802,3190,3151,1723,1445,1998 +"YMR013C",346,373,296,409,871,231,294,320,483 +"YNCM0012W",8,1,12,5,4,2,4,3,10 +"YNCM0013W",13,12,13,14,16,3,4,6,13 +"YNCM0014W",6,6,4,8,6,1,3,4,8 +"YNCM0015W",3,7,3,3,2,1,1,4,11 +"YMR014W",754,1038,1424,2702,2301,212,568,547,929 +"YMR015C",8864,9833,8143,5076,5438,2698,5374,4926,8753 +"YMR016C",553,743,1026,1597,1351,341,315,315,530 +"YMR017W",158,140,88,35,48,201,178,158,228 +"YMR018W",426,297,120,61,119,453,716,679,823 +"YMR019W",891,912,755,593,689,542,631,611,1047 +"YMR020W",766,871,677,491,361,417,449,490,927 +"YMR021C",407,431,401,384,572,362,332,320,532 +"YMR022W",529,502,434,317,551,584,515,588,825 +"YMR023C",266,265,213,211,371,354,203,196,310 +"YMR024W",462,551,528,585,693,1662,532,424,532 +"YMR025W",257,250,174,107,110,185,179,189,334 +"YMR026C",643,699,684,633,516,474,524,530,950 +"YMR027W",2123,2089,1646,1153,1103,2037,1640,1721,2850 +"YMR028W",490,591,579,527,513,401,441,424,680 +"YMR029C",1324,1365,931,436,561,1525,1330,1311,1894 +"YMR030W",537,510,368,135,206,788,711,542,754 +"YMR031C",7108,5346,3226,773,943,11868,8590,7282,10444 +"YMR032W",85,67,68,40,61,599,1103,535,263 +"YMR030W-A",1,5,3,3,1,11,17,13,7 +"YMR033W",621,778,781,995,1085,607,608,503,723 +"YMR034C",1032,983,716,378,425,390,611,805,1375 +"YMR035W",305,327,269,229,262,295,240,286,488 +"YMR036C",1118,928,556,283,311,883,880,862,1492 +"YMR037C",1192,1236,1171,738,801,752,840,696,1142 +"YMR038C",1038,1323,1509,1941,1702,582,602,753,1404 +"YMR039C",1091,1313,1485,1769,1590,955,815,909,1471 +"YMR040W",105,86,75,18,47,113,79,123,173 +"YMR041C",1041,1007,726,320,175,933,728,821,1470 +"YMR042W",239,292,338,412,400,210,243,237,422 +"YMR043W",949,938,960,1007,1111,927,876,945,1315 +"YMR044W",818,954,956,1038,1060,682,719,700,1157 +"YMR047C",1126,1209,1078,930,948,1077,1090,931,1441 +"YMR048W",283,338,273,178,451,315,258,252,395 +"YMR049C",716,1151,1966,4824,4071,81,292,277,539 +"YNCM0021C",2,2,3,1,2,1,3,1,2 +"YMR052W",212,241,222,213,276,142,164,178,285 +"YMR053C",907,806,476,57,151,588,555,624,949 +"YMR054W",1193,1174,988,664,809,1386,960,923,1388 +"YMR055C",205,237,232,258,167,100,171,163,264 +"YMR056C",441,445,398,316,389,715,526,500,825 +"YMR058W",376,405,451,386,475,229,279,254,455 +"YMR059W",139,148,117,108,122,61,125,130,200 +"YMR060C",378,359,337,230,370,602,400,370,577 +"YMR061W",1012,987,775,769,1522,912,978,934,1384 +"YMR062C",2094,1836,1494,1825,2347,786,1498,1453,2678 +"YMR063W",117,111,105,94,66,74,72,78,116 +"YMR064W",588,619,522,507,505,576,502,403,651 +"YMR065W",182,169,168,135,207,198,165,149,240 +"YMR066W",460,489,419,463,478,510,337,300,515 +"YMR067C",803,900,742,709,453,509,643,528,846 +"YMR068W",328,370,354,196,177,318,361,366,553 +"YMR069W",37,48,65,87,44,30,28,38,54 +"YMR070W",898,890,967,951,869,878,1000,755,1130 +"YMR071C",516,568,559,384,236,510,421,501,947 +"YMR072W",2950,2830,2148,1790,1172,3338,2927,2709,4231 +"YMR073C",397,434,370,325,455,438,412,406,610 +"YMR074C",555,436,339,310,558,749,602,632,965 +"YMR075W",554,543,412,350,505,365,399,380,620 +"YMR075C-A",5,7,2,2,5,7,6,1,5 +"YMR076C",1043,1063,872,359,828,883,731,813,1154 +"YMR077C",364,436,383,308,319,262,300,325,528 +"YMR078C",370,406,387,215,419,332,257,319,502 +"YMR079W",1013,1252,1228,1837,1757,527,700,681,997 +"YMR080C",1467,1644,1714,2163,1689,922,1143,1114,1766 +"YMR081C",1568,1175,694,119,2106,2210,1980,1971,2379 +"YMR083W",2056,2196,2290,2425,2944,1980,1243,1792,2926 +"YMR084W",164,136,104,20,21,123,104,104,164 +"YMR085W",407,386,224,54,116,265,300,304,469 +"YMR086W",1363,1518,1245,664,408,914,1005,957,1563 +"YMR087W",279,204,140,46,142,348,250,223,389 +"YMR088C",1067,1361,1513,1469,1507,522,632,658,1301 +"YMR089C",1764,1690,1577,1277,1301,3396,1501,1254,1972 +"YMR090W",2593,1977,1232,603,234,2516,1919,2179,4337 +"YMR091C",616,723,769,1010,1172,506,604,472,786 +"YMR092C",1831,1845,1418,924,1087,1728,1740,1638,2410 +"YMR093W",340,543,979,1944,1498,41,218,169,275 +"YMR094W",145,138,138,123,92,102,87,71,139 +"YMR095C",218,221,207,206,195,142,121,127,228 +"YMR096W",834,960,916,1060,944,639,541,666,1162 +"YMR097C",454,533,396,310,524,596,492,477,690 +"YMR098C",643,663,580,537,592,963,485,445,714 +"YMR099C",1791,1719,1453,1054,881,2051,1706,1677,2766 +"YMR100W",1926,1797,1156,824,831,795,1082,1167,2076 +"YMR101C",52,48,36,34,50,56,34,31,68 +"YMR102C",466,518,468,362,262,393,376,413,685 +"YMR103C",340,305,171,27,121,720,468,435,595 +"YMR104C",1405,1197,689,132,493,2937,1758,1654,2097 +"YMR105C",7110,4783,1811,193,394,13069,4886,6265,10809 +"YMR105W-A",40,33,39,12,11,18,18,20,37 +"YMR106C",299,350,317,178,108,71,148,180,304 +"YMR107W",24004,15034,8193,1737,264,45446,41600,34934,49326 +"YMR108W",6635,7746,9389,15673,12081,1462,3060,3147,6554 +"YMR109W",1149,1106,928,635,679,863,770,742,1128 +"YMR110C",8615,7326,4312,1084,511,9740,9627,8415,12571 +"YMR111C",342,360,330,319,342,295,284,274,445 +"YMR112C",276,267,251,202,291,222,250,247,409 +"YMR113W",353,436,384,426,343,272,271,248,464 +"YMR114C",1293,1106,768,243,233,1242,977,1001,1783 +"YMR115W",929,1079,833,467,842,1011,756,708,1102 +"YMR116C",7281,9127,11021,20716,33894,1539,4080,5271,10748 +"YNCM0026C",23,15,19,43,22,1,6,17,19 +"YMR117C",213,269,254,187,154,136,168,126,259 +"YMR118C",2795,2678,1617,228,111,552,701,1410,3279 +"YMR119W",1068,1110,691,216,472,828,806,822,1366 +"YMR120C",3136,4365,4832,14335,15819,1745,745,1343,2568 +"YMR121C",462,545,539,474,416,253,343,436,753 +"YMR122C",50,26,37,19,28,58,68,47,73 +"YMR122W-A",1764,1513,1465,1805,2557,1562,2191,4412,3687 +"YMR123W",278,347,430,682,647,133,234,246,389 +"YMR124W",699,758,898,762,495,524,579,512,752 +"YMR125W",3177,3129,2498,2623,2468,1900,2486,2382,3546 +"YMR126C",182,217,207,195,209,178,210,148,252 +"YMR127C",279,385,377,547,520,152,195,227,384 +"YMR128W",655,962,1272,2488,1939,104,297,305,640 +"YMR129W",896,1150,1117,1341,1293,529,606,634,883 +"YMR130W",680,700,644,685,670,432,604,541,860 +"YMR131C",1004,1974,3999,9635,5920,176,609,506,989 +"YMR132C",84,115,149,209,218,102,100,95,123 +"YMR133W",199,162,90,34,66,265,168,160,266 +"YMR134W",367,462,428,360,468,324,333,298,501 +"YMR135C",1740,1598,1135,647,1121,1658,1600,1699,2667 +"YMR136W",3052,2360,1360,467,976,2623,2453,2231,3454 +"YMR137C",582,567,431,297,411,283,323,347,700 +"YMR138W",177,235,190,181,200,74,104,144,215 +"YMR139W",980,850,484,134,264,1118,996,952,1415 +"YMR140W",702,651,389,123,240,524,479,524,789 +"YMR141C",111,100,70,19,56,83,84,98,153 +"YMR142C",5091,5766,5969,9259,13345,1622,3397,3600,6706 +"YMR143W",3817,4107,4179,6788,11557,1236,2935,3323,5871 +"YMR144W",216,233,223,114,351,274,338,266,281 +"YMR145C",5641,6126,5241,4010,9432,8977,7009,5037,7110 +"YMR146C",1720,2113,2511,3866,4611,971,1354,1239,2133 +"YMR147W",799,858,781,816,412,935,759,633,930 +"YMR149W",803,840,691,708,791,659,766,732,1235 +"YMR150C",503,465,373,273,255,616,552,535,839 +"YMR152W",2198,1998,1454,825,506,2183,1758,1875,3046 +"YMR153W",698,761,767,835,926,503,530,546,827 +"YMR154C",393,387,304,185,227,251,241,258,400 +"YMR155W",595,652,500,297,416,725,486,564,761 +"YMR156C",231,262,198,113,92,254,184,192,302 +"YMR157C",247,281,223,175,235,1529,308,260,415 +"YMR158W",240,269,235,284,418,944,299,236,345 +"YMR158C-A",59,81,63,20,14,41,46,65,116 +"YMR159C",211,187,139,36,33,109,121,159,279 +"YMR160W",871,786,456,136,126,774,670,732,1129 +"YMR161W",571,624,578,506,696,425,484,508,813 +"YMR162C",1412,1368,997,604,899,926,1005,947,1573 +"YMR163C",392,409,295,165,316,341,393,327,530 +"YMR164C",731,766,620,328,398,819,586,546,923 +"YMR165C",1106,1174,821,413,347,1071,797,859,1429 +"YMR166C",177,198,193,190,279,594,245,169,228 +"YMR167W",569,614,674,641,532,318,334,392,541 +"YMR168C",520,553,478,434,521,385,386,402,597 +"YMR169C",2873,1558,731,132,65,1547,1042,1743,5081 +"YMR170C",523,522,355,152,54,433,296,328,769 +"YMR171C",648,719,594,561,755,352,417,434,728 +"YMR172W",632,717,686,622,718,449,514,494,754 +"YMR173W",11429,9197,6084,2884,1022,6330,4238,7064,12486 +"YMR174C",5426,3635,2250,832,122,3270,4124,4749,9655 +"YMR175W",22524,14029,7621,1572,224,7150,15090,17780,40353 +"YMR175W-A",658,428,194,44,4,189,418,578,1295 +"YMR176W",1177,1190,1031,753,730,627,710,740,1176 +"YMR177W",185,272,366,946,1083,118,152,150,207 +"YMR178W",605,612,526,473,440,606,620,641,877 +"YMR179W",192,215,194,99,291,191,139,127,198 +"YMR180C",420,340,268,205,287,545,377,340,543 +"YMR181C",1274,1124,976,729,263,1195,1090,1104,1725 +"YMR182C",237,208,346,560,118,222,160,201,364 +"YMR182W-A",18,15,14,4,4,23,17,16,28 +"YNCM0030W",29,28,29,20,51,53,35,37,34 +"YMR183C",1541,1525,1277,1224,939,1322,1356,1277,2037 +"YMR184W",333,437,325,225,243,266,335,351,586 +"YMR185W",845,867,772,729,954,269,480,572,957 +"YMR186W",50532,41059,26962,14526,8381,32913,34284,35175,63124 +"YMR187C",258,286,301,287,404,150,186,173,317 +"YMR188C",339,369,330,339,594,1243,433,336,524 +"YMR189W",1122,1601,1695,2740,2003,404,470,569,991 +"YMR190C",680,712,655,460,448,532,545,455,696 +"YMR191W",4791,4243,3335,1990,1665,5091,5014,4816,7003 +"YMR192W",413,419,316,346,512,219,289,269,475 +"YMR193W",349,438,352,356,472,1430,399,370,532 +"YMR194W",894,1080,1274,2283,3239,264,715,684,1290 +"YNCM0031W",108,78,47,30,39,189,138,136,229 +"YMR194C-B",163,146,94,25,56,327,229,226,330 +"YMR195W",94,139,127,122,233,60,60,98,163 +"YMR196W",6112,5426,3316,726,205,9024,5314,5235,7699 +"YMR197C",1277,1138,858,435,655,1350,1393,1208,1819 +"YMR198W",335,407,351,371,409,327,345,245,359 +"YMR199W",281,311,223,164,587,1024,541,449,444 +"YMR200W",1455,1318,1134,1172,1487,1081,1195,1113,1771 +"YMR201C",514,444,391,264,306,448,391,404,761 +"YNCM0032C",18,15,11,7,5,17,17,10,36 +"YMR202W",1635,1817,1613,1518,1901,1600,1816,1689,2580 +"YMR203W",1627,1830,1602,1498,1634,3537,1584,1350,1906 +"YMR204C",248,324,204,121,250,257,252,251,378 +"YMR205C",8545,7637,6093,7098,4241,3942,4734,6061,9787 +"YMR206W",1179,736,301,35,311,2525,1873,1849,2122 +"YMR207C",813,928,887,764,459,508,556,561,938 +"YMR208W",1190,1253,1095,882,1138,925,1115,1031,1471 +"YMR209C",330,294,308,277,352,359,351,291,416 +"YMR210W",356,358,303,164,244,775,428,373,502 +"YMR211W",394,475,432,468,489,253,353,334,516 +"YMR212C",872,983,994,1147,1484,548,733,685,1002 +"YMR213W",357,385,421,416,426,232,287,257,435 +"YMR214W",404,446,542,606,528,196,261,321,523 +"YMR215W",588,739,737,1129,1598,1189,540,324,597 +"YMR216C",744,958,1335,1771,865,482,541,547,816 +"YMR217W",1330,2726,5729,16445,11684,243,612,651,1250 +"YMR218C",630,698,677,659,508,335,405,358,614 +"YMR219W",1027,1077,937,755,801,933,725,667,1113 +"YMR220W",1023,1091,1016,991,983,1084,1135,946,1454 +"YMR221C",902,1003,911,875,993,660,728,656,1118 +"YMR222C",245,244,211,218,207,199,245,216,375 +"YMR223W",289,303,324,436,480,160,214,204,317 +"YMR224C",498,515,396,263,297,361,373,344,623 +"YMR225C",254,239,242,215,210,763,297,259,382 +"YMR226C",2855,2733,2259,2001,1878,3702,2574,2849,4437 +"YMR227C",670,750,746,889,908,392,584,538,997 +"YMR228W",221,291,270,282,259,341,179,191,333 +"YMR229C",1950,3057,4142,10110,9110,323,981,914,1678 +"YMR230W",2699,3120,3330,5429,9238,972,2047,2174,3738 +"YMR231W",599,626,611,525,414,230,338,335,509 +"YMR232W",381,319,190,83,248,319,226,292,452 +"YMR233W",236,310,227,317,566,243,337,328,492 +"YMR234W",404,397,426,468,519,198,261,262,449 +"YMR235C",1510,1726,1575,2340,2964,902,1147,1153,1814 +"YMR236W",449,435,492,457,606,524,505,502,724 +"YMR237W",766,911,663,566,642,790,672,676,971 +"YMR238W",992,1056,1184,1330,560,842,814,836,1422 +"YMR239C",304,524,924,1908,1293,36,125,163,311 +"YMR240C",404,441,578,634,750,278,319,333,460 +"YMR241W",1554,2336,3005,5504,8549,986,1525,1312,1782 +"YMR242C",2991,3625,4242,7728,12017,800,2227,2221,4050 +"YMR243C",2319,2776,3060,5349,4297,1232,1455,1605,2866 +"YMR244W",156,237,459,3746,2969,54,93,125,243 +"YMR244C-A",786,605,517,393,348,1311,865,693,1084 +"YMR246W",7420,7338,6193,3895,2442,6290,6874,5544,8900 +"YNCM0034C",403,311,233,200,444,334,320,337,584 +"YMR247C",959,1054,1025,1276,1450,524,503,557,931 +"YMR250W",3236,2611,1478,255,34,2380,1591,2038,4452 +"YMR251W",146,126,128,28,16,54,47,54,129 +"YMR251W-A",7280,4928,2651,1472,1905,23358,16367,12677,16174 +"YMR252C",195,220,148,86,69,188,158,174,282 +"YMR253C",478,464,319,157,119,371,353,421,707 +"YMR254C",27,30,25,14,14,20,23,17,42 +"YMR255W",1013,1038,875,756,1024,1114,1028,974,1464 +"YMR256C",1553,1451,1035,719,1072,2624,2863,2527,2889 +"YMR257C",425,378,358,294,379,543,316,272,387 +"YMR258C",1160,1010,591,233,538,898,953,995,1510 +"YMR259C",683,843,915,1459,1598,235,380,395,589 +"YMR260C",1338,1797,2093,3725,6173,610,1055,983,1700 +"YMR261C",1510,1428,894,286,428,1550,1025,1119,1805 +"YMR262W",442,331,164,28,91,713,553,596,850 +"YMR263W",284,288,310,372,331,210,233,218,346 +"YMR264W",840,854,751,698,762,802,910,887,1543 +"YMR265C",326,372,405,460,394,265,309,382,501 +"YMR266W",1938,2074,2294,3410,2727,931,1167,1460,2156 +"YMR267W",582,636,514,378,344,1645,678,638,897 +"YMR268C",325,380,378,462,382,169,216,205,397 +"YMR269W",191,318,463,1023,1273,52,120,85,218 +"YMR270C",308,390,402,448,499,340,331,259,398 +"YMR271C",880,808,607,281,146,995,502,675,1293 +"YMR272C",1223,1278,1252,1443,1514,703,886,846,1503 +"YMR272W-B",10,15,8,6,10,6,6,7,5 +"YMR273C",422,481,487,411,373,255,284,255,421 +"YMR274C",125,134,128,173,206,129,145,106,129 +"YMR275C",666,770,753,735,773,522,462,478,717 +"YMR276W",2287,2036,1786,1407,1171,2104,2295,2058,3676 +"YMR277W",710,760,714,1064,1289,583,620,543,874 +"YMR278W",1083,1101,881,494,289,634,575,684,1336 +"YMR279C",232,164,124,53,63,206,169,175,275 +"YMR280C",1062,1061,751,146,583,1085,1053,973,1289 +"YMR281W",246,218,133,121,248,259,222,192,304 +"YMR282C",497,509,434,417,629,575,473,413,607 +"YMR283C",299,341,357,473,553,219,222,235,355 +"YMR284W",724,727,482,127,105,466,451,482,807 +"YMR285C",243,342,324,515,628,189,229,171,320 +"YMR286W",342,323,300,235,370,963,407,414,563 +"YMR287C",401,471,420,436,428,650,341,273,415 +"YMR288W",518,547,625,673,567,339,301,328,536 +"YMR289W",872,862,786,586,413,788,737,729,1141 +"YMR290C",470,869,1820,4829,3710,170,298,246,442 +"YMR291W",874,727,740,301,275,892,745,793,1130 +"YMR292W",359,392,336,305,427,289,274,317,544 +"YMR293C",305,328,294,257,270,749,268,291,397 +"YMR294W",527,575,537,585,458,459,408,406,703 +"YMR295C",2252,2392,2094,2275,3290,3068,2271,2177,3620 +"YMR296C",690,834,1581,3424,1017,411,527,501,644 +"YMR297W",19054,15337,10715,5686,1670,20239,15225,18392,29372 +"YMR298W",681,703,585,549,313,437,468,504,923 +"YMR299C",399,420,442,393,314,396,424,338,588 +"YMR300C",1153,1733,2772,7239,5754,258,554,662,1095 +"YMR301C",597,807,910,1274,1084,325,378,404,641 +"YMR302C",2774,2727,2018,1027,1079,4165,2500,2289,3324 +"YMR303C",47538,31564,17518,3601,453,101163,98363,82852,103486 +"YMR304W",3855,3471,2158,416,264,3511,3050,3022,4193 +"YMR305C",952,1371,1696,3694,12746,1138,718,590,806 +"YMR306W",390,394,340,270,252,271,188,205,358 +"YMR307W",2967,4531,6905,19060,23952,5656,5176,3752,3571 +"YMR308C",1691,2124,2563,5175,5089,685,1178,1053,1722 +"YMR309C",2354,2962,3852,7368,5827,554,1296,1180,1989 +"YMR310C",276,407,641,1156,933,64,144,141,256 +"YMR311C",2124,1782,1242,655,1216,2555,2252,2339,3747 +"YMR312W",468,537,550,773,870,227,273,290,514 +"YMR313C",703,721,574,406,577,522,495,511,781 +"YMR314W",2327,2241,1862,1457,1371,1924,2300,2281,3464 +"YMR315W",2439,2400,1728,732,369,3162,2137,2205,3647 +"YMR315W-A",8,4,7,1,3,10,5,6,8 +"YMR316W",198,163,204,212,223,113,138,156,336 +"YMR316C-A",5,3,4,1,7,8,5,5,8 +"YMR317W",550,489,494,329,286,441,314,372,632 +"YMR318C",831,1634,3663,7710,3413,1658,685,661,936 +"YMR319C",577,584,517,566,463,414,482,435,668 +"YMR320W",34,20,23,30,67,61,43,49,86 +"YMR321C",21,15,22,34,43,12,9,14,27 +"YMR322C",437,300,219,48,21,451,353,340,691 +"YMR323W",1057,719,350,42,21,848,462,617,1516 +"YNL336W",193,133,110,86,108,166,118,163,284 +"YNL335W",45,36,35,23,18,32,17,27,42 +"YNL334C",20,39,45,37,58,22,19,17,44 +"YNL333W",153,211,222,222,352,367,107,128,224 +"YNL332W",433,395,328,145,115,419,361,464,768 +"YNL331C",773,811,653,389,799,604,450,537,1027 +"YNL330C",837,847,758,693,1026,1086,968,822,1225 +"YNL329C",884,829,681,493,570,1118,850,871,1121 +"YNL328C",69,65,47,33,22,37,48,64,66 +"YNL327W",2617,1386,1334,2369,870,583,2851,8838,6848 +"YNL326C",388,415,421,508,654,231,279,299,453 +"YNL325C",663,696,551,429,454,414,458,441,727 +"YNL323W",839,929,853,840,920,573,603,589,951 +"YNL322C",1589,1634,1682,1728,1671,1446,1538,1445,2149 +"YNL321W",956,975,670,330,439,1392,1046,839,1156 +"YNL320W",398,428,372,385,316,360,345,345,514 +"YNL318C",52,65,56,36,23,31,23,36,74 +"YNL317W",306,358,310,309,250,192,228,239,405 +"YNL316C",254,279,289,425,404,212,277,190,329 +"YNL315C",684,679,625,552,704,3146,843,692,1010 +"YNL314W",276,281,256,193,163,262,265,243,443 +"YNL313C",699,919,1364,2203,1737,115,375,392,658 +"YNL312W",834,873,714,394,644,568,630,688,1198 +"YNL311C",520,548,564,565,523,186,301,334,577 +"YNL310C",223,224,230,118,205,249,235,227,380 +"YNL309W",249,273,210,170,321,128,163,187,277 +"YNL308C",1066,1477,2236,4939,4101,286,687,620,1139 +"YNL307C",1955,1865,1496,992,1012,2213,2058,1713,2469 +"YNL306W",712,804,723,628,743,3102,1000,809,1180 +"YNL305C",1427,1302,867,252,438,1426,1209,1347,2238 +"YNL304W",192,221,192,66,153,164,154,181,294 +"YNL302C",2975,3420,3880,6091,10515,997,2540,2942,5180 +"YNL301C",682,785,838,1589,3554,374,603,649,1005 +"YNL300W",221,240,256,226,431,221,106,93,163 +"YNL299W",354,478,687,1074,705,112,207,210,407 +"YNL298W",384,512,637,1168,1766,223,355,299,366 +"YNL297C",1227,1190,936,599,533,748,810,736,1182 +"YNL295W",450,472,374,322,391,466,317,292,532 +"YNL294C",958,914,735,598,649,719,725,777,1296 +"YNL293W",640,535,382,198,334,643,547,573,882 +"YNL292W",362,495,638,989,1167,228,260,261,420 +"YNL291C",420,427,495,482,531,256,330,326,536 +"YNL290W",474,573,657,777,921,391,581,472,768 +"YNL289W",244,282,262,290,848,207,110,133,234 +"YNCN0001W",3,3,6,1,4,3,4,6,9 +"YNL288W",616,598,592,602,732,507,589,547,892 +"YNL287W",3365,3629,2857,2506,2503,2363,2496,2460,3613 +"YNL286W",364,364,372,334,313,312,307,294,530 +"YNL284C-B",42,43,26,22,30,35,19,27,37 +"YNCN0003W",3,4,1,3,2,2,2,4,6 +"YNL284C",627,661,595,534,804,2845,772,569,851 +"YNL283C",475,539,542,469,714,697,516,371,524 +"YNL282W",96,145,140,296,251,32,53,61,114 +"YNL281W",2172,2136,1769,1691,1107,1499,1709,2023,3945 +"YNL280C",1422,1467,1179,865,557,765,776,1035,1969 +"YNL279W",181,168,122,123,194,257,163,139,202 +"YNL278W",256,274,269,141,268,281,253,184,307 +"YNL277W-A",24,17,10,10,10,9,6,21,40 +"YNL277W",1682,2113,2671,4235,1634,460,1153,1234,2127 +"YNL275W",606,569,398,274,432,706,741,581,854 +"YNL274C",4947,4673,3316,1694,515,7786,4793,4892,7818 +"YNL273W",501,540,477,286,639,283,280,350,562 +"YNL272C",915,921,713,423,808,726,810,734,1042 +"YNL271C",934,929,784,611,523,597,637,634,1000 +"YNL270C",959,894,646,111,87,726,640,934,1367 +"YNL269W",18,13,8,6,13,11,10,8,16 +"YNL268W",1983,2476,4047,6552,3498,913,1228,1373,2145 +"YNL267W",1413,1300,1157,850,973,972,1128,1017,1713 +"YNL265C",1045,953,783,476,668,1032,1004,971,1479 +"YNL264C",266,264,257,323,251,206,261,268,373 +"YNL263C",777,875,718,703,1004,599,733,741,1065 +"YNL262W",758,869,760,506,771,613,534,649,937 +"YNL261W",546,527,508,688,781,358,377,393,614 +"YNL260C",194,223,223,193,236,139,139,141,268 +"YNL259C",409,408,255,244,275,462,438,452,679 +"YNL258C",1195,1182,944,722,1233,910,945,994,1443 +"YNL257C",1330,1242,985,615,403,1000,993,1008,1510 +"YNL256W",727,972,1272,2626,1751,232,459,466,795 +"YNL255C",1904,2267,2435,3578,5209,1103,1655,1843,3068 +"YNL254C",258,315,359,350,242,97,157,157,298 +"YNL253W",506,482,389,283,350,430,385,403,591 +"YNL252C",396,455,562,601,485,1155,412,317,528 +"YNL251C",1440,923,496,386,2876,4338,1406,1120,1706 +"YNL250W",1065,1301,1093,849,532,459,551,564,1012 +"YNL249C",400,341,251,239,259,252,270,303,457 +"YNL248C",715,1347,2003,5209,4749,68,376,344,631 +"YNL247W",887,1148,1365,2742,2769,466,734,639,1080 +"YNL246W",890,840,999,1025,578,551,605,667,1194 +"YNL245C",313,355,476,533,241,183,207,235,392 +"YNL244C",1694,1825,1845,2862,3878,1132,1389,1492,2480 +"YNL243W",2152,2024,1616,1139,1622,2047,2000,1910,2826 +"YNL242W",760,814,686,244,156,469,495,473,800 +"YNL241C",3719,2906,1976,1208,1325,4067,3225,2904,4899 +"YNL240C",765,816,911,1179,896,649,635,681,1189 +"YNL239W",2593,2240,1754,1010,448,4282,3134,2697,3975 +"YNL238W",684,785,965,1282,903,470,540,470,810 +"YNL237W",781,718,507,106,113,715,675,643,1069 +"YNL236W",534,621,628,668,630,312,332,338,496 +"YNL234W",44,53,103,210,60,33,33,31,49 +"YNL233W",476,566,592,593,992,279,383,365,570 +"YNL232W",503,599,922,1156,1050,303,498,476,786 +"YNL231C",525,682,782,1038,1906,229,328,345,621 +"YNL230C",262,311,297,306,240,136,171,172,284 +"YNL229C",980,1089,1082,1174,1256,758,866,926,1335 +"YNL227C",658,882,1167,2075,2194,297,475,415,800 +"YNL225C",577,628,593,425,613,475,561,487,791 +"YNL224C",651,650,618,531,522,361,474,475,773 +"YNL223W",540,453,309,99,158,442,394,450,772 +"YNL222W",307,264,178,148,353,320,368,337,423 +"YNCN0005C",46,50,20,20,26,38,42,49,102 +"YNL221C",910,1184,1530,3278,1483,311,618,601,971 +"YNL220W",966,1280,2186,5614,4466,958,841,914,1280 +"YNL219C",903,893,771,667,672,673,677,678,1089 +"YNL218W",432,448,409,231,278,246,230,332,531 +"YNL217W",320,346,361,703,598,339,291,295,421 +"YNL216W",747,871,867,1137,1509,894,1005,787,1014 +"YNL215W",1167,1122,991,809,868,1086,925,962,1586 +"YNL214W",221,197,140,55,99,211,214,156,261 +"YNL213C",293,358,366,387,402,366,237,194,310 +"YNL212W",1524,1576,1317,731,818,1379,1337,1231,1875 +"YNL211C",65,64,69,114,133,73,59,77,124 +"YNL210W",23,33,56,105,49,10,14,14,19 +"YNL209W",4024,4938,6017,10975,12110,1219,2477,2714,5169 +"YNL208W",13931,10963,8724,5557,3567,15508,13770,17990,28086 +"YNL207W",570,763,984,1650,1811,116,357,396,677 +"YNL206C",736,766,716,681,1313,435,641,672,1032 +"YNL204C",59,57,52,56,111,58,42,57,86 +"YNL202W",2908,2618,1635,478,145,6557,4881,4027,5632 +"YNL201C",574,704,1361,2116,641,333,325,348,564 +"YNL200C",3060,2403,1406,263,118,3035,2623,2984,5340 +"YNL199C",731,832,779,983,1346,593,751,736,1094 +"YNL197C",826,859,907,1009,936,872,789,593,845 +"YNL196C",76,57,33,17,37,121,57,68,103 +"YNL195C",2218,1402,586,97,35,3658,2278,2661,4623 +"YNL194C",1886,1299,491,48,37,2515,1398,1647,2870 +"YNL193W",503,456,362,324,462,491,301,385,675 +"YNL192W",2250,1965,1631,1274,2297,1378,2313,4214,3858 +"YNL191W",419,684,1321,3215,426,168,388,339,594 +"YNL190W",2324,2397,2414,3773,2439,922,1328,1270,2136 +"YNL189W",2566,2696,2656,3051,2300,1946,2018,2030,3053 +"YNL188W",266,345,464,622,522,176,301,329,386 +"YNL187W",143,167,316,378,122,95,91,106,174 +"YNL186W",1503,1652,2074,2810,2390,615,1232,1175,1877 +"YNL185C",172,170,175,180,216,609,173,164,205 +"YNL184C",20,16,17,18,17,57,15,10,17 +"YNL183C",1127,1225,1141,855,1160,1165,939,942,1471 +"YNL182C",374,652,1162,2925,2479,41,181,196,325 +"YNL181W",672,837,795,841,831,557,450,530,906 +"YNL180C",3192,2383,2365,1873,1001,2271,2539,2535,4036 +"YNL178W",8308,9504,10674,18151,29581,2073,5303,6160,11540 +"YNL177C",803,855,734,698,934,2419,813,784,1017 +"YNL176C",791,969,1001,910,746,806,753,628,925 +"YNL175C",586,908,1489,3243,4024,86,255,275,558 +"YNL173C",3336,2780,1944,701,258,5005,3627,4091,5907 +"YNL172W",790,826,589,442,518,522,596,558,823 +"YNL169C",524,629,602,629,901,725,737,645,762 +"YNL168C",603,601,555,448,372,641,528,574,948 +"YNL167C",665,743,563,413,537,747,558,571,734 +"YNL166C",664,793,863,1104,1316,419,550,505,830 +"YNL165W",454,470,406,258,294,303,304,340,551 +"YNL164C",660,734,595,626,715,263,432,501,801 +"YNL163C",1166,1434,1878,3808,1782,432,619,665,1179 +"YNL162W-A",44,81,171,348,120,3,18,16,30 +"YNL162W",2082,2173,2237,3495,5647,534,1562,1723,3091 +"YNL161W",1433,1450,1299,968,1277,938,1080,1074,1529 +"YNL160W",15103,11015,6584,2466,488,9633,9535,10798,20082 +"YNL159C",555,600,391,165,164,466,396,523,836 +"YNL158W",237,246,230,270,237,166,203,218,305 +"YNL157W",1262,1056,800,619,1060,1216,1122,1221,1989 +"YNL156C",1368,1405,1179,1033,724,1573,1423,1395,2045 +"YNL155W",1515,1597,1421,1565,1164,1352,1369,1264,2101 +"YNL154C",1277,1287,1436,2007,3260,1214,1438,1116,1592 +"YNL153C",300,384,473,909,797,237,322,320,491 +"YNL152W",282,271,288,258,314,183,235,182,259 +"YNL151C",504,604,766,1326,1631,265,413,380,659 +"YNL149C",1763,1667,1566,1425,1380,1352,1635,1588,2592 +"YNL148C",337,348,327,273,179,184,173,259,498 +"YNL147W",451,472,439,466,604,335,444,461,774 +"YNL146C-A",5,9,5,6,14,2,8,8,12 +"YNL146W",76,71,58,37,76,72,77,80,96 +"YNL145W",28,28,15,14,52,34,37,30,30 +"YNL144C",737,592,338,83,1036,866,634,702,1080 +"YNL143C",30,24,24,9,23,23,27,28,49 +"YNL142W",4706,7951,10911,17694,32531,1263,1342,2796,5538 +"YNL141W",387,1112,3428,11909,6118,150,147,174,321 +"YNL140C",3,3,7,1,8,1,2,2,3 +"YNL139C",645,692,675,630,552,360,424,388,639 +"YNL138W-A",165,144,112,90,137,214,171,193,294 +"YNL138W",1670,1620,1241,652,404,1966,1539,1422,2091 +"YNL137C",792,831,689,567,967,2459,718,652,948 +"YNL136W",921,924,877,776,900,754,791,787,1216 +"YNL135C",3733,3322,2726,2523,2683,5190,4552,4898,7487 +"YNL134C",2534,2350,1564,276,346,791,837,1323,3243 +"YNL133C",409,403,353,270,269,298,319,327,625 +"YNL132W",769,1322,1907,4480,3369,106,319,338,605 +"YNL131W",1225,1226,934,741,950,3566,1544,1246,1848 +"YNL130C",2237,2120,1757,1324,1220,1482,2115,2267,3270 +"YNL130C-A",42,34,17,28,24,46,44,55,62 +"YNL129W",339,314,300,388,404,249,335,306,460 +"YNL128W",130,133,143,189,102,90,88,96,179 +"YNL127W",858,868,712,499,530,444,450,466,802 +"YNL126W",488,520,428,320,375,495,417,344,495 +"YNL125C",1785,1580,1456,1009,852,1839,1896,1690,2385 +"YNL124W",412,622,1251,2619,1046,206,228,260,433 +"YNL123W",1335,1697,2339,4148,2093,515,826,786,1252 +"YNL122C",230,196,179,142,179,759,266,196,306 +"YNL121C",2263,2242,2052,1704,1523,3987,1926,1734,2607 +"YNL119W",587,739,864,1350,1328,171,391,402,698 +"YNL118C",2498,2428,2157,1725,1687,1943,1910,1838,2711 +"YNL117W",3899,3661,2751,917,630,1695,2039,2710,4855 +"YNL116W",1300,1349,1056,726,757,783,1047,985,1606 +"YNL115C",3742,3142,1957,459,106,2646,2254,3067,5156 +"YNL113W",524,751,1095,2242,2044,89,361,366,670 +"YNL112W",649,1834,4430,14139,12341,56,111,197,379 +"YNL111C",1152,1573,1822,2522,1045,482,1338,943,1388 +"YNL110C",893,1305,1968,4030,3456,101,529,562,970 +"YNL108C",226,267,321,388,281,124,149,176,276 +"YNL107W",427,441,370,322,427,230,294,344,520 +"YNL106C",365,388,443,228,251,193,210,231,374 +"YNL104C",7971,7556,6485,5705,4844,9200,9428,7038,10649 +"YNL103W",1571,1530,1498,1627,1535,832,1202,1260,1942 +"YNL102W",465,569,517,416,816,258,269,319,485 +"YNL101W",1723,1954,1805,1719,1945,1175,1269,1318,1956 +"YNL100W",1196,1164,853,587,823,4460,1995,1533,2094 +"YNL099C",432,447,429,398,538,371,409,353,585 +"YNL098C",2100,1754,1241,789,808,7028,3384,2883,3797 +"YNL097C-B",4,11,6,15,19,10,8,4,13 +"YNL097C",547,514,532,263,507,445,534,561,902 +"YNL096C",1730,2204,2665,5166,5938,453,1160,1108,1973 +"YNL095C",293,384,494,607,388,163,166,188,366 +"YNL094W",1123,1177,1101,952,856,696,744,813,1373 +"YNL093W",378,348,233,51,49,310,223,248,517 +"YNL092W",353,380,264,45,31,212,212,225,439 +"YNL091W",2596,2542,2168,2126,2071,2719,2335,2051,3173 +"YNL090W",491,522,420,369,534,358,527,500,792 +"YNL088W",1729,1990,1883,2136,1279,1232,1230,1216,1814 +"YNL087W",1386,1635,1599,2211,3016,1289,1193,1078,1543 +"YNL086W",140,140,133,120,128,116,129,155,242 +"YNL085W",1817,1981,1836,1927,2040,988,1060,1033,1673 +"YNL084C",1098,1134,866,714,898,1176,1150,1066,1551 +"YNL083W",425,454,417,385,382,783,423,344,560 +"YNL082W",547,559,528,288,534,299,310,366,588 +"YNL081C",451,473,323,316,513,1647,604,559,754 +"YNL080C",379,418,461,469,472,292,448,399,554 +"YNL079C",3997,3985,3451,3259,3216,5125,4503,4334,6541 +"YNL078W",211,177,195,185,166,87,198,477,481 +"YNL077W",1649,1394,604,152,531,1098,1014,1292,2403 +"YNL076W",655,733,731,812,875,489,592,522,813 +"YNL075W",547,783,1079,2458,2538,88,279,295,602 +"YNL074C",844,1049,1023,961,1444,757,619,686,941 +"YNL073W",318,384,255,201,409,1993,473,397,561 +"YNL072W",151,177,165,125,144,179,132,130,216 +"YNL071W",4671,4462,3412,2406,1781,8141,5637,5327,7737 +"YNL070W",286,339,275,283,453,749,370,312,448 +"YNL069C",4150,5009,5908,10691,15240,1023,2690,2750,4883 +"YNL068C",773,1006,924,1207,737,347,469,441,667 +"YNL067W",3709,3952,3876,5660,5571,1441,2765,3591,5865 +"YNL066W",803,619,799,1813,1112,229,565,1651,2397 +"YNL065W",123,308,1788,4105,115,38,47,45,124 +"YNL064C",9067,9016,9255,9166,5665,3777,5027,5979,12198 +"YNL063W",202,223,195,168,188,264,201,188,351 +"YNL062C",352,524,941,2040,1485,55,162,148,333 +"YNL061W",1321,1957,2967,6273,5288,162,687,656,1292 +"YNL059C",1067,1114,1074,1088,943,842,919,779,1301 +"YNL058C",147,135,111,83,152,276,533,306,266 +"YNL056W",397,432,444,512,743,417,591,471,658 +"YNL055C",8091,6954,5044,2719,2319,13738,10149,9153,12631 +"YNCN0008C",9,7,7,2,4,13,17,7,9 +"YNL054W-B",262,242,196,187,152,235,158,146,215 +"YNL054W",879,991,905,738,799,537,561,532,807 +"YNL053W",256,313,337,388,454,220,263,183,327 +"YNL052W",3443,3368,2729,2021,3402,5070,5814,4529,5872 +"YNL051W",560,598,430,338,400,472,511,503,746 +"YNL050C",427,571,732,1091,1139,259,379,345,636 +"YNL049C",614,709,761,711,664,309,370,373,593 +"YNL048W",888,982,814,734,719,658,715,719,1043 +"YNL047C",463,469,442,409,487,299,351,352,526 +"YNL046W",177,162,148,82,104,204,238,369,407 +"YNL045W",1303,1267,897,415,284,1085,944,908,1472 +"YNL044W",1383,1371,1411,1858,2250,1618,1761,1602,2084 +"YNL042W",124,128,126,196,255,121,120,83,158 +"YNL041C",858,929,795,552,651,562,661,591,940 +"YNL040W",998,1117,989,1007,918,716,550,638,1158 +"YNL039W",828,856,755,852,1080,716,672,638,975 +"YNL038W",328,333,325,325,432,221,260,282,430 +"YNL037C",1829,1926,1792,1012,2934,2666,1685,1658,2519 +"YNL036W",9063,6363,3895,1492,1152,15568,13759,12920,17423 +"YNL035C",365,381,371,479,766,271,239,299,455 +"YNL034W",40,40,35,18,26,25,41,36,48 +"YNL032W",473,511,472,521,538,284,407,465,740 +"YNL031C",2557,2244,1629,1326,1815,5356,2756,2212,3362 +"YNL030W",617,657,649,733,1280,3828,1367,703,1038 +"YNL029C",311,353,336,528,788,171,278,254,361 +"YNL027W",1102,1140,973,894,992,892,928,881,1314 +"YNL026W",622,645,521,356,343,883,643,596,857 +"YNL025C",270,240,187,73,125,201,180,201,304 +"YNCN0013W",9,5,3,2,5,26,11,15,12 +"YNCN0014W",5,3,6,3,4,9,3,9,7 +"YNL024C-A",397,383,372,455,451,273,360,376,592 +"YNL024C",13,22,30,126,91,18,11,9,16 +"YNL023C",881,1006,1184,1419,1353,286,446,506,926 +"YNL022C",457,598,787,1336,1260,241,287,344,546 +"YNL021W",411,525,617,938,902,211,309,265,368 +"YNL020C",462,507,441,494,819,324,379,378,589 +"YNL019C",5,8,9,4,9,2,1,3,3 +"YNL018C",24,24,4,17,17,23,11,18,25 +"YNL016W",2150,2409,2438,3216,3038,1286,1396,1420,2180 +"YNL015W",5917,4345,2754,1308,468,6240,6001,8725,11095 +"YNL014W",6599,5686,3677,672,47,914,2023,3865,8058 +"YNL012W",1038,962,632,335,341,1161,862,865,1445 +"YNL011C",311,331,235,141,216,365,254,310,492 +"YNL010W",737,851,972,1341,1681,855,689,710,1142 +"YNL009W",2949,2686,1629,349,62,5893,3315,2888,4290 +"YNL008C",1208,1038,743,446,496,2399,1492,1225,1651 +"YNL007C",11368,8894,5734,1794,2211,5714,6835,8232,15765 +"YNL006W",1092,1083,855,360,572,995,859,919,1487 +"YNL005C",1020,1093,906,802,1129,4023,1211,1022,1501 +"YNL004W",1170,1244,1427,1938,2350,788,1032,1041,1661 +"YNL003C",467,490,352,234,331,614,512,474,658 +"YNL002C",1243,1743,2584,5785,5748,205,592,661,1364 +"YNL001W",380,547,657,1173,1050,207,339,310,511 +"YNR001C",11211,9703,6406,1881,2727,26039,15148,12436,16495 +"YNR002C",5035,4916,3633,501,560,10903,7305,5132,6987 +"YNR003C",449,520,535,767,1389,119,278,349,543 +"YNR004W",68,85,52,104,112,95,72,72,106 +"YNR006W",724,818,757,582,680,500,576,545,866 +"YNR007C",1007,884,605,181,324,989,796,814,1369 +"YNR008W",384,472,494,513,426,385,316,278,498 +"YNR009W",76,106,99,87,69,166,130,86,108 +"YNR010W",165,191,130,147,176,85,125,142,192 +"YNR011C",507,628,583,753,541,278,312,308,590 +"YNR012W",315,477,856,1850,1511,40,180,200,305 +"YNR013C",787,1032,1344,1880,949,367,440,498,756 +"YNR014W",40,47,73,88,135,46,29,28,61 +"YNR015W",322,376,437,776,1085,196,225,267,413 +"YNR016C",28113,26514,21104,17496,9500,17688,21740,18523,30377 +"YNR017W",547,609,767,968,1007,845,650,523,808 +"YNR018W",674,859,1461,2858,1454,388,419,523,888 +"YNR019W",2058,2094,1630,996,574,1573,1265,1071,2120 +"YNR020C",222,259,271,334,417,404,250,205,364 +"YNR021W",1435,1436,1281,1683,1936,921,1085,1017,1776 +"YNR022C",410,414,325,255,335,1790,485,393,667 +"YNR023W",470,482,493,494,584,442,396,382,583 +"YNR024W",336,378,444,710,878,159,249,229,422 +"YNR026C",495,604,895,1492,719,202,309,331,566 +"YNR027W",232,305,589,951,330,87,178,204,362 +"YNR028W",507,555,440,413,503,833,544,407,570 +"YNR029C",706,800,954,877,857,387,564,536,866 +"YNR030W",1487,1699,1531,1257,560,1016,1259,1125,1691 +"YNR031C",926,957,907,627,650,649,624,592,891 +"YNR032W",414,438,476,317,347,426,398,371,633 +"YNR032C-A",326,310,241,220,235,326,315,314,623 +"YNR033W",644,721,676,482,390,1615,630,618,933 +"YNR034W",409,364,187,43,110,340,292,351,677 +"YNR034W-A",5318,2984,1474,320,122,11298,6166,5631,10623 +"YNR035C",2007,1874,1422,986,1328,2764,2284,2269,3192 +"YNR036C",1048,920,759,442,810,5574,1869,1616,2160 +"YNR037C",199,201,164,152,206,965,279,243,349 +"YNR038W",424,593,846,1455,1090,108,283,276,461 +"YNR039C",676,741,696,750,734,290,407,440,752 +"YNR040W",155,223,177,154,175,469,142,146,196 +"YNR041C",265,315,257,256,393,635,484,367,460 +"YNR043W",1033,1116,1134,1309,1287,1323,1704,1218,1470 +"YNR044W",783,867,895,861,2089,1266,540,400,630 +"YNR045W",412,421,291,178,347,747,416,384,553 +"YNR046W",290,378,463,749,930,210,326,302,507 +"YNR047W",531,569,390,272,346,342,343,337,498 +"YNR048W",273,307,300,312,274,234,214,187,319 +"YNR049C",334,316,264,213,460,377,350,343,537 +"YNR050C",4501,9022,12329,23578,27653,1553,1220,1478,3028 +"YNCN0018W",3,10,7,14,25,7,5,7,16 +"YNR051C",1100,1158,1280,1880,1595,900,1081,893,1602 +"YNR052C",623,797,891,1005,1284,695,791,705,980 +"YNR053C",761,1294,2667,7049,3655,49,312,338,682 +"YNR054C",253,366,565,1045,980,70,131,167,313 +"YNR055C",1000,1091,1127,1666,1266,748,831,820,1313 +"YNR056C",4826,4870,4958,2581,2721,6263,6574,4912,6538 +"YNR057C",1294,1270,1112,1430,1387,756,1401,1517,2316 +"YNR058W",5422,5906,5906,7790,6925,1907,4372,4278,6850 +"YNR059W",295,322,272,173,242,269,270,249,448 +"YNR060W",446,403,349,265,238,547,372,376,554 +"YNR061C",698,599,386,205,378,578,549,631,1111 +"YNR062C",77,89,84,78,85,62,59,63,93 +"YNR063W",200,207,208,221,184,81,97,110,198 +"YNR064C",249,249,237,203,174,140,155,177,363 +"YNR065C",240,306,284,296,222,116,144,171,272 +"YNR066C",68,87,107,89,49,34,39,50,75 +"YNR067C",1797,1172,1434,3017,668,331,1174,4319,4309 +"YNR068C",262,236,149,82,63,146,109,149,292 +"YNR069C",269,271,187,81,67,133,124,143,281 +"YNR072W",5,7,5,1,2,4,4,1,8 +"YNR073C",33,33,20,7,15,59,31,37,67 +"YNR075W",22,18,29,30,44,22,17,6,22 +"YNR075C-A",3,2,2,7,6,2,2,1,2 +"YOL164W-A",16,10,6,6,5,16,8,10,12 +"YOL164W",433,477,501,470,317,293,262,295,493 +"YOL163W",65,72,53,69,60,76,50,60,108 +"YOL162W",47,46,34,45,42,47,50,40,68 +"YOL160W",6,8,11,11,11,13,3,9,14 +"YOL159C-A",76,80,51,52,76,60,57,72,104 +"YOL159C",258,238,151,91,165,220,190,234,379 +"YOL158C",426,454,376,345,302,324,365,367,547 +"YOL157C",44,21,20,6,16,197,76,47,80 +"YOL156W",48,56,44,38,49,58,24,40,61 +"YOL155C",21307,16016,10756,4866,2309,15650,17686,16696,24805 +"YOL154W",459,351,262,219,274,532,603,546,723 +"YOL153C",1152,942,523,116,127,1250,806,933,1663 +"YOL152W",164,167,105,85,118,184,126,96,213 +"YOL151W",4506,4124,2908,1447,655,1223,1979,2949,6005 +"YOL149W",420,481,401,436,631,358,449,460,695 +"YOL148C",455,507,451,425,529,456,505,469,686 +"YOL147C",3611,3646,2714,1188,923,8012,5148,4440,6176 +"YOL146W",313,317,263,195,275,306,320,288,482 +"YOL145C",1773,1974,1846,2128,2764,1230,1572,1424,2114 +"YOL144W",306,442,727,1332,1010,64,187,156,318 +"YOL143C",1201,1166,993,608,478,1756,1376,1370,2332 +"YOL142W",454,518,564,727,968,267,383,401,676 +"YOL141W",115,204,253,495,219,28,32,46,83 +"YOL140W",1335,1298,1404,2460,2204,224,695,672,1285 +"YOL139C",2595,2941,3258,5069,6491,1960,2346,2321,3509 +"YOL138C",841,860,766,626,728,554,602,600,926 +"YOL137W",354,359,347,424,806,235,325,306,440 +"YOL136C",310,531,1659,2730,1979,42,95,111,199 +"YOL135C",254,276,288,325,301,131,207,203,277 +"YOL133W",532,551,448,386,341,453,481,440,776 +"YOL132W",121,124,92,88,156,177,106,103,188 +"YOL131W",18,18,20,12,7,15,9,15,25 +"YOL130W",1081,1174,1209,1883,1745,790,711,802,1376 +"YOL129W",1804,1577,1220,647,514,2354,1787,1796,2769 +"YOL128C",214,277,313,476,493,84,86,110,187 +"YOL127W",6718,7372,7420,11934,20731,2303,5190,5573,10208 +"YOL126C",3296,2993,1864,315,200,2793,2885,2961,4832 +"YOL125W",356,435,618,1259,784,155,223,228,415 +"YOL124C",342,746,2002,4835,2616,39,143,158,245 +"YOL123W",1410,742,502,559,3380,7236,4478,2568,2835 +"YOL122C",925,964,693,317,369,1346,748,757,1182 +"YOL121C",1851,2423,2737,4388,7098,520,1437,1565,2936 +"YOL120C",4965,5624,6030,10363,16320,1330,3412,3762,6309 +"YOL119C",2321,2384,1979,1554,2116,884,1302,1309,2573 +"YOL118C",62,62,66,81,94,69,73,46,77 +"YOL117W",542,595,360,165,178,427,337,359,598 +"YOL116W",498,574,461,295,454,627,498,477,728 +"YOL115W",437,445,415,539,960,342,390,354,593 +"YOL114C",50,30,15,10,26,128,92,86,94 +"YOL113W",889,834,520,170,390,1216,1001,848,1159 +"YOL112W",612,659,601,568,564,426,442,465,807 +"YOL111C",779,730,526,363,474,661,631,598,1015 +"YOL110W",1050,848,532,240,271,1515,1154,1291,2109 +"YOL109W",24930,17775,11052,9002,13405,30325,28513,29138,45653 +"YOL108C",430,429,341,230,399,356,462,458,746 +"YOL107W",353,323,250,142,177,226,319,329,461 +"YOL105C",360,311,229,180,297,480,346,288,453 +"YOL104C",15,13,11,21,12,60,14,15,21 +"YOL103W",944,1143,1153,1742,1657,569,619,614,976 +"YOL102C",519,529,381,353,445,408,466,494,825 +"YOL101C",223,232,186,105,135,295,300,132,202 +"YOL100W",1918,1691,1273,628,903,1406,1466,1469,2197 +"YOL098C",2082,2161,1871,2240,1927,1099,1362,1256,1981 +"YNCO0003C",3,3,9,3,5,4,5,2,3 +"YOL097W-A",8,8,4,13,29,6,12,7,14 +"YOL097C",965,1333,1696,3435,4115,443,921,769,1139 +"YOL096C",345,327,209,85,86,764,380,345,535 +"YOL095C",230,293,269,312,261,136,168,113,229 +"YOL094C",345,380,376,541,557,178,257,279,481 +"YOL093W",438,580,688,1132,1110,162,290,322,564 +"YOL092W",881,906,1018,1464,1706,307,551,617,1079 +"YOL091W",143,160,143,203,169,110,116,95,159 +"YOL090W",699,818,712,418,766,355,377,484,725 +"YOL089C",796,878,735,438,522,589,595,548,799 +"YOL088C",1069,959,677,382,646,1356,1195,977,1522 +"YOL087C",1598,1516,1029,371,424,1484,1241,1227,2060 +"YOL086W-A",280,311,281,190,212,300,269,316,495 +"YOL086C",9137,7976,6112,7468,5808,25322,15581,13502,19565 +"YOL085C",23,12,3,4,2,28,14,21,35 +"YOL084W",2963,2073,755,51,54,3896,1895,2144,3915 +"YOL083W",3862,3565,2319,812,169,2949,3045,3540,5814 +"YOL082W",2160,2024,1526,592,351,2028,1667,1940,2914 +"YOL081W",5033,4708,3066,1315,782,2666,2185,2502,4721 +"YOL080C",154,278,574,1390,1026,22,98,77,141 +"YOL078W",439,478,568,726,624,227,248,293,417 +"YOL077W-A",1287,1166,978,914,1132,3187,1945,1515,1773 +"YOL077C",750,1221,1789,3952,4278,75,424,434,724 +"YOL076W",547,645,625,730,613,210,305,292,477 +"YOL075C",502,604,532,499,365,361,274,297,556 +"YOL073C",375,390,252,130,183,443,402,356,626 +"YOL072W",277,296,253,264,218,219,226,227,362 +"YOL071W",988,865,575,159,189,2301,910,835,1329 +"YOL070C",749,786,719,655,674,785,1158,1029,1185 +"YOL069W",354,354,325,285,314,320,360,275,309 +"YOL068C",1213,1305,1160,1339,1259,1071,1036,1010,1562 +"YOL067C",385,388,375,357,281,327,331,311,489 +"YOL066C",493,559,634,930,523,441,431,421,710 +"YOL065C",523,441,438,227,67,397,411,470,788 +"YOL064C",1463,1737,1765,2717,2276,650,975,1112,1798 +"YOL063C",786,790,713,499,481,541,558,519,916 +"YOL062C",812,919,885,870,773,1124,857,805,1144 +"YOL061W",1596,1970,2278,3386,4015,779,1223,1145,1880 +"YOL060C",2107,2004,1385,402,433,1322,1312,1391,2439 +"YOL059W",2152,2225,2691,3221,961,597,868,1228,2760 +"YOL058W",5694,4840,4955,5501,6711,1758,5936,4281,7933 +"YOL057W",1293,1418,1183,972,578,963,1035,1064,1792 +"YOL056W",160,211,223,291,283,128,143,140,212 +"YOL055C",2990,3505,3171,3788,6989,1843,1566,2263,4006 +"YOL054W",691,718,733,599,673,337,417,520,868 +"YOL053W",447,457,332,182,295,956,549,519,692 +"YOL052C-A",18991,12273,6508,1291,441,17680,16945,17525,28772 +"YOL052C",397,485,588,800,980,285,311,290,525 +"YOL051W",3100,3337,2847,2212,2558,1800,2077,2105,3052 +"YOL049W",1610,1550,1295,867,841,1654,1539,1510,2119 +"YOL048C",952,852,440,138,215,1251,1024,1165,1544 +"YOL047C",86,55,58,101,36,105,60,105,136 +"YOL045W",615,585,739,1108,727,317,267,393,693 +"YOL044W",700,675,494,289,444,625,649,704,1053 +"YOL043C",370,420,376,356,298,232,293,303,547 +"YOL042W",495,527,480,462,534,450,400,386,566 +"YOL041C",1127,1534,2067,4274,3715,113,604,676,1214 +"YOL040C",3465,3938,4584,7283,10403,901,2205,2199,4731 +"YOL039W",1884,2434,2663,4507,6679,464,1312,1326,2613 +"YOL038C-A",58,57,22,17,4,37,32,45,66 +"YOL038W",3666,3360,2834,2170,1704,3293,3785,3647,5913 +"YOL036W",1394,1630,1438,1410,1453,936,1139,935,1663 +"YOL034W",731,818,695,496,628,395,424,485,805 +"YOL033W",237,265,240,174,274,733,168,192,282 +"YOL032W",1619,1248,591,81,159,2078,1531,1668,2820 +"YOL031C",330,415,400,517,737,338,310,268,392 +"YOL030W",814,1151,1298,2305,3536,2074,1183,843,1022 +"YOL029C",166,232,271,424,516,147,181,130,205 +"YOL028C",169,191,258,405,383,126,135,122,192 +"YOL027C",1298,1438,1411,1616,1583,2095,1704,1201,1801 +"YOL026C",339,295,235,149,151,374,402,453,816 +"YOL025W",555,588,460,329,321,364,379,432,743 +"YOL024W",6,6,8,2,8,23,17,12,16 +"YOL023W",280,280,237,234,313,787,252,216,301 +"YOL022C",683,826,916,1718,1955,261,359,402,760 +"YOL021C",1073,1347,1597,2556,2289,522,763,674,1062 +"YOL020W",514,780,1119,1525,1345,201,350,335,520 +"YOL019W",310,308,396,385,486,106,265,580,513 +"YOL018C",777,902,690,268,272,721,728,745,1159 +"YOL017W",293,304,203,88,396,219,161,239,309 +"YOL016C",853,763,463,306,443,964,592,689,1233 +"YOL015W",43,38,29,7,44,38,31,37,61 +"YOL014W",18,28,26,62,98,26,27,27,46 +"YOL013C",773,771,631,223,390,672,718,680,1093 +"YOL012C",511,506,396,342,462,1018,841,653,940 +"YOL011W",486,379,326,532,1136,805,804,652,745 +"YOL010W",380,664,1226,2302,2009,75,252,249,399 +"YOL009C",306,297,216,201,253,266,242,230,371 +"YOL008W",185,231,214,219,211,200,159,151,266 +"YOL007C",118,139,149,112,224,110,84,79,120 +"YOL006C",1300,1287,1281,1516,1664,720,931,1121,1622 +"YOL005C",359,409,333,275,390,391,393,409,617 +"YOL004W",1579,1717,1447,1351,1285,1416,1309,1169,1879 +"YOL003C",474,465,394,332,356,385,332,319,557 +"YOL002C",473,723,760,855,790,494,389,340,586 +"YOL001W",352,330,247,200,422,299,250,255,418 +"YOR001W",813,1044,1126,1813,1760,300,450,442,886 +"YOR002W",1727,1663,1307,878,827,1296,1431,1616,2322 +"YOR003W",505,502,371,185,176,738,473,495,781 +"YOR004W",223,335,559,1379,1320,49,146,150,250 +"YOR005C",713,784,593,452,419,587,523,544,919 +"YOR006C",453,624,842,1435,881,223,318,330,573 +"YOR007C",15424,13336,9991,6872,4777,9898,10042,11070,21616 +"YOR008C",2523,2558,2155,1851,2403,2254,2081,2152,3249 +"YOR008C-A",5,5,7,5,9,19,6,7,11 +"YOR009W",165,134,114,85,180,238,163,142,217 +"YOR010C",117,124,129,117,142,156,107,100,157 +"YOR011W",811,905,796,761,383,283,409,460,857 +"YOR011W-A",18,11,13,8,9,12,11,7,18 +"YOR012W",75,88,137,309,154,78,65,53,92 +"YOR014W",1774,1776,1406,1020,1143,1237,1320,1203,1956 +"YOR015W",282,234,182,138,262,225,203,234,397 +"YOR016C",630,793,641,654,857,552,476,530,940 +"YOR017W",339,373,333,377,442,431,293,233,363 +"YOR018W",536,520,298,78,207,465,392,449,665 +"YOR019W",485,494,252,73,89,352,322,409,694 +"YOR020C",3875,3243,2470,1427,1687,12061,4543,4250,7037 +"YOR020W-A",1487,1429,1055,538,239,1334,1212,1491,2459 +"YOR021C",671,785,929,1408,1763,571,587,558,907 +"YOR022C",519,522,406,203,291,428,357,391,583 +"YOR023C",1205,1338,1048,682,977,963,886,843,1286 +"YOR025W",312,350,264,124,235,516,737,491,507 +"YOR026W",300,312,290,234,413,456,516,336,426 +"YOR027W",25975,20638,13312,3838,2321,10937,11920,14851,31636 +"YOR028C",876,576,250,79,150,1278,726,874,1651 +"YOR030W",676,686,590,563,397,1156,624,436,748 +"YOR031W",1486,1055,617,212,245,1874,1519,2192,4086 +"YOR032C",413,436,390,196,111,236,185,228,472 +"YOR032W-A",28,18,3,7,18,40,12,25,30 +"YOR033C",247,252,288,460,759,232,131,156,273 +"YOR034C",796,808,573,556,529,466,423,533,897 +"YOR034C-A",55,47,30,16,15,38,27,37,62 +"YOR035C",1114,1122,797,313,218,596,555,694,1216 +"YOR036W",1543,1298,875,307,589,1555,1316,1463,2499 +"YOR037W",370,374,292,266,422,523,344,328,470 +"YOR038C",570,600,441,484,597,417,498,423,617 +"YOR039W",1282,1279,1166,1072,1287,1043,1091,1126,1834 +"YOR040W",1301,1300,947,471,334,1392,1234,1297,2146 +"YNCO0014C",263,255,156,96,83,269,230,312,434 +"YOR042W",2232,2059,1537,810,672,2738,2317,2326,3479 +"YNCO0015C",10,16,6,4,7,12,20,12,26 +"YOR043W",1312,1402,1263,1442,1464,710,999,948,1533 +"YOR044W",384,362,327,264,202,200,233,281,482 +"YOR045W",240,244,198,196,283,1351,396,315,429 +"YOR046C",1139,1329,1536,2197,2782,668,983,901,1402 +"YOR047C",94,120,206,281,185,53,86,87,120 +"YOR048C",1027,1209,1402,1838,1713,437,665,678,1193 +"YOR049C",177,198,243,195,147,140,148,148,220 +"YOR051C",581,863,1626,3640,2543,237,509,536,837 +"YOR052C",2797,2578,2525,1673,1198,3771,2287,2357,4062 +"YOR054C",1756,1507,965,213,314,1706,1670,1643,2593 +"YOR056C",906,1165,1619,2988,3171,383,666,638,1201 +"YOR057W",622,631,586,465,359,341,423,469,823 +"YOR058C",384,498,513,634,530,577,829,509,566 +"YNCO0016W",5,2,2,2,3,4,1,1,4 +"YOR059C",971,911,761,556,469,896,911,809,1270 +"YOR060C",192,204,220,207,126,82,117,123,172 +"YOR061W",1264,1397,1431,1970,2093,992,1174,1070,1762 +"YOR062C",259,250,336,141,145,189,218,220,427 +"YOR063W",11330,13800,16801,31436,36002,2851,7160,7658,14027 +"YOR064C",448,504,392,341,562,410,493,457,676 +"YOR065W",4584,4115,2996,1963,3222,8081,7887,5393,6980 +"YOR066W",450,600,520,435,845,154,252,362,473 +"YOR067C",711,788,771,799,1051,347,496,482,786 +"YOR069W",729,749,649,557,664,549,652,579,901 +"YOR070C",691,710,576,295,430,506,526,532,851 +"YOR071C",546,574,449,456,577,353,365,425,676 +"YOR072W",25,24,15,15,25,29,22,24,39 +"YOR073W",424,498,491,472,474,435,509,383,519 +"YOR074C",261,268,246,151,306,202,148,199,293 +"YOR075W",639,683,541,309,656,471,536,580,900 +"YOR076C",463,503,472,388,478,351,310,371,515 +"YOR077W",250,254,199,233,229,156,196,246,394 +"YOR078W",625,871,1214,2323,1835,218,476,442,854 +"YOR079C",181,202,205,272,334,118,158,152,239 +"YOR080W",339,386,280,273,305,184,216,256,334 +"YOR081C",443,540,465,495,536,274,328,331,471 +"YOR083W",200,196,158,110,105,267,246,179,332 +"YOR084W",958,699,579,261,266,3273,2087,1414,1959 +"YOR085W",708,753,740,696,643,522,579,593,873 +"YOR086C",3599,3292,2406,1005,444,2825,2477,2521,4320 +"YOR087W",1122,1189,925,542,410,1320,1086,934,1467 +"YOR089C",1254,1277,1275,1322,1457,1158,1219,1148,2026 +"YOR090C",1168,996,724,450,488,849,782,827,1313 +"YOR091W",445,592,872,1571,1350,144,280,280,494 +"YOR092W",426,457,486,495,519,269,229,264,443 +"YOR093C",836,803,668,437,616,799,645,589,902 +"YOR094W",255,281,290,277,390,151,220,242,380 +"YOR095C",491,761,1177,2323,2075,39,257,324,540 +"YOR096W",4455,5192,5252,8882,14303,1064,2994,3625,6871 +"YOR097C",355,410,276,163,209,312,305,288,464 +"YOR098C",1134,1221,1447,1999,1497,741,916,850,1289 +"YOR099W",1593,1579,1289,1218,1762,1773,1727,1662,2507 +"YOR100C",530,551,435,171,129,1262,709,594,826 +"YOR101W",471,799,1417,2791,1471,144,130,204,506 +"YOR103C",465,455,399,345,350,408,455,505,716 +"YOR104W",284,311,306,249,297,190,210,219,392 +"YOR105W",15,24,14,13,21,9,14,21,21 +"YOR106W",370,397,422,438,515,299,361,329,467 +"YOR107W",184,243,369,580,267,114,193,184,291 +"YOR108W",384,566,915,2006,2563,46,150,162,370 +"YOR109W",1163,1385,1235,1264,1097,782,737,676,1108 +"YOR110W",385,428,397,350,465,329,340,302,496 +"YOR111W",311,345,255,169,191,292,286,282,413 +"YOR112W",517,588,562,519,702,462,475,415,612 +"YOR113W",850,831,607,168,294,741,670,603,899 +"YOR114W",219,253,155,55,86,259,177,176,264 +"YOR115C",516,580,585,682,766,314,350,396,591 +"YOR116C",1252,1609,1751,2737,2796,464,832,772,1328 +"YOR117W",4449,4335,3501,2939,2371,3674,4312,4021,6186 +"YOR118W",1600,1443,1229,996,1096,1213,1190,1219,1998 +"YOR119C",824,989,1072,1630,1073,487,497,529,990 +"YOR120W",8210,7123,4284,1350,411,11352,5300,6752,11527 +"YOR122C",3193,2846,2323,1912,1747,4458,3933,4040,5992 +"YOR123C",1798,1767,1694,1935,2301,1575,1637,1432,2371 +"YOR124C",2481,2341,1782,919,753,1912,1584,1673,2655 +"YOR125C",414,440,321,129,127,819,485,524,753 +"YOR126C",395,443,336,197,247,378,372,430,597 +"YOR127W",749,886,895,863,970,441,518,573,812 +"YOR128C",1592,1966,2202,5160,3288,710,902,1009,1721 +"YOR129C",348,377,381,504,535,301,368,260,383 +"YOR130C",311,377,332,360,398,184,277,272,446 +"YOR131C",293,314,298,218,260,440,348,326,479 +"YOR132W",815,820,587,256,436,719,608,614,1093 +"YOR133W",1076,1093,1057,1509,2210,546,643,752,1269 +"YOR134W",434,296,183,38,99,852,240,353,735 +"YOR136W",1856,1689,1405,739,2653,2442,1436,1518,2415 +"YOR137C",521,519,429,221,276,465,379,364,651 +"YOR138C",1333,1277,922,536,874,1286,1313,1321,2085 +"YOR140W",533,692,695,756,686,326,421,358,497 +"YOR141C",1264,1452,1424,833,788,935,1114,1074,1660 +"YOR142W",5303,4833,3588,1737,1479,12309,7707,6073,7623 +"YOR143C",288,394,592,958,847,130,239,214,373 +"YOR144C",313,427,449,456,471,167,188,200,307 +"YOR145C",1022,1408,1991,4099,4087,323,764,761,1336 +"YOR147W",1003,1064,818,678,875,1001,1023,883,1196 +"YOR148C",484,499,400,340,375,339,405,447,745 +"YOR149C",582,650,521,478,459,388,343,383,630 +"YOR150W",610,620,503,337,440,2720,830,686,971 +"YOR151C",3358,3626,3485,4834,4247,2184,2801,2536,3712 +"YOR152C",619,543,281,58,153,453,369,529,853 +"YOR153W",1609,2099,2078,2543,2980,832,862,982,1679 +"YOR154W",602,726,810,1087,743,308,368,392,674 +"YOR155C",853,806,612,278,215,734,731,782,1325 +"YOR156C",311,361,312,271,293,220,237,238,358 +"YOR157C",2256,2255,1950,1398,970,1492,1862,1616,2716 +"YOR158W",640,718,604,458,761,2697,787,682,939 +"YOR159C",272,273,312,522,477,192,248,228,419 +"YOR160W",621,692,739,1075,751,388,365,394,644 +"YOR161C",2740,2057,1011,312,311,3441,2118,2609,4597 +"YOR161C-C",7,7,6,6,9,20,8,7,10 +"YOR162C",1075,1023,860,374,465,996,801,738,1307 +"YOR163W",873,840,635,403,387,836,813,779,1314 +"YOR164C",969,938,773,696,602,684,747,695,1238 +"YOR165W",1648,1825,1570,1573,1572,1620,1230,1115,1723 +"YOR166C",691,747,642,677,639,315,448,462,772 +"YOR167C",3106,3193,3049,4357,7461,1439,2833,3114,5060 +"YOR168W",2272,2763,2990,5261,5150,886,1374,1401,2200 +"YOR171C",843,924,816,832,1059,687,698,666,1048 +"YOR172W",441,514,401,415,418,331,375,341,519 +"YOR173W",5706,4285,2167,381,114,7278,4425,5447,9014 +"YOR174W",306,326,301,298,525,365,346,347,505 +"YOR175C",1844,1700,1307,755,604,1758,1608,1636,2592 +"YOR176W",1128,1222,794,365,345,1237,1090,1179,1774 +"YOR177C",241,265,187,61,52,373,275,443,426 +"YOR178C",1895,1517,1044,248,856,2066,1155,1281,1949 +"YOR179C",314,304,368,323,331,193,310,290,480 +"YOR180C",859,789,504,137,88,2716,1520,1083,1263 +"YOR181W",635,566,466,277,343,443,470,442,683 +"YOR182C",1531,1618,1491,2196,3870,578,1285,1495,2463 +"YOR184W",2505,2889,3030,4953,3800,1619,1610,1931,3008 +"YNCO0022C",7,5,5,4,16,6,11,10,12 +"YOR185C",1581,1336,878,353,77,1441,1219,1347,2373 +"YOR186W",102,125,62,9,7,68,38,50,166 +"YOR187W",2106,2177,1983,1547,3156,9163,2711,2173,2815 +"YOR188W",538,638,814,1013,790,370,384,309,425 +"YOR189W",377,476,417,400,447,383,372,377,629 +"YOR190W",204,171,121,69,153,261,184,221,310 +"YOR191W",1641,1831,1512,1209,1112,926,1000,1013,1606 +"YOR192C",207,154,100,82,127,162,130,133,222 +"YOR192C-C",4,4,1,5,4,11,6,4,8 +"YOR192C-B",18,17,17,9,3,11,8,6,13 +"YOR193W",548,486,332,225,226,461,429,416,647 +"YOR194C",1065,1111,1036,942,1268,1156,1125,1000,1499 +"YOR195W",1142,1150,960,772,1062,665,755,694,1229 +"YOR196C",973,1009,1024,1192,1550,949,964,857,1235 +"YOR197W",1156,1149,1091,1092,1225,1070,933,1043,1486 +"YOR198C",1600,1730,1678,2246,2478,1654,1343,1140,1751 +"YOR201C",465,510,654,1052,817,681,483,375,604 +"YOR202W",548,561,649,1229,1068,325,482,457,928 +"YOR204W",1798,2575,4565,8502,3402,965,1144,1085,1813 +"YOR205C",320,313,372,562,374,353,259,211,315 +"YOR206W",1038,1742,2545,5944,5177,151,590,561,928 +"YOR207C",1300,1683,1881,3371,3462,341,701,702,1140 +"YOR208W",465,523,415,236,296,385,357,330,533 +"YOR209C",1454,1758,1957,3022,2808,801,1154,1110,1926 +"YOR210W",318,437,612,1090,1148,170,317,336,502 +"YOR211C",1054,1093,948,768,971,1119,749,642,1046 +"YOR212W",1038,1075,1040,982,1590,796,692,765,1383 +"YOR213C",334,349,375,382,520,230,296,237,433 +"YOR214C",15,21,12,5,4,28,17,18,25 +"YOR215C",5093,4275,2998,1432,417,5510,4830,4903,7782 +"YOR216C",674,753,822,908,667,421,527,542,789 +"YOR217W",936,1028,992,1145,968,649,770,685,1023 +"YOR219C",636,612,405,326,662,692,524,510,817 +"YOR220W",1255,1038,616,320,642,1415,1200,1184,1919 +"YOR221C",544,635,569,485,484,403,443,413,645 +"YOR222W",752,897,1004,2068,2456,461,647,537,927 +"YNCO0024C",4,3,7,3,16,7,6,8,5 +"YOR223W",532,491,385,135,233,533,570,540,892 +"YOR224C",494,581,765,1531,2075,312,593,466,758 +"YOR226C",165,218,377,741,694,70,117,129,210 +"YOR227W",2221,1885,1118,292,485,2353,1587,1643,2392 +"YOR228C",392,454,286,88,105,426,390,437,637 +"YOR229W",481,564,689,789,417,249,475,439,676 +"YOR230W",10099,7977,5634,3016,1260,6494,7226,10745,16628 +"YOR231W",473,491,369,290,553,363,416,351,570 +"YOR232W",937,1068,1079,1287,1600,2257,995,877,1243 +"YOR233W",373,457,582,870,803,255,287,240,412 +"YOR234C",1803,2145,2465,4781,6956,542,1501,1539,2622 +"YNCO0025W",32,32,18,8,8,20,40,32,45 +"YOR236W",245,310,318,379,193,110,189,260,451 +"YOR237W",71,69,65,74,62,48,36,26,66 +"YOR238W",370,407,369,375,339,251,225,255,468 +"YOR239W",868,1027,1158,1662,1397,878,843,737,1258 +"YOR241W",776,958,1000,1244,1283,520,696,735,1036 +"YOR242C",67,79,48,49,161,52,54,53,66 +"YOR243C",842,1171,1556,2937,2919,206,481,465,848 +"YOR244W",878,866,705,642,899,614,808,757,1124 +"YOR245C",1158,1108,858,649,731,1030,845,848,1450 +"YOR246C",587,750,749,986,980,514,625,583,977 +"YOR247W",565,660,663,611,1134,4296,2426,956,655 +"YOR249C",469,516,427,324,448,318,344,398,500 +"YOR250C",360,371,323,260,276,290,275,302,472 +"YOR251C",1413,1388,1129,1014,915,1142,1202,1370,2388 +"YOR252W",447,584,746,1420,2219,165,272,301,510 +"YOR253W",400,486,475,565,577,318,352,354,557 +"YOR254C",1625,1920,1942,2624,2853,683,1192,1138,1712 +"YOR255W",14,21,16,6,2,7,11,12,31 +"YOR256C",1244,1328,1100,864,975,934,891,874,1450 +"YOR257W",519,557,398,340,493,541,593,542,878 +"YOR258W",211,191,158,146,212,157,151,180,305 +"YOR259C",4800,4547,4163,3947,3231,4070,4893,4322,6536 +"YOR260W",1073,1185,1294,1825,2400,391,756,706,1028 +"YOR261C",3957,3721,2655,1773,2159,4305,4667,4375,6128 +"YOR262W",716,884,838,677,873,392,555,575,985 +"YOR264W",656,478,495,457,328,179,590,1645,1601 +"YOR265W",466,439,350,356,247,374,369,358,492 +"YOR266W",315,330,286,277,269,730,313,254,378 +"YOR267C",1061,952,848,578,467,698,572,604,942 +"YOR269W",101,134,177,191,110,36,63,72,131 +"YOR270C",3713,3867,3986,5749,2808,2404,2628,2750,4378 +"YOR271C",775,1156,1500,2516,2176,535,811,702,1050 +"YOR272W",662,996,1583,3352,3070,52,297,378,635 +"YOR273C",2838,2298,1160,186,201,5375,3471,2802,4087 +"YOR274W",575,640,715,746,692,396,407,428,686 +"YOR275C",750,767,596,325,287,653,507,521,909 +"YOR276W",991,1111,1245,1878,2643,528,847,882,1402 +"YNCO0027C",30,32,29,69,66,17,15,29,35 +"YNCO0028W",10,5,4,9,10,11,9,6,8 +"YOR278W",296,297,259,249,248,243,215,244,355 +"YOR279C",277,359,363,340,414,195,223,238,407 +"YOR280C",337,410,368,360,415,317,297,315,523 +"YOR281C",599,718,1092,1810,991,413,552,478,727 +"YOR283W",541,859,1512,3403,1836,184,354,412,693 +"YOR284W",273,286,235,78,122,201,220,257,387 +"YOR285W",12969,10496,6849,2972,2740,25079,22815,19179,25638 +"YOR286W",418,432,466,360,657,1476,496,454,679 +"YOR287C",220,441,655,1170,989,19,114,125,248 +"YOR288C",217,253,215,130,214,222,228,231,355 +"YOR289W",1285,1172,805,389,182,992,914,1233,2008 +"YNCO0029C",6,6,8,2,1,6,8,10,8 +"YOR290C",1973,1940,1547,1212,1255,1476,1382,1330,2150 +"YOR291W",823,901,828,924,702,486,552,491,848 +"YOR292C",495,475,280,73,228,442,346,439,681 +"YOR293W",4258,4782,5144,8785,16038,1220,3101,3204,5363 +"YOR294W",685,935,1327,2635,2415,119,463,519,903 +"YOR295W",208,238,286,304,295,133,160,133,262 +"YOR296W",538,564,450,409,568,342,315,311,522 +"YOR297C",197,231,219,299,388,176,178,166,245 +"YOR298W",149,118,86,97,121,210,156,144,220 +"YOR298C-A",7875,5874,3159,774,2452,6877,6430,6944,11846 +"YOR299W",430,519,567,657,608,326,294,321,490 +"YOR301W",279,287,276,314,263,214,222,303,477 +"YOR302W",655,510,477,628,279,214,451,456,803 +"YOR303W",9214,6784,7581,11606,5064,2855,6667,7319,13449 +"YOR304W",1017,1180,1228,1276,1370,597,700,757,1197 +"YOR304C-A",123,143,185,164,120,90,115,124,222 +"YOR305W",298,412,467,687,459,181,231,208,335 +"YOR306C",463,850,2947,8409,1402,238,314,245,438 +"YOR307C",753,864,885,1211,1046,415,606,552,942 +"YOR308C",358,480,490,562,320,158,244,290,414 +"YOR310C",958,1712,3414,9506,7588,93,444,418,731 +"YOR311C",437,503,598,819,692,228,313,365,552 +"YOR312C",4850,5546,6073,10160,17197,1555,3942,3896,6838 +"YOR313C",17,15,18,16,29,31,67,28,42 +"YOR315W",139,178,215,309,495,344,695,263,193 +"YOR316C",1074,1087,933,875,1097,722,795,998,1631 +"YOR316C-A",8,6,1,3,6,11,6,6,11 +"YOR317W",6632,5176,3499,1507,852,13105,11082,8459,11134 +"YOR319W",427,565,610,526,434,290,303,294,559 +"YOR320C",910,1064,865,742,1180,677,744,685,973 +"YOR321W",440,489,368,172,194,272,290,305,513 +"YOR322C",769,851,899,1178,867,494,554,452,790 +"YOR323C",1112,1299,1330,1695,1629,524,752,806,1402 +"YOR324C",711,728,611,352,542,875,745,605,832 +"YOR326W",3034,3078,2899,3300,2967,3096,2581,2450,3496 +"YOR327C",1329,1430,1331,1185,1095,1339,1286,1373,2076 +"YOR328W",2906,2913,1699,394,120,945,979,1423,2901 +"YOR329C",1415,1147,827,532,683,1618,1072,1000,1533 +"YOR330C",710,762,688,579,583,719,662,578,875 +"YOR332W",2676,2666,2447,2535,2250,2376,2318,2482,4402 +"YOR334W",237,264,277,331,199,281,185,177,284 +"YOR335C",3772,5199,6442,12504,10955,1883,2490,2633,4096 +"YOR336W",750,837,712,738,380,495,414,372,677 +"YOR337W",385,596,1161,2040,642,86,161,144,297 +"YOR338W",374,711,2451,6460,1854,88,108,153,359 +"YOR339C",100,101,90,90,98,74,80,98,164 +"YOR340C",445,721,1119,2165,1874,57,230,230,406 +"YOR341W",2045,3009,4144,10125,10593,336,966,958,1698 +"YOR342C",575,664,941,1642,2033,367,605,858,987 +"YOR343C",34,31,35,12,26,45,39,49,57 +"YOR343W-B",81,98,92,92,104,46,44,41,74 +"YOR344C",1568,1453,1016,798,633,896,924,1231,2182 +"YOR346W",741,839,908,1350,1538,533,665,581,832 +"YOR347C",420,448,321,109,77,477,374,421,669 +"YOR348C",3981,3374,1944,317,822,9888,9734,5831,6788 +"YOR349W",367,353,318,276,303,486,295,235,376 +"YOR350C",848,926,755,582,392,387,522,617,1014 +"YOR351C",35,39,17,16,28,52,26,17,40 +"YOR352W",548,561,357,186,356,575,466,488,711 +"YOR353C",730,749,689,551,684,477,571,563,836 +"YOR354C",1000,1074,926,758,1145,3644,1103,857,1132 +"YOR355W",3726,3028,2496,2234,2590,1027,3087,2602,3992 +"YOR356W",3093,3226,2833,2003,1557,3428,3797,2851,4137 +"YOR357C",324,327,215,188,385,390,360,364,514 +"YOR358W",278,307,266,155,167,383,235,251,446 +"YOR359W",309,475,1110,1724,699,73,154,148,230 +"YOR360C",426,795,2694,3828,462,206,268,302,454 +"YOR361C",2180,3065,3511,6654,7621,881,1526,1512,2469 +"YOR362C",3552,3377,2848,2276,1860,3759,4327,4008,5978 +"YOR363C",1178,1253,967,456,373,1629,1229,931,1322 +"YOR365C",257,191,138,100,201,533,274,236,403 +"YOR367W",491,571,406,269,410,386,413,398,706 +"YOR368W",262,325,281,292,462,170,183,192,285 +"YOR369C",5743,6682,7629,12254,23919,1484,4426,5192,10164 +"YOR370C",1344,1580,1736,2161,2294,872,1197,949,1571 +"YOR371C",403,408,376,311,251,244,243,241,437 +"YOR372C",648,754,874,976,447,724,614,443,656 +"YOR373W",624,531,454,359,318,1147,799,786,1088 +"YOR374W",122903,92856,63305,22265,1389,207054,177318,146394,205271 +"YOR375C",12106,19172,27543,46258,75002,5092,12143,11489,16221 +"YOR376W",16,26,19,8,32,57,42,37,53 +"YOR376W-A",69,93,78,37,62,73,53,41,74 +"YOR377W",724,735,491,334,684,719,507,500,817 +"YOR378W",248,266,227,187,117,116,124,137,214 +"YOR380W",374,393,283,169,217,287,322,322,495 +"YOR381W",258,246,219,178,319,112,146,164,326 +"YOR381W-A",9,18,15,24,34,4,2,3,18 +"YOR382W",180,202,189,170,184,328,132,134,203 +"YOR383C",335,320,280,168,170,732,345,292,452 +"YOR384W",491,503,366,199,196,339,289,311,520 +"YOR385W",583,635,520,550,526,296,342,425,717 +"YOR386W",709,651,331,58,84,692,483,517,722 +"YOR387C",187,115,48,17,33,309,167,181,301 +"YOR388C",6126,4692,3161,1540,238,9619,8558,8188,11176 +"YOR389W",967,1009,1035,1681,816,1125,1045,993,1571 +"YOR390W",52,57,69,89,78,30,26,26,49 +"YOR391C",394,295,170,34,10,428,309,373,682 +"YPL279C",12,17,16,20,25,9,5,7,7 +"YPL278C",65,39,39,25,5,74,58,80,104 +"YPL277C",476,404,264,170,73,621,540,512,776 +"YPL276W",927,716,457,194,25,1219,1055,1112,1390 +"YPL274W",1902,2339,2963,4771,2598,557,1292,1265,2216 +"YPL273W",489,557,629,1055,1758,177,395,365,540 +"YPL272C",130,136,113,77,234,103,75,86,156 +"YPL271W",2246,2074,1411,891,1473,4084,3614,3166,4027 +"YPL270W",1354,1317,1103,752,668,1045,1008,1033,1610 +"YPL269W",206,268,237,181,188,182,175,120,221 +"YPL268W",686,673,587,504,444,440,451,487,737 +"YPL267W",165,193,142,106,328,117,99,117,211 +"YPL266W",550,858,1170,2582,3314,111,354,335,628 +"YPL265W",515,771,864,658,2320,974,517,391,545 +"YPL264C",264,189,149,119,143,235,226,204,398 +"YPL263C",366,482,650,1316,2708,209,309,233,427 +"YPL262W",3462,3641,2872,1721,1674,6747,3892,3336,5024 +"YPL261C",52,51,36,23,41,51,41,38,40 +"YPL260W",1786,1799,1430,1067,1382,2016,1579,1559,2409 +"YPL259C",436,484,474,454,537,272,388,355,563 +"YPL258C",298,302,252,212,496,440,231,203,323 +"YNCP0001C",12,7,2,3,9,9,9,8,7 +"YPL257W",252,203,108,45,88,301,255,249,363 +"YPL256C",714,901,814,743,1202,262,144,287,633 +"YPL255W",170,199,148,153,248,179,157,157,209 +"YPL254W",604,690,626,698,954,272,504,454,764 +"YPL253C",308,305,269,258,298,391,338,258,389 +"YPL252C",290,332,436,704,651,409,276,252,334 +"YPL250C",857,663,410,442,111,320,562,595,1097 +"YPL249C-A",3469,3618,4063,6143,10493,1251,2548,2723,5155 +"YPL249C",676,715,608,320,271,492,518,444,763 +"YNCP0002W",23,21,25,21,42,21,24,18,37 +"YPL247C",827,639,347,112,191,761,590,670,1181 +"YPL246C",360,364,459,631,386,295,240,290,445 +"YPL245W",88,123,171,300,540,135,70,78,126 +"YPL244C",381,488,550,680,871,310,361,341,551 +"YPL243W",1998,2175,1996,2320,2696,1866,2042,1730,2537 +"YPL242C",1002,955,801,603,627,1209,2146,1357,1329 +"YPL241C",118,149,124,112,274,139,101,131,180 +"YPL240C",29371,22868,13614,3141,1521,27239,14812,18588,39267 +"YPL239W",891,957,1128,1880,1677,297,476,609,1248 +"YPL237W",1690,2041,2640,5105,6178,1263,1546,1480,2393 +"YPL236C",487,486,335,147,214,287,339,370,662 +"YPL235W",1211,1349,1346,1937,2349,907,1104,1039,1615 +"YPL234C",858,854,808,858,893,942,970,996,1637 +"YPL233W",228,297,304,389,265,209,168,188,331 +"YPL232W",1164,1165,1309,1645,1349,1039,1156,1354,1907 +"YPL231W",17225,17563,15483,14327,9210,10246,15620,12308,18395 +"YPL230W",1458,970,373,44,287,4133,1650,1517,1972 +"YPL229W",387,401,511,649,590,281,325,337,518 +"YPL228W",776,770,598,466,689,602,668,632,859 +"YPL227C",312,455,693,1311,696,250,330,282,450 +"YPL226W",2073,3225,5268,15511,5814,351,867,924,1720 +"YPL225W",2359,2225,1598,1424,1637,2178,1928,2136,3389 +"YPL224C",414,473,387,300,414,562,444,397,602 +"YPL223C",42336,31045,19876,4631,255,1674,5768,12502,48317 +"YPL222W",3237,2945,1861,412,249,1729,1758,2261,4488 +"YPL221W",1005,1365,2408,4684,2320,952,949,772,1135 +"YPL220W",975,1247,1196,2103,3299,423,646,811,1347 +"YPL219W",396,362,255,93,229,388,298,387,476 +"YPL218W",2096,2009,1724,1495,1826,2289,2237,2289,3367 +"YPL217C",1303,1785,2535,5263,4407,341,763,750,1367 +"YPL216W",787,831,627,605,629,550,474,462,881 +"YPL215W",557,590,494,462,712,1560,616,521,754 +"YPL214C",1429,1685,1689,2176,3995,1004,898,1133,1855 +"YPL213W",361,428,422,373,535,214,274,307,461 +"YPL212C",571,863,1529,3757,1931,136,387,371,697 +"YPL211W",363,566,948,1973,2230,66,240,224,457 +"YPL210C",1640,1832,1751,2416,2105,1283,1558,1399,1984 +"YPL209C",93,129,100,110,117,77,61,73,127 +"YPL208W",439,465,413,341,483,279,296,369,522 +"YPL207W",1699,2154,2217,3122,4868,640,1026,991,1779 +"YPL206C",1411,1466,1240,799,838,1651,1234,1317,2306 +"YPL204W",1242,1511,1804,2533,1880,868,907,961,1456 +"YPL203W",2072,1845,1051,144,189,2239,1660,1857,2813 +"YPL202C",393,459,773,1121,699,724,422,326,454 +"YPL201C",1632,1368,745,64,91,8941,3538,2439,2828 +"YPL200W",211,179,106,16,22,277,261,239,333 +"YPL199C",496,585,593,1013,1344,560,465,425,672 +"YPL198W",949,1125,1446,2831,3379,197,557,564,1107 +"YNCP0003W",9,9,16,22,20,3,5,4,17 +"YPL196W",869,836,444,185,264,1093,917,906,1533 +"YPL195W",1582,1680,1428,1435,1374,941,1023,1026,1692 +"YPL194W",411,459,345,233,195,230,262,254,431 +"YPL193W",931,924,951,1004,1087,636,761,656,1058 +"YPL192C",124,112,72,94,243,164,171,119,200 +"YPL191C",471,468,317,148,196,309,300,354,601 +"YPL190C",2318,2097,1699,1422,1471,1938,1999,1797,2886 +"YPL189C-A",463,347,293,176,352,1036,913,722,900 +"YPL189W",62,81,70,112,63,53,40,50,76 +"YPL188W",1254,1268,1133,1074,1110,1010,1140,1102,1660 +"YPL187W",32671,34939,32758,38640,61601,31597,19198,25333,35837 +"YPL186C",10566,8100,5269,1991,256,9329,7889,9307,16534 +"YPL184C",940,960,827,751,866,701,715,688,1083 +"YPL183W-A",341,292,293,276,366,958,397,347,467 +"YPL183C",607,872,1318,3273,2094,106,329,302,611 +"YPL181W",1569,1744,1824,2058,2549,1443,1417,1325,2153 +"YPL180W",852,923,761,610,643,502,619,598,1045 +"YPL179W",2729,2641,2197,2242,2800,1594,1927,1922,3046 +"YPL178W",642,676,667,721,945,738,810,707,1060 +"YPL177C",1824,2029,2516,3357,2365,762,1550,1532,2426 +"YPL176C",755,768,645,790,906,540,536,586,841 +"YPL175W",274,392,437,585,620,132,262,223,360 +"YPL174C",651,677,557,437,458,287,392,368,629 +"YPL173W",433,459,400,399,523,1762,470,394,587 +"YPL172C",253,309,267,241,337,1363,330,278,387 +"YPL171C",2521,2605,2015,992,168,868,802,1230,2947 +"YPL170W",1152,1251,891,310,301,877,1022,1052,1653 +"YPL169C",607,795,846,1167,1226,397,502,474,723 +"YPL168W",346,422,320,293,384,397,307,301,484 +"YPL167C",978,962,640,342,351,415,505,625,1045 +"YPL166W",367,301,179,32,47,328,284,287,455 +"YPL165C",604,530,330,57,117,507,508,487,850 +"YPL164C",378,413,325,188,187,474,361,351,561 +"YPL163C",359,418,368,321,704,380,200,192,352 +"YPL162C",504,553,468,304,234,262,342,415,698 +"YPL161C",694,711,516,368,490,519,535,537,818 +"YPL160W",3528,4427,5105,9844,8562,1167,2303,2052,3570 +"YPL159C",750,853,1137,1506,712,413,445,464,824 +"YPL158C",518,429,363,309,321,266,1000,1805,1281 +"YPL157W",343,357,435,577,524,108,291,379,460 +"YPL156C",924,946,544,117,1329,593,797,824,1308 +"YPL155C",200,248,329,342,291,316,275,199,300 +"YPL154C",7948,6528,4529,2309,1166,8668,7832,7618,12255 +"YPL153C",209,295,267,157,413,90,100,146,231 +"YPL152W",471,446,304,111,224,488,410,395,667 +"YPL151C",385,446,450,421,547,325,353,408,636 +"YPL150W",949,969,779,598,721,762,757,675,1098 +"YPL149W",478,591,534,474,380,395,408,472,794 +"YPL148C",336,356,295,184,235,265,335,326,549 +"YPL147W",5435,4512,2367,121,82,6334,5437,4903,7067 +"YPL146C",660,1151,1927,4307,3042,233,487,450,746 +"YPL145C",3238,3187,2695,2660,3311,1757,1995,2205,3522 +"YPL144W",104,125,107,128,248,93,118,100,150 +"YPL143W",3196,3562,3868,6396,10792,1037,2359,2581,4552 +"YPL141C",716,758,641,552,486,966,1604,945,898 +"YPL140C",650,566,544,580,638,602,475,499,811 +"YPL139C",601,679,667,649,801,599,617,500,749 +"YPL138C",505,541,542,346,427,367,406,396,703 +"YPL137C",975,1384,1845,2137,593,432,468,496,921 +"YPL135W",4442,3640,3054,1599,1825,5356,5862,5527,8948 +"YPL134C",1096,1115,1045,685,721,1651,1423,1801,2111 +"YPL133C",505,510,497,367,384,341,430,437,713 +"YPL132W",217,263,215,142,208,714,278,237,342 +"YPL131W",5341,6699,8846,16721,21122,1459,4044,3752,7432 +"YPL130W",34,34,33,19,9,5,10,14,29 +"YPL129W",872,897,819,925,1293,689,848,790,1295 +"YPL128C",335,435,563,804,602,332,346,248,327 +"YPL127C",885,931,783,534,399,2231,1120,865,1248 +"YPL126W",901,1351,2590,5862,3583,182,449,514,821 +"YPL125W",1326,1346,1055,951,1090,1230,1137,986,1463 +"YPL124W",126,133,95,65,123,156,111,102,154 +"YPL123C",1901,1597,878,145,73,1755,1484,1599,2580 +"YPL122C",380,503,445,535,553,217,276,284,490 +"YPL120W",564,547,407,255,375,419,406,432,714 +"YPL119C-A",296,255,166,12,40,144,139,171,297 +"YPL119C",1203,1046,620,76,136,597,686,771,1370 +"YPL118W",1046,1125,947,795,1202,3275,1210,1080,1407 +"YPL117C",3495,3702,4110,4974,3500,1327,2617,2843,4479 +"YPL116W",686,755,611,428,490,1099,834,574,832 +"YPL115C",626,732,743,761,773,458,371,389,564 +"YPL113C",1783,1512,897,81,156,1724,2075,2056,3018 +"YPL112C",750,1004,1038,1279,1941,624,666,600,922 +"YPL111W",268,241,234,224,1097,241,259,236,415 +"YPL110C",838,831,648,463,378,692,541,558,980 +"YPL109C",1552,1372,942,264,167,1358,1334,1295,1857 +"YPL108W",119,173,216,291,285,59,112,118,209 +"YPL107W",643,695,703,656,695,527,655,573,926 +"YPL106C",17026,16985,16409,20089,10834,7397,8029,9271,18452 +"YPL105C",1460,1703,1998,2944,2003,1159,1298,1163,1729 +"YPL104W",383,448,459,352,238,1481,414,293,538 +"YPL103C",231,256,271,312,385,427,223,181,293 +"YPL101W",596,676,705,788,866,363,495,517,782 +"YPL100W",831,782,532,265,393,698,665,694,1126 +"YPL099C",553,494,347,215,332,1003,588,545,775 +"YPL098C",460,439,400,288,389,1244,591,404,672 +"YPL097W",319,435,383,332,405,1471,380,293,375 +"YPL096C-A",75,84,69,78,70,90,78,75,168 +"YPL096W",652,624,513,256,306,506,526,523,911 +"YPL095C",441,462,442,236,202,325,362,362,599 +"YPL094C",1245,1415,1481,1878,1484,1319,1345,1393,1975 +"YPL093W",1754,2988,5504,13981,9137,156,771,883,1534 +"YPL092W",3334,2876,1943,803,274,1876,2492,2517,4762 +"YPL091W",1593,1714,1496,1373,1822,1582,1292,1322,2172 +"YPL090C",2001,2445,2623,4802,8299,608,1430,1638,2754 +"YPL089C",809,817,848,830,691,357,504,556,793 +"YPL088W",291,368,328,359,354,159,142,194,358 +"YPL087W",700,745,687,442,267,1622,874,781,1049 +"YPL086C",632,877,1100,2013,2267,188,445,441,688 +"YPL085W",1104,1279,1293,1342,981,651,820,727,1059 +"YPL084W",1331,1386,1035,646,787,912,795,838,1369 +"YPL083C",425,440,414,454,386,260,231,243,437 +"YPL082C",834,814,799,1223,1221,449,625,666,898 +"YPL081W",1854,2347,3579,7064,3515,375,1623,1404,2411 +"YPL080C",23,29,47,60,63,8,28,23,40 +"YPL079W",3308,3864,4053,6812,11319,1167,2628,2816,4842 +"YPL078C",4340,4255,3353,2607,3143,6877,5599,5335,7320 +"YPL077C",179,182,226,123,127,85,121,142,248 +"YPL076W",252,301,246,207,157,165,135,155,293 +"YPL075W",1372,1131,774,438,497,617,598,770,1371 +"YPL074W",757,897,714,792,896,596,629,666,1012 +"YPL072W",150,187,148,141,147,636,257,147,223 +"YPL071C",243,277,232,222,303,157,205,224,411 +"YPL070W",770,830,738,470,390,513,506,542,881 +"YPL069C",262,238,222,257,310,164,197,203,324 +"YPL068C",30,66,157,280,155,24,29,23,28 +"YPL067C",47,66,55,45,101,49,54,51,67 +"YPL066W",442,445,382,268,385,238,301,372,478 +"YPL065W",405,407,332,208,275,249,318,348,541 +"YPL064C",703,764,766,650,497,436,498,564,924 +"YPL063W",1078,1281,1371,1501,1457,1728,970,872,1367 +"YPL062W",2,5,5,4,3,5,8,3,7 +"YPL061W",14625,17246,18469,5582,5005,16887,14909,13261,19633 +"YPL060W",349,339,269,203,345,341,284,297,444 +"YPL060C-A",5,6,12,2,2,3,4,2,4 +"YPL059W",847,830,648,440,581,1892,866,844,1341 +"YPL058C",9241,13846,18033,24098,10364,6161,4861,3888,6846 +"YPL057C",1636,1496,1301,856,1788,1904,2230,2190,2664 +"YPL056C",113,94,68,32,125,118,136,119,168 +"YPL055C",508,541,579,453,563,306,442,410,636 +"YPL054W",3037,2464,1344,190,670,2195,2824,2838,4106 +"YPL053C",1171,1241,1194,1275,1536,924,1111,1189,1660 +"YPL052W",330,407,385,326,288,155,224,278,443 +"YPL051W",405,444,433,411,370,252,369,346,632 +"YPL050C",1392,1719,1794,2477,2882,1074,1274,1171,1826 +"YPL049C",812,823,830,901,971,678,634,678,1039 +"YPL048W",2729,2673,2295,2235,2123,2257,2001,2040,3694 +"YPL047W",177,189,194,219,219,106,156,147,222 +"YPL046C",147,193,168,152,158,114,133,164,232 +"YPL045W",721,840,789,726,512,478,532,533,873 +"YPL043W",1242,1819,2968,6879,5450,153,540,536,1054 +"YPL042C",371,426,579,580,379,297,369,378,522 +"YPL041C",87,87,61,65,105,77,76,79,127 +"YPL040C",328,369,335,334,285,960,299,247,393 +"YPL039W",312,356,345,381,372,273,304,252,417 +"YPL038W-A",6,9,4,10,14,11,9,8,12 +"YPL038W",179,262,385,567,304,180,184,152,287 +"YPL037C",3473,3572,3403,4314,5581,2502,3620,3800,6119 +"YPL036W",16188,13617,8822,2728,270,3451,2949,5871,15576 +"YPL034W",222,232,176,206,249,186,211,203,326 +"YPL033C",108,110,92,43,47,98,124,92,154 +"YPL032C",746,1034,1137,1648,1287,357,454,374,630 +"YPL031C",748,759,633,498,565,968,746,647,1116 +"YPL030W",307,488,715,1179,691,85,182,176,337 +"YPL029W",467,455,490,490,475,810,390,352,532 +"YPL028W",3353,3391,2933,1932,1817,3382,4111,3689,5975 +"YPL027W",90,85,78,26,42,70,78,86,137 +"YPL026C",874,1297,2836,1994,1468,258,645,575,776 +"YPL024W",638,606,691,830,734,783,935,785,1099 +"YPL023C",965,1022,1057,1236,1286,671,758,730,1203 +"YPL022W",1299,1457,1285,1286,1051,728,774,757,1373 +"YPL021W",3,2,1,1,3,4,3,2,6 +"YPL020C",790,791,724,662,625,391,498,558,850 +"YPL019C",995,922,782,856,1101,975,745,733,1219 +"YPL018W",417,337,246,119,138,505,369,311,529 +"YPL017C",628,509,325,155,194,774,527,583,862 +"YPL016W",936,633,463,417,972,1185,1362,981,1238 +"YPL015C",606,629,449,194,351,591,413,484,817 +"YPL014W",209,211,132,72,256,248,166,170,226 +"YPL013C",505,490,412,395,440,1763,655,574,824 +"YPL012W",1496,2179,3398,8509,6068,216,732,768,1290 +"YPL011C",561,602,526,470,516,364,505,532,770 +"YPL010W",1378,1295,996,890,987,1345,1290,1274,1843 +"YPL009C",1623,1850,1792,1908,1420,1085,1318,1271,2317 +"YPL008W",740,718,664,529,614,451,484,468,798 +"YPL007C",418,507,400,256,298,336,350,374,521 +"YPL006W",1984,1767,1367,635,427,1321,1094,1156,2035 +"YPL005W",304,320,279,203,254,281,247,239,398 +"YPL004C",20410,14868,8155,2039,792,26103,19192,17991,28827 +"YPL003W",568,413,188,58,205,960,689,610,924 +"YPL002C",452,542,408,297,424,356,282,389,619 +"YPL001W",557,561,520,563,692,343,406,397,605 +"YPR001W",4478,3929,2821,809,109,30243,11444,6767,8591 +"YPR002W",4746,4752,3896,1530,574,24325,9033,5520,7658 +"YPR003C",647,604,385,234,468,585,544,504,708 +"YPR004C",1336,1464,1422,1913,1944,2194,1378,1211,1666 +"YPR005C",587,629,376,142,307,639,393,401,713 +"YPR006C",4809,4009,2399,332,223,16801,8153,6040,8240 +"YPR007C",170,176,168,95,63,146,89,97,207 +"YPR008W",1765,1587,1534,884,967,1734,1796,1695,2580 +"YPR009W",207,290,504,838,815,247,240,213,273 +"YPR010C",1695,2919,4534,11755,8714,165,779,788,1462 +"YPR010C-A",2491,2200,1680,1034,1031,4287,3540,3113,4070 +"YPR011C",415,472,392,347,453,801,409,441,616 +"YPR013C",223,213,247,302,547,135,162,150,251 +"YPR014C",59,52,56,45,37,39,72,64,93 +"YPR015C",224,206,140,83,131,302,167,216,306 +"YPR016C",1396,1711,1981,3583,4719,757,1293,1344,2198 +"YPR017C",111,150,140,135,250,87,96,98,183 +"YPR018W",547,586,826,637,731,209,359,390,678 +"YPR019W",954,1051,883,839,1212,622,789,754,1099 +"YPR020W",782,1000,857,867,1420,1192,1093,851,1096 +"YPR021C",615,632,550,405,543,704,466,437,649 +"YPR022C",754,851,798,848,792,693,527,510,772 +"YPR023C",1502,1526,1235,820,1169,1386,1433,1367,2068 +"YPR024W",1434,1569,1545,1504,1629,2353,1683,1429,1918 +"YPR025C",722,570,362,296,542,1660,826,752,1100 +"YPR026W",2691,2282,1174,160,271,3027,2182,2116,3216 +"YPR027C",143,180,165,54,207,244,237,180,255 +"YPR028W",2285,2105,1501,866,587,2526,1908,2279,3467 +"YPR029C",1449,1353,1190,1062,1505,1046,1149,1137,1610 +"YPR030W",1533,1364,918,281,763,1176,1038,1188,1705 +"YPR031W",537,643,542,450,511,360,403,385,657 +"YPR032W",552,609,568,494,417,377,435,387,537 +"YPR033C",1265,1730,2032,3964,5020,1073,1167,1099,1568 +"YPR034W",607,697,824,1018,756,511,647,502,749 +"YPR035W",10313,12512,17949,23031,24416,1609,10623,8893,13851 +"YPR036W",3230,3286,3273,3615,2313,2072,2636,2899,4554 +"YPR036W-A",3952,3570,4691,879,5929,6912,7395,4435,6607 +"YPR037C",287,270,254,178,160,269,247,326,562 +"YPR038W",3,5,2,3,6,9,8,3,4 +"YPR040W",510,558,564,433,525,342,362,408,606 +"YPR041W",1732,2345,3175,5588,5277,890,1274,1297,2156 +"YPR042C",495,639,480,339,267,365,393,410,615 +"YPR043W",3106,3324,3319,5236,7925,869,2078,2249,4154 +"YPR045C",704,628,355,296,677,620,514,522,869 +"YPR046W",218,196,169,122,149,176,160,201,341 +"YPR047W",230,288,223,101,111,1561,269,240,308 +"YPR048W",551,620,771,1036,1015,170,304,307,516 +"YPR049C",1282,1273,972,487,559,541,664,817,1396 +"YPR051W",389,355,396,377,453,312,380,404,651 +"YPR052C",191,180,152,100,131,270,297,222,385 +"YPR053C",68,62,57,33,53,45,49,64,92 +"YPR054W",162,193,151,145,166,112,135,157,216 +"YPR055W",682,715,637,563,543,460,488,453,647 +"YPR056W",436,461,406,348,609,344,390,408,628 +"YPR057W",430,478,482,515,606,444,379,351,560 +"YPR058W",832,858,825,998,865,474,512,554,1035 +"YPR060C",113,250,404,979,845,67,127,106,120 +"YPR061C",231,235,304,215,137,228,258,245,399 +"YPR062W",421,515,859,1734,1502,433,535,583,722 +"YPR063C",477,494,542,646,661,570,473,481,792 +"YPR064W",16,11,11,8,6,6,14,14,25 +"YPR065W",1345,1611,3235,3332,1430,524,899,767,1189 +"YPR066W",152,158,140,69,48,213,118,129,217 +"YPR067W",260,273,266,126,196,420,228,216,336 +"YPR068C",188,260,217,200,215,236,173,197,272 +"YPR069C",1918,2173,2129,2939,3219,1289,1334,1440,2288 +"YPR070W",497,554,592,743,579,292,320,310,506 +"YPR071W",159,209,246,331,259,73,88,83,156 +"YPR072W",1035,1011,922,919,994,844,961,851,1368 +"YPR073C",431,509,654,902,704,663,468,444,671 +"YPR074C",2609,4650,7196,14485,10307,2083,2315,1798,2351 +"YPR075C",1467,1446,1290,848,1197,1305,1234,1314,2041 +"YPR078C",75,68,27,28,32,47,56,68,117 +"YPR079W",455,485,437,380,513,370,358,391,707 +"YPR080W",3086,4048,5639,10657,10916,1008,1895,1920,3654 +"YPR081C",760,693,523,245,198,533,454,453,839 +"YPR082C",419,394,333,298,281,343,374,434,593 +"YPR083W",1014,935,753,447,507,682,916,981,1456 +"YPR084W",392,431,367,340,443,317,308,335,499 +"YPR085C",419,468,423,467,419,198,266,272,444 +"YPR086W",1171,1268,1123,1306,1620,849,841,875,1456 +"YPR088C",1723,1782,1658,1827,2373,1402,1592,1525,2407 +"YPR089W",1117,1100,895,781,704,855,835,754,1244 +"YPR091C",788,745,547,298,337,870,701,686,1025 +"YNCP0013C",16,11,12,8,19,35,27,31,42 +"YNCP0014C",64,43,18,13,29,85,69,70,121 +"YNCP0015C",70,49,31,12,24,78,65,48,102 +"YPR093C",384,352,326,260,197,355,337,348,664 +"YPR094W",183,168,188,203,265,153,167,191,264 +"YPR095C",479,558,476,364,430,303,336,336,512 +"YPR096C",12,16,9,9,6,8,4,7,10 +"YPR097W",1864,1874,1534,1075,781,915,1086,1202,1991 +"YPR098C",1473,1299,851,406,175,1762,1360,1404,2214 +"YPR100W",69,80,64,49,84,281,97,111,141 +"YPR101W",361,345,329,284,410,291,331,341,509 +"YPR102C",1624,1876,2001,3724,6250,452,1018,1117,1911 +"YPR103W",3528,3306,2651,1855,1545,3405,4017,3943,5998 +"YPR104C",736,851,891,944,974,513,567,502,819 +"YPR105C",1061,1113,987,763,781,713,801,807,1250 +"YPR106W",384,351,235,151,268,277,262,279,463 +"YPR107C",335,363,289,241,316,284,319,320,468 +"YPR108W",3397,3412,2855,2275,1940,3444,3319,3097,4519 +"YPR109W",364,405,279,250,409,525,377,375,556 +"YPR110C",1004,1416,1931,3966,4296,162,605,597,1125 +"YPR111W",743,770,668,523,528,473,591,507,784 +"YPR112C",707,1086,1691,3721,3110,84,371,417,713 +"YPR113W",373,523,636,1306,1935,672,326,338,493 +"YPR114W",412,522,582,1012,926,479,383,328,517 +"YPR115W",1541,1541,1132,557,534,1344,1130,1103,1711 +"YPR116W",45,53,80,79,16,8,11,13,30 +"YPR117W",954,1044,918,723,651,570,603,590,967 +"YPR118W",1159,1407,1314,1519,1229,761,1128,1040,1486 +"YPR119W",137,147,104,108,151,438,664,308,227 +"YPR120C",264,283,236,184,428,162,187,236,406 +"YPR121W",352,349,293,261,299,312,276,264,430 +"YPR122W",1157,1179,991,1178,1270,1002,817,767,1235 +"YPR124W",189,237,288,362,346,361,172,165,293 +"YPR125W",730,1069,1783,2950,1113,466,540,532,815 +"YPR127W",3005,2671,1818,959,306,1147,730,1157,3392 +"YPR128C",1485,1396,1199,1105,1048,734,903,1076,1889 +"YPR129W",902,1004,899,803,836,906,903,727,1127 +"YPR131C",384,358,357,354,421,239,254,293,447 +"YPR132W",3543,3626,3681,5554,10411,1434,2855,3152,5675 +"YPR133C",1899,1984,1927,1891,1945,1171,1599,1673,2512 +"YPR133W-A",205,250,235,258,274,727,283,193,331 +"YPR134W",521,569,441,311,407,580,442,501,834 +"YPR135W",842,885,713,372,524,527,542,614,1079 +"YPR137W",591,922,1697,3753,2051,215,384,355,638 +"YNCP0019W",82,72,43,25,8,43,47,40,74 +"YPR138C",2588,2274,1587,1538,2356,1630,2047,1453,2520 +"YPR139C",553,671,684,793,605,366,448,500,793 +"YPR140W",627,724,702,646,604,1208,684,573,980 +"YPR141C",420,446,433,424,555,463,429,330,428 +"YPR143W",781,1054,1318,2418,3061,260,587,664,1036 +"YPR144C",360,576,1118,2211,1382,49,181,177,337 +"YPR145W",4055,5313,6899,14077,16750,741,2638,2245,4128 +"YPR145C-A",98,95,70,92,110,85,58,92,131 +"YPR147C",374,407,372,273,270,424,346,333,476 +"YPR148C",2743,2689,2144,1296,1090,2764,2371,2654,4219 +"YPR149W",41323,28085,14100,3208,859,54048,44101,40923,66810 +"YPR151C",2639,1917,984,86,94,6982,7182,4616,5354 +"YPR152C",246,281,353,443,231,154,220,225,398 +"YPR153W",85,120,129,143,94,37,40,38,80 +"YPR154W",1320,1173,1045,600,615,1001,910,799,1194 +"YPR155C",1466,1378,917,232,391,1841,1473,1318,1921 +"YPR156C",501,499,401,352,278,576,828,603,719 +"YPR157W",86,64,57,104,68,110,137,91,120 +"YPR158W",1174,980,548,78,171,768,783,942,1684 +"YPR158W-B",20,14,7,14,6,19,5,9,15 +"YPR159W",1046,1638,2209,4289,4445,599,870,737,1072 +"YPR160W",9015,6285,3226,733,175,25124,6862,9317,12504 +"YPR161C",625,732,778,938,963,357,562,507,807 +"YPR162C",372,413,383,442,439,208,199,256,401 +"YPR163C",3132,3740,4426,8747,11744,1505,2687,2387,3903 +"YPR164W",1167,1263,1151,823,297,491,609,678,1041 +"YPR165W",5069,4707,3593,3136,4010,6328,5034,4790,7574 +"YPR166C",248,252,195,181,259,963,274,264,355 +"YPR167C",876,1317,1712,3663,2065,277,554,577,995 +"YPR168W",270,322,288,338,148,106,199,203,311 +"YPR169W",1283,1605,1660,2602,2060,635,997,933,1705 +"YPR170W-B",669,679,569,614,896,898,872,839,1259 +"YPR171W",404,440,497,461,522,290,305,291,454 +"YPR172W",852,740,465,158,158,719,617,628,1095 +"YPR173C",1880,1848,1684,1654,2052,1531,1778,1794,2937 +"YPR174C",263,281,250,152,179,176,176,240,475 +"YPR175W",142,202,197,218,563,142,112,125,184 +"YPR176C",576,572,537,436,627,663,522,574,893 +"YPR178W",512,547,527,424,570,451,472,478,772 +"YPR179C",735,728,598,535,629,517,571,492,904 +"YPR180W",609,672,541,489,528,566,545,517,831 +"YPR181C",2305,2530,2400,2571,1976,2120,2106,1893,2732 +"YPR182W",465,365,301,168,213,859,897,733,1023 +"YPR183W",814,894,944,1127,1284,663,561,636,1209 +"YPR184W",2922,2308,1220,175,156,4390,2166,2372,3765 +"YPR185W",1044,934,655,307,295,947,886,819,1289 +"YPR186C",223,320,428,575,408,96,146,122,226 +"YPR187W",1153,1450,1758,3134,3794,524,1085,960,1483 +"YPR188C",552,566,527,510,545,512,522,472,798 +"YPR189W",972,1064,1044,1266,1023,586,656,620,951 +"YPR190C",423,672,1026,1904,1522,117,335,276,400 +"YPR191W",2083,2130,1861,1286,2188,3498,3289,2218,3104 +"YPR192W",938,876,532,115,179,553,688,654,1240 +"YPR193C",429,385,255,102,33,234,314,290,505 +"YPR194C",275,283,261,183,147,119,141,135,235 +"YPR195C",47,43,47,21,42,54,55,37,51 +"YPR196W",281,320,294,281,381,219,222,238,350 +"YPR198W",682,656,617,593,549,443,477,528,792 +"YPR199C",456,463,441,392,436,386,423,408,709 +"YPR200C",60,56,24,29,49,68,53,60,74 +"YPR201W",171,178,136,67,84,133,137,165,222 +"YPR202W",6,10,8,3,11,4,4,2,3 +"YPR204W",57,60,65,36,73,59,42,41,68 +"Q0020",39,24,27,19,34,52,74,43,83 +"Q0055",1,11,7,7,3,11,15,12,24 +"Q0050",3,6,2,2,7,4,17,7,12 +"Q0130",1,3,3,2,1,3,3,4,7 +"Q0158",156,148,92,98,149,195,313,188,425 diff --git a/test_data/YMC/samplesheet_RCvsOX.csv b/test_data/YMC/samplesheet_RCvsOX.csv new file mode 100644 index 00000000..9748bc2b --- /dev/null +++ b/test_data/YMC/samplesheet_RCvsOX.csv @@ -0,0 +1,10 @@ +"sample","fase" +"Time.1","RC" +"Time.2","RC" +"Time.3","OX" +"Time.4","OX" +"Time.5","OX" +"Time.13","RC" +"Time.14","RC" +"Time.15","RC" +"Time.16","RC" From 6f8d5b069424ea34ec8f24789122133ace21f19d Mon Sep 17 00:00:00 2001 From: Cristina Araiz Date: Thu, 18 Jul 2024 15:28:43 +0200 Subject: [PATCH 029/154] upload mygene module with nf-core module install --- modules.json | 20 +++ modules/nf-core/mygene/main.nf | 2 +- modules/nf-core/mygene/templates/mygene.py | 166 +++++++++++++-------- 3 files changed, 124 insertions(+), 64 deletions(-) diff --git a/modules.json b/modules.json index ff141997..d4e06ef3 100644 --- a/modules.json +++ b/modules.json @@ -60,6 +60,26 @@ "git_sha": "9326d73af3fbe2ee90d9ce0a737461a727c5118e", "installed_by": ["modules"] }, + "mygene": { + "branch": "master", + "git_sha": "82024cf6325d2ee194e7f056d841ecad2f6856e9", + "installed_by": ["modules"] + }, + "propr/grea": { + "branch": "master", + "git_sha": "71b1180a5a3de6398eb0eb4d55424cbda36f52d8", + "installed_by": ["modules"] + }, + "propr/propd": { + "branch": "master", + "git_sha": "08b360512467e8e7079f995bb7c981a7c204d00f", + "installed_by": ["modules"] + }, + "propr/propr": { + "branch": "master", + "git_sha": "c8b064f86eaa6c7ca89286bc12c0e517be0e6215", + "installed_by": ["modules"] + }, "proteus/readproteingroups": { "branch": "master", "git_sha": "a069b29783583c219c1f23ed3dcf64a5aee1340b", diff --git a/modules/nf-core/mygene/main.nf b/modules/nf-core/mygene/main.nf index 27066b71..25a21d8f 100644 --- a/modules/nf-core/mygene/main.nf +++ b/modules/nf-core/mygene/main.nf @@ -5,7 +5,7 @@ process MYGENE { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/mygene:3.2.2--pyh5e36f6f_0': - 'quay.io/biocontainers/mygene:3.2.2--pyh5e36f6f_0' }" + 'biocontainers/mygene:3.2.2--pyh5e36f6f_0' }" input: tuple val(meta), path(gene_list) diff --git a/modules/nf-core/mygene/templates/mygene.py b/modules/nf-core/mygene/templates/mygene.py index 201977a0..2717c467 100644 --- a/modules/nf-core/mygene/templates/mygene.py +++ b/modules/nf-core/mygene/templates/mygene.py @@ -23,13 +23,10 @@ class Arguments: """ Parses the argments, including the ones coming from $task.ext.args. """ + def __init__(self) -> None: self.input = "$gene_list" - self.prefix = ( - "$task.ext.prefix" - if "$task.ext.prefix" != "null" - else "$meta.id" - ) + self.prefix = "$task.ext.prefix" if "$task.ext.prefix" != "null" else "$meta.id" self.output_gmt = self.prefix + ".gmt" self.output_tsv = self.prefix + ".tsv" self.parse_ext_args("$task.ext.args") @@ -46,17 +43,49 @@ def parse_ext_args(self, args_string: str) -> None: args_list = shlex.split(args_string) # Split the string into a list of arguments parser = argparse.ArgumentParser() # input parameters - parser.add_argument('--columname', default='"gene_id"', help='Name of the column where the gene ids are stored in the input file. Default: gene_id') + parser.add_argument( + "--columname", + default="gene_id", + help="Name of the column where the gene ids are stored in the input file. Default: gene_id", + ) # filtering parameters - parser.add_argument('--species', default=None, help="Comma separated of common name of the species or taxon ids") - parser.add_argument('--go_category', default=None, help="Comma separated list of GO categories to keep. Default: all") - parser.add_argument('--go_evidence', default=None, help="Comma separated list of GO evidence codes to keep. Default: all") + parser.add_argument( + "--species", + default=None, + help="Comma separated of common name of the species or taxon ids", + ) + parser.add_argument( + "--go_category", + default=None, + help="Comma separated list of GO categories to keep. Default: all", + ) + parser.add_argument( + "--go_evidence", + default=None, + help="Comma separated list of GO evidence codes to keep. Default: all", + ) # additional parameters for querymany - parser.add_argument('--scopes', default=None, help="Comma separated list of scopes to search for.") - parser.add_argument('--entrezonly', default=False, help="When true, the query returns only the hits with valid Entrez gene ids. Default: false.") - parser.add_argument('--ensemblonly', default=False, help="When true, the query returns only the hits with valid Ensembl gene ids. Default: False") + parser.add_argument( + "--scopes", + default=None, + help="Comma separated list of scopes to search for.", + ) + parser.add_argument( + "--entrezonly", + default=False, + help="When true, the query returns only the hits with valid Entrez gene ids. Default: false.", + ) + parser.add_argument( + "--ensemblonly", + default=False, + help="When true, the query returns only the hits with valid Ensembl gene ids. Default: False", + ) # output parameters - parser.add_argument('--generate_tsv', default=False, help="Also generate a tsv file with the gene based information. Default: False") + parser.add_argument( + "--generate_tsv", + default=False, + help="Also generate a tsv file with the gene based information. Default: False", + ) args = parser.parse_args(args_list) # Convert "null" values to default values @@ -135,7 +164,17 @@ class MyGene: of the query gene. Then, it queries for the annotations, and parses the go terms all together with all the other information. """ - def __init__(self, query: list, species: str, scopes: str, entrezonly: bool, ensemblonly: bool, go_category: str = None, go_evidence: str = None) -> None: + + def __init__( + self, + query: list, + species: str, + scopes: str, + entrezonly: bool, + ensemblonly: bool, + go_category: str = None, + go_evidence: str = None, + ) -> None: self.query = query self.fields = "go,symbol,name,taxid" self.species = species @@ -158,9 +197,9 @@ def query2idmap(self) -> dict: species=self.species, entrezonly=self.entrezonly, ensemblonly=self.ensemblonly, - returnall=True + returnall=True, ) - return {dic['_id']: dic['query'] for dic in q['out'] if '_id' in dic} + return {dic["_id"]: dic["query"] for dic in q["out"] if "_id" in dic} def id2info(self) -> list: """ @@ -177,22 +216,23 @@ def parse_go_based_info(self) -> dict: """ info = {} for dic in self.id2info(): - - if 'go' not in dic: + if "go" not in dic: continue if self.go_category: - dic['go'] = {category: dic['go'][category] for category in self.go_category.split(",") if category in dic['go']} - for category, go_list in dic['go'].items(): + dic["go"] = { + category: dic["go"][category] for category in self.go_category.split(",") if category in dic["go"] + } + for category, go_list in dic["go"].items(): if not isinstance(go_list, list): go_list = [go_list] for go in go_list: - if (self.go_evidence) and (go['evidence'] not in self.go_evidence.split(",")): + if (self.go_evidence) and (go["evidence"] not in self.go_evidence.split(",")): continue - if go['id'] not in info: - info[go['id']] = [go['term'], self.idmap[dic['_id']]] + if go["id"] not in info: + info[go["id"]] = [go["term"], self.idmap[dic["_id"]]] else: - info[go['id']].append(self.idmap[dic['_id']]) + info[go["id"]].append(self.idmap[dic["_id"]]) return info def parse_gene_based_info(self) -> dict: @@ -206,30 +246,31 @@ def parse_gene_based_info(self) -> dict: """ info = {} for dic in self.id2info(): - - if 'go' not in dic: + if "go" not in dic: continue if self.go_category: - dic['go'] = {category: dic['go'][category] for category in self.go_category.split(",") if category in dic['go']} - for category, go_list in dic['go'].items(): + dic["go"] = { + category: dic["go"][category] for category in self.go_category.split(",") if category in dic["go"] + } + for category, go_list in dic["go"].items(): if not isinstance(go_list, list): go_list = [go_list] for go in go_list: - if (self.go_evidence) and (go['evidence'] not in self.go_evidence.split(",")): + if (self.go_evidence) and (go["evidence"] not in self.go_evidence.split(",")): continue current_info = { - 'query': self.idmap[dic['_id']], - 'mygene_id': dic['_id'], - 'go_id': go['id'], - 'go_term': go['term'], - 'go_evidence': go['evidence'], - 'go_category': category, - 'symbol': dic['symbol'], - 'name': dic['name'], - 'taxid': dic['taxid'] + "query": self.idmap[dic["_id"]], + "mygene_id": dic["_id"], + "go_id": go["id"], + "go_term": go["term"], + "go_evidence": go["evidence"], + "go_category": category, + "symbol": dic["symbol"], + "name": dic["name"], + "taxid": dic["taxid"], } - info[self.idmap[dic['_id']]] = current_info + info[self.idmap[dic["_id"]]] = current_info return info def parse_and_save_to_gmt(self, filename: str) -> list: @@ -239,7 +280,7 @@ def parse_and_save_to_gmt(self, filename: str) -> list: """ info = self.parse_go_based_info() info = dict(sorted(info.items(), key=lambda x: x[0])) - with open(filename, 'w') as f: + with open(filename, "w") as f: for go_id, go_list in info.items(): tmp = sorted(go_list[1:]) f.write(go_id + "\\t" + go_list[0] + "\\t" + "\\t".join(tmp) + "\\n") @@ -251,7 +292,7 @@ def parse_and_save_to_tsv(self, filename: str) -> None: The final tsv output will be sorted following the input query gene list order. """ info = self.parse_gene_based_info() - with open(filename, 'w') as f: + with open(filename, "w") as f: f.write("\\t".join(info[self.query[0]].keys()) + "\\n") for gene in self.query: # sorted by query gene list if gene in info: @@ -260,23 +301,22 @@ def parse_and_save_to_tsv(self, filename: str) -> None: def load_list(filename: str, columname: str) -> list: - """ - It loads the list of gene ids from a file. - The columname is the name of the column where the gene ids are stored. - """ - if filename.split('.')[-1] == 'tsv': - sep = "\\t" - elif filename.split('.')[-1] == 'csv': - sep = "," - else: - raise ValueError("The input file extension should be either tsv or csv.") - with open(filename, 'r') as f: - idx = f.readline().strip().split(sep).index(columname) - return [line.strip().split(sep)[idx] for line in f] + """ + It loads the list of gene ids from a file. + The columname is the name of the column where the gene ids are stored. + """ + if filename.split(".")[-1] == "tsv": + sep = "\\t" + elif filename.split(".")[-1] == "csv": + sep = "," + else: + raise ValueError("The input file extension should be either tsv or csv.") + with open(filename, "r") as f: + idx = f.readline().strip().split(sep).index(columname) + return [line.strip().split(sep)[idx] for line in f] if __name__ == "__main__": - # parse and print arguments args = Arguments() args.print_args() @@ -286,14 +326,14 @@ def load_list(filename: str, columname: str) -> list: # run mygene api mg = MyGene( - gene_list, - species=args.species, - scopes=args.scopes, - entrezonly=args.entrezonly, - ensemblonly=args.ensemblonly, - go_category=args.go_category, - go_evidence=args.go_evidence - ) + gene_list, + species=args.species, + scopes=args.scopes, + entrezonly=args.entrezonly, + ensemblonly=args.ensemblonly, + go_category=args.go_category, + go_evidence=args.go_evidence, + ) # parse annotations and save output files mg.parse_and_save_to_gmt(args.output_gmt) From 969d15ae3a189fe271d67db887674e8a2003ed89 Mon Sep 17 00:00:00 2001 From: Cristina Araiz Date: Thu, 18 Jul 2024 15:45:39 +0200 Subject: [PATCH 030/154] fix linting errors --- assets/tools_samplesheet.csv | 2 +- conf/crg.config | 30 +- conf/modules_coda.config | 2 +- main_coda.nf | 6 +- modules/local/filtervar/main.nf | 2 +- modules/local/filtervar/templates/filtervar.R | 8 +- nextflow_coda.config | 4 +- subworkflows/local/correlation/main.nf | 4 +- subworkflows/local/differential/main.nf | 4 +- subworkflows/local/enrichment/main.nf | 6 +- subworkflows/local/experimental/main.nf | 10 +- subworkflows/local/variable_selection/main.nf | 6 +- test_data/YMC/counts_sin0.csv | 5840 ----------------- test_data/YMC/samplesheet_RCvsOX.csv | 10 - 14 files changed, 42 insertions(+), 5892 deletions(-) delete mode 100644 test_data/YMC/counts_sin0.csv delete mode 100644 test_data/YMC/samplesheet_RCvsOX.csv diff --git a/assets/tools_samplesheet.csv b/assets/tools_samplesheet.csv index f6147f34..1c16d64b 100644 --- a/assets/tools_samplesheet.csv +++ b/assets/tools_samplesheet.csv @@ -3,4 +3,4 @@ diff_prop,propd, --adjacency true --permutation 100 --fixseed true, , ,,, , ,, filtered_pcor,propd, --adjacency true --permutation 100 --fixseed true, , ,propr, --permutation 10 --adjacency true --cutoff_min 0.005 --cutoff_max 0.5 --cutoff_interval 0.01 --metric pcor.bshrink, , , filtervar, prop,, , , ,propr, --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --fixseed true --metric rho --permutation 100 --adjacency true, , , , diff_grea,propd,--group_col fase --adjacency true --permutation 10,grea, --permutation 10, , , , ,, -deseq2,deseq2,,gsea,,,,,,, \ No newline at end of file +deseq2,deseq2,,gsea,,,,,,, diff --git a/conf/crg.config b/conf/crg.config index 07da3727..29d4366e 100644 --- a/conf/crg.config +++ b/conf/crg.config @@ -1,10 +1,10 @@ params { - config_profile_name = 'CRG profile' - config_profile_description = 'Configuration to run on CRG cluster' + config_profile_name = 'CRG profile' + config_profile_description = 'Configuration to run on CRG cluster' - max_cpus = 64 - max_memory = 100.GB - max_time = 48.h + max_cpus = 64 + max_memory = 100.GB + max_time = 48.h } @@ -14,18 +14,18 @@ process { //errorStrategy = params.err_start withLabel:process_low { - queue = 'cn-el7,short-centos79' - cpus = { check_max( 2 , 'cpus' ) } - memory = { check_max( 12.GB * task.attempt, 'memory' ) } - time = { check_max( 4.h * task.attempt, 'time' ) } + queue = 'cn-el7,short-centos79' + cpus = { check_max( 2 , 'cpus' ) } + memory = { check_max( 12.GB * task.attempt, 'memory' ) } + time = { check_max( 4.h * task.attempt, 'time' ) } } withLabel:process_medium{ - queue = 'cn-el7,short-centos79' - cpus = { check_max( 6 , 'cpus' ) } - memory = { check_max( 36.GB * task.attempt, 'memory' ) } - time = { check_max( 8.h * task.attempt, 'time' ) } + queue = 'cn-el7,short-centos79' + cpus = { check_max( 6 , 'cpus' ) } + memory = { check_max( 36.GB * task.attempt, 'memory' ) } + time = { check_max( 8.h * task.attempt, 'time' ) } } - withLabel:process_high { + withLabel:process_high { queue = 'cn-el7,long-centos79' cpus = { check_max( 12 , 'cpus' ) } memory = { check_max( 56.GB * task.attempt, 'memory' ) } @@ -38,4 +38,4 @@ process { singularity { enabled = true cacheDir = 'singularity_cache' -} \ No newline at end of file +} diff --git a/conf/modules_coda.config b/conf/modules_coda.config index a783c00e..44d272e4 100644 --- a/conf/modules_coda.config +++ b/conf/modules_coda.config @@ -42,4 +42,4 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } -} \ No newline at end of file +} diff --git a/main_coda.nf b/main_coda.nf index 6a62390e..ca9043bc 100644 --- a/main_coda.nf +++ b/main_coda.nf @@ -1,7 +1,7 @@ // include { PROPR_PROPR } from '../../../modules/nf-core/propr/propr/main' // include { PROPR_PROPD } from '../../../modules/nf-core/propr/propd/main' // include { PROPR_GREA } from '../../../modules/nf-core/propr/grea/main' -// include { MYGENE } from '../../../modules/nf-core/mygene/main' +// include { MYGENE } from '../../../modules/nf-core/mygene/main' include { EXPERIMENTAL } from './subworkflows/experimental/main.nf' include { fromSamplesheet } from 'plugin/nf-validation' @@ -11,11 +11,11 @@ include { fromSamplesheet } from 'plugin/nf-validation' Counts_ch = Channel.fromPath("../YMC/counts_sin0.csv") Sample_ch = Channel.fromPath("../YMC/samplesheet_RCvsOX.csv") - .map{ it -> [[id: 'YMC'], it]} + .map{ it -> [[id: 'YMC'], it]} ch_samples_and_matrix = Sample_ch.combine(Counts_ch) -// Convert the samplesheet.csv in a channel with the proper format +// Convert the samplesheet.csv in a channel with the proper format ch_tools = Channel.fromSamplesheet('tools') diff --git a/modules/local/filtervar/main.nf b/modules/local/filtervar/main.nf index bf8e3ae2..5d9c39c8 100644 --- a/modules/local/filtervar/main.nf +++ b/modules/local/filtervar/main.nf @@ -20,4 +20,4 @@ process FILTERVAR { script: template 'filtervar.R' -} \ No newline at end of file +} diff --git a/modules/local/filtervar/templates/filtervar.R b/modules/local/filtervar/templates/filtervar.R index cf5159c9..7b662626 100644 --- a/modules/local/filtervar/templates/filtervar.R +++ b/modules/local/filtervar/templates/filtervar.R @@ -189,23 +189,23 @@ A\$per_gene <- per_gene_connection A <- A[order(A\$per_gene, decreasing = TRUE),] -# Define selection criteria +# Define selection criteria max_gene_number <- ncol(count)*10 # 10x samples for technical reasons (pcor) -#Calculate connection threshold +#Calculate connection threshold total_connections <- sum(per_gene_connection)/2 # 2 because the matrix is symmetric possible_connections <- nrow(count)*(nrow(count)-1)/2 percentage_expected <- total_connections/possible_connections connection_threshold <- percentage_expected * nrow(count) -# Filter count matrix according to selected genes +# Filter count matrix according to selected genes col_genes <- which(names(count) == opt\$features_id_col) if (opt\$filterVar == 'yes'){ - # select only differentially proportional genes + # select only differentially proportional genes top_genes <- rownames(A[which(A\$per_gene > connection_threshold),]) count_filtered <- count[count[,col_genes] %in% top_genes,] warning("non differentially proportional genes were removed before correlation analysis") diff --git a/nextflow_coda.config b/nextflow_coda.config index 3ed7f425..23d475f4 100644 --- a/nextflow_coda.config +++ b/nextflow_coda.config @@ -6,7 +6,7 @@ params.validationSkipDuplicateCheck = true params.publish_dir_mode = 'copy' params.pathway = 'all' //params.maxRetries = 0 -includeConfig 'conf/modules.config' // now it should refer to modules_coda.config +includeConfig 'conf/modules.config' // now it should refer to modules_coda.config @@ -52,4 +52,4 @@ def check_max(obj, type) { return obj } } -} \ No newline at end of file +} diff --git a/subworkflows/local/correlation/main.nf b/subworkflows/local/correlation/main.nf index 5aaad2e2..5bcaa808 100644 --- a/subworkflows/local/correlation/main.nf +++ b/subworkflows/local/correlation/main.nf @@ -22,7 +22,7 @@ workflow CORRELATION { .set { ch_counts_cor } // Hacer un branch del channel para coger las counts normales cuando no hay variable selection - + ch_counts_cor.propr .branch{ no_sel: it[0]["sel_method"] == null @@ -45,4 +45,4 @@ workflow CORRELATION { matrix = ch_matrix adjacency = ch_adjacency -} \ No newline at end of file +} diff --git a/subworkflows/local/differential/main.nf b/subworkflows/local/differential/main.nf index 15948b9c..ccea968a 100644 --- a/subworkflows/local/differential/main.nf +++ b/subworkflows/local/differential/main.nf @@ -21,7 +21,7 @@ workflow DIFFERENTIAL { deseq2: it[0]["diff_method"] == "deseq2" } .set { ch_counts_tools } - + PROPD(ch_counts_tools.propd, ch_samplesheet) ch_results = PROPD.out.results ch_adjacency = PROPD.out.adj @@ -30,4 +30,4 @@ workflow DIFFERENTIAL { results = ch_results adjacency = ch_adjacency -} \ No newline at end of file +} diff --git a/subworkflows/local/enrichment/main.nf b/subworkflows/local/enrichment/main.nf index 442014a3..b19f96fc 100644 --- a/subworkflows/local/enrichment/main.nf +++ b/subworkflows/local/enrichment/main.nf @@ -8,8 +8,8 @@ include { MYGENE } from "../../modules/nf-core/mygene/main.nf" workflow ENRICHMENT { take: ch_diff_adjacency - ch_cor_adjacency - ch_counts + ch_cor_adjacency + ch_counts main: @@ -43,4 +43,4 @@ workflow ENRICHMENT { emit: enriched_diff = ch_enriched_diff enriched_cor = ch_enriched_cor -} \ No newline at end of file +} diff --git a/subworkflows/local/experimental/main.nf b/subworkflows/local/experimental/main.nf index 6e26eb6d..62d51241 100644 --- a/subworkflows/local/experimental/main.nf +++ b/subworkflows/local/experimental/main.nf @@ -37,7 +37,7 @@ workflow EXPERIMENTAL { } .set { ch_counts_tools } - // Perform CODA analysis + // Perform CODA analysis ch_out = Channel.empty() // Perform differential analysis @@ -48,10 +48,10 @@ workflow EXPERIMENTAL { // Perform variable selection ch_counts_filtered = VARIABLE_SELECTION(ch_diff_adjacency, ch_counts) - + //VARIABLE_SELECTION.out.count.view() - // Perform correlation analysis + // Perform correlation analysis CORRELATION(ch_counts, ch_tools, ch_counts_filtered) ch_matrix = CORRELATION.out.matrix ch_cor_adjacency = CORRELATION.out.adjacency @@ -59,14 +59,14 @@ workflow EXPERIMENTAL { //ch_diff_adjacency.view() //ch_cor_adjacency.view() - + // Perform enrichment analysis ENRICHMENT(ch_diff_adjacency, ch_cor_adjacency, ch_counts) ch_enriched_cor = ENRICHMENT.out.enriched_cor ch_enriched_diff = ENRICHMENT.out.enriched_diff ch_out.mix(ch_enriched_diff, ch_enriched_cor) - + emit: output = ch_out diff --git a/subworkflows/local/variable_selection/main.nf b/subworkflows/local/variable_selection/main.nf index d7a176c8..f914473c 100644 --- a/subworkflows/local/variable_selection/main.nf +++ b/subworkflows/local/variable_selection/main.nf @@ -16,7 +16,7 @@ workflow VARIABLE_SELECTION { .combine(ch_adj) //.view() .map{ - counts, meta, adj -> + counts, meta, adj -> [ meta, counts, adj] } //.view() @@ -34,7 +34,7 @@ workflow VARIABLE_SELECTION { ch_counts_cor = FILTERVAR.out.count //ch_counts_cor.view() - + emit: count = ch_counts_cor -} \ No newline at end of file +} diff --git a/test_data/YMC/counts_sin0.csv b/test_data/YMC/counts_sin0.csv deleted file mode 100644 index 58ea62af..00000000 --- a/test_data/YMC/counts_sin0.csv +++ /dev/null @@ -1,5840 +0,0 @@ -"gene_id","Time.1","Time.2","Time.3","Time.4","Time.5","Time.13","Time.14","Time.15","Time.16" -"YAL068C",57,52,82,93,66,12,33,34,52 -"YAL063C",82,94,62,69,99,99,64,72,105 -"YAL062W",2280,2753,2819,2270,1033,2942,1535,2444,4300 -"YAL061W",2970,2391,1049,64,170,4379,2215,2849,4953 -"YAL060W",2354,1727,1039,378,578,5618,2218,2790,4385 -"YAL059W",339,534,832,1966,2627,51,185,189,360 -"YAL058W",362,459,447,574,546,229,266,279,491 -"YAL056W",1440,1269,894,233,393,1094,1083,1122,1763 -"YAL055W",266,305,255,61,108,190,246,277,477 -"YAL054C",27781,19019,8956,842,151,65763,49692,34469,45068 -"YAL053W",2027,2120,2779,3995,1796,963,1298,1864,2887 -"YAL051W",738,774,529,417,516,471,515,590,849 -"YAL049C",1752,1677,1138,592,382,1650,1602,1692,2793 -"YAL048C",594,557,428,361,305,434,393,401,619 -"YAL047C",361,393,343,276,335,195,225,222,341 -"YAL046C",212,223,211,170,207,377,201,221,344 -"YAL044W-A",543,477,401,403,350,566,570,599,895 -"YAL044C",1313,1345,1376,1512,1792,1237,1033,1109,1959 -"YAL043C",662,765,740,610,608,421,524,478,781 -"YAL042W",1402,1561,1514,1458,1497,1612,1611,1525,2301 -"YAL041W",874,1009,931,806,780,569,603,541,939 -"YAL040C",461,496,781,1188,1398,268,354,485,527 -"YAL039C",597,784,1003,891,658,1037,770,694,1154 -"YAL038W",58112,51535,41160,35725,15242,7632,8910,23994,59573 -"YAL037C-A",17,15,10,6,9,3,2,7,16 -"YAL037W",136,135,103,97,123,92,104,132,188 -"YAL036C",585,819,1099,2182,1675,86,371,381,651 -"YAL035W",3563,4130,4675,7945,6950,2337,3169,2701,4412 -"YAL034W-A",189,173,127,128,290,218,182,147,226 -"YAL034C",1341,1171,699,345,283,945,912,906,1595 -"YAL033W",148,157,186,238,434,150,148,137,241 -"YAL032C",365,410,408,281,374,531,506,417,632 -"YAL031C",584,509,439,278,434,432,419,392,628 -"YAL030W",686,630,442,216,153,662,613,618,1098 -"YAL029C",784,1113,1433,2741,957,506,615,538,774 -"YAL028W",307,292,174,43,34,287,244,254,388 -"YAL027W",457,449,256,106,267,611,522,515,690 -"YAL026C",924,1013,1035,1041,887,589,659,586,1017 -"YNCA0001W",3,5,3,8,6,2,2,2,2 -"YAL025C",594,1044,2169,5174,3574,39,286,273,530 -"YAL024C",281,311,342,393,397,170,232,172,241 -"YAL023C",1330,1558,1528,2354,2915,1130,1206,1067,1590 -"YAL022C",586,667,687,756,872,518,617,581,812 -"YAL021C",1123,1192,1026,1191,1137,809,948,806,1318 -"YAL020C",224,220,254,256,256,205,192,225,394 -"YAL019W",610,799,1044,1726,1689,175,292,266,525 -"YAL018C",53,49,49,34,44,38,30,35,73 -"YAL017W",1716,1423,967,212,299,1823,1233,1198,2090 -"YAL016W",3105,2860,2027,1115,1273,2640,2398,2550,3939 -"YAL015C",384,440,423,525,425,672,341,326,520 -"YAL014C",485,486,486,408,373,399,451,448,714 -"YAL013W",522,532,514,478,603,469,544,503,828 -"YAL012W",1420,2450,4168,10720,7247,527,834,742,1259 -"YAL011W",438,392,392,367,451,299,391,328,528 -"YAL010C",512,491,465,303,178,305,373,351,540 -"YAL009W",434,416,380,297,336,288,348,332,619 -"YAL008W",1069,952,631,323,232,1182,834,908,1585 -"YAL007C",403,451,445,469,530,362,384,348,528 -"YAL005C",39259,28272,16583,3934,2053,32018,23096,25421,47879 -"YAL003W",6226,6713,6934,10417,11213,1064,2494,2881,6539 -"YNCA0003W",28,22,28,40,30,2,11,9,33 -"YAL002W",862,914,757,563,520,453,508,493,847 -"YAL001C",1160,1147,944,515,621,950,841,877,1373 -"YAR002W",553,606,721,1095,883,320,423,467,696 -"YAR002C-A",1296,1328,1228,1305,1661,1263,982,1027,1821 -"YAR003W",391,369,347,338,550,317,299,319,484 -"YAR007C",1489,1606,1312,665,1118,1083,1052,1353,1918 -"YAR008W",192,281,273,215,398,152,153,242,249 -"YAR009C",2,3,3,2,1,2,2,1,3 -"YAR014C",1140,1171,1212,1528,2111,840,873,821,1354 -"YAR015W",1406,1807,2073,4611,4758,783,683,885,1518 -"YAR018C",161,162,214,248,162,236,593,362,298 -"YAR019C",356,376,315,271,277,265,253,222,359 -"YAR020C",43,43,28,11,21,46,25,25,63 -"YAR023C",110,114,75,38,65,89,62,77,162 -"YAR027W",800,652,445,293,373,771,702,802,1329 -"YAR028W",88,100,95,144,86,93,89,84,133 -"YAR029W",9,6,2,8,15,11,14,15,14 -"YAR031W",60,53,24,19,52,50,41,54,84 -"YAR033W",39,27,28,24,29,36,19,20,50 -"YAR035W",1012,721,516,232,320,3248,3775,1985,2524 -"YAR035C-A",13,7,4,5,5,21,29,14,18 -"YAR042W",1108,1029,1048,868,508,974,932,939,1385 -"YAR050W",76,64,41,19,97,76,78,101,123 -"YAR068W",9,6,10,14,19,3,4,6,10 -"YAR071W",39,42,42,23,29,24,35,40,50 -"YBL113C",294,322,327,194,379,277,239,262,404 -"YBL107C",565,650,591,568,644,966,545,471,788 -"YBL106C",601,675,573,400,315,527,561,478,738 -"YBL105C",1592,1711,1382,1066,1112,1008,1024,1131,1617 -"YBL104C",565,708,671,652,503,335,470,418,660 -"YBL103C",754,766,688,625,675,394,596,611,894 -"YBL102W",1092,1002,700,412,731,1334,1176,1239,1851 -"YBL101C",1820,1870,1454,658,483,895,1011,1053,1650 -"YBL100W-C",20,26,14,8,8,11,8,6,22 -"YBL100W-B",68,75,80,70,35,56,38,49,54 -"YBL099W",7753,7604,5782,4330,6259,13973,11072,9175,11914 -"YBL098W",1161,991,817,681,832,1137,1182,1317,1772 -"YBL097W",260,300,336,409,274,119,186,133,198 -"YBL095W",386,425,386,345,274,680,405,344,588 -"YBL093C",660,921,1528,2287,853,318,364,484,902 -"YBL092W",5976,6726,7267,12014,21385,1810,4469,4847,8498 -"YBL091C-A",186,204,151,105,99,242,202,194,319 -"YBL091C",662,652,682,712,514,622,648,567,1081 -"YBL090W",325,432,396,405,445,1254,419,352,567 -"YBL089W",310,403,352,337,378,285,307,266,463 -"YBL088C",1324,1350,1146,759,553,713,691,746,1262 -"YBL087C",1222,1664,2036,3500,6142,422,867,982,1842 -"YBL086C",545,437,326,108,127,561,393,443,742 -"YBL085W",742,847,762,538,783,882,714,642,949 -"YBL084C",725,724,592,515,667,690,671,603,891 -"YBL082C",237,312,392,610,526,226,219,194,293 -"YBL081W",132,239,553,1565,1104,47,109,79,94 -"YBL080C",301,324,250,146,135,939,338,319,476 -"YBL079W",1290,1621,1629,2243,2033,841,875,732,1158 -"YBL078C",1235,1111,670,177,156,1304,1177,1106,1988 -"YBL076C",4574,5141,5455,9294,10336,1577,2613,2695,4487 -"YBL075C",63397,44458,24068,5006,681,10390,25176,33960,76517 -"YBL074C",197,176,149,212,130,97,122,147,266 -"YBL072C",2289,2630,2623,3925,6868,827,1561,1709,3212 -"YBL071C-B",4,3,1,6,6,3,4,3,7 -"YBL071W-A",183,267,383,728,440,73,103,149,254 -"YBL071C",102,129,212,387,286,43,61,66,135 -"YBL069W",199,275,420,1286,484,128,160,152,224 -"YBL068W",400,573,714,1071,1299,139,288,268,464 -"YBL067C",3191,3187,2219,1065,899,2359,2384,2366,3622 -"YBL066C",710,728,689,660,780,678,705,539,700 -"YBL064C",5724,4390,2749,1042,605,6591,5216,5884,9855 -"YBL063W",418,442,409,334,340,506,407,329,460 -"YBL061C",445,554,640,1054,1236,240,370,328,473 -"YBL060W",544,607,431,375,514,459,376,401,662 -"YBL059C-A",352,339,287,229,325,1166,394,332,427 -"YBL059W",190,232,160,144,179,305,207,210,305 -"YBL058W",2894,2537,2032,1124,1187,2988,2809,2620,4145 -"YBL057C",405,475,446,464,474,375,367,380,612 -"YBL056W",2233,2204,1706,1547,1856,2703,2332,2120,3318 -"YBL055C",442,518,552,1017,824,494,378,371,583 -"YBL054W",418,588,938,1842,1507,134,195,202,453 -"YBL052C",768,803,735,637,520,668,747,568,921 -"YBL051C",1058,1185,1087,1273,1200,759,954,850,1102 -"YBL050W",1332,1258,868,572,942,1333,1246,1366,2033 -"YBL049W",1641,1486,969,670,418,1041,860,1325,2436 -"YBL048W",579,494,359,210,188,398,311,441,761 -"YBL047C",3682,3519,2573,1333,1120,4036,2992,2878,4136 -"YBL046W",507,449,540,582,676,356,457,455,707 -"YBL045C",6974,6367,4703,2984,5475,14818,11652,9445,11245 -"YBL044W",4,2,3,3,1,3,3,2,3 -"YBL043W",535,493,516,298,1798,315,791,700,991 -"YBL042C",1341,2008,3831,6389,3437,330,1027,884,1382 -"YBL041W",2451,2440,2142,1738,1420,2431,2735,2594,4065 -"YBL040C",636,727,566,500,881,721,650,681,1144 -"YBL039W-B",259,266,161,65,25,280,268,247,440 -"YBL039C",730,1546,3177,8847,6349,44,277,298,628 -"YBL038W",498,619,521,404,638,1280,631,471,764 -"YBL037W",561,638,528,303,320,512,511,407,589 -"YBL036C",682,777,807,928,1012,335,472,520,878 -"YBL035C",332,403,408,300,542,180,200,249,427 -"YBL034C",677,644,596,494,588,389,424,427,698 -"YBL033C",1007,1092,1523,1283,974,889,1181,1156,1735 -"YBL032W",497,511,450,462,582,716,589,477,575 -"YBL031W",91,108,105,93,82,99,98,65,102 -"YBL030C",5432,5919,5542,5272,9715,11038,6188,4945,6545 -"YBL029C-A",443,409,263,138,186,409,447,509,784 -"YBL029W",420,474,387,383,430,298,309,305,662 -"YBL028C",382,579,887,2016,2035,33,152,206,386 -"YBL027W",8082,8372,8984,13622,20029,2265,5201,5868,10786 -"YBL026W",587,603,578,647,771,498,493,500,749 -"YBL025W",206,220,213,175,187,125,166,172,280 -"YBL024W",821,1174,1495,3007,2739,222,493,471,897 -"YBL023C",672,672,735,821,1274,311,508,520,747 -"YBL022C",3321,3315,2772,1874,1606,5532,2647,2313,3582 -"YBL021C",257,261,256,272,505,341,333,278,433 -"YBL020W",635,815,772,905,799,362,416,456,720 -"YBL019W",467,481,386,297,317,360,385,398,615 -"YBL018C",333,336,357,379,386,209,213,316,511 -"YBL017C",2107,2075,1742,1516,1387,1755,1260,1394,2162 -"YBL016W",361,525,628,1032,1379,321,222,249,463 -"YBL015W",2064,2061,1743,796,1563,5749,3214,2461,3064 -"YBL014C",543,622,649,1014,640,275,376,414,559 -"YBL013W",73,81,59,51,35,82,88,78,101 -"YBL011W",695,719,681,805,846,1036,742,551,810 -"YBL010C",198,233,234,188,287,142,192,153,279 -"YBL009W",428,552,575,677,905,450,408,351,482 -"YBL008W-A",4,5,2,2,5,2,3,2,8 -"YBL008W",409,504,489,572,597,310,275,252,431 -"YBL007C",2902,2579,1865,1144,1116,2598,2284,2236,3442 -"YBL006C",515,559,495,412,592,364,445,505,831 -"YBL005W",446,556,485,447,419,286,287,272,475 -"YBL004W",1215,1790,2261,4983,5563,289,672,624,1163 -"YBL003C",588,715,559,502,853,2360,882,543,885 -"YBL002W",838,982,1137,1739,2317,3692,1260,555,852 -"YBL001C",3406,2865,2061,1436,1035,2721,2704,3221,5361 -"YBR001C",1446,1236,784,212,621,1537,1114,1113,1722 -"YBR002C",274,381,426,653,530,199,276,250,426 -"YBR003W",422,418,307,166,188,1040,404,405,549 -"YBR004C",288,376,466,542,643,165,197,186,327 -"YBR005W",524,568,351,264,314,422,440,501,849 -"YBR006W",1653,1460,1103,402,158,1311,1064,1264,2252 -"YBR007C",172,268,333,461,638,112,105,118,179 -"YBR008C",758,1113,1096,482,289,243,289,345,752 -"YBR009C",3256,2976,2349,1725,1616,7163,4415,3298,5180 -"YBR010W",2358,2115,1767,1787,2590,5335,3302,2617,3914 -"YBR011C",4914,4942,4541,4900,4373,3396,2959,3437,5950 -"YBR013C",95,101,76,39,60,90,70,68,129 -"YBR014C",583,579,508,455,603,634,496,529,910 -"YBR015C",1535,1737,1567,1890,1917,1035,1101,1069,1832 -"YBR016W",579,585,530,369,617,729,721,556,805 -"YBR017C",1010,1153,1326,1891,1928,501,746,747,1194 -"YBR018C",66,61,33,2,8,46,42,59,103 -"YBR019C",40,32,29,10,11,33,28,41,63 -"YNCB0008W",58,47,50,35,32,39,37,41,53 -"YBR021W",324,545,945,1860,2363,129,229,184,337 -"YBR022W",337,408,345,360,398,368,245,289,440 -"YBR023C",1220,1558,1520,2082,2649,617,934,971,1520 -"YBR024W",395,409,317,141,72,922,387,370,541 -"YBR025C",6537,6368,5853,6980,7678,2982,3592,4187,8632 -"YBR026C",13543,11243,7855,3764,619,10569,11642,11766,18300 -"YBR027C",37,39,32,29,18,29,37,31,35 -"YBR028C",478,566,636,934,740,410,346,298,478 -"YBR029C",1624,1803,1969,2722,2827,1713,2482,1759,2148 -"YBR030W",319,398,479,588,487,132,259,267,385 -"YBR031W",861,1205,1563,2934,3696,322,755,576,1109 -"YBR032W",14,14,3,11,31,10,13,13,14 -"YBR033W",400,401,295,217,588,372,325,283,474 -"YBR034C",605,1146,2923,6179,2233,157,372,403,664 -"YBR035C",1484,1459,1209,1122,1236,1481,1363,1441,2183 -"YNCB0010W",333,333,331,378,587,689,374,408,546 -"YBR036C",2178,1971,1693,1610,2303,2405,2091,2149,3308 -"YBR037C",237,241,198,86,149,1292,321,294,363 -"YBR038W",241,313,242,190,118,1324,1870,1066,636 -"YBR039W",3776,3803,3095,2548,3248,5927,4742,4130,5834 -"YBR040W",28,16,20,24,31,33,14,19,37 -"YBR041W",598,614,442,398,614,507,453,448,694 -"YBR042C",354,431,514,672,426,265,263,267,400 -"YBR043C",1538,1709,1332,871,579,1373,1413,1269,1925 -"YBR044C",456,440,370,256,356,1096,515,397,571 -"YBR045C",1045,541,246,86,271,1011,1070,1071,1616 -"YBR046C",5817,4754,3010,1214,1016,2997,3649,4445,7647 -"YBR047W",905,838,520,205,244,326,526,737,1362 -"YBR048W",2030,2427,2775,4420,6541,686,1285,1238,2219 -"YBR049C",1455,1466,1239,968,1230,1734,1697,1236,1684 -"YBR050C",254,251,136,65,161,620,474,362,524 -"YBR052C",804,771,617,437,451,1750,1064,1128,1637 -"YBR053C",1967,1704,1093,305,163,2260,1773,2020,3131 -"YBR054W",30851,23564,13500,5214,1032,4433,4830,12544,36015 -"YBR055C",660,709,718,947,1093,314,380,389,637 -"YBR056W",3023,2554,1542,309,104,2454,1952,2395,4171 -"YBR056W-A",192,153,152,126,273,176,185,193,354 -"YBR057C",1154,1061,1030,880,596,982,949,965,1502 -"YBR058C",1275,1294,1134,1106,1293,1011,1099,1042,1719 -"YBR058C-A",1083,1035,945,755,954,791,861,1045,1643 -"YBR059C",1580,1535,1092,464,456,1244,1077,1114,1633 -"YBR060C",402,526,505,578,521,255,310,330,437 -"YBR061C",375,507,640,1252,1401,156,258,243,414 -"YBR062C",979,944,655,453,472,979,978,948,1522 -"YBR063C",574,631,731,1033,700,258,358,383,651 -"YBR065C",424,495,668,982,399,126,196,245,385 -"YBR066C",358,506,359,255,927,253,174,265,426 -"YBR067C",65719,50360,38714,21346,8746,75249,105452,72701,97418 -"YBR068C",3444,3395,5146,4784,3113,3585,3762,3124,4584 -"YNCB0014W",11,18,14,29,18,4,3,3,12 -"YBR070C",234,224,179,100,251,238,193,282,373 -"YBR071W",1172,1076,812,252,544,1078,1099,2547,2333 -"YBR072W",253833,163101,80247,12808,1027,124016,161416,183996,352923 -"YBR072C-A",16,17,10,3,1,6,12,19,36 -"YBR073W",1055,1194,1087,850,1395,857,720,704,1079 -"YBR074W",970,1121,1171,1654,1705,400,534,587,917 -"YBR076W",135,112,65,27,28,167,111,158,223 -"YBR077C",493,508,456,331,323,404,463,536,745 -"YBR078W",4708,7001,8653,15844,17087,6251,5364,4441,4564 -"YBR079C",2125,2771,3502,6833,6364,796,1448,1251,2160 -"YBR080C",997,1142,972,859,1040,729,724,747,1187 -"YBR081C",1674,1742,1495,1067,1015,1178,1272,1158,1738 -"YBR082C",2846,3037,3450,4576,4255,2696,2225,2270,3939 -"YBR083W",920,945,847,607,1599,1783,1025,815,1073 -"YBR084W",994,1734,3036,8133,6841,231,423,523,846 -"YBR084C-A",5770,6303,6582,10543,14327,1605,3725,4041,7457 -"YBR085W",11,12,35,95,25,19,15,20,26 -"YBR085C-A",6305,4535,2714,1179,621,7396,4702,5677,9893 -"YBR086C",3482,3395,2448,1959,1461,2650,2293,2146,3675 -"YBR087W",435,501,411,477,609,232,275,349,525 -"YBR088C",418,490,508,303,893,299,285,420,659 -"YBR089C-A",637,544,392,264,267,1488,1267,919,1231 -"YBR090C",37,19,13,23,13,37,54,23,35 -"YBR091C",93,126,138,187,242,133,112,92,152 -"YBR092C",191,164,180,95,108,190,141,155,275 -"YBR093C",57,51,54,39,34,52,47,52,81 -"YBR094W",1392,1449,1091,592,462,865,837,941,1549 -"YBR095C",668,637,590,510,630,374,452,432,798 -"YBR096W",381,388,311,291,569,461,375,384,551 -"YBR097W",891,825,698,262,116,408,467,512,793 -"YBR098W",649,598,441,187,421,782,676,630,964 -"YBR101C",4270,3717,2116,811,1326,2468,2788,3527,6870 -"YBR102C",680,788,652,614,448,352,423,419,651 -"YBR103W",748,826,690,473,407,808,752,685,1126 -"YBR104W",226,327,546,940,640,35,103,130,261 -"YBR105C",275,762,3007,4207,486,74,98,150,281 -"YBR106W",2298,2996,3942,6863,6114,1369,2011,1994,3220 -"YBR107C",177,210,203,143,161,168,198,182,292 -"YBR108W",764,796,510,167,202,722,637,572,884 -"YBR109C",2353,2208,1651,1314,1353,2450,2327,2500,4057 -"YBR110W",724,843,765,636,447,537,541,537,950 -"YBR111C",1710,1612,1177,861,606,1932,1625,1683,2882 -"YBR111W-A",512,508,356,299,329,320,344,431,642 -"YBR112C",1689,1605,1656,1784,1442,2308,1766,1396,2020 -"YBR114W",422,557,1226,2080,331,174,174,218,432 -"YBR115C",2971,3899,4177,7072,6970,519,1053,1353,2563 -"YBR117C",11877,7622,3623,589,78,7683,5734,8163,18182 -"YBR118W",10103,8292,6973,7137,7346,4034,7334,8123,16158 -"YBR119W",983,872,595,390,622,671,736,853,1337 -"YBR120C",255,246,198,140,256,1201,313,285,341 -"YBR121C",3741,4615,4949,8423,10818,2898,3306,2941,4521 -"YBR122C",511,545,461,458,611,1900,644,513,758 -"YBR123C",438,480,439,282,272,432,421,298,495 -"YBR125C",542,543,632,561,493,587,592,540,891 -"YBR126C",5160,3836,1841,194,438,7324,4269,4801,7897 -"YBR126W-A",746,541,331,159,212,1647,1051,1120,1752 -"YBR127C",5442,5160,4679,4984,3819,4202,4117,4219,7457 -"YBR128C",341,274,185,26,31,262,246,296,460 -"YBR129C",584,621,458,440,575,413,508,493,825 -"YBR130C",181,262,258,323,375,214,214,162,226 -"YBR131W",270,346,320,307,274,101,142,160,275 -"YBR132C",546,506,299,33,134,892,534,452,571 -"YBR133C",585,750,641,582,834,538,582,492,728 -"YBR135W",385,420,413,395,525,466,467,452,682 -"YBR136W",713,779,612,461,451,546,450,452,711 -"YBR137W",702,587,484,263,216,990,774,678,1179 -"YBR138C",344,329,237,135,176,522,575,339,445 -"YBR139W",2462,2039,1169,228,277,2297,1838,1980,3055 -"YBR140C",3038,2857,2077,1293,1090,1943,1930,1956,3263 -"YBR141C",157,244,457,790,299,63,108,111,195 -"YBR142W",644,991,1944,5574,3368,119,278,316,513 -"YBR143C",2356,3132,3583,6782,8956,1185,2059,1997,2893 -"YBR145W",442,335,250,205,254,443,418,452,738 -"YBR146W",799,956,919,837,958,4780,1006,813,1046 -"YBR147W",982,1011,675,301,577,400,628,706,1230 -"YBR148W",201,165,95,83,160,240,197,182,284 -"YBR149W",8442,6670,4362,1612,540,14098,10683,9316,13504 -"YBR150C",771,749,547,335,581,474,688,541,794 -"YBR151W",1263,1140,757,475,943,2147,1381,1410,1980 -"YBR152W",186,239,267,250,234,154,119,125,196 -"YBR153W",267,330,388,477,382,255,240,237,361 -"YBR154C",693,950,1294,2947,2591,221,598,511,802 -"YBR155W",416,699,1190,2529,1080,92,180,213,446 -"YBR156C",140,159,156,190,192,181,152,110,187 -"YBR157C",1950,2159,2376,804,834,1725,1437,1378,2133 -"YBR158W",1451,1042,977,1783,1393,795,1528,4371,4168 -"YBR159W",1220,1327,1201,1076,1122,1560,1331,1323,1874 -"YBR160W",546,584,584,638,820,558,529,518,730 -"YBR161W",339,351,273,208,177,209,219,304,508 -"YBR162C",2329,2045,2007,3002,5960,3157,3350,3741,4486 -"YBR162W-A",381,441,436,531,931,393,424,470,658 -"YBR163W",491,512,524,521,635,387,400,378,576 -"YBR164C",605,671,642,714,908,487,572,616,817 -"YBR165W",343,401,305,340,442,282,374,348,533 -"YBR166C",738,883,892,941,953,406,598,586,910 -"YBR167C",367,417,333,257,309,504,497,378,522 -"YBR168W",572,593,423,259,262,1013,785,614,860 -"YBR169C",11190,8337,4561,788,253,5815,4885,6634,15074 -"YBR170C",1202,1351,1005,597,590,862,859,883,1493 -"YBR171W",614,666,672,805,910,470,613,492,842 -"YBR172C",645,784,1135,1927,2073,364,600,503,653 -"YBR173C",1938,1759,1511,1160,1079,1642,2134,1960,2872 -"YBR175W",228,241,340,436,327,112,144,168,285 -"YBR176W",267,273,261,223,282,345,245,246,373 -"YBR177C",1889,1669,1372,1190,1251,2457,2464,2098,2767 -"YBR179C",1159,1290,1058,721,986,1674,1014,931,1416 -"YBR180W",66,62,69,75,58,20,26,34,73 -"YBR181C",2369,2654,2828,4817,7182,688,1518,1776,3249 -"YBR182C",155,213,222,349,435,101,149,157,244 -"YBR182C-A",5,4,7,15,26,9,9,8,6 -"YBR183W",426,338,211,55,122,970,611,528,655 -"YBR184W",111,114,126,161,94,82,66,62,110 -"YBR185C",329,366,350,286,454,1660,408,301,447 -"YBR186W",133,155,119,106,80,54,87,75,165 -"YBR187W",760,907,1116,1726,1341,406,536,643,1025 -"YBR188C",340,354,298,256,292,224,252,294,490 -"YBR189W",4804,5890,6588,13011,21551,1157,3281,3397,6137 -"YBR191W",3667,4426,5004,9171,15601,807,2438,2494,4989 -"YBR192W",341,421,431,526,527,300,232,249,386 -"YBR193C",412,423,355,283,226,215,264,300,475 -"YBR194W",142,150,129,113,167,154,128,122,221 -"YBR195C",439,571,545,654,757,223,340,409,543 -"YBR196C",20565,16998,12334,9078,4583,8589,9623,14964,26331 -"YBR196C-A",8,6,6,3,8,1,4,10,5 -"YBR196C-B",11,8,7,7,11,3,8,6,13 -"YBR197C",234,318,276,292,201,117,156,184,283 -"YBR198C",981,969,1016,1109,1020,616,835,702,1168 -"YBR199W",2273,2157,1646,1189,1595,1574,1651,1795,2851 -"YBR200W",852,953,994,960,741,653,753,737,1067 -"YBR200W-A",10,12,5,7,4,2,6,10,16 -"YBR201W",299,291,277,144,177,204,222,310,476 -"YBR201C-A",158,158,161,88,131,60,66,114,178 -"YBR202W",1194,1401,1370,1087,1920,467,1188,1186,1608 -"YBR203W",1709,1740,1382,411,1154,1897,2117,1851,2279 -"YBR204C",617,559,394,135,200,670,568,569,900 -"YBR205W",710,686,672,678,840,738,605,531,887 -"YBR207W",1487,1398,1130,786,933,1850,1443,1484,2213 -"YBR208C",2861,4285,4213,4844,6019,1045,669,1688,2942 -"YBR209W",35,22,10,6,12,48,57,65,68 -"YBR210W",237,206,158,147,204,267,257,195,325 -"YBR211C",284,290,200,236,383,253,286,253,379 -"YBR212W",3241,2986,1954,826,1098,3211,2952,2841,4159 -"YBR213W",168,287,470,1033,321,74,110,102,193 -"YBR214W",3675,2728,1474,238,94,4296,3468,3263,4895 -"YBR215W",624,633,602,570,593,370,500,474,677 -"YBR216C",1033,1077,765,596,570,725,731,715,1206 -"YBR217W",253,264,224,162,170,190,198,221,347 -"YBR218C",4296,4441,3584,3763,3912,2258,2781,3124,4815 -"YBR220C",328,418,532,809,712,195,303,310,452 -"YBR221C",6200,5680,4337,3126,2424,8634,6365,6168,9702 -"YBR221W-A",100,74,37,39,64,24,59,75,101 -"YBR222C",10249,7512,5209,4270,5657,2464,5471,7832,13680 -"YBR223C",383,397,318,187,124,286,253,244,441 -"YBR225W",899,761,586,304,345,561,535,558,800 -"YBR227C",708,856,954,1270,942,320,563,523,940 -"YBR228W",298,317,285,322,290,142,182,184,324 -"YBR229C",1439,1543,1263,737,549,805,986,1001,1549 -"YBR230C",5941,4404,2412,773,861,11240,9350,9787,13208 -"YBR230W-A",299,198,169,93,117,648,698,545,741 -"YNCB0019C",411,330,349,381,372,277,343,302,577 -"YBR231C",548,590,557,447,447,305,443,463,796 -"YBR233W",423,480,381,271,372,403,389,364,527 -"YBR233W-A",188,222,203,254,269,269,232,179,257 -"YBR234C",1516,1411,1169,710,661,1689,1479,1495,2219 -"YBR235W",1165,1115,893,605,474,672,662,683,1117 -"YBR236C",611,736,775,806,833,522,620,592,814 -"YBR237W",884,968,852,782,809,598,696,652,1044 -"YBR238C",95,199,571,2580,512,53,59,42,90 -"YBR239C",127,185,242,421,331,91,99,117,159 -"YBR240C",1182,1245,1150,1636,2529,479,898,997,1579 -"YBR241C",3516,3022,1970,557,177,2407,2012,2484,5155 -"YBR242W",543,629,635,956,983,402,444,438,783 -"YBR243C",356,389,328,341,564,389,388,325,486 -"YBR244W",151,165,141,137,181,83,87,99,244 -"YBR245C",916,1116,1123,1255,1137,502,636,617,932 -"YBR246W",261,308,360,473,474,206,223,224,316 -"YBR247C",638,887,1562,3633,2587,101,311,336,555 -"YBR248C",1113,1291,1482,2677,2009,332,827,730,1302 -"YBR249C",3353,3351,3075,4628,6326,949,1913,2145,3964 -"YBR250W",124,132,127,131,73,66,80,69,136 -"YBR251W",403,405,427,337,458,1320,537,380,585 -"YBR252W",211,255,319,445,513,240,244,263,334 -"YBR253W",241,239,254,226,295,252,323,251,466 -"YBR254C",173,227,230,282,226,118,155,153,250 -"YBR255W",698,706,582,393,312,444,466,518,922 -"YBR255C-A",737,590,378,220,251,1092,929,805,1201 -"YBR256C",1592,1374,1276,1538,1196,1691,1658,1591,2438 -"YBR257W",410,475,433,433,541,230,328,369,584 -"YBR258C",111,102,105,95,100,130,100,132,154 -"YBR259W",463,570,481,435,449,229,285,297,472 -"YBR260C",569,621,620,512,464,452,470,427,606 -"YBR261C",270,351,492,727,673,189,256,241,468 -"YBR262C",408,329,274,250,428,1483,656,460,666 -"YBR263W",2073,2162,2135,2517,2509,1638,1593,1491,2665 -"YBR264C",256,274,220,172,249,326,307,273,461 -"YBR265W",854,927,853,782,805,652,744,730,1160 -"YBR267W",312,401,691,1540,1144,76,180,211,389 -"YBR268W",154,169,161,173,263,791,223,198,265 -"YBR269C",1204,1122,740,321,259,1688,1349,1266,2065 -"YBR270C",311,276,272,208,194,218,214,232,427 -"YBR271W",195,267,372,648,530,54,91,110,237 -"YBR272C",807,783,585,380,411,666,590,596,1057 -"YBR273C",1292,1233,912,646,742,1078,1031,1138,1944 -"YBR274W",554,560,501,378,476,380,427,432,662 -"YBR275C",984,1078,1020,984,851,589,573,628,1035 -"YBR276C",1069,1239,1070,942,940,949,875,911,1405 -"YBR278W",639,617,481,220,349,630,575,641,1058 -"YBR279W",987,1003,1249,1415,963,1040,1086,963,1453 -"YBR280C",1649,1313,675,60,101,1384,1184,1284,2239 -"YBR281C",797,1020,897,1262,917,472,717,587,906 -"YBR282W",289,308,279,248,404,996,351,283,464 -"YBR283C",2352,2558,2569,3164,3301,1358,1690,1693,2755 -"YBR284W",227,198,90,57,153,554,188,152,277 -"YBR285W",627,537,229,29,48,1265,628,599,995 -"YBR286W",11619,9176,6637,4099,2267,9842,9720,10070,16610 -"YBR287W",1556,1549,1233,1047,1336,984,997,1113,1862 -"YBR288C",562,614,558,569,838,317,420,392,607 -"YBR289W",949,982,950,740,617,691,829,654,1005 -"YBR290W",1024,1020,836,639,1170,1048,1086,1062,1526 -"YBR291C",641,1255,2122,5746,5861,149,256,333,594 -"YBR292C",27,40,39,24,41,21,26,22,38 -"YBR293W",393,439,432,433,391,334,303,313,481 -"YBR294W",3740,5676,7338,9146,5808,4549,2883,2708,3729 -"YBR295W",2256,2083,1374,576,471,1932,2019,2073,3292 -"YBR296C",375,367,312,276,232,186,226,304,525 -"YBR296C-A",8,7,8,5,14,2,9,5,11 -"YBR297W",696,606,425,318,1846,1845,1191,1038,1289 -"YBR298C",3123,2112,1143,381,1787,9106,6208,4275,6580 -"YBR299W",376,263,115,62,61,1861,662,425,688 -"YCL064C",64,46,41,24,116,64,56,66,98 -"YCL063W",255,349,370,435,428,357,473,331,382 -"YCL061C",633,674,584,310,404,268,277,396,665 -"YCL059C",554,893,1151,2377,3191,101,226,324,612 -"YCL058C",35,47,34,31,46,102,71,34,78 -"YCL057C-A",728,709,602,514,804,1716,1192,1113,1422 -"YCL057W",2316,2372,1858,1180,535,1476,1629,1489,2441 -"YCL056C",394,438,383,278,400,298,354,393,670 -"YCL055W",878,882,675,501,960,859,769,787,1083 -"YCL054W",829,1361,2490,6445,4271,96,460,452,907 -"YCL052C",1579,1338,1000,556,645,1602,1317,1427,2153 -"YCL051W",394,417,338,321,354,431,343,326,523 -"YCL050C",2026,2158,1897,1898,1771,959,1143,1352,2551 -"YCL049C",465,395,242,144,222,857,385,351,646 -"YCL048W-A",3186,2498,1723,959,438,386,668,1592,3758 -"YCL048W",77,87,51,31,20,72,47,65,100 -"YCL047C",272,346,301,383,281,311,213,256,371 -"YCL045C",1302,1502,1457,1398,1161,1076,1179,1113,1734 -"YCL044C",539,565,454,378,353,305,371,346,527 -"YCL043C",7055,6802,5925,5026,3884,4419,4845,4890,8164 -"YCL042W",14,6,5,6,9,13,11,16,13 -"YCL040W",10734,6506,3183,595,1007,24785,18060,17240,23249 -"YCL039W",959,901,529,106,227,958,828,832,1355 -"YCL038C",950,856,586,266,248,834,746,723,1382 -"YCL037C",38,71,170,385,135,9,13,13,22 -"YCL036W",283,421,992,2097,500,31,44,91,318 -"YCL035C",3053,2455,1687,1078,941,3968,3086,3041,4996 -"YCL034W",911,876,648,329,522,1466,1085,1018,1651 -"YCL033C",911,826,585,251,147,1005,964,1210,1981 -"YCL032W",792,770,720,416,463,635,707,738,1130 -"YCL031C",812,1036,1149,1945,1948,400,644,638,1007 -"YCL030C",3359,3258,2948,3863,6436,1301,2335,2203,3837 -"YCL029C",533,649,590,690,810,378,465,420,695 -"YCL028W",1843,1805,1650,1498,1732,1958,1723,1647,2468 -"YCL027W",196,192,154,192,569,300,145,169,238 -"YCL026C-B",180,229,254,243,525,391,267,207,270 -"YCL026C-A",18,21,18,40,50,19,16,15,29 -"YCL025C",1765,2356,3619,7083,8813,271,1155,1339,1987 -"YCL024W",633,664,527,238,1050,332,300,491,830 -"YCL021W-A",53,48,37,44,53,55,50,43,67 -"YCL019W",12,15,21,13,5,8,9,10,15 -"YNCC0002W",3,2,2,2,2,1,2,1,2 -"YCL018W",1840,2825,4990,7635,4960,1324,1173,1238,2070 -"YCL017C",1735,1798,1557,1288,1227,1479,1053,1245,2088 -"YCL016C",348,358,349,385,406,246,244,298,497 -"YCL014W",652,809,739,656,668,684,717,522,635 -"YCL012C",552,549,365,170,55,289,301,413,739 -"YCL011C",1485,1546,1450,1833,2398,1044,1398,1290,2128 -"YCL010C",480,568,476,411,312,372,390,463,794 -"YCL009C",2916,2620,2411,2363,2431,1753,2126,2152,3700 -"YCL008C",368,413,318,293,194,277,289,326,485 -"YCL005W-A",542,529,551,579,756,513,585,599,988 -"YNCC0003C",44,38,32,45,50,41,27,34,58 -"YCL005W",234,195,219,262,292,202,208,242,329 -"YCL004W",312,309,246,180,156,239,225,202,332 -"YCL002C",355,412,427,529,562,232,292,289,501 -"YCL001W",901,899,781,779,889,732,753,753,1251 -"YCL001W-A",35,22,44,25,30,30,40,29,50 -"YCL001W-B",38,56,29,27,31,46,43,48,91 -"YCR001W",33,53,60,68,50,18,26,31,59 -"YCR002C",818,906,791,874,1283,1053,905,771,1077 -"YCR003W",237,264,254,226,273,964,312,254,335 -"YCR004C",5591,4935,3323,1389,719,9039,7362,5953,9129 -"YCR005C",2091,2812,5461,1236,3277,2821,2883,1905,2932 -"YCR006C",98,98,67,41,52,136,136,145,169 -"YCR007C",270,259,186,179,255,267,186,213,378 -"YCR008W",808,916,992,1324,1527,532,567,588,859 -"YCR009C",1978,1961,1562,1108,1167,1545,1376,1627,2537 -"YCR010C",5044,3346,1786,240,42,45822,29944,16092,14578 -"YCR011C",3002,2943,2057,715,355,2090,1589,1878,2973 -"YCR012W",90042,64683,39856,14090,3534,44054,41238,70401,146503 -"YCR014C",907,932,708,477,477,674,626,660,1157 -"YCR015C",281,349,299,355,205,145,198,173,296 -"YNCC0006C",37,53,53,89,101,39,38,37,57 -"YCR016W",292,528,849,1941,1684,66,194,211,313 -"YCR017C",1845,1785,1312,1124,1482,1922,1625,1655,2400 -"YCR018C",1320,1053,630,378,548,1512,1455,1074,1966 -"YCR019W",350,409,380,422,449,293,329,314,522 -"YCR020C",669,874,775,1224,3263,998,522,577,942 -"YCR020C-A",287,304,231,263,291,152,164,216,407 -"YCR020W-B",129,194,189,296,226,49,96,111,156 -"YCR021C",4126,3107,1285,159,140,1436,1338,1525,5045 -"YCR023C",749,718,534,313,437,911,747,639,944 -"YCR024C",203,244,258,222,202,490,222,163,239 -"YCR024C-B",8128,7065,5932,7292,5460,3476,6227,5444,8701 -"YCR024C-A",5997,5397,4739,5820,4306,2585,4513,3854,6488 -"YCR025C",34,22,15,19,33,42,31,24,53 -"YCR026C",1017,1146,1235,1487,800,766,748,741,1236 -"YCR027C",228,251,328,341,317,162,150,155,231 -"YCR028C",607,739,679,748,818,327,476,449,792 -"YCR028C-A",1698,1755,1496,1470,1676,1941,1614,1679,2604 -"YCR030C",2166,1934,1408,649,479,1800,1651,1552,2536 -"YCR031C",3256,3832,4253,7139,9606,1130,1931,1969,3795 -"YCR032W",1128,1088,873,546,661,685,577,612,1070 -"YCR033W",1047,1074,1027,1004,834,976,919,814,1232 -"YCR034W",582,855,918,1765,2189,386,546,461,666 -"YCR035C",619,742,1096,1623,1156,415,533,549,815 -"YCR036W",819,836,722,542,505,864,791,757,1197 -"YCR037C",921,1011,1038,1192,1189,630,674,627,973 -"YCR038C",217,177,166,130,150,197,152,140,269 -"YCR042C",1567,1559,1565,1423,1186,773,1131,1054,1755 -"YCR043C",158,217,272,573,720,139,173,157,221 -"YCR044C",426,453,412,489,529,393,402,355,616 -"YCR045C",182,202,199,212,229,167,186,191,315 -"YCR046C",319,320,327,332,395,1549,468,384,530 -"YCR047C",414,594,853,1596,1692,160,312,355,726 -"YCR048W",340,393,509,538,293,183,260,298,467 -"YCR051W",939,1048,1083,1214,1356,928,1091,1097,1836 -"YCR052W",532,573,578,678,649,360,419,397,619 -"YCR053W",2302,2319,2236,2917,3119,1148,1675,1669,2574 -"YCR054C",404,429,472,624,468,173,247,272,482 -"YCR057C",554,868,1617,3894,2466,42,255,270,469 -"YCR059C",413,549,610,882,907,288,298,369,609 -"YCR060W",265,261,272,308,371,311,287,287,467 -"YCR061W",674,582,383,163,143,764,582,589,946 -"YCR063W",67,71,134,203,134,26,37,45,83 -"YCR065W",352,471,409,586,765,252,274,228,329 -"YCR066W",241,274,253,244,210,156,181,154,282 -"YCR067C",872,944,866,783,676,785,708,649,898 -"YCR068W",787,859,717,447,282,557,469,508,900 -"YCR069W",1777,1870,1340,737,456,1245,1282,1341,2368 -"YCR071C",275,250,246,220,266,1157,333,288,341 -"YCR072C",158,353,776,1958,841,12,69,80,141 -"YCR073C",404,400,367,337,299,233,247,283,458 -"YCR073W-A",926,805,658,263,450,903,898,942,1436 -"YCR075C",326,303,229,59,76,350,320,356,514 -"YCR075W-A",166,166,129,89,66,185,213,198,302 -"YCR076C",722,730,607,383,325,927,792,828,1356 -"YCR077C",1218,1259,1132,1162,1106,1052,1050,973,1552 -"YCR079W",703,624,525,260,234,914,859,898,1271 -"YCR081W",559,668,566,539,355,388,357,351,537 -"YCR082W",1922,1749,1288,904,1157,2141,2136,1961,3113 -"YCR083W",1198,1132,871,561,401,1002,845,1033,1779 -"YCR084C",1842,1859,1780,2149,2350,1929,1893,1459,2086 -"YCR085W",10,10,7,8,9,13,5,3,2 -"YCR086W",305,356,291,239,266,269,317,258,352 -"YCR087C-A",213,380,646,1555,2318,45,111,94,181 -"YCR088W",1275,1308,976,695,375,1448,1182,984,1564 -"YCR089W",470,496,463,501,600,438,277,253,348 -"YCR090C",287,350,311,416,551,340,338,344,503 -"YCR091W",703,581,280,53,117,1003,673,616,897 -"YCR092C",337,383,403,516,548,268,208,215,341 -"YCR093W",1926,1993,1928,1842,1454,1416,1468,1329,1881 -"YCR094W",506,504,467,412,415,359,374,319,524 -"YCR095C",389,438,374,262,440,219,275,343,510 -"YCR095W-A",21,33,20,32,21,10,12,14,26 -"YCR098C",164,175,133,106,165,100,114,129,196 -"YCR099C",71,67,52,38,22,56,52,48,95 -"YCR100C",116,102,66,46,26,69,64,81,131 -"YCR101C",70,62,43,18,5,35,30,36,58 -"YCR102C",352,318,247,314,1773,258,306,316,561 -"YDL248W",372,340,218,165,185,336,234,343,533 -"YDL247W",2,1,2,6,4,10,4,3,2 -"YDL246C",10,7,4,4,4,6,3,6,14 -"YDL245C",16,15,13,7,11,17,11,13,24 -"YDL244W",94,113,84,57,54,128,78,61,177 -"YDL243C",146,153,166,91,80,134,102,122,176 -"YDL242W",13,26,21,9,14,24,8,13,22 -"YDL241W",12,8,13,9,24,11,14,7,15 -"YDL240W",464,525,525,406,426,492,464,393,540 -"YDL239C",807,598,302,114,172,684,541,561,904 -"YDL238C",565,461,283,82,52,391,348,382,638 -"YDL237W",1181,1149,1021,853,625,806,636,720,1238 -"YDL236W",692,779,940,1621,1441,526,618,581,923 -"YDL235C",519,614,611,684,931,337,398,415,699 -"YDL234C",1711,1630,1111,470,562,1542,1295,1396,2249 -"YDL233W",419,392,359,220,281,282,316,347,560 -"YDL232W",171,213,176,230,270,247,227,194,261 -"YDL231C",1296,1405,1290,1331,1385,608,732,881,1349 -"YDL230W",212,231,218,132,149,302,275,257,381 -"YDL229W",2019,3292,5713,15742,15604,564,1261,1260,2402 -"YDL227C",429,628,690,874,1359,82,79,175,451 -"YDL226C",871,907,836,876,881,729,873,748,1227 -"YDL225W",958,1105,1044,1323,1494,1081,1115,886,1156 -"YDL224C",1535,1595,1340,1020,1032,892,1194,1093,1571 -"YDL223C",9550,5879,2642,376,103,7244,6427,6719,11931 -"YDL222C",4994,3349,1532,129,44,3238,2581,3816,7934 -"YDL220C",261,283,276,218,233,173,208,187,281 -"YDL219W",187,244,223,277,344,109,146,112,212 -"YDL218W",1953,2181,1329,147,92,168,181,294,1398 -"YDL217C",253,346,411,414,406,232,212,195,302 -"YDL216C",329,331,212,122,132,262,238,292,462 -"YDL215C",6325,5619,3676,1496,1174,10534,8536,6677,8463 -"YDL214C",3177,2104,960,54,131,5542,3877,3436,5049 -"YDL213C",691,941,1177,2151,3121,216,462,495,930 -"YDL212W",1357,1466,1300,1593,2026,1198,1300,1419,2162 -"YDL211C",98,141,142,110,158,136,104,92,149 -"YDL210W",129,150,161,195,182,124,75,79,144 -"YDL209C",218,316,295,321,287,86,165,175,302 -"YDL208W",915,1403,2104,4278,5332,198,760,708,1191 -"YDL207W",799,799,729,594,729,566,657,650,1109 -"YDL206W",549,485,290,122,258,627,419,418,666 -"YDL205C",445,471,508,846,983,453,453,482,705 -"YDL204W",12224,7051,2695,191,127,8413,8201,9167,18393 -"YDL203C",539,558,523,569,676,318,397,410,648 -"YDL202W",267,338,327,331,389,1024,323,270,387 -"YDL201W",409,592,802,1909,1759,185,222,208,421 -"YDL200C",762,772,634,532,473,542,607,678,1136 -"YDL199C",915,837,507,83,73,638,594,601,1104 -"YDL198C",515,660,852,1439,1111,859,651,493,669 -"YDL197C",989,761,452,107,280,741,580,607,1068 -"YDL195W",3780,3677,2958,1875,1609,2661,2305,2237,3488 -"YDL194W",729,651,426,151,511,738,577,587,894 -"YDL193W",825,758,513,312,437,662,586,612,1044 -"YDL192W",1667,2032,2191,3474,4850,1975,1694,1643,2360 -"YDL191W",1194,1363,1264,2096,3629,491,973,1077,1838 -"YDL190C",1424,1481,1310,968,1011,1002,1040,968,1409 -"YDL189W",469,512,626,772,670,239,343,252,432 -"YDL188C",1146,989,843,395,524,808,872,936,1479 -"YDL186W",22,32,44,43,22,12,29,37,83 -"YDL185W",6530,6905,6602,9591,4925,4119,4130,4672,7699 -"YDL184C",1086,1167,948,1088,2286,664,994,1166,2068 -"YDL183C",254,326,234,172,242,442,214,205,361 -"YDL182W",1437,2155,2844,4147,4369,150,436,703,1467 -"YDL181W",2124,1740,1223,626,845,2560,2631,2368,3331 -"YDL180W",582,668,646,405,688,317,382,414,661 -"YDL179W",389,219,207,199,175,115,572,1558,1220 -"YDL178W",1131,1333,1318,1919,2211,1648,1153,950,1398 -"YDL177C",203,251,285,283,264,158,209,190,308 -"YDL176W",520,582,478,339,384,253,371,354,572 -"YDL175C",363,293,228,206,484,351,332,310,456 -"YDL174C",2514,2423,1985,787,1053,7997,4795,3190,4451 -"YDL173W",1586,1577,1319,1038,1272,1488,1837,1701,2756 -"YDL171C",8107,8688,7530,8914,10227,7286,6007,6629,9873 -"YDL170W",725,828,1106,1432,817,265,483,438,798 -"YDL169C",714,710,473,86,42,592,546,622,1126 -"YDL168W",2220,2270,1943,1368,1371,1009,1143,1464,2966 -"YDL167C",492,671,1081,2526,1468,66,259,272,397 -"YDL166C",356,413,504,828,977,199,305,282,532 -"YDL165W",464,426,371,400,529,427,475,424,691 -"YDL164C",435,493,432,240,480,269,317,379,562 -"YDL161W",1452,1424,1223,918,1166,1272,1287,1289,1983 -"YDL160C-A",109,103,115,122,122,93,86,108,183 -"YDL160C",570,594,490,522,469,484,486,384,587 -"YDL159W",386,402,327,228,404,259,298,310,464 -"YDL157C",370,429,354,391,452,341,273,338,563 -"YDL156W",162,185,180,118,193,82,116,100,201 -"YDL155W",600,616,652,695,735,657,604,553,860 -"YDL154W",378,348,268,168,309,398,309,283,468 -"YDL153C",1166,1494,2101,4702,4840,193,613,634,1268 -"YDL150W",435,572,761,1476,1506,141,342,315,577 -"YDL149W",844,844,605,144,178,520,535,552,996 -"YDL148C",699,1191,1890,4386,3770,59,356,281,628 -"YDL147W",6863,6186,4603,3548,3450,4964,5653,5187,7623 -"YDL146W",228,213,145,109,172,220,177,185,270 -"YDL145C",2407,2588,2389,2533,2709,2585,2206,1868,2764 -"YDL144C",948,1054,957,844,642,926,929,900,1474 -"YDL143W",2538,2763,2664,3326,3680,1725,2296,2255,3488 -"YDL142C",369,404,279,139,176,410,362,383,524 -"YDL141W",636,709,625,586,621,406,491,430,676 -"YDL140C",3724,3713,3576,3904,3677,2364,2700,2396,3601 -"YDL139C",121,104,93,60,51,62,44,60,147 -"YDL138W",730,949,1192,1306,796,552,679,624,910 -"YDL137W",4292,3960,3056,2190,1925,6521,5478,5420,7775 -"YDL136W",996,1190,1294,2088,3522,237,646,710,1272 -"YDL135C",914,972,811,530,566,1039,885,862,1208 -"YDL134C",1383,1438,1262,1000,1220,1186,1375,1365,2131 -"YDL133C-A",2076,2063,1572,1643,2669,756,1109,1779,3093 -"YDL133W",791,848,676,362,533,551,663,614,1004 -"YDL132W",2781,2451,1679,716,811,2055,2126,2163,3361 -"YDL131W",1783,2106,2260,3121,3405,514,891,1005,1799 -"YDL130W-A",3042,2140,1267,448,309,4935,3559,3629,5270 -"YDL130W",2254,2681,2771,4278,6385,592,1471,1597,3003 -"YDL129W",231,232,202,195,367,141,203,223,316 -"YDL128W",1834,1765,1441,1351,1764,1258,1387,1791,2507 -"YDL127W",94,99,93,95,292,106,115,196,153 -"YDL126C",16809,14995,11537,7595,5092,13944,13995,13717,21427 -"YDL125C",2396,1997,1376,794,886,3014,3184,3222,4698 -"YDL124W",9172,7465,4732,1781,621,6561,4578,5884,11024 -"YDL123W",619,589,443,203,233,385,467,511,791 -"YDL122W",1410,1698,2449,4635,3652,646,865,849,1407 -"YDL121C",618,658,702,863,1043,218,463,515,807 -"YDL120W",474,388,315,228,512,919,681,563,765 -"YDL119C",125,138,139,119,92,200,164,176,251 -"YDL117W",523,517,529,768,733,325,653,1217,1023 -"YDL116W",1073,1160,1079,1273,1270,589,782,740,1122 -"YDL115C",1089,1049,807,500,602,986,1023,973,1626 -"YDL114W",45,44,35,37,18,18,15,28,58 -"YDL113C",1092,996,656,203,336,981,857,912,1419 -"YDL112W",1065,1274,1468,2226,2437,350,576,605,944 -"YDL111C",375,511,824,1432,952,267,339,307,478 -"YDL110C",4157,3189,1892,328,280,8847,6209,5564,7819 -"YDL109C",229,276,261,277,187,160,182,187,291 -"YDL108W",371,396,395,440,522,287,376,314,532 -"YDL107W",302,320,233,195,255,1000,355,282,431 -"YDL106C",837,770,507,334,569,765,753,684,969 -"YDL105W",166,203,200,159,252,93,82,95,175 -"YDL104C",352,312,374,231,221,361,281,242,447 -"YDL103C",840,927,824,629,747,908,860,769,1098 -"YDL102W",605,773,742,682,737,398,378,416,552 -"YDL101C",402,437,360,188,456,524,479,384,570 -"YDL100C",3606,3844,3251,3039,2600,2813,3163,3043,4732 -"YDL099W",1651,1754,1424,1179,1143,1303,1538,1450,2385 -"YDL098C",136,171,166,184,234,111,102,95,153 -"YDL097C",4342,3889,2913,2106,1961,3189,3618,3447,5235 -"YDL095W",1336,1528,1357,1651,2217,1194,1165,1140,1523 -"YDL093W",380,467,463,377,370,353,290,311,431 -"YDL092W",418,521,501,584,1038,418,471,440,690 -"YDL091C",1218,1160,785,412,476,1036,1005,1035,1533 -"YDL090C",531,465,420,201,286,499,435,466,664 -"YDL089W",462,436,316,163,378,470,400,380,573 -"YDL088C",863,897,923,1014,1171,729,714,674,1070 -"YDL087C",215,217,190,183,157,116,113,129,224 -"YDL086W",1292,1112,983,768,468,1408,1324,1182,2258 -"YDL085C-A",157,175,172,196,366,156,149,129,212 -"YDL085W",4555,3588,2067,383,55,5203,4008,3952,6717 -"YDL084W",3639,3878,3596,4094,5130,3463,3506,3270,4874 -"YDL083C",2897,3549,4043,7546,12254,715,1943,2063,3674 -"YDL082W",1777,2520,3070,6408,8202,439,1183,1080,2084 -"YDL081C",3882,4408,4657,7473,12946,1508,3069,3331,6326 -"YDL080C",768,802,675,871,1390,492,573,558,973 -"YDL079C",1057,885,532,172,619,2347,1218,1317,1787 -"YDL078C",6341,5350,3948,2040,1402,11238,7875,7872,11814 -"YDL077C",718,762,644,440,409,471,403,453,678 -"YDL076C",515,521,448,294,289,469,456,388,633 -"YDL075W",4219,4797,5099,8636,14712,1370,3168,3304,5902 -"YNCD0002C",9,6,8,6,56,6,4,1,7 -"YDL074C",1544,1746,1704,2281,2456,970,1237,1145,1797 -"YDL073W",828,924,881,935,983,331,540,525,837 -"YDL072C",1839,1788,1119,600,409,1707,1608,1846,2882 -"YDL070W",2087,1399,805,599,735,2223,2312,1924,2950 -"YDL069C",117,195,161,168,233,131,127,118,192 -"YDL067C",1543,1489,1227,1094,1603,2101,1900,1749,2333 -"YDL066W",1383,1555,1341,1105,1412,1543,1422,1340,2103 -"YDL065C",1271,1240,1110,781,1114,1073,1152,1081,1786 -"YDL064W",482,548,497,550,745,378,438,395,669 -"YDL063C",502,895,1394,3009,2398,60,226,244,437 -"YDL061C",1811,2018,1999,3344,4401,435,1172,1250,2188 -"YDL060W",922,1318,2069,4552,3591,127,471,491,910 -"YDL059C",288,374,405,503,365,193,227,216,376 -"YDL058W",1221,1307,1261,1235,777,875,837,907,1325 -"YDL057W",374,432,391,331,190,213,237,316,585 -"YDL056W",602,617,663,749,590,517,489,406,703 -"YDL055C",4579,4234,5056,10654,9441,2171,2519,7496,11105 -"YDL054C",1426,1430,1124,781,899,1526,1538,1363,1978 -"YDL053C",793,880,729,768,911,777,804,738,1096 -"YDL052C",277,327,310,394,432,336,266,233,315 -"YDL051W",1102,1444,1800,3557,4507,379,803,841,1484 -"YDL049C",1530,1677,1595,958,386,2422,1796,1488,2081 -"YDL048C",863,998,1077,647,536,311,317,443,939 -"YDL047W",814,910,910,1061,1123,615,773,850,1218 -"YDL046W",3676,3231,2573,1678,1411,5130,3820,3368,4736 -"YDL045W-A",207,218,229,203,302,809,287,236,369 -"YDL045C",629,646,550,380,501,797,618,617,836 -"YDL044C",349,378,356,364,445,503,351,294,413 -"YDL043C",451,441,483,568,567,228,296,308,530 -"YDL042C",414,520,466,542,592,224,276,259,416 -"YDL040C",1109,1289,1244,1624,1462,1088,943,869,1381 -"YDL039C",143,265,749,6523,799,62,63,57,96 -"YDL037C",35,75,217,1716,185,18,24,16,29 -"YDL036C",387,497,562,975,828,186,228,238,430 -"YDL035C",1247,1354,1252,1220,1187,965,982,1008,1552 -"YDL033C",160,166,193,203,243,241,191,189,267 -"YDL031W",1301,1676,2173,4234,3739,371,808,817,1513 -"YDL030W",385,437,480,491,478,277,309,301,473 -"YDL029W",2192,1961,1556,966,789,2849,2273,2265,3545 -"YDL028C",514,546,496,417,411,541,494,405,613 -"YDL027C",1607,1457,999,328,428,1750,1265,1286,2017 -"YDL025C",1200,1125,854,442,602,1126,859,809,1349 -"YDL024C",314,301,205,47,37,131,115,173,299 -"YDL022W",5582,4433,2834,341,327,3152,2948,4042,7579 -"YDL021W",750,744,583,207,55,656,465,688,1101 -"YDL020C",5269,4125,2470,886,2232,4674,3642,3859,6962 -"YDL019C",1953,1789,1138,285,377,2198,1699,1573,2476 -"YDL018C",438,378,277,78,337,661,420,468,657 -"YDL017W",235,276,232,228,320,211,194,209,342 -"YDL015C",1521,1788,1926,2921,1994,1405,1407,1330,2135 -"YDL014W",963,1783,3499,8718,8051,176,609,536,939 -"YDL013W",582,621,583,639,683,420,445,429,811 -"YDL012C",419,376,398,434,725,391,488,460,605 -"YDL010W",460,428,352,159,474,423,395,441,684 -"YDL009C",63,78,55,29,77,80,67,69,117 -"YDL008W",519,518,487,406,363,431,515,568,899 -"YDL007W",4752,4742,3827,3078,2761,3618,4562,4398,6748 -"YDL006W",465,447,371,297,506,380,384,382,621 -"YDL005C",1219,1239,1050,868,1327,874,1049,1006,1516 -"YDL004W",2621,2393,2091,1470,1775,4229,3536,3297,4551 -"YDL003W",217,327,309,364,642,276,176,165,241 -"YDL002C",530,586,520,607,557,447,466,473,750 -"YDL001W",489,583,544,504,615,323,385,399,635 -"YDR001C",3835,3270,2679,2246,923,2806,2364,2804,4969 -"YDR002W",2067,2646,3858,7306,7469,1894,1672,1985,3225 -"YDR003W",671,573,450,178,187,632,593,602,1078 -"YDR003W-A",225,174,116,44,60,169,166,138,282 -"YDR004W",757,813,658,562,554,568,629,669,1058 -"YDR005C",1731,1562,1062,624,818,1060,1093,1347,2286 -"YDR006C",1041,1285,1603,2091,970,586,735,698,983 -"YDR007W",585,622,586,689,495,873,719,774,1145 -"YDR009W",250,262,208,102,184,215,252,205,289 -"YDR010C",26,16,16,18,26,55,42,27,36 -"YDR011W",3376,3459,2849,1758,2476,1933,2079,2131,3933 -"YDR012W",1674,1997,2399,3853,4832,526,1147,1221,2131 -"YDR013W",190,206,158,181,321,132,148,213,276 -"YDR014W",359,401,321,227,268,189,177,210,323 -"YDR014W-A",22,24,26,18,14,50,19,22,20 -"YDR016C",173,170,113,61,94,302,223,183,321 -"YDR017C",1075,1252,1134,961,1099,749,734,794,1195 -"YDR018C",657,603,321,90,120,1009,718,663,960 -"YDR019C",1256,1302,1188,1891,1691,785,590,734,1438 -"YDR020C",130,186,268,417,372,62,105,112,162 -"YDR021W",152,250,436,937,766,15,79,79,128 -"YDR022C",517,477,342,160,151,460,381,434,741 -"YDR023W",2998,3539,3801,6391,7720,1736,2416,2187,3451 -"YDR025W",2549,2999,3469,5654,7738,607,1751,1790,3191 -"YDR026C",685,770,790,974,1065,423,509,551,881 -"YDR027C",982,910,660,329,501,822,774,680,1041 -"YDR028C",3003,2892,2325,1665,2112,2889,2210,2203,3498 -"YDR029W",141,141,113,67,86,104,94,90,118 -"YDR030C",642,610,509,331,262,416,448,505,841 -"YDR031W",246,235,155,85,102,631,241,291,394 -"YDR032C",6910,5954,4205,2164,782,8222,7242,8200,12963 -"YDR033W",12001,12439,10124,15394,11562,2422,2806,3724,9075 -"YDR034C",1126,1240,1158,1225,1564,451,741,748,1184 -"YDR034C-A",1,2,1,1,3,2,1,1,2 -"YDR034W-B",142,86,69,45,20,82,112,279,296 -"YDR035W",1781,1582,1713,2789,2130,771,1371,1718,2439 -"YDR036C",1403,1394,1004,383,410,5443,1673,1456,1977 -"YDR037W",1353,2415,4896,12280,7752,287,671,654,1168 -"YDR038C",69,86,64,36,130,30,37,50,102 -"YDR040C",108,140,124,46,145,61,68,118,152 -"YDR041W",445,487,443,411,584,1732,568,469,682 -"YDR042C",23,24,36,55,72,16,10,27,26 -"YNCD0010C",3,3,1,2,5,4,6,1,3 -"YDR043C",1834,1599,1443,1783,2760,1279,1922,1740,2386 -"YDR044W",462,521,541,612,798,325,419,465,674 -"YDR045C",166,221,291,580,577,54,102,131,197 -"YDR046C",68,99,99,152,143,58,46,45,63 -"YDR047W",753,818,784,977,836,757,733,730,1068 -"YDR049W",414,458,526,789,655,210,291,237,499 -"YDR050C",23167,18241,12605,8234,4811,15582,15468,24426,41598 -"YDR051C",878,901,857,819,1111,664,748,746,1188 -"YDR052C",1142,1196,1201,1177,905,869,890,987,1403 -"YDR054C",1804,1804,1845,1881,1954,1752,1723,1643,2467 -"YDR055W",3013,2956,2415,2007,716,547,1540,4280,4447 -"YDR056C",1000,975,895,728,682,925,922,865,1426 -"YDR057W",846,940,699,447,558,521,587,618,1071 -"YDR058C",291,368,311,375,493,238,278,240,409 -"YDR059C",1616,1633,1316,858,364,1389,1301,1437,2488 -"YDR060W",1823,2684,3914,8958,7759,341,960,974,1692 -"YDR061W",646,725,688,596,628,1332,602,572,833 -"YDR062W",1805,1922,1753,2123,2697,1396,1498,1423,2281 -"YDR063W",801,666,503,323,230,934,810,812,1217 -"YDR064W",5080,6132,6985,12121,19204,1496,3997,3954,7250 -"YDR065W",275,324,326,385,259,147,152,161,317 -"YDR066C",210,218,171,189,193,139,126,160,234 -"YDR067C",408,424,380,423,396,327,383,388,631 -"YDR068W",972,904,683,653,1001,828,935,741,1291 -"YDR069C",567,555,471,204,275,419,334,373,560 -"YDR070C",8733,6094,3585,1282,152,7892,7599,8262,14415 -"YDR071C",1669,1687,1396,1253,1284,1273,1461,1543,2376 -"YDR072C",1050,1178,1177,909,1331,1618,1259,975,1463 -"YDR073W",446,401,239,132,290,1078,765,577,778 -"YDR074W",6791,4676,2067,266,503,12103,6093,6587,9860 -"YDR075W",745,1026,1413,2109,1175,342,590,478,863 -"YDR076W",304,324,312,156,150,539,282,269,394 -"YDR077W",119989,94996,67525,22581,12579,135339,112867,86629,113020 -"YDR078C",259,253,155,117,183,220,251,282,482 -"YDR079W",266,293,244,202,264,657,270,242,410 -"YDR079C-A",140,135,107,110,147,115,140,178,242 -"YDR080W",1066,1104,946,740,556,709,568,680,1034 -"YDR081C",923,995,952,916,975,516,661,698,1057 -"YDR082W",484,482,417,408,396,302,345,389,607 -"YDR083W",488,867,1333,3082,2921,73,232,193,442 -"YDR084C",447,385,298,193,181,413,432,475,682 -"YDR085C",1492,1207,647,93,326,1668,1098,1222,1999 -"YDR086C",1085,1075,907,1096,1534,942,1120,1188,1716 -"YDR087C",510,753,1100,2250,2043,154,288,371,616 -"YDR088C",402,468,442,448,601,297,338,315,527 -"YDR089W",603,629,689,1075,848,591,386,361,578 -"YDR090C",500,520,510,451,689,304,464,513,787 -"YDR091C",1632,2305,2935,6229,6978,396,1020,1064,1703 -"YDR092W",966,981,805,590,732,707,794,897,1498 -"YDR093W",409,476,537,787,1121,416,363,260,390 -"YDR096W",1537,1298,701,171,576,1995,1314,1232,1714 -"YDR097C",828,991,847,424,752,419,440,622,987 -"YDR098C",575,769,904,1281,1193,404,459,461,740 -"YDR098C-B",8,12,3,9,16,5,4,7,5 -"YDR099W",8046,6788,4971,2708,2464,8271,7381,6509,9805 -"YDR100W",673,628,396,133,169,1045,811,870,1159 -"YDR101C",690,1281,2008,5057,3993,82,333,335,612 -"YDR102C",16,16,20,17,7,7,13,4,17 -"YDR103W",559,642,676,867,746,276,326,360,592 -"YDR104C",885,971,808,596,570,441,569,586,1045 -"YDR105C",1105,940,685,368,542,1010,898,927,1565 -"YDR106W",82,66,30,14,31,132,73,73,150 -"YDR107C",388,461,370,166,137,225,275,242,420 -"YDR108W",576,639,569,450,471,366,429,418,655 -"YDR109C",762,795,796,728,424,382,485,505,815 -"YDR110W",555,696,902,1283,1114,279,391,387,657 -"YDR111C",932,811,603,269,261,949,1498,1175,1640 -"YDR113C",345,405,376,257,417,511,308,237,482 -"YDR115W",206,234,167,144,302,1073,319,270,346 -"YDR116C",418,431,415,330,456,1598,501,420,608 -"YDR117C",457,544,466,518,645,302,378,328,558 -"YDR118W",541,544,373,243,372,467,399,420,639 -"YDR119W",1266,1468,1490,1584,1742,623,922,957,1538 -"YDR119W-A",3043,2260,1076,84,429,4199,3696,3987,6087 -"YDR120C",917,1163,1575,2801,2740,258,610,659,1140 -"YDR121W",327,363,344,376,580,244,305,316,519 -"YDR122W",1566,1476,986,234,504,1132,1055,1101,1764 -"YDR123C",399,474,582,578,378,163,275,265,454 -"YDR124W",238,204,124,76,132,188,156,159,248 -"YDR125C",237,238,153,87,91,176,145,135,233 -"YDR126W",260,213,160,172,254,171,197,176,338 -"YDR127W",3523,3238,2446,2411,2693,2061,2480,2504,3919 -"YDR128W",935,1033,903,629,570,555,651,670,1046 -"YDR129C",4198,3697,3000,2257,2516,4960,3896,3875,5968 -"YDR130C",373,357,337,335,353,387,380,300,431 -"YDR131C",474,428,356,297,377,310,336,359,536 -"YDR132C",549,596,549,458,497,371,422,468,740 -"YDR134C",5126,4118,4267,6484,6487,46878,22945,13044,10934 -"YDR135C",2199,2419,2201,2055,2050,1767,1202,1270,2140 -"YDR137W",776,807,702,645,689,675,700,637,950 -"YDR138W",435,443,407,395,510,324,360,323,552 -"YDR139C",541,583,529,527,567,356,395,425,803 -"YDR140W",337,367,328,375,374,263,258,249,463 -"YDR141C",1373,1454,1098,907,686,988,916,935,1454 -"YDR142C",550,521,444,383,465,529,553,546,803 -"YDR143C",553,483,445,538,1002,460,507,448,622 -"YDR144C",133,183,175,227,462,122,131,126,157 -"YDR145W",1638,1535,1354,1143,1638,1546,1586,1444,2110 -"YDR146C",182,180,139,150,129,1172,1558,794,490 -"YDR147W",428,447,496,512,464,295,445,393,522 -"YDR148C",5976,5319,3259,1283,2322,6687,5480,5506,8047 -"YDR150W",2295,2336,1880,1279,945,2058,2039,1704,2565 -"YDR151C",553,598,523,465,371,305,277,344,629 -"YDR152W",730,804,935,1628,2254,387,683,599,961 -"YDR153C",968,1140,1125,1480,1668,645,836,710,1082 -"YDR155C",37360,27849,19655,10813,3729,20845,24660,30538,61267 -"YDR156W",210,264,344,611,554,47,133,102,220 -"YDR157W",19,21,13,36,29,3,12,12,14 -"YDR158W",3761,3696,3462,5870,6102,2032,2433,2383,4487 -"YDR159W",481,567,629,693,605,443,453,385,637 -"YDR160W",727,738,645,687,649,386,492,450,883 -"YDR161W",549,737,895,1662,1867,200,400,430,755 -"YDR162C",570,535,459,316,430,486,605,513,857 -"YDR163W",517,517,408,345,574,393,464,566,759 -"YDR164C",783,857,815,856,577,511,563,498,805 -"YDR165W",380,686,1139,2497,2098,90,202,223,378 -"YDR166C",1427,1336,1012,788,689,954,997,974,1498 -"YDR167W",718,704,679,746,1032,872,687,691,1042 -"YDR168W",2840,2534,1887,1288,1288,2297,2102,2217,3362 -"YDR169C",1030,1017,726,431,621,793,787,687,972 -"YDR169C-A",18,21,13,3,5,18,14,20,21 -"YDR170C",2399,2640,2233,2249,1756,1716,1545,1589,2462 -"YDR171W",11798,7278,3558,297,274,16590,10837,11530,21147 -"YDR172W",3183,3717,4198,6745,6587,2117,2689,2478,3964 -"YDR173C",439,395,167,76,246,608,473,510,790 -"YDR174W",1007,1040,1099,1389,1138,1543,1365,1022,1479 -"YDR175C",465,506,468,374,497,1808,539,417,582 -"YDR176W",1526,1494,1207,853,986,1069,1306,1255,1993 -"YDR177W",1758,1767,1406,1005,1432,1876,2009,1926,2779 -"YDR178W",2342,2125,1522,810,1418,5568,3612,3158,4053 -"YDR179C",335,319,321,316,308,211,247,243,432 -"YDR179W-A",351,388,309,356,345,194,259,299,418 -"YDR180W",578,733,707,740,580,242,315,331,570 -"YDR181C",742,788,686,614,555,578,735,699,1019 -"YDR182W",974,905,728,533,710,791,736,722,1133 -"YDR182W-A",12,10,11,7,13,22,10,16,17 -"YDR183W",264,294,269,261,321,155,188,169,289 -"YDR184C",169,291,683,1433,944,51,70,64,142 -"YDR185C",82,113,149,200,298,184,151,88,158 -"YDR186C",2491,2441,2815,3598,2036,1629,1721,1608,2819 -"YDR188W",4427,4683,4415,4468,4087,3725,4124,4018,6358 -"YDR189W",1097,1283,1082,990,800,845,938,817,1347 -"YDR190C",1869,1929,1977,2803,3647,1026,1640,1604,2329 -"YDR191W",165,195,184,154,315,51,121,160,245 -"YDR192C",259,249,241,240,265,193,213,210,318 -"YDR194C",1210,1481,1425,1701,1827,2788,996,931,1442 -"YDR195W",580,568,466,451,910,623,541,590,955 -"YDR196C",848,812,572,256,250,1135,968,953,1449 -"YDR197W",384,403,322,248,237,530,354,318,514 -"YDR198C",449,549,506,642,659,284,343,344,543 -"YDR200C",672,701,559,384,512,669,636,590,842 -"YDR201W",312,250,220,164,202,399,398,332,496 -"YDR202C",1043,975,628,249,241,990,840,961,1417 -"YDR204W",1327,1168,765,202,109,1376,1177,1202,1852 -"YDR205W",395,393,392,304,368,291,298,344,465 -"YDR206W",1444,1576,1439,1647,1652,736,919,948,1615 -"YDR207C",733,905,928,1051,832,556,581,579,918 -"YDR208W",1412,1547,1636,1513,1101,1356,1282,1047,1557 -"YDR209C",68,84,66,113,110,102,101,75,94 -"YDR210W-B",13,19,16,13,15,8,11,5,15 -"YDR210C-D",19,16,14,27,19,8,4,9,10 -"YDR211W",1262,1569,1819,2891,3047,541,814,940,1399 -"YDR212W",2872,3232,3259,4208,3398,1600,2274,2165,3646 -"YDR213W",327,431,487,527,517,97,177,212,295 -"YDR214W",6997,5908,4054,1393,871,4916,4684,5425,10337 -"YDR215C",12,13,11,1,6,10,9,10,16 -"YDR216W",2647,2528,1686,458,703,2215,1928,1897,2977 -"YDR217C",822,1003,969,1226,951,352,462,458,797 -"YDR218C",398,343,256,133,97,249,270,329,591 -"YDR219C",704,677,561,396,595,777,662,642,923 -"YDR221W",1089,1206,1061,833,505,630,618,620,1115 -"YDR222W",479,608,655,1360,458,323,286,338,589 -"YDR223W",2071,1674,945,181,151,3189,1625,1769,2950 -"YDR224C",6159,5872,4590,3429,3656,6651,4813,4605,7860 -"YDR225W",5459,4454,3026,2319,2216,6080,5630,6127,10355 -"YDR226W",2504,2659,2460,3640,4991,2439,2051,2474,4039 -"YDR227W",1246,1330,1099,1072,1003,658,853,798,1331 -"YDR228C",858,797,646,652,1180,761,695,723,1122 -"YDR229W",790,852,633,352,356,767,699,788,1231 -"YDR231C",987,1009,719,371,450,1310,1103,1127,1635 -"YDR232W",1797,2122,2631,4237,2517,905,1325,1281,2004 -"YDR233C",3717,3607,3322,3856,4589,1979,2843,2734,4141 -"YDR234W",1779,3256,4590,9017,9837,282,621,614,1262 -"YDR235W",408,437,409,451,587,300,348,301,435 -"YDR236C",397,387,322,248,259,299,314,362,624 -"YDR237W",362,397,402,414,550,1906,496,338,490 -"YDR238C",3134,3406,3145,3394,3035,2634,2465,2275,3435 -"YDR239C",469,509,456,432,461,285,306,307,549 -"YDR240C",308,375,349,375,436,174,203,219,369 -"YDR242W",612,718,538,433,437,330,377,378,695 -"YDR243C",313,404,427,457,266,183,193,188,323 -"YDR244W",1233,1431,936,469,699,2307,1522,1281,1586 -"YDR245W",932,1195,1413,2031,2125,693,865,819,1199 -"YDR246W",548,545,386,166,189,389,448,428,772 -"YDR246W-A",23,14,10,5,9,37,25,22,49 -"YDR247W",724,568,300,85,254,787,706,666,987 -"YDR248C",1110,1382,1235,1071,493,841,738,852,1603 -"YDR249C",149,195,212,277,319,98,91,114,171 -"YDR251W",1078,1084,806,535,855,1182,906,906,1300 -"YDR252W",85,72,78,56,31,84,107,84,134 -"YDR253C",597,746,843,1312,526,255,453,471,775 -"YDR254W",608,502,320,172,283,530,502,453,736 -"YDR255C",855,769,486,154,281,585,567,603,904 -"YDR256C",10753,8212,4002,404,354,43475,29705,19465,22136 -"YDR257C",362,497,541,852,1011,243,320,315,413 -"YDR258C",11660,8819,5236,1133,1254,14785,7934,8183,14886 -"YDR259C",186,236,351,411,306,207,268,187,233 -"YDR260C",350,336,300,343,295,224,277,325,510 -"YDR261C",163,206,198,264,328,304,171,151,237 -"YDR261W-B",43,61,61,19,15,28,18,9,36 -"YDR261C-D",50,55,56,32,54,37,40,39,65 -"YNCD0020W",56,37,23,18,5,27,28,35,55 -"YDR262W",3255,2858,1987,1176,1054,1822,1955,2278,4505 -"YDR263C",114,115,72,54,144,201,131,97,176 -"YDR264C",1497,1675,1562,1190,1215,1105,1203,1288,1835 -"YDR265W",431,470,361,219,283,423,397,392,609 -"YDR266C",465,562,751,1256,1248,255,392,352,512 -"YDR267C",453,515,548,679,717,351,408,403,610 -"YDR268W",133,159,170,170,195,532,159,129,155 -"YDR270W",735,747,646,227,242,762,564,517,847 -"YDR272W",1842,1784,1415,1048,1146,1651,1605,1734,2634 -"YDR273W",158,132,104,97,151,222,140,139,257 -"YDR274C",180,159,114,68,85,200,211,156,236 -"YDR275W",1696,1807,1219,437,630,803,607,815,1964 -"YDR276C",4621,3514,2313,1149,1296,6672,5767,5327,7846 -"YDR277C",903,894,934,257,1236,606,846,812,1309 -"YDR279W",436,506,460,383,546,310,335,402,572 -"YDR280W",448,501,640,1003,1121,300,395,419,613 -"YDR281C",34,48,68,80,79,12,11,31,54 -"YDR282C",459,457,375,284,346,505,327,332,587 -"YDR283C",1301,1291,897,624,888,820,825,788,1261 -"YDR284C",793,729,578,203,287,686,697,733,1127 -"YDR285W",385,302,194,162,198,353,269,299,470 -"YDR286C",193,197,126,77,147,362,195,232,323 -"YDR287W",625,637,460,342,313,702,615,583,1003 -"YDR288W",353,368,285,363,534,382,363,344,515 -"YDR289C",678,706,568,535,782,526,653,630,997 -"YDR291W",735,814,706,785,747,396,447,481,829 -"YDR292C",1205,1361,1268,1675,1986,994,1044,997,1465 -"YDR293C",5005,4214,2675,1095,1361,4651,4098,4216,6634 -"YDR294C",2436,2386,1838,1005,676,2624,2541,2102,3285 -"YDR295C",559,590,558,615,882,319,398,444,619 -"YDR296W",363,403,479,381,494,1949,589,407,622 -"YDR297W",791,1014,1589,2404,1906,477,504,610,995 -"YDR298C",2740,2840,2510,2453,2903,4461,3556,3012,3815 -"YDR299W",660,1090,1968,4186,2850,53,265,257,522 -"YDR300C",479,644,741,1140,1974,278,525,463,708 -"YDR301W",440,535,623,528,459,248,342,308,468 -"YDR302W",306,356,455,485,439,368,351,312,470 -"YDR303C",636,775,596,601,755,518,523,430,752 -"YDR304C",1334,1315,1198,1116,1253,2413,1429,1387,2279 -"YDR305C",446,456,312,211,293,581,450,461,683 -"YDR306C",1070,1018,662,276,392,1038,1021,1030,1458 -"YDR307W",1297,1208,873,468,532,877,820,883,1475 -"YDR308C",341,379,403,487,415,323,322,301,450 -"YDR309C",75,163,240,676,2089,106,54,64,59 -"YDR310C",1539,1577,1544,1661,1681,818,1185,1236,1914 -"YDR311W",708,682,679,569,590,307,508,596,834 -"YDR312W",526,584,719,978,1074,227,349,352,566 -"YDR313C",1690,1425,1034,502,457,1194,990,1147,2080 -"YDR314C",336,370,289,220,150,298,214,225,350 -"YDR315C",251,234,199,100,78,200,234,218,339 -"YDR316W",374,423,423,367,443,1738,481,380,527 -"YDR317W",234,267,199,225,243,204,242,215,333 -"YDR318W",431,434,351,220,247,419,416,347,530 -"YDR319C",647,567,423,302,273,486,536,585,1014 -"YDR320C",537,613,495,429,278,340,309,334,521 -"YDR320C-A",325,314,277,259,144,453,403,366,559 -"YDR321W",561,738,923,1656,2100,148,319,412,648 -"YDR322W",345,392,377,409,557,1381,421,336,469 -"YDR322C-A",1077,1110,945,733,1371,2073,1771,1323,1850 -"YDR323C",365,402,322,216,213,211,269,279,487 -"YDR324C",886,1445,2163,4968,3619,149,494,459,815 -"YDR325W",675,761,866,1059,1015,579,673,521,717 -"YDR326C",793,838,947,1466,938,544,560,526,828 -"YDR328C",2760,2480,2016,1341,1757,3606,3279,3253,4966 -"YDR329C",2334,2155,1466,451,829,2215,2101,2216,3599 -"YDR330W",1261,1130,793,158,205,1208,1010,1086,1828 -"YDR331W",400,470,542,613,729,283,305,290,402 -"YDR332W",555,566,421,327,369,458,430,384,707 -"YDR333C",900,960,905,975,1387,511,640,618,969 -"YDR334W",1308,1258,1039,884,924,1292,1289,920,1394 -"YDR335W",2405,2376,1976,1227,1141,1622,1681,1645,2716 -"YDR336W",256,260,264,241,270,188,188,210,322 -"YDR337W",400,472,453,463,560,1799,558,432,687 -"YDR338C",638,636,436,326,450,481,468,575,763 -"YDR339C",410,548,711,1290,1642,196,363,380,558 -"YDR341C",2678,3178,3248,5273,7042,1185,1574,1907,3163 -"YDR342C",2012,2002,1925,1062,2982,6727,4769,2885,3118 -"YDR343C",2716,1591,895,280,1298,5826,4186,4340,5690 -"YDR344C",4,1,5,1,8,21,15,9,16 -"YDR345C",316,428,583,816,527,194,247,246,438 -"YDR346C",2636,3216,3348,4668,3776,1766,1879,1822,3058 -"YDR347W",428,507,508,590,555,1598,445,373,560 -"YDR348C",504,704,878,1411,1485,547,596,537,648 -"YDR349C",912,1000,978,1138,1328,544,572,603,1043 -"YDR350C",752,766,742,542,490,581,576,531,887 -"YDR351W",971,1126,981,1137,985,511,642,686,1037 -"YDR352W",498,601,596,585,640,316,404,449,722 -"YDR353W",1218,1552,1798,2634,3221,1449,1213,1571,1935 -"YDR354W",1043,1161,1214,863,864,559,1016,1007,1440 -"YDR356W",1145,1212,893,547,565,974,786,825,1218 -"YDR357C",1119,895,636,420,422,1272,1297,1129,1735 -"YDR358W",1393,1196,601,42,125,1344,1058,1150,1765 -"YDR359C",1203,880,582,471,599,995,1083,910,1190 -"YDR361C",526,713,960,1666,1822,118,259,294,638 -"YDR362C",610,720,592,534,719,625,538,570,913 -"YDR363W",477,529,482,525,324,283,338,321,601 -"YDR363W-A",1741,1525,1261,1004,950,1737,1773,1653,2566 -"YDR364C",488,550,516,731,669,220,275,330,586 -"YDR365C",4701,4352,3764,4281,4555,4755,4065,3094,5562 -"YDR365W-B",12,9,11,9,6,6,6,7,8 -"YDR366C",7,14,4,8,7,14,6,4,5 -"YDR367W",422,440,416,361,417,427,381,361,586 -"YDR368W",1515,1497,1197,682,284,1219,1090,1292,2069 -"YDR369C",613,666,557,278,222,344,423,441,710 -"YDR370C",468,541,481,410,597,294,384,381,577 -"YDR371W",445,489,381,218,251,383,378,359,564 -"YDR372C",1344,1423,1167,1285,1690,980,1110,1026,1672 -"YDR373W",1004,1056,854,701,736,776,859,943,1630 -"YDR374C",10,17,21,18,18,9,6,7,17 -"YDR374W-A",255,220,181,140,174,209,194,242,348 -"YDR375C",362,376,355,254,402,1662,509,397,539 -"YDR376W",404,509,498,420,482,544,370,366,539 -"YDR377W",2312,2350,1765,1242,1827,3446,3394,2997,3739 -"YDR378C",519,488,379,332,576,477,574,639,1020 -"YDR379W",985,1099,935,626,873,668,756,780,1245 -"YDR379C-A",564,435,272,114,58,665,631,650,1070 -"YDR380W",1454,1570,1312,451,119,1249,1696,1688,2136 -"YDR381W",3546,3083,2534,2757,4261,3758,3495,3293,4935 -"YDR381C-A",262,300,244,145,248,574,222,252,442 -"YDR382W",3179,3911,4243,7760,12972,829,2131,2418,4708 -"YDR383C",283,263,265,149,120,212,215,216,414 -"YDR384C",8020,6257,3372,817,672,10711,10359,8753,13233 -"YDR385W",2012,2384,2371,3696,4701,421,532,853,2059 -"YDR386W",433,478,408,224,274,425,363,366,531 -"YDR387C",575,577,460,338,426,485,344,414,685 -"YDR388W",1746,1718,1306,855,616,1734,1581,1722,2828 -"YDR389W",703,700,589,508,804,814,798,534,819 -"YDR390C",1069,1054,861,786,1128,1011,1048,972,1503 -"YDR391C",291,287,205,244,226,369,250,295,493 -"YDR392W",618,676,549,404,594,493,520,557,861 -"YDR393W",315,401,384,295,414,636,349,305,503 -"YDR394W",3982,3650,2857,1836,1792,2976,3639,3460,5814 -"YDR395W",1037,1411,1888,4302,3798,307,563,538,889 -"YDR397C",700,658,647,920,914,610,709,916,1281 -"YDR398W",413,815,2020,4231,1745,65,181,189,384 -"YDR399W",2836,3724,4636,7232,10342,1386,2260,2629,3881 -"YDR400W",200,264,266,311,454,142,120,136,238 -"YDR402C",166,127,64,39,81,255,167,149,238 -"YDR403W",125,139,110,90,96,282,166,127,195 -"YDR404C",375,370,411,460,726,400,423,385,569 -"YDR405W",590,668,519,312,529,1942,909,689,985 -"YDR406W",890,913,640,322,356,889,613,650,1014 -"YDR407C",632,673,671,500,521,420,475,434,612 -"YDR408C",438,468,475,841,1308,488,419,439,691 -"YDR409W",635,755,533,460,581,533,538,522,737 -"YDR410C",241,270,212,257,450,161,199,216,356 -"YDR411C",711,614,460,200,355,745,742,745,1062 -"YDR412W",400,577,858,1826,2238,145,251,282,491 -"YDR414C",268,304,281,270,333,222,211,208,361 -"YDR415C",414,502,463,439,492,336,389,357,542 -"YDR416W",609,664,651,723,706,292,419,423,690 -"YDR418W",3418,3896,4104,7315,10606,1130,2661,2748,4876 -"YDR419W",562,672,619,536,625,378,402,404,709 -"YDR420W",1010,1035,965,1070,842,396,513,554,953 -"YDR421W",776,832,626,464,513,584,585,564,917 -"YDR422C",983,876,685,586,753,698,745,756,1204 -"YDR423C",548,612,423,244,383,449,489,498,775 -"YDR424C",482,429,317,222,258,624,527,575,887 -"YDR425W",504,572,372,118,220,427,435,434,582 -"YDR427W",3152,3010,2261,1777,1935,2721,3046,2756,4046 -"YDR428C",348,421,406,519,545,305,303,327,526 -"YDR429C",1760,2004,2433,4141,5413,1208,1543,1384,2315 -"YDR430C",747,909,752,543,504,2601,824,644,877 -"YDR432W",2069,2966,3528,5030,3202,1049,931,1119,2137 -"YDR434W",1091,1159,941,822,932,799,812,825,1260 -"YDR435C",406,387,268,71,154,631,418,496,753 -"YDR436W",789,759,498,195,324,878,685,669,1121 -"YDR437W",82,93,66,77,94,49,50,75,127 -"YDR438W",364,350,272,243,433,399,308,312,447 -"YDR439W",289,298,295,291,338,164,212,214,333 -"YDR440W",312,357,436,302,339,190,252,268,430 -"YDR441C",708,743,881,1102,1175,334,514,521,795 -"YDR443C",766,839,672,308,326,591,585,521,825 -"YDR444W",287,321,273,304,371,406,307,279,416 -"YDR446W",1,9,4,10,8,2,12,5,8 -"YDR447C",2394,2651,2764,5066,9169,745,1846,2081,3542 -"YDR448W",322,359,379,431,457,184,224,227,357 -"YDR449C",357,567,886,1746,1498,32,149,162,323 -"YDR450W",4456,4763,5026,8272,14832,1811,3265,3448,5995 -"YDR451C",141,173,145,106,145,597,517,213,201 -"YDR452W",2557,2527,2060,1317,957,2629,2296,2121,3382 -"YDR453C",292,282,204,132,102,274,147,191,380 -"YDR454C",930,1098,1124,1881,2793,884,783,780,1445 -"YDR456W",1304,1190,928,561,691,1132,1123,1016,1684 -"YDR457W",2178,2356,2034,1758,1473,1640,1569,1543,2251 -"YDR458C",1394,1429,1291,1088,968,997,1000,1012,1587 -"YDR459C",384,423,408,395,419,273,345,335,580 -"YDR460W",446,433,413,366,573,373,428,379,604 -"YDR461W",52,40,47,38,78,49,34,39,82 -"YDR461C-A",372,325,226,104,83,375,445,535,712 -"YDR462W",342,332,285,171,330,1035,417,384,514 -"YDR463W",1631,1682,1809,2053,1811,966,1171,1204,1787 -"YDR464W",682,896,1102,1550,998,495,584,529,822 -"YDR465C",751,1239,1966,3810,3359,126,354,405,873 -"YDR466W",896,925,923,696,362,766,769,733,1143 -"YDR468C",644,684,589,625,684,634,631,611,906 -"YDR469W",319,367,428,569,490,270,305,289,428 -"YDR470C",509,540,397,184,229,847,470,493,649 -"YDR471W",3076,3584,4500,8255,11658,753,2373,2369,4075 -"YNCD0030W",3,2,2,3,4,2,2,1,3 -"YDR472W",302,350,407,508,452,172,253,229,424 -"YDR473C",707,736,635,652,739,573,642,594,937 -"YDR475C",958,916,730,500,522,772,775,739,1135 -"YDR476C",405,413,327,269,299,387,393,376,558 -"YDR477W",1593,1474,978,661,1035,1927,1429,1375,2030 -"YDR478W",141,193,198,338,233,61,94,109,168 -"YDR479C",991,817,529,358,583,980,820,800,1225 -"YDR480W",192,193,171,98,205,307,239,186,275 -"YDR481C",1344,1340,1195,912,1157,1230,1179,1346,1953 -"YDR482C",262,321,388,727,619,265,208,235,378 -"YDR483W",2363,2567,2651,3915,3452,1589,1455,1637,2785 -"YDR484W",566,484,454,321,449,377,383,416,538 -"YDR485C",995,1018,926,984,847,884,884,807,1387 -"YDR486C",985,980,857,717,664,895,814,827,1272 -"YDR487C",796,917,1001,1054,862,1221,952,903,1323 -"YDR488C",183,221,285,379,78,323,141,154,255 -"YDR489W",124,150,172,254,226,135,128,132,186 -"YDR490C",845,727,523,147,350,947,796,744,1097 -"YDR492W",658,794,878,940,725,470,544,439,642 -"YDR493W",173,209,166,179,234,635,225,193,283 -"YDR494W",773,892,641,524,792,3636,1010,829,1131 -"YDR495C",642,605,450,395,585,408,405,420,766 -"YDR496C",915,1424,2450,5710,4303,94,387,468,816 -"YDR497C",12708,11288,10671,11184,8083,21146,30051,24901,25571 -"YDR498C",453,507,478,349,396,351,452,397,599 -"YDR499W",847,844,742,444,389,509,556,586,915 -"YDR500C",2471,2750,2968,4759,7776,915,1850,2057,3620 -"YDR501W",179,182,149,170,198,162,157,121,213 -"YDR502C",4640,6548,8755,19712,10878,2883,6611,5070,6126 -"YDR503C",305,352,233,169,270,193,199,215,341 -"YDR504C",154,171,98,59,94,181,155,124,221 -"YDR505C",2251,2184,1443,615,723,2213,1816,1593,2363 -"YDR506C",481,486,402,227,115,274,285,296,563 -"YDR507C",1107,1383,1363,988,1653,818,882,1026,1183 -"YDR508C",421,739,1957,3796,1572,304,327,246,451 -"YDR510W",896,917,760,699,735,802,685,712,1201 -"YDR511W",368,352,302,174,238,1368,446,401,579 -"YDR512C",743,658,442,269,165,934,828,832,1177 -"YDR513W",3549,2839,1775,568,396,3925,2911,3366,5726 -"YDR514C",265,413,474,804,589,153,274,187,324 -"YDR515W",578,678,536,702,628,568,467,398,570 -"YDR516C",1699,1362,839,208,326,3443,1373,1754,2570 -"YDR517W",784,848,702,468,793,806,759,880,1238 -"YDR518W",345,379,318,283,313,175,200,251,384 -"YDR519W",679,759,626,574,438,536,538,657,1148 -"YDR520C",626,678,478,438,511,284,420,410,680 -"YDR522C",81,60,48,29,80,76,73,66,111 -"YDR523C",83,85,75,82,140,87,60,65,99 -"YDR524C",752,677,490,588,1094,394,467,540,815 -"YDR524W-C",2067,2475,2857,5142,6709,2573,2117,1738,2355 -"YDR524C-B",4729,5841,6346,11142,14558,7584,6322,5522,6857 -"YDR525W",7,5,5,1,5,7,7,4,18 -"YDR525W-A",406,310,234,114,141,311,394,375,562 -"YDR527W",476,773,1696,2280,735,123,240,277,506 -"YNCD0032C",44,41,52,44,57,21,39,28,48 -"YDR528W",259,359,427,431,763,73,148,164,281 -"YDR529C",4382,4061,3064,2205,4029,9141,7629,5881,7069 -"YDR530C",364,439,356,326,380,440,385,357,556 -"YDR531W",1696,1796,1552,1609,1067,790,1300,1354,2001 -"YDR532C",398,419,363,321,540,412,364,331,542 -"YDR533C",2275,2409,1604,990,645,543,588,959,2523 -"YDR534C",233,157,90,37,155,309,264,265,293 -"YDR536W",1021,844,412,73,163,1602,1316,1925,1931 -"YDR538W",359,352,230,174,262,177,225,296,505 -"YDR539W",342,292,252,205,310,401,290,317,484 -"YDR540C",28,15,27,33,56,48,31,34,41 -"YDR541C",232,300,251,289,300,191,171,177,360 -"YEL077C",129,125,115,87,150,81,82,108,181 -"YEL073C",345,323,286,200,301,595,572,489,699 -"YEL072W",201,342,399,672,432,169,170,178,280 -"YEL071W",2004,2751,4217,4587,3336,1891,2233,1423,2408 -"YEL070W",51,51,24,6,16,68,43,63,74 -"YEL069C",14,24,18,8,17,34,7,20,24 -"YEL068C",165,183,172,143,118,239,239,168,274 -"YEL067C",113,131,100,54,54,134,121,122,154 -"YEL066W",553,640,608,553,404,604,431,654,1036 -"YEL065W",207,265,256,180,419,158,144,167,271 -"YEL064C",340,377,278,182,262,200,234,287,395 -"YEL063C",1504,2020,3053,5438,4068,638,1014,1014,1400 -"YEL062W",467,541,549,528,425,283,345,362,588 -"YEL061C",585,634,659,635,525,682,466,420,604 -"YEL060C",18565,15128,10254,4207,3118,14864,14607,15288,26234 -"YEL059C-A",221,199,163,141,165,156,220,233,377 -"YEL059W",67,73,67,46,60,42,47,67,116 -"YEL058W",2036,2127,2011,1782,1599,1083,1580,1839,2990 -"YEL057C",637,424,194,38,55,1214,665,661,1113 -"YEL056W",632,624,493,246,394,427,506,501,800 -"YEL055C",1226,1633,1775,2750,2837,557,572,672,1054 -"YEL054C",2066,2759,3277,6365,8497,480,1332,1385,2614 -"YEL053C",625,718,704,817,721,332,393,385,636 -"YEL052W",766,783,688,544,680,1448,722,659,1034 -"YEL051W",1863,1892,1623,1772,1763,1425,1513,1611,2608 -"YEL050C",512,611,575,545,705,2482,650,554,739 -"YNCE0002W",2,6,5,4,13,5,2,8,4 -"YEL049W",75,73,32,18,38,61,61,74,114 -"YEL048C",117,136,144,222,161,34,68,91,136 -"YEL047C",470,543,485,637,455,397,298,345,662 -"YEL046C",1758,2185,2850,3843,2687,303,584,721,1542 -"YEL044W",701,733,584,531,731,790,854,859,1323 -"YEL043W",1046,1216,1237,1533,1187,846,772,726,1085 -"YEL042W",1008,1312,1910,3833,2571,964,822,749,1162 -"YEL041W",5207,6771,6072,1097,94,3361,2951,3452,5940 -"YEL040W",165,240,436,1166,1728,184,368,154,174 -"YEL039C",344,266,189,39,31,560,335,288,506 -"YEL038W",270,304,417,495,162,306,252,295,524 -"YEL037C",2655,2829,2735,3326,2920,1475,2231,1993,3349 -"YEL036C",1289,1608,2025,2669,2289,944,1073,1056,1636 -"YEL035C",20,29,10,11,13,66,55,42,63 -"YEL034W",30064,25153,19821,17772,19263,34531,37181,31901,49088 -"YEL033W",5076,4334,3520,3047,3573,5538,5280,4261,6050 -"YEL032W",1061,1408,1687,2254,2235,340,702,849,1172 -"YEL031W",3033,3501,3386,3389,2489,1403,1836,1804,3107 -"YEL030W",552,614,425,180,136,318,255,266,634 -"YEL029C",328,446,604,950,877,119,206,208,425 -"YEL028W",117,90,54,43,81,71,64,76,140 -"YEL027W",3852,4063,4214,5782,5214,2910,3068,3115,5068 -"YEL026W",302,698,1157,2645,2277,53,166,196,328 -"YEL025C",1015,981,807,572,637,572,699,678,1065 -"YEL024W",4031,3750,2772,1873,3316,6933,6374,5196,6466 -"YEL023C",453,472,384,278,290,245,332,315,579 -"YEL022W",900,1049,1024,1047,1384,349,525,518,806 -"YEL021W",587,698,759,1318,1538,605,604,540,895 -"YEL020W-A",643,652,788,843,848,1696,707,757,1002 -"YNCE0007C",3,4,5,2,8,4,9,2,13 -"YEL020C",1904,1671,1345,972,898,720,1090,1488,2671 -"YEL019C",109,163,159,186,114,36,62,52,115 -"YEL018W",382,444,403,474,564,280,360,300,531 -"YEL017C-A",902,899,803,1384,1362,357,424,575,995 -"YEL017W",449,473,328,206,250,769,566,430,669 -"YEL016C",400,419,379,438,437,369,314,302,482 -"YEL015W",1175,1267,1283,1730,1654,1065,1038,1004,1532 -"YEL014C",57,56,42,44,54,37,47,40,54 -"YEL013W",1608,1537,1155,921,804,1230,1164,1169,1949 -"YEL012W",1605,1455,975,190,409,1550,1637,1655,2618 -"YEL011W",7833,5773,2523,103,551,9324,6467,7188,11443 -"YEL009C-A",22,4,7,6,8,23,9,6,17 -"YEL009C",27370,23805,19814,21250,23648,17432,25826,24988,40088 -"YEL008W",35,26,20,4,12,38,39,26,50 -"YEL007W",1759,1399,1104,1018,2298,1652,1459,1267,1789 -"YEL006W",665,725,717,779,759,456,504,506,817 -"YEL005C",425,441,295,152,126,355,321,373,595 -"YEL004W",381,362,285,210,206,227,241,263,448 -"YEL003W",517,565,510,695,969,320,435,431,714 -"YEL002C",2198,2248,2001,1820,1685,1507,1618,1783,2816 -"YEL001C",872,983,942,1039,1465,866,767,748,1173 -"YER001W",679,1011,1180,1772,1156,254,292,355,621 -"YER002W",896,1188,1713,3280,3067,262,600,742,1214 -"YER003C",874,1005,853,782,820,660,598,741,1169 -"YER004W",5498,4820,3528,1933,1126,4397,5081,5144,8613 -"YER005W",582,620,631,865,916,395,370,385,667 -"YER006W",1207,1760,2623,5872,6115,202,546,537,1091 -"YER007W",352,325,359,342,368,290,239,232,383 -"YER007C-A",786,822,851,1147,1411,418,601,719,1116 -"YNCE0011C",14,11,12,10,5,9,3,10,14 -"YER008C",960,1031,974,994,766,660,657,634,1090 -"YER009W",1337,1495,1314,1645,2725,1353,1345,1415,2033 -"YER010C",1284,1292,977,588,536,1279,1171,1217,2012 -"YER011W",29,19,18,11,19,71,29,23,45 -"YER012W",2903,2865,2225,1732,1559,2439,2862,2681,4183 -"YER013W",470,544,542,621,521,235,319,326,616 -"YER014W",592,638,650,587,186,460,466,534,837 -"YER015W",4891,4697,3145,563,167,11855,6112,4574,6378 -"YER016W",330,388,410,415,537,331,321,314,472 -"YER017C",1300,1211,889,682,1065,2224,1179,1233,1710 -"YER018C",217,207,200,162,277,390,270,241,398 -"YER019W",451,495,435,340,457,475,448,447,714 -"YER019C-A",1165,1031,909,929,1383,1131,1221,1311,1973 -"YER020W",1797,1576,1147,603,956,1765,1410,1662,2718 -"YER021W",5239,5039,3662,2652,2695,4141,4462,4424,6709 -"YER022W",848,864,790,663,702,555,569,575,997 -"YER023W",1626,1514,1347,1305,1013,1847,1683,1773,2659 -"YER024W",5020,4472,3314,974,1427,8872,12120,7411,8699 -"YER025W",2279,2765,2864,4543,5069,1207,1727,1639,2689 -"YER026C",2393,2270,1880,1178,1162,4708,3941,3538,4126 -"YER027C",522,622,500,339,343,555,432,403,635 -"YER028C",84,92,90,63,28,49,49,53,124 -"YER029C",526,550,598,721,875,485,517,554,825 -"YER030W",2516,2289,2000,1377,1131,3118,2814,2475,3881 -"YER031C",816,919,693,708,878,778,960,893,1402 -"YER032W",367,469,435,396,299,450,398,259,419 -"YER033C",390,425,335,315,264,318,252,257,402 -"YER034W",366,337,334,303,268,244,355,384,609 -"YER035W",605,539,535,382,226,364,396,488,883 -"YER036C",2397,3561,5734,11910,5578,439,780,1089,2426 -"YER037W",486,522,508,443,228,265,263,348,626 -"YER038C",287,320,328,332,275,124,170,185,348 -"YER039C",251,213,171,69,56,167,192,218,377 -"YER039C-A",162,162,116,41,29,162,147,153,301 -"YER040W",645,724,632,602,548,333,404,392,557 -"YER041W",387,445,443,331,234,311,334,292,524 -"YER042W",1967,2124,1655,1593,1264,1452,1362,1661,2869 -"YER043C",2678,4151,6971,14450,9587,3209,3243,2504,3099 -"YER044C",1108,1042,734,469,476,2106,1354,1260,1805 -"YER044C-A",22,27,40,67,49,24,7,8,18 -"YER045C",255,294,459,624,605,217,155,212,315 -"YER046W",278,270,211,102,214,227,265,283,495 -"YER047C",771,905,765,713,709,640,675,625,956 -"YER048C",1675,1637,1323,1146,1293,2447,1719,1553,2316 -"YER048W-A",461,446,374,303,374,1199,543,469,648 -"YER049W",887,1251,1939,4128,3561,297,535,514,866 -"YER050C",523,533,465,401,601,1728,688,540,787 -"YER051W",533,558,414,305,368,331,383,409,642 -"YER052C",2925,2813,3683,5884,2056,343,1487,1476,3083 -"YER053C",1216,818,394,101,206,2177,985,1095,2013 -"YER053C-A",8510,4964,1771,515,1281,6126,7286,7060,10297 -"YER054C",5863,3758,1423,58,83,9871,5170,5525,9235 -"YER055C",2411,2731,3088,5522,6139,2392,2065,1920,3258 -"YER056C",2571,4575,10135,19583,10323,313,1108,1448,2500 -"YER056C-A",1415,1746,2063,3951,5164,281,808,775,1670 -"YER057C",1437,1390,1232,1254,1149,1311,1072,1173,1895 -"YER058W",240,219,170,122,138,1479,332,282,348 -"YER059W",578,542,420,196,274,388,483,515,778 -"YER060W",494,536,589,894,735,245,290,305,485 -"YER060W-A",271,361,443,637,437,133,131,183,259 -"YER061C",341,502,643,1009,415,170,140,175,303 -"YER062C",625,1330,4291,9256,1478,169,272,352,672 -"YER063W",564,675,596,569,519,515,525,565,872 -"YER064C",222,387,765,465,408,71,132,114,224 -"YER065C",1914,1957,1478,785,809,1933,2631,1913,3051 -"YNCE0015C",3,15,7,5,5,5,5,6,9 -"YER066W",257,292,192,90,112,343,295,304,441 -"YER067W",761,375,125,34,210,5226,889,2731,2721 -"YER068W",754,844,841,868,1090,569,770,617,901 -"YER069W",6500,5321,4666,7699,5692,1021,3717,3615,6808 -"YER070W",908,1310,1121,1022,2946,624,420,521,891 -"YER071C",228,257,194,176,225,305,254,227,377 -"YER072W",599,667,650,756,961,359,461,451,703 -"YER073W",2069,2675,4324,9510,2840,375,1028,1095,2120 -"YER074W",2784,3098,3248,5133,9063,859,2031,2276,4367 -"YER074W-A",505,547,406,362,468,466,471,485,796 -"YER075C",867,987,973,917,929,604,477,625,999 -"YER076C",180,193,169,144,168,165,153,172,261 -"YER077C",450,434,544,598,521,427,332,251,498 -"YER078C",395,369,273,239,458,851,324,304,494 -"YER079W",1064,915,618,271,264,1049,934,956,1509 -"YER080W",1838,1804,1370,767,690,2774,1606,1570,2431 -"YNCE0017W",126,81,50,49,153,103,83,88,140 -"YER081W",1141,1170,1313,4691,1893,697,1027,964,1565 -"YER082C",792,1127,1753,3076,2489,265,475,525,964 -"YER083C",670,695,720,669,648,300,368,436,717 -"YER084W",157,163,77,15,30,104,91,137,261 -"YER085C",14,9,31,58,19,4,9,10,16 -"YER086W",1968,2401,3258,6941,4281,706,1174,1312,2204 -"YER087W",282,314,320,202,164,1063,315,247,365 -"YER087C-B",545,561,452,479,629,478,482,444,726 -"YER088C",1847,1782,1694,1704,1519,2304,1650,1485,2332 -"YER089C",927,922,952,937,899,695,770,709,1146 -"YER090W",1391,1272,1321,1636,1376,567,1046,955,1682 -"YER091C",8908,13446,19294,51294,21193,2125,3171,4188,7890 -"YER092W",469,535,526,598,540,220,416,460,712 -"YER093C",642,717,727,782,690,454,424,418,633 -"YER093C-A",209,224,183,124,154,666,284,231,342 -"YER094C",2759,2475,1961,1333,1501,2786,3263,3165,4756 -"YER095W",1442,1487,1202,577,897,1289,1187,1482,2458 -"YER096W",846,907,701,378,142,125,325,468,1056 -"YER098W",403,449,433,267,576,328,269,247,471 -"YER099C",792,812,740,891,1041,723,711,718,1284 -"YER100W",1499,1526,1390,1211,1294,1098,1263,1250,2160 -"YER101C",482,472,359,175,169,407,353,342,683 -"YER102W",1273,1558,1899,3492,5955,371,933,899,1695 -"YER103W",11538,8717,6113,2090,444,7814,5677,6962,16286 -"YER104W",250,269,222,108,140,245,229,220,374 -"YER105C",1845,2022,1793,1792,1960,1185,1297,1290,1883 -"YER106W",91,106,94,92,51,37,56,67,109 -"YER107C",564,626,618,577,645,525,647,600,818 -"YER109C",283,355,372,498,383,180,221,183,292 -"YER110C",2163,2862,3426,6835,6802,513,1013,1118,1993 -"YER111C",1155,1181,946,382,1106,673,807,830,1166 -"YER112W",1067,1049,970,1020,1108,910,1063,939,1221 -"YER113C",493,591,537,647,878,328,330,292,537 -"YER114C",1168,1151,1151,1492,1312,600,679,669,1075 -"YER115C",224,190,133,104,123,171,175,180,332 -"YER116C",366,410,320,223,208,255,293,295,529 -"YER117W",3246,3689,3974,6765,11859,1286,3020,2867,5142 -"YER118C",508,632,603,721,904,323,381,381,628 -"YER119C",789,698,471,163,229,825,652,650,1119 -"YER120W",1720,1921,1662,1636,1647,1443,1583,1301,2177 -"YER121W",1295,963,462,78,55,3392,2245,2113,2892 -"YER122C",2118,2168,2307,3135,3575,1952,2078,1676,2514 -"YER123W",790,799,854,967,700,525,680,601,864 -"YER124C",3344,1938,1747,2913,1807,412,870,4740,7821 -"YER125W",2672,2571,1752,1262,1912,2668,2334,2340,3560 -"YER126C",825,1260,1992,4474,3724,70,435,469,871 -"YER127W",395,616,1175,2450,1608,64,204,219,371 -"YER128W",362,370,444,498,330,249,319,283,419 -"YER129W",1099,1121,1049,1076,1433,736,819,764,1319 -"YER130C",361,438,431,546,764,225,295,332,465 -"YER131W",2121,3007,3962,8133,14259,490,1255,1206,2572 -"YNCE0019W",44,37,28,48,98,37,39,41,69 -"YER132C",436,587,657,702,581,232,286,267,415 -"YER133W",3495,3355,2710,2815,3327,3223,3166,3312,4911 -"YER134C",267,304,234,288,361,373,264,279,406 -"YER135C",23,18,18,5,7,29,20,15,30 -"YER136W",3878,3812,2813,1338,1306,3699,3288,3246,4766 -"YER137C",91,110,190,321,398,23,42,45,88 -"YNCE0024W",42,27,29,31,78,66,112,78,158 -"YER139C",512,577,464,388,235,301,340,368,610 -"YER140W",328,410,475,485,484,151,250,267,386 -"YER141W",2011,1816,1336,790,770,5434,2257,1823,2708 -"YER142C",1387,1363,1081,388,329,728,889,1007,1667 -"YER143W",1897,1869,1499,599,623,1831,1794,1760,2650 -"YER144C",912,894,882,620,489,706,683,723,1036 -"YER145C",1738,2183,2311,2248,2283,1047,1370,1413,2437 -"YER145C-A",11,16,12,14,36,19,26,14,11 -"YER146W",36,22,29,44,75,41,56,49,81 -"YER147C",513,554,558,451,516,408,398,480,749 -"YER148W",945,1065,1212,2151,2526,788,992,898,1359 -"YER149C",414,545,625,744,685,267,278,299,490 -"YER150W",1058,905,555,221,132,2261,785,793,1479 -"YER151C",1064,1269,1593,2422,1115,912,793,784,1245 -"YER152C",922,799,703,560,458,1042,699,905,1596 -"YER153C",130,133,103,69,52,104,99,128,218 -"YER154W",484,511,498,642,777,721,403,390,629 -"YER155C",1681,1849,1575,1836,1981,1273,1164,1069,1588 -"YER156C",474,688,818,1599,1922,308,496,452,646 -"YER157W",613,696,682,785,623,353,447,396,681 -"YER158C",498,799,1356,2486,2184,321,234,355,478 -"YER159C",1580,1259,1159,1172,1676,1434,1917,1718,2532 -"YER161C",570,584,576,620,827,506,615,570,827 -"YER162C",905,884,738,576,603,586,610,633,1133 -"YER163C",209,263,223,250,407,488,195,179,257 -"YER164W",1226,1344,1180,1395,1285,808,798,756,1185 -"YER165W",6400,7258,8156,13026,10731,2314,3591,3872,6825 -"YER166W",1481,1592,1380,1038,779,1151,981,940,1555 -"YER167W",988,1120,1037,947,839,450,754,775,1208 -"YER168C",342,491,510,729,954,303,356,277,440 -"YER169W",808,937,1317,1997,302,447,413,555,1008 -"YER170W",238,234,160,80,262,853,358,302,329 -"YER171W",752,784,697,776,1212,487,572,528,827 -"YER172C",943,1115,1009,1101,1291,495,570,579,919 -"YER173W",477,475,372,282,354,371,413,383,620 -"YER174C",850,911,740,740,1317,646,755,841,1340 -"YER175C",864,729,538,361,243,466,537,528,891 -"YER175W-A",18,31,23,12,19,13,8,10,37 -"YER176W",802,881,953,1176,869,626,585,572,923 -"YER177W",10505,9524,7240,4638,2131,11209,9349,9914,15477 -"YER178W",5224,5017,3923,2952,1770,5660,4941,4696,7490 -"YER179W",121,121,66,46,44,256,128,98,170 -"YER180C",272,267,234,243,286,140,157,194,342 -"YER180C-A",73,87,65,69,59,36,71,56,94 -"YER181C",10,10,2,3,4,5,6,3,12 -"YER182W",997,872,607,271,378,4333,1241,1061,1668 -"YER183C",294,318,288,296,379,202,253,252,354 -"YER184C",348,396,342,266,157,167,162,187,358 -"YER185W",148,166,100,120,127,101,72,103,184 -"YER186C",452,488,400,348,524,325,383,324,620 -"YER187W",57,79,77,84,114,44,53,53,81 -"YER188W",69,69,65,34,48,76,75,67,103 -"YER188C-A",12,10,13,7,6,11,8,9,12 -"YER190W",3,4,3,2,2,6,2,6,3 -"YFL067W",38,36,39,28,54,39,39,43,45 -"YFL066C",5,7,5,4,10,2,4,1,11 -"YFL062W",38,17,11,12,7,21,19,23,49 -"YFL061W",10,19,12,6,13,6,10,10,12 -"YFL060C",22,39,46,48,52,13,16,15,35 -"YFL059W",125,182,175,200,313,336,86,101,176 -"YFL058W",154,168,117,79,33,150,127,122,230 -"YFL056C",268,268,232,262,242,182,213,244,370 -"YFL055W",435,575,575,445,313,306,292,299,508 -"YFL054C",828,851,635,129,447,1599,977,861,1206 -"YFL053W",83,61,74,62,63,235,62,48,71 -"YFL052W",120,152,92,24,170,302,115,126,150 -"YFL051C",59,50,41,9,75,136,64,54,46 -"YFL050C",337,364,434,501,505,210,233,288,424 -"YFL049W",892,867,796,675,862,727,817,774,1069 -"YFL048C",992,990,895,757,1067,896,929,897,1276 -"YFL047W",595,741,794,693,812,408,364,393,651 -"YFL046W",685,710,635,553,525,720,735,697,1006 -"YFL045C",1884,1795,1350,1449,3148,2023,1676,1639,2824 -"YFL044C",1866,1746,1320,885,601,1335,1428,1440,2586 -"YFL042C",1061,916,620,191,176,949,807,883,1351 -"YFL041W-A",40,35,24,3,9,31,32,40,68 -"YFL041W",1367,1425,1240,929,941,1690,1124,1126,1737 -"YFL040W",150,146,107,58,63,83,84,89,177 -"YFL039C",12457,10263,8306,7037,5979,10306,9749,11095,20043 -"YFL038C",4561,4433,3861,3045,3701,6411,5638,5482,8258 -"YFL037W",2131,2118,2105,2413,2113,3640,2762,2194,3110 -"YNCF0001C",51,46,42,57,50,65,46,25,40 -"YFL036W",1051,1214,1157,992,1167,2024,933,799,1195 -"YFL034C-B",221,306,395,358,304,164,192,169,262 -"YFL034C-A",736,888,1235,2318,2254,131,434,537,994 -"YFL034W",598,653,626,527,601,540,536,487,741 -"YFL033C",1448,1502,1206,811,379,897,775,844,1446 -"YFL031W",1282,1404,1283,1835,2711,768,855,820,1342 -"YFL030W",3775,3653,2932,1510,566,8868,4168,4163,6264 -"YFL029C",398,435,333,262,163,458,436,417,614 -"YFL028C",678,787,893,1131,1279,538,602,554,899 -"YFL027C",418,476,430,386,295,265,305,331,488 -"YFL026W",217,229,154,157,206,192,204,225,297 -"YFL025C",511,575,487,535,717,444,249,287,466 -"YFL024C",1357,870,615,761,865,1492,1538,1265,1635 -"YFL023W",503,736,964,1422,999,101,204,264,526 -"YFL022C",1006,1585,2217,3924,3653,399,600,581,1031 -"YFL021W",2284,2326,2649,3575,5780,616,1770,2025,2973 -"YFL020C",30,26,24,11,8,27,15,16,31 -"YFL019C",29,37,23,11,10,31,17,24,44 -"YFL018C",5382,5214,3957,2595,2951,7115,5437,5121,7512 -"YFL017W-A",152,211,171,162,191,139,193,200,268 -"YFL017C",247,264,256,238,285,428,324,269,384 -"YFL016C",2214,2006,1348,467,795,4725,2017,1901,3541 -"YFL014W",96319,57968,28940,8136,921,80232,95421,109971,203911 -"YFL013C",1308,1287,1120,790,975,1371,1294,1204,1900 -"YFL012W",29,34,20,29,33,14,14,37,48 -"YFL011W",408,381,237,53,12,424,224,261,462 -"YFL010W-A",46,52,60,79,93,23,39,24,63 -"YFL010C",430,547,627,792,864,256,312,301,509 -"YFL009W",505,509,511,624,816,399,412,421,713 -"YFL008W",1483,1575,1039,526,972,1175,1045,1299,1921 -"YFL007W",5816,5747,4276,2105,1373,3465,3665,3927,6468 -"YFL005W",2033,1994,1647,1453,1631,2244,2007,1936,3247 -"YNCF0003C",171,189,140,125,148,185,154,162,263 -"YFL004W",2108,2130,1672,1549,1563,1574,1318,1318,2332 -"YFL003C",95,112,110,158,81,81,79,85,130 -"YFL002C",668,811,1057,1775,1435,244,409,415,718 -"YFL001W",274,401,548,1031,1071,156,222,237,317 -"YFR001W",1104,1346,1547,2087,2672,575,871,819,1328 -"YFR002W",1261,1517,1419,1835,1856,730,941,903,1343 -"YFR003C",826,742,508,207,235,1082,856,811,1290 -"YFR004W",3279,2993,2278,1838,2109,2894,3203,3153,4770 -"YFR005C",296,327,328,336,375,178,255,278,439 -"YFR006W",2134,1885,1592,1158,904,2036,1940,1819,2946 -"YFR007W",264,242,201,123,169,847,288,228,334 -"YFR008W",358,337,251,96,157,298,306,292,547 -"YFR009W",985,1224,1426,2266,2461,592,713,698,1127 -"YFR010W",2772,2585,2163,1510,1182,2362,2311,2241,3686 -"YFR011C",568,628,651,694,665,1370,850,653,806 -"YFR012W",61,89,69,59,85,33,40,31,51 -"YFR012W-A",3,9,11,12,9,5,3,4,7 -"YFR013W",583,662,669,637,680,373,431,373,672 -"YFR014C",1510,1385,1211,878,549,1374,1142,1269,2118 -"YFR015C",1213,849,439,65,151,4499,1470,1336,2062 -"YFR016C",1532,1487,1269,953,1177,1411,1103,1142,1895 -"YFR017C",1481,994,529,81,266,2586,1672,1614,2221 -"YFR018C",533,529,373,308,461,658,503,569,959 -"YFR019W",999,930,741,334,277,716,651,686,1055 -"YFR020W",620,651,512,546,558,522,470,465,767 -"YFR021W",319,355,275,194,169,225,257,206,385 -"YFR022W",327,274,193,139,228,338,221,238,424 -"YFR023W",157,152,137,110,112,83,96,100,154 -"YFR024C-A",2289,2302,1715,1019,767,2081,2017,2058,3366 -"YFR025C",538,618,597,608,679,660,604,531,862 -"YFR026C",62,86,54,23,62,104,70,57,131 -"YFR027W",193,232,165,99,213,185,162,176,325 -"YFR028C",571,704,724,774,999,619,750,598,834 -"YFR029W",454,538,585,479,541,305,358,378,524 -"YFR030W",4963,7330,8424,17821,16411,2331,2466,2543,4288 -"YFR031C",770,829,837,801,650,607,597,540,851 -"YFR031C-A",2846,3558,4034,6634,10343,849,2329,2285,4143 -"YFR032C-A",1536,1591,1702,2481,4754,444,1213,1555,2740 -"YFR032C-B",59,44,46,57,54,10,48,44,63 -"YFR033C",4232,3404,2968,2574,4152,12185,10616,6438,8044 -"YFR034C",520,562,712,988,901,375,462,483,817 -"YFR035C",276,296,268,322,297,223,248,253,450 -"YFR036W",152,174,268,320,269,102,142,148,241 -"YFR037C",1615,1763,1759,1925,2138,1755,1899,1712,2788 -"YFR038W",680,780,689,518,612,376,397,472,771 -"YFR039C",835,924,796,714,797,580,731,737,1161 -"YFR040W",1999,1788,1459,1586,1893,1714,1554,1626,2140 -"YFR041C",519,518,360,282,481,387,397,336,615 -"YFR042W",231,247,195,121,191,292,216,200,297 -"YFR043C",464,440,357,279,332,419,392,358,538 -"YFR044C",1749,1520,1267,956,429,2248,1770,1568,2607 -"YFR045W",325,341,236,112,142,701,379,325,524 -"YFR046C",244,304,286,180,246,270,243,227,370 -"YFR047C",1623,1478,1171,986,811,1700,1281,1480,2768 -"YFR048W",379,395,393,493,522,277,298,253,406 -"YFR049W",1330,1207,843,308,517,1746,1447,1418,2080 -"YFR050C",2979,2823,2041,1374,1613,2929,3304,3087,4887 -"YFR051C",1065,1086,967,918,1028,877,878,791,1253 -"YFR052W",1968,1926,1451,1135,1153,1858,2022,1904,2830 -"YFR053C",13687,8721,4129,906,2149,81340,15955,12284,19440 -"YFR054C",12,10,8,4,13,34,9,7,14 -"YFR055W",31,44,59,150,154,22,28,23,30 -"YGL263W",6,8,8,13,4,9,3,12,10 -"YGL262W",17,28,11,8,9,20,18,20,29 -"YGL259W",2,5,3,1,1,17,7,7,13 -"YGL258W",27,28,19,25,26,19,21,22,43 -"YGL257C",826,882,750,692,602,576,665,628,1016 -"YGL256W",461,490,536,765,572,302,320,364,562 -"YGL255W",285,354,604,2642,808,163,165,195,390 -"YGL254W",427,485,443,403,386,239,345,352,594 -"YGL253W",2371,2993,3820,3195,7637,1395,2000,2024,2893 -"YGL252C",1479,1451,1365,1080,1642,1367,1490,1362,1882 -"YGL251C",363,277,190,151,185,356,303,259,453 -"YGL250W",507,437,316,68,119,582,512,504,838 -"YGL249W",15,12,12,17,11,11,9,15,24 -"YGL248W",567,666,555,482,508,657,574,533,845 -"YGL247W",179,162,154,180,262,194,171,198,317 -"YGL246C",269,440,595,1062,996,132,220,246,339 -"YGL245W",3935,4239,3788,4686,4535,2543,2670,2737,4622 -"YGL244W",1801,1837,1862,1975,2393,1322,1460,1330,2031 -"YGL243W",357,376,360,357,443,204,237,304,472 -"YGL242C",469,519,411,294,245,559,468,442,668 -"YGL241W",775,793,637,465,554,542,509,529,835 -"YGL240W",168,187,181,143,59,80,65,80,133 -"YGL238W",1726,1911,1782,2137,1830,1189,1194,1076,1693 -"YGL237C",442,374,332,209,377,660,441,447,582 -"YGL236C",255,302,352,374,419,859,236,194,308 -"YGL234W",2697,3320,3639,7480,8549,1275,1407,1674,2844 -"YGL233W",941,953,781,586,535,671,617,609,918 -"YGL232W",496,518,490,597,813,412,405,398,632 -"YGL231C",760,846,749,779,839,791,797,715,1105 -"YGL230C",37,40,29,23,37,41,34,34,81 -"YGL229C",81,57,42,12,39,395,128,143,153 -"YGL228W",2718,2351,1841,1190,1386,2119,2194,2256,3838 -"YGL227W",2030,1754,1030,112,284,1637,1213,1304,2163 -"YGL226C-A",461,465,359,372,433,669,498,495,784 -"YGL226W",193,153,138,92,157,509,222,259,333 -"YNCG0002C",10,13,4,10,10,13,6,7,15 -"YGL225W",848,1204,1833,3606,2541,384,575,563,829 -"YGL224C",383,396,332,351,542,364,348,342,556 -"YGL223C",613,742,664,849,674,547,549,552,840 -"YGL222C",171,185,148,149,126,91,100,116,132 -"YGL221C",1052,1090,985,951,949,1020,973,1029,1621 -"YGL220W",680,614,577,619,814,655,699,758,1130 -"YGL219C",1043,997,925,646,806,1380,994,878,1278 -"YGL216W",336,396,332,336,312,275,255,246,335 -"YGL215W",1346,1589,2169,4293,3327,1008,1072,911,1391 -"YGL213C",644,748,645,644,734,519,620,573,885 -"YGL212W",204,231,204,200,208,228,242,187,309 -"YGL211W",547,657,777,1164,1261,370,411,474,733 -"YGL210W",705,633,521,468,757,620,725,682,1044 -"YGL209W",326,267,246,43,67,425,246,259,489 -"YGL208W",510,495,326,65,200,1362,599,605,884 -"YGL207W",3769,3661,3019,2365,2699,2289,2683,2737,4300 -"YGL206C",4055,4203,3185,1928,1596,3085,2481,2608,3980 -"YGL205W",10069,8358,4365,380,68,37981,18630,13152,16311 -"YNCG0003C",7,8,2,2,2,39,11,7,11 -"YGL204C",132,118,73,75,159,122,123,106,169 -"YGL203C",929,1062,1134,1618,1341,755,759,674,1139 -"YGL202W",1348,1676,2264,4981,5029,745,1000,879,1311 -"YGL201C",924,1059,1001,1120,1582,426,657,702,1064 -"YGL200C",1578,1526,1315,1071,1709,1994,1614,1796,2639 -"YGL198W",555,477,431,226,336,649,609,639,1065 -"YGL197W",3093,2604,1776,830,768,2359,2164,2090,3204 -"YGL196W",3014,2731,1990,1640,1147,1669,2055,2368,4151 -"YGL195W",1917,2104,2026,2383,3589,1184,1329,1330,1994 -"YGL194C-A",100,109,69,66,124,147,120,124,186 -"YGL194C",315,362,340,307,314,165,173,190,269 -"YNCG0006C",7,5,3,5,5,6,5,4,12 -"YGL191W",3290,2790,2084,1331,2063,5678,5287,4037,5602 -"YGL190C",1616,1498,1157,694,737,990,1159,1189,1979 -"YGL189C",3672,4178,4448,7204,8934,941,2113,2301,4325 -"YGL188C-A",21,27,25,61,35,2,11,9,29 -"YGL187C",3219,2932,2232,1484,2313,4592,4838,3837,4923 -"YGL186C",1131,1295,1323,1746,1801,450,675,693,1287 -"YGL185C",629,673,589,540,499,452,531,596,912 -"YGL184C",1926,1915,1712,4070,888,216,845,906,1758 -"YGL183C",66,67,49,52,60,34,36,34,75 -"YGL181W",995,959,807,502,668,996,1014,919,1494 -"YGL180W",1352,1294,743,267,263,451,663,656,1376 -"YGL179C",94,85,77,69,101,334,96,72,121 -"YGL178W",590,701,794,1513,877,413,363,381,558 -"YGL176C",457,456,385,284,325,269,372,342,545 -"YGL175C",115,119,92,54,90,88,70,72,82 -"YGL174W",212,197,180,200,263,116,116,103,238 -"YGL173C",3565,3461,2627,2196,1798,2810,2484,2374,3624 -"YGL172W",699,826,809,804,866,658,734,617,1046 -"YGL171W",404,653,1040,2160,2084,84,207,225,407 -"YGL170C",83,80,65,65,91,70,46,74,112 -"YGL169W",361,552,664,1137,1162,174,204,219,474 -"YGL168W",69,67,48,64,111,52,61,51,95 -"YGL167C",1521,1434,1168,846,1392,903,1030,1036,1685 -"YGL166W",368,436,365,260,427,268,312,415,709 -"YGL164C",692,748,630,513,581,462,483,488,832 -"YGL163C",654,764,849,810,730,442,415,460,814 -"YGL162W",111,149,206,256,447,134,121,89,141 -"YGL161C",1053,995,657,315,347,1545,1259,1188,1810 -"YGL160W",870,766,545,272,543,965,910,809,1294 -"YGL159W",506,603,508,525,473,331,334,384,711 -"YGL158W",6,5,18,6,12,17,13,7,12 -"YGL157W",52,78,92,110,48,47,45,46,72 -"YGL156W",5411,4773,3045,948,126,4131,3393,3859,6489 -"YGL155W",367,435,398,460,481,264,268,291,443 -"YGL154C",487,454,287,184,299,718,608,529,822 -"YGL153W",745,842,662,415,471,1437,908,822,1192 -"YGL151W",1084,992,726,527,828,722,669,674,1030 -"YGL150C",1927,2084,1829,1787,1286,1032,1132,1199,1984 -"YGL149W",35,41,34,26,19,20,24,18,33 -"YGL148W",1117,1354,1673,2733,2676,427,922,931,1530 -"YGL147C",1360,2105,2764,6289,12439,273,721,834,1680 -"YGL146C",258,299,305,156,198,143,192,210,272 -"YGL145W",776,799,770,738,874,532,610,610,985 -"YGL144C",439,511,651,656,415,166,260,255,427 -"YGL143C",347,361,330,284,421,1523,388,329,462 -"YGL142C",706,765,575,403,546,565,554,506,790 -"YGL141W",1158,1167,901,509,479,704,730,703,1250 -"YGL140C",1277,1387,1355,1302,1193,705,711,729,1272 -"YGL139W",1374,1408,1323,1340,1495,1243,1168,1060,1565 -"YGL138C",8,9,8,1,6,4,4,5,10 -"YGL137W",3553,3489,2893,2704,2610,2865,2739,2690,4126 -"YGL136C",568,567,455,420,466,470,477,493,756 -"YGL135W",1621,1934,1961,3657,5803,393,1103,1252,2085 -"YGL134W",785,757,536,348,529,702,875,734,1156 -"YGL133W",1462,1705,1601,1581,901,656,798,778,1378 -"YGL131C",778,970,965,608,341,282,352,381,624 -"YGL130W",722,826,746,669,809,511,576,591,939 -"YGL129C",462,494,553,523,461,1626,492,412,590 -"YGL128C",253,253,261,196,135,179,138,133,261 -"YGL127C",156,180,227,248,149,130,173,126,247 -"YGL126W",372,381,407,510,315,417,475,449,704 -"YGL125W",1397,1523,1862,3269,1750,627,1128,994,1353 -"YGL124C",540,600,391,239,314,501,396,397,691 -"YGL123W",10225,12025,13508,23037,41360,3021,7537,7638,13693 -"YGL122C",1025,1241,1336,1691,1876,820,885,800,1196 -"YGL121C",4000,3589,2634,1423,424,2144,2150,3213,5655 -"YGL120C",586,1153,2325,6755,3660,62,242,272,561 -"YGL119W",427,477,605,607,275,419,281,276,440 -"YGL118C",22,13,6,6,14,8,15,16,21 -"YGL117W",814,706,1067,742,453,369,799,620,1189 -"YGL116W",407,419,386,179,166,365,698,501,581 -"YGL115W",827,785,584,446,924,1432,922,906,1261 -"YGL114W",988,1108,1008,931,910,637,701,704,1220 -"YGL113W",352,355,411,388,393,290,330,309,412 -"YGL112C",925,973,883,897,967,691,714,689,1085 -"YGL111W",525,715,990,2013,2055,170,302,317,557 -"YGL110C",766,839,771,759,888,594,541,559,997 -"YGL108C",408,378,342,394,439,353,361,377,548 -"YGL107C",457,535,476,577,686,1515,491,364,576 -"YGL106W",955,913,838,820,1098,1363,1191,1049,1641 -"YGL105W",3295,3592,3438,4230,3926,1834,2220,2095,3922 -"YGL104C",435,412,241,93,37,507,279,315,590 -"YGL103W",6750,7304,7948,13296,21788,2290,5875,6425,11292 -"YGL101W",300,331,352,368,382,357,458,286,407 -"YGL100W",886,930,895,902,925,749,785,765,1227 -"YGL099W",389,612,776,1596,1509,95,259,261,433 -"YNCG0010W",11,16,13,13,17,12,18,11,15 -"YGL098W",501,596,494,324,444,282,347,349,585 -"YGL097W",487,648,871,1767,2022,506,584,484,680 -"YGL096W",1102,826,823,605,587,1227,1136,1129,1819 -"YGL095C",1049,1105,873,650,877,875,854,797,1243 -"YGL094C",1153,1184,1153,940,696,639,706,755,1154 -"YGL093W",1063,1110,906,569,487,1091,870,834,1387 -"YGL092W",1121,1310,1404,2054,1847,906,913,786,1162 -"YGL091C",563,564,548,466,679,431,520,482,716 -"YGL090W",482,508,429,388,302,264,277,238,487 -"YGL089C",168,186,184,235,687,521,114,115,181 -"YGL087C",831,836,666,483,476,889,851,796,1314 -"YGL086W",937,916,921,1017,971,559,669,674,1064 -"YGL085W",338,407,449,539,459,313,370,277,489 -"YGL084C",1135,1111,885,524,483,1137,1011,910,1358 -"YGL083W",362,480,358,330,287,340,294,238,380 -"YGL082W",1002,985,857,526,563,1185,947,927,1385 -"YGL081W",252,250,179,90,65,234,125,161,330 -"YGL080W",1609,1459,1026,428,539,2837,2066,2106,2434 -"YGL079W",382,389,337,325,329,227,270,301,472 -"YGL078C",836,1471,2362,6416,5418,115,283,317,707 -"YGL077C",2220,2829,3295,5122,4037,1536,2980,2712,3495 -"YGL076C",2175,2414,2689,4454,6644,516,1363,1463,2547 -"YNCG0014C",18,14,14,41,27,6,12,8,11 -"YGL075C",245,266,203,130,189,145,151,161,267 -"YGL073W",1575,1502,1206,803,834,1007,1005,1041,1644 -"YGL071W",356,413,409,428,415,241,252,265,387 -"YGL070C",182,269,337,541,810,195,290,218,315 -"YGL068W",564,590,568,593,858,4507,833,594,855 -"YGL067W",429,455,473,549,711,266,287,268,426 -"YGL066W",1117,1099,887,667,870,723,879,815,1290 -"YGL065C",559,618,494,415,526,415,407,393,693 -"YGL064C",174,224,292,342,392,229,137,128,214 -"YGL063W",109,119,116,125,238,87,109,94,159 -"YGL062W",5963,6541,6134,4266,5677,7155,5086,4384,6905 -"YGL061C",296,343,317,276,443,261,259,226,430 -"YGL060W",515,541,421,234,276,324,327,379,616 -"YGL059W",1229,1053,707,234,206,663,856,931,1592 -"YGL058W",568,602,663,727,758,447,543,505,914 -"YGL057C",284,351,323,307,256,194,200,191,344 -"YGL056C",1183,1393,1614,1340,996,1127,1395,1050,1420 -"YGL055W",23708,24739,20332,13306,11545,29727,29506,15057,22387 -"YGL054C",1104,1103,965,1297,1596,872,889,1014,1476 -"YGL053W",310,294,227,92,124,425,312,354,544 -"YGL051W",54,64,47,52,36,71,41,48,76 -"YGL050W",416,399,355,464,810,315,357,337,534 -"YGL049C",623,757,841,1021,814,486,462,418,727 -"YGL048C",3820,4072,3367,2662,2264,3394,3628,3284,5384 -"YGL047W",419,457,398,185,92,313,384,420,668 -"YNCG0018C",4,5,2,1,1,2,2,6,4 -"YGL045W",645,575,400,393,533,441,546,571,968 -"YGL044C",524,517,490,473,799,408,454,396,673 -"YGL043W",652,761,776,916,934,413,516,526,821 -"YGL041W-A",322,325,290,329,430,445,374,331,565 -"YGL040C",671,745,792,712,948,1639,711,561,934 -"YGL039W",203,212,182,170,224,231,256,160,290 -"YGL038C",691,746,564,164,532,453,456,503,832 -"YGL037C",8087,5720,2987,541,568,10158,6713,7919,13992 -"YGL036W",1170,1251,852,627,757,938,820,805,1376 -"YGL035C",1297,1490,1730,627,821,1266,1207,1235,1677 -"YGL034C",2,2,3,1,5,10,2,9,7 -"YGL033W",35,33,29,27,12,28,17,22,44 -"YGL032C",39,32,19,14,11,26,37,35,60 -"YGL031C",4712,5507,5662,9342,16887,1233,2872,3159,6382 -"YGL030W",4061,4890,5045,7959,14517,1321,3027,3775,6581 -"YGL029W",464,658,1036,2200,2177,30,161,197,427 -"YGL028C",1558,1006,1090,2395,778,341,810,3279,3940 -"YGL027C",1045,1053,971,763,715,648,684,681,1136 -"YGL026C",2864,3008,3214,4926,2757,1050,1850,1915,3266 -"YGL025C",507,567,516,497,602,330,441,436,684 -"YGL023C",1570,1459,1394,1168,1332,1073,1216,1230,1858 -"YGL022W",1522,1609,1538,1495,1550,1357,1328,1316,1972 -"YGL021W",363,435,362,290,219,1318,1745,937,703 -"YGL020C",622,706,661,756,986,573,560,547,940 -"YGL019W",1067,1105,1208,1224,1377,1130,994,997,1775 -"YGL018C",158,177,212,232,104,225,122,109,192 -"YGL017W",357,356,428,373,156,248,269,299,508 -"YGL016W",613,645,481,433,1154,402,426,396,640 -"YGL015C",11,5,10,8,15,6,5,11,10 -"YGL014W",1448,1583,1701,2622,2502,986,1103,1045,1580 -"YGL013C",1677,1889,1748,1778,1054,889,973,934,1457 -"YGL012W",591,956,1470,3019,5191,970,539,516,642 -"YGL011C",2706,2405,2012,1496,1353,1998,2105,2001,3369 -"YGL010W",703,625,337,70,236,693,641,587,961 -"YGL009C",3538,4661,6317,13795,12213,2060,1959,2113,3689 -"YGL008C",18294,28140,37219,100452,64171,18336,24284,15198,16191 -"YGL007C-A",13,12,8,3,1,22,21,16,26 -"YGL007W",140,67,43,34,24,157,187,167,232 -"YGL006W-A",31,21,12,7,3,24,22,14,26 -"YGL006W",3643,3466,2622,1273,1057,3249,2588,2819,4477 -"YGL005C",860,933,857,705,681,856,754,773,1368 -"YGL004C",540,569,449,232,287,468,414,422,716 -"YGL003C",625,612,512,312,459,428,438,479,751 -"YGL002W",448,448,337,213,309,419,391,403,657 -"YGL001C",717,794,795,863,1121,896,840,759,1044 -"YGR001C",758,826,777,1063,1416,381,486,563,1014 -"YGR002C",424,460,430,411,499,426,380,333,553 -"YGR003W",746,827,783,735,733,320,422,514,841 -"YGR004W",249,282,282,354,451,141,183,183,293 -"YGR005C",1256,1253,1077,976,1517,1038,1039,1020,1641 -"YGR006W",194,189,159,104,114,113,147,151,240 -"YGR007W",542,623,614,649,736,561,555,516,815 -"YGR008C",5571,3400,1249,116,211,12456,6922,7643,11253 -"YGR009C",1296,1384,1753,1978,1310,1056,1105,1074,1818 -"YGR010W",856,871,754,493,476,807,788,795,1155 -"YGR012W",441,464,435,374,573,433,389,377,580 -"YGR013W",709,844,768,696,752,472,573,524,885 -"YGR014W",1306,1504,1327,767,2086,1444,1258,782,1168 -"YGR015C",255,285,228,166,203,174,222,230,321 -"YGR016W",166,154,101,87,113,107,117,146,210 -"YGR017W",573,651,563,703,868,564,540,491,802 -"YGR018C",12,20,26,13,19,17,13,15,35 -"YGR019W",1398,1321,998,558,245,1265,1065,1212,2140 -"YGR020C",948,1123,1112,1572,2026,739,761,878,1413 -"YGR021W",241,318,277,222,353,1601,295,255,350 -"YGR023W",509,530,410,270,460,701,407,422,519 -"YGR024C",714,743,622,519,669,480,618,633,1042 -"YGR025W",208,185,121,84,46,126,103,109,184 -"YGR026W",1996,2027,1493,877,467,1473,1296,1530,2604 -"YGR027C",5730,5797,5173,7173,12111,2376,4207,5042,9140 -"YGR028W",527,549,446,265,430,1024,483,480,717 -"YGR029W",602,637,528,418,610,1381,784,744,995 -"YNCG0024W",15,19,12,5,16,9,11,8,22 -"YGR030C",287,325,331,308,289,150,305,280,453 -"YGR031W",304,341,347,154,191,343,413,388,576 -"YGR032W",6232,6349,5000,3377,3764,4128,2736,3215,6384 -"YGR033C",1687,1648,1281,783,921,1395,1531,1577,2477 -"YGR034W",3278,3789,4338,7509,13050,723,2149,2365,4303 -"YGR035C",19,38,45,57,135,13,10,7,12 -"YGR035W-A",47,53,84,123,72,24,27,32,47 -"YGR036C",188,275,420,557,162,103,113,129,174 -"YGR037C",2447,2606,2175,1887,1239,3025,2559,2287,3313 -"YGR038W",457,465,345,218,481,576,440,482,653 -"YGR039W",31,40,37,32,51,50,24,21,35 -"YGR040W",390,462,470,515,660,267,308,324,447 -"YGR041W",437,338,206,173,253,310,291,557,762 -"YGR042W",578,584,503,344,412,444,503,584,789 -"YGR043C",9678,7875,4425,1120,102,8324,5960,8324,15946 -"YGR044C",2336,2136,1638,543,160,1482,1176,3258,4208 -"YGR045C",103,115,73,23,15,74,57,113,173 -"YGR046W",1307,1335,1179,863,976,927,1095,1110,1669 -"YGR047C",899,952,973,537,284,504,563,576,1030 -"YGR048W",1152,1185,891,542,619,900,975,1000,1662 -"YGR049W",438,497,509,469,413,406,495,409,625 -"YGR050C",76,71,41,44,96,145,115,115,145 -"YGR052W",627,397,155,12,18,1096,474,542,968 -"YGR053C",184,141,100,14,20,292,156,153,297 -"YGR054W",1050,1351,2013,3584,2023,566,769,692,991 -"YGR055W",1399,2751,5379,12377,1263,89,412,458,1326 -"YGR056W",676,662,829,829,718,351,430,396,636 -"YGR057C",337,432,517,564,354,179,231,309,443 -"YGR058W",242,291,353,430,371,154,164,211,269 -"YGR059W",153,160,110,37,37,78,69,91,190 -"YNCG0026W",5,6,1,3,5,3,8,4,5 -"YGR060W",12568,12119,10122,9027,6963,2248,6359,7362,14491 -"YGR061C",3242,4052,4695,10179,9899,1297,1531,1685,3215 -"YGR062C",190,217,232,186,242,334,179,169,298 -"YGR063C",265,280,320,406,521,234,274,266,405 -"YGR065C",4199,4188,4335,5787,6372,4805,4994,4735,6274 -"YGR066C",339,277,215,135,135,133,136,206,470 -"YGR067C",1648,1103,551,50,228,4365,2592,2083,2521 -"YGR068C",139,237,371,658,325,110,124,96,155 -"YGR070W",1904,1696,1113,252,307,1070,967,1099,1921 -"YGR071C",599,679,524,578,528,435,462,428,683 -"YGR072W",527,637,713,921,911,316,458,427,765 -"YGR074W",279,371,328,337,399,250,295,334,416 -"YGR075C",277,323,285,297,319,207,251,222,393 -"YGR076C",376,339,367,350,465,1694,475,399,474 -"YGR077C",608,612,557,383,254,453,416,470,707 -"YGR078C",214,275,380,742,384,87,156,166,252 -"YGR079W",169,343,1084,1588,342,37,66,91,181 -"YGR080W",683,625,560,429,329,722,658,631,1067 -"YGR081C",312,378,611,1153,1010,46,165,161,277 -"YGR082W",347,374,405,505,524,962,368,304,502 -"YGR083C",1119,1376,1529,2504,2299,483,749,746,1272 -"YGR084C",320,333,328,307,405,1343,392,322,404 -"YGR085C",1769,1806,2130,3621,5143,416,1140,1289,2173 -"YGR086C",19302,14074,8661,3058,1542,22037,23368,23822,32487 -"YGR087C",1365,2160,2522,2827,660,719,483,568,1354 -"YGR088W",9086,6011,2795,424,59,3804,7248,7554,13012 -"YGR089W",821,918,879,1237,1263,516,623,545,870 -"YGR090W",1505,2080,2602,5057,4431,255,708,756,1246 -"YGR091W",360,433,416,429,461,207,272,271,470 -"YGR092W",583,651,619,442,830,659,1176,908,881 -"YGR093W",543,656,822,1347,1259,258,341,344,613 -"YGR094W",4051,4598,4795,7732,8851,1916,2598,2475,4275 -"YGR095C",582,714,1039,1667,1196,289,460,471,848 -"YGR096W",145,135,140,197,104,59,86,84,200 -"YGR097W",878,972,985,1221,693,403,405,523,871 -"YGR098C",680,693,635,623,588,538,498,395,575 -"YGR099W",558,633,570,546,644,491,465,457,706 -"YGR100W",1467,1503,1238,825,592,1033,1088,1060,1719 -"YGR101W",494,489,520,341,512,785,549,521,690 -"YGR102C",429,404,362,344,372,346,351,290,601 -"YGR103W",1646,2504,3912,9940,11103,196,744,731,1559 -"YGR104C",460,434,383,340,406,304,367,326,571 -"YGR105W",463,471,364,373,422,415,453,418,671 -"YGR106C",1773,1992,1874,2005,2166,1544,1660,1676,2716 -"YGR108W",151,133,126,98,206,837,1218,614,367 -"YGR109C",27,35,25,29,62,24,19,20,30 -"YGR109W-B",286,322,240,195,172,180,160,190,264 -"YGR110W",687,631,449,187,260,509,616,622,1015 -"YGR111W",1034,1044,718,512,477,1238,915,840,1354 -"YGR112W",527,474,348,145,142,1326,471,427,697 -"YGR113W",414,417,377,255,344,438,419,370,556 -"YGR116W",3092,3184,2759,2556,2405,1783,1958,2124,3308 -"YGR117C",813,823,535,375,598,553,714,747,1128 -"YGR118W",4160,4310,4596,7102,11091,1661,3514,3793,6694 -"YGR119C",1329,1371,1401,1811,1954,1145,1351,1153,1740 -"YGR120C",267,282,319,281,354,191,205,206,381 -"YGR121C",1872,2277,2216,1963,3810,477,960,1255,2253 -"YGR122W",572,454,270,132,493,537,447,434,658 -"YGR123C",354,617,1080,2402,1903,55,162,158,279 -"YGR124W",2104,2587,3067,5165,6648,1000,1632,1378,2427 -"YGR125W",1211,1557,1881,2824,1922,525,644,665,1167 -"YGR126W",148,140,113,110,58,58,62,82,143 -"YGR127W",1863,1223,559,161,256,3141,2311,1964,2986 -"YGR128C",664,1156,1669,3773,3486,59,348,325,590 -"YGR129W",221,311,303,334,185,115,116,160,325 -"YGR130C",6512,5303,3337,745,815,8601,7085,6483,9734 -"YGR131W",40,40,18,12,19,57,36,52,84 -"YGR132C",3308,2945,2233,1134,1165,6054,3427,3440,5111 -"YGR133W",310,355,258,172,144,266,182,221,413 -"YGR134W",599,716,667,492,588,357,430,447,688 -"YGR135W",2717,2801,2262,2050,2058,2584,2988,2700,4131 -"YGR136W",510,589,627,761,652,579,479,463,721 -"YGR138C",69,63,40,876,469,92,74,73,94 -"YGR140W",465,545,529,657,619,397,358,375,563 -"YGR141W",799,796,619,294,389,725,558,700,1033 -"YGR142W",9593,7569,4232,448,630,5667,5083,6628,13451 -"YGR143W",2408,2277,1545,1043,1198,1350,1274,1551,2736 -"YGR144W",34825,32461,25248,14780,22033,31457,11600,20206,49642 -"YGR145W",774,1243,1817,4357,3975,122,443,455,758 -"YGR146C",1356,861,370,79,187,1319,1094,1147,1874 -"YGR146C-A",11,5,5,3,15,11,6,7,12 -"YGR147C",663,720,704,566,701,795,593,587,929 -"YGR148C",3553,4132,4446,7969,13027,1074,2441,2398,4728 -"YGR149W",718,721,466,144,251,481,638,840,995 -"YGR150C",706,860,795,814,759,1485,651,571,796 -"YGR152C",214,410,1039,2767,1777,176,228,217,239 -"YGR153W",96,119,138,140,156,123,88,91,145 -"YGR154C",859,889,607,177,89,486,400,541,1148 -"YGR155W",3859,5174,7368,14602,7782,2400,2559,2870,4777 -"YGR156W",275,291,240,178,450,246,288,220,391 -"YGR157W",5278,4902,3805,3233,1905,3114,4442,3958,5780 -"YGR158C",340,487,539,881,1096,116,269,280,426 -"YGR159C",1314,3614,9993,26920,11482,61,248,344,854 -"YGR161C",5895,3850,2746,497,740,2755,3610,4237,8060 -"YGR161W-C",759,600,454,114,245,1994,1192,963,1342 -"YGR161C-D",8,3,13,14,4,1,2,2,3 -"YNCG0037W",7,10,5,10,30,1,4,3,9 -"YGR162W",1874,2711,3903,8599,6406,455,894,912,1629 -"YGR163W",599,723,616,588,737,471,498,476,719 -"YGR164W",7,5,4,8,7,3,3,6,10 -"YGR165W",521,582,565,618,751,1977,549,461,632 -"YGR166W",271,307,367,419,365,236,204,159,305 -"YGR167W",1611,1349,936,686,862,2063,1489,1411,2170 -"YGR168C",423,420,275,232,336,409,378,387,625 -"YGR169C",141,200,274,490,451,178,134,112,184 -"YGR169C-A",535,591,648,857,875,347,507,454,730 -"YGR170W",1024,1016,942,768,693,815,803,805,1173 -"YGR171C",296,361,305,216,240,564,305,256,378 -"YGR172C",416,438,453,465,564,303,287,311,541 -"YGR173W",475,606,701,1098,1246,99,256,309,589 -"YGR174C",945,893,547,142,263,3596,1253,1074,1708 -"YGR174W-A",168,100,45,15,6,156,166,163,267 -"YGR175C",9724,10088,11249,16046,7299,3484,6562,7501,11558 -"YGR177C",64,86,90,134,256,81,73,70,123 -"YGR178C",1979,2070,1843,1654,1696,1979,1773,1656,2651 -"YGR179C",324,341,288,227,326,284,245,232,363 -"YGR180C",9882,9764,7948,6251,3642,5359,4281,6016,12073 -"YGR181W",313,321,297,266,381,627,314,258,390 -"YGR183C",1979,1921,1370,705,2103,4577,3010,2547,3013 -"YGR184C",2382,2493,2222,1756,1331,1347,1314,1347,2341 -"YGR185C",1091,1186,1218,1785,2723,684,1072,897,1565 -"YGR186W",1994,1939,1677,1393,1677,1932,1803,1787,2641 -"YGR187C",665,1045,1391,3000,2254,122,461,442,796 -"YGR188C",266,309,256,197,295,206,172,180,327 -"YGR189C",1370,1351,1509,1383,2224,640,1405,3566,2846 -"YGR191W",503,846,1760,4672,2184,258,402,425,629 -"YGR192C",149208,113487,75877,34853,8952,79006,92706,117154,224207 -"YGR193C",1002,1039,882,643,698,1293,963,833,1278 -"YGR194C",604,492,300,54,78,1819,653,625,899 -"YGR195W",182,252,309,487,604,111,207,194,302 -"YGR196C",1403,1273,1016,766,1087,872,1096,1097,1682 -"YGR197C",460,479,348,225,390,615,427,412,698 -"YGR198W",447,649,970,1289,593,240,288,240,430 -"YGR199W",971,971,856,550,736,857,717,725,1143 -"YGR200C",802,1157,1564,3049,3050,239,469,467,891 -"YGR201C",753,790,538,313,164,627,458,574,1100 -"YGR202C",649,683,618,500,618,735,672,583,957 -"YGR203W",389,266,234,156,167,345,431,415,601 -"YGR204W",2658,3396,4234,7487,5517,1833,2125,1826,2813 -"YGR204C-A",61,37,16,4,22,82,56,63,78 -"YGR205W",709,598,252,49,255,1256,931,745,982 -"YGR206W",215,227,165,164,174,186,208,213,334 -"YGR207C",691,910,875,1235,1312,1025,735,652,885 -"YGR208W",297,466,674,1854,1311,106,234,193,358 -"YGR209C",2993,2679,1940,1211,719,3130,2549,3167,5440 -"YGR210C",563,775,907,1035,1050,330,338,392,749 -"YGR211W",2798,2841,3032,3213,2053,700,1319,1652,3425 -"YGR212W",247,257,195,136,98,198,202,150,278 -"YGR213C",115,81,70,49,58,146,89,67,155 -"YGR214W",6385,7021,7227,11098,17484,1825,4355,4842,8992 -"YGR215W",296,338,339,339,454,1127,397,313,454 -"YGR216C",599,656,546,538,709,387,522,439,727 -"YGR217W",464,583,642,764,589,222,319,282,401 -"YGR218W",2199,2340,2010,2038,2068,1559,1539,1481,2279 -"YGR220C",504,506,497,487,732,1515,556,445,698 -"YGR221C",216,257,168,84,243,217,165,172,311 -"YGR222W",488,483,310,176,292,501,424,417,633 -"YGR223C",810,804,625,284,512,743,667,660,983 -"YGR224W",327,354,216,79,102,187,212,227,405 -"YGR225W",180,182,95,42,33,86,89,102,226 -"YGR227W",429,555,520,523,564,325,348,352,416 -"YGR227C-A",12,11,12,9,17,12,10,8,11 -"YGR229C",1174,1661,3257,4779,3893,1285,1383,1032,1351 -"YGR230W",393,391,321,164,140,1170,1626,962,995 -"YGR231C",3065,2957,2160,1257,1048,4779,3085,2668,4025 -"YGR232W",500,514,341,190,259,722,597,603,741 -"YGR233C",901,993,953,865,808,429,544,543,913 -"YGR234W",4888,6554,7417,12415,19918,5894,4996,6057,6286 -"YGR235C",1219,1179,1060,702,962,1554,1304,1220,1827 -"YGR236C",3458,2253,792,43,22,7031,4655,5354,7467 -"YGR237C",810,743,456,166,276,830,673,639,939 -"YGR238C",408,425,312,202,357,607,374,330,497 -"YGR239C",585,867,1399,1244,990,293,495,464,783 -"YGR240C",8947,7840,6556,7268,4401,3383,4020,5743,10694 -"YGR240C-A",50,59,52,63,30,14,33,46,94 -"YGR241C",673,668,696,584,600,1144,985,748,947 -"YGR243W",2876,2047,969,147,872,10303,7809,5865,6748 -"YGR244C",7984,7602,5533,2671,1081,19697,11148,9062,12204 -"YGR245C",1095,1704,2969,7151,5220,138,485,532,951 -"YGR246C",1204,1176,1001,784,893,890,942,1014,1538 -"YGR247W",370,341,225,53,70,631,371,416,626 -"YGR248W",2301,1673,795,85,31,2111,1530,2019,3649 -"YGR249W",102,64,35,28,72,227,92,97,127 -"YGR250C",5973,5308,3658,1438,1689,4364,4363,4692,7491 -"YGR251W",299,410,476,631,516,81,148,184,389 -"YGR252W",695,675,575,531,781,723,685,626,922 -"YGR253C",3539,3444,2758,2191,1843,2934,3413,3355,5256 -"YGR254W",36077,25763,14744,4360,782,12398,11057,26486,58024 -"YGR255C",1056,1084,1108,864,221,1371,894,950,1453 -"YGR256W",13537,10595,6764,2318,206,5451,5155,8225,17691 -"YGR257C",395,448,453,324,435,618,440,377,589 -"YGR258C",945,1033,1260,1638,233,451,510,581,1026 -"YGR260W",3432,3959,4464,6764,4337,1438,1506,1966,4288 -"YGR261C",985,1019,1023,1092,918,648,784,668,1053 -"YGR262C",456,517,537,560,647,396,452,416,689 -"YGR263C",323,379,337,302,248,253,325,271,455 -"YGR264C",1822,2411,3086,6252,5709,494,1187,1155,1745 -"YGR266W",919,894,812,451,438,1303,1259,957,1252 -"YGR267C",1155,1132,1120,1258,1643,874,1032,1046,1593 -"YGR268C",406,463,363,207,233,343,343,315,527 -"YGR270W",1798,1741,1401,1181,904,1301,1162,1145,1897 -"YGR271W",812,908,798,780,777,481,520,472,793 -"YGR271C-A",383,591,816,1758,1563,79,240,247,452 -"YGR273C",6,11,18,10,16,3,3,3,6 -"YGR274C",1066,1171,1119,991,972,720,849,788,1235 -"YGR275W",505,500,438,436,553,398,421,464,767 -"YGR276C",978,1123,1074,1155,1067,654,827,826,1301 -"YGR277C",668,825,755,701,687,492,592,613,1001 -"YGR278W",476,481,437,435,553,322,366,330,571 -"YGR279C",1152,1638,2330,5120,6986,5318,2912,1611,1552 -"YGR280C",373,574,1212,2774,1679,148,278,232,464 -"YGR281W",1799,1757,1501,832,742,857,1123,1137,1891 -"YGR282C",9119,9289,8304,9050,10875,12483,7824,7887,12396 -"YGR283C",175,304,462,1011,1014,44,79,81,190 -"YGR284C",3064,2976,2283,1268,518,2064,2048,2319,3820 -"YGR285C",1299,1729,2264,4165,4712,673,924,922,1458 -"YGR286C",10399,11328,11446,12690,17888,5854,9357,9321,14084 -"YGR287C",336,278,196,102,232,621,323,257,509 -"YGR288W",407,341,195,114,324,490,347,369,608 -"YGR289C",7393,4464,2149,770,598,20897,15039,10305,17062 -"YGR292W",949,611,306,147,123,3580,1792,1169,2041 -"YGR295C",1262,1010,632,325,629,1536,1100,1247,1979 -"YHL050C",51,45,44,32,56,36,41,34,45 -"YHL048W",22,16,13,11,5,17,18,13,29 -"YHL045W",38,14,5,2,7,95,39,43,79 -"YHL044W",15,12,4,3,5,25,14,10,18 -"YHL043W",383,304,287,348,380,188,191,239,525 -"YHL042W",404,367,288,248,238,149,181,237,524 -"YHL041W",5,4,8,4,13,8,5,3,10 -"YHL040C",712,834,913,1179,656,321,256,297,675 -"YHL039W",899,1296,1331,1775,1787,220,373,461,796 -"YHL038C",449,540,475,427,318,476,393,309,533 -"YHL037C",4,8,7,5,3,5,4,2,5 -"YHL036W",649,683,719,1803,315,195,357,434,686 -"YHL035C",571,559,395,206,103,347,296,331,545 -"YHL034C",5374,4570,3699,2711,1742,4726,4373,4398,7533 -"YHL033C",3026,3250,4336,8654,6679,780,2065,2118,4304 -"YHL032C",4718,3859,2547,685,783,12322,10937,8195,8500 -"YHL031C",506,528,468,357,432,513,402,439,819 -"YHL030W",1658,1506,1282,828,605,1261,1204,1147,1758 -"YHL029C",807,952,1105,1442,1110,331,629,552,950 -"YHL028W",119,125,86,40,40,145,118,113,154 -"YHL027W",2480,2554,2432,2167,1945,1461,2007,1989,3198 -"YHL026C",152,165,206,415,329,87,104,100,198 -"YHL025W",690,633,586,614,777,838,787,702,1212 -"YHL024W",4436,3821,2421,669,1966,6411,5331,4059,5392 -"YHL023C",857,976,887,834,698,528,690,649,1015 -"YHL022C",64,57,32,32,40,63,59,54,67 -"YHL021C",1117,808,395,93,379,6878,1790,1514,1796 -"YHL020C",1549,1538,1549,1396,1396,1604,2385,2193,2952 -"YHL019C",424,466,395,233,225,309,316,308,509 -"YHL018W",73,74,46,39,22,66,56,45,77 -"YHL017W",878,902,849,778,740,521,536,591,907 -"YHL016C",893,1162,1280,1466,1778,401,363,429,839 -"YHL015W-A",23,33,18,10,9,8,29,14,36 -"YHL015W",6850,8047,8990,15557,28349,2274,5057,5269,9250 -"YHL014C",246,293,266,238,260,503,212,209,323 -"YHL013C",305,389,601,1034,653,125,209,230,367 -"YHL012W",251,240,178,160,230,231,178,214,351 -"YHL011C",830,1168,1946,4535,4176,238,463,500,894 -"YHL010C",656,648,478,173,164,413,444,503,835 -"YHL009C",230,291,269,271,342,159,192,147,316 -"YHL008C",208,186,169,94,103,168,130,157,283 -"YHL007C",771,1121,1764,2700,1672,357,511,444,738 -"YHL006C",65,75,47,63,44,88,58,80,133 -"YHL005C",14,20,25,16,17,52,13,12,15 -"YHL004W",451,606,579,639,720,1579,453,376,507 -"YHL003C",806,830,693,672,1015,703,654,673,1115 -"YHL002W",780,778,558,435,681,844,800,737,1324 -"YHL001W",964,1099,1259,2062,2606,258,697,784,1518 -"YHR001W",1281,1354,1064,653,662,1319,1150,1160,1638 -"YHR001W-A",2093,1961,1300,799,1374,3536,3361,2727,3608 -"YHR002W",248,284,222,145,300,238,250,217,338 -"YHR003C",565,729,978,1644,1248,311,455,445,781 -"YHR004C",661,702,575,213,261,601,626,606,890 -"YHR005C",1501,1811,1671,1500,2625,880,1072,1206,1808 -"YHR005C-A",957,1036,934,1182,1638,3417,1171,1065,1363 -"YHR006W",1656,1722,1566,1728,1404,858,1183,1206,1846 -"YHR007C",19446,20010,18726,18998,10712,4315,10644,12794,23156 -"YHR007C-A",82,66,30,20,21,172,98,77,111 -"YHR008C",7611,6175,4541,1961,1081,8877,7695,7736,13283 -"YHR009C",1738,1852,1588,1536,1616,2210,1624,1388,2240 -"YHR010W",3657,4384,4810,8671,14971,1023,2791,2831,5269 -"YHR011W",243,269,210,142,141,577,209,197,293 -"YHR012W",728,739,761,724,564,487,617,560,982 -"YHR013C",464,530,564,735,709,253,323,296,561 -"YHR014W",58,39,34,40,92,27,28,35,62 -"YHR015W",233,217,208,194,217,104,136,149,289 -"YHR016C",1001,782,475,76,122,1892,1106,1025,1584 -"YHR017W",643,659,414,218,557,812,672,636,901 -"YHR018C",5827,4433,3734,3588,2602,2187,6244,5280,8372 -"YHR019C",1746,2305,2771,4893,4865,780,1255,1210,2031 -"YHR020W",2132,2727,3222,5645,6899,367,1225,1312,2397 -"YHR021C",2712,3137,3474,5269,9792,878,2320,2287,4084 -"YHR021W-A",28,24,20,14,31,42,33,32,63 -"YHR022C",67,41,35,24,53,88,66,66,105 -"YHR023W",691,758,737,743,956,905,1343,890,846 -"YHR024C",409,498,528,694,644,1010,428,365,480 -"YHR025W",1098,1291,1349,1919,2211,624,765,731,1186 -"YHR026W",898,988,909,1061,1352,805,814,780,1341 -"YHR027C",8032,7738,6360,4894,3660,5607,6401,6149,9510 -"YHR028C",2665,2816,2304,1826,1629,2109,1633,1762,2944 -"YHR029C",716,729,585,422,387,525,474,532,922 -"YHR030C",761,788,694,668,685,519,487,617,1125 -"YHR031C",364,431,492,740,356,309,311,280,534 -"YHR032W",472,638,904,1687,971,190,328,354,594 -"YHR033W",677,737,539,336,332,501,649,662,1116 -"YHR034C",362,350,331,258,243,254,316,363,555 -"YHR035W",211,176,129,73,106,168,156,204,248 -"YHR036W",266,287,330,405,549,233,284,210,369 -"YHR037W",2079,2229,2093,1466,1841,2241,1549,1486,2671 -"YHR038W",185,233,138,102,146,544,205,176,317 -"YHR039C",1512,1684,1581,1727,1374,856,1015,1299,1825 -"YHR039C-A",1375,1462,1331,1355,1324,1048,1183,1390,2293 -"YHR040W",239,320,481,763,652,72,127,168,316 -"YHR041C",229,261,268,305,338,226,260,250,441 -"YHR042W",1060,1235,1216,1558,1661,795,712,778,1188 -"YHR043C",297,317,300,217,705,702,433,376,562 -"YHR044C",52,67,58,58,110,129,49,58,83 -"YHR045W",736,844,769,862,1102,399,542,598,924 -"YHR046C",276,357,465,1069,809,96,180,158,341 -"YHR047C",1736,1558,1105,672,528,1470,1835,1510,2218 -"YHR048W",278,266,189,207,257,360,271,282,395 -"YHR049W",313,602,1573,5085,2181,247,172,195,364 -"YHR050W",747,851,788,488,886,941,832,773,1118 -"YHR050W-A",281,301,190,139,194,311,344,269,319 -"YHR051W",3013,3066,2228,1763,2694,4788,4540,3782,4633 -"YHR052W",711,1315,2287,5480,4558,109,365,379,706 -"YNCH0007W",6,2,2,3,1,1,3,4,17 -"YHR054C",6,7,5,11,4,9,7,3,14 -"YHR056C",524,495,502,427,369,494,403,371,504 -"YHR057C",1445,1382,1196,862,730,1596,1659,1601,2767 -"YHR058C",256,328,355,329,212,139,196,190,329 -"YHR059W",238,238,235,209,271,851,218,179,317 -"YHR060W",513,561,523,562,594,483,453,466,739 -"YHR061C",145,188,189,197,159,270,249,156,161 -"YHR062C",181,189,246,481,554,105,141,125,215 -"YHR063C",629,792,910,1401,1513,454,467,466,711 -"YHR064C",2798,3244,3682,6098,7078,1365,1989,2027,3518 -"YHR065C",661,984,1348,2620,2826,99,373,368,629 -"YHR066W",695,1133,1786,3956,2225,37,343,332,665 -"YHR067W",438,478,336,264,303,396,520,505,718 -"YHR068W",699,951,1329,2717,2249,352,529,508,849 -"YHR069C",628,854,1383,1955,1049,227,396,440,788 -"YHR070W",237,405,789,1744,648,87,135,175,290 -"YHR071W",1407,1148,1374,2049,1405,494,797,811,1719 -"YHR072W",1237,1514,1669,2082,1963,798,924,879,1456 -"YHR072W-A",908,978,1101,1865,2967,420,705,726,1253 -"YHR073W",1601,1668,1548,1373,1051,1233,1146,1130,1714 -"YHR074W",1867,1870,1573,973,937,1786,1359,1320,2265 -"YHR075C",595,495,301,96,88,439,404,454,785 -"YHR076W",601,616,500,531,519,830,556,513,833 -"YHR077C",2076,2156,1982,2646,2779,1130,1595,1383,2388 -"YHR078W",677,670,513,579,845,511,422,517,801 -"YHR079C",806,740,773,703,705,446,499,527,780 -"YHR079C-A",9,9,15,12,8,3,1,5,15 -"YHR080C",1403,1298,867,295,314,1247,1131,1041,1597 -"YHR081W",632,703,739,1111,1834,237,365,451,819 -"YHR082C",2300,2117,1511,867,1205,1698,1598,1633,2697 -"YHR083W",551,542,505,325,354,516,485,520,872 -"YHR084W",471,590,586,882,1193,436,414,341,546 -"YHR085W",224,357,602,1112,946,47,121,116,231 -"YHR086W",589,718,568,427,369,677,542,471,712 -"YHR087W",2730,1664,456,28,80,3200,1918,2613,5120 -"YHR088W",544,810,1272,2341,2276,113,347,318,577 -"YHR089C",714,1183,1788,4181,6781,185,512,492,920 -"YHR090C",529,551,489,485,543,573,619,561,873 -"YHR091C",415,469,419,271,298,878,484,374,544 -"YHR092C",251,592,1565,3583,4953,169,142,130,206 -"YHR093W",18,37,45,84,44,10,9,11,18 -"YHR094C",211,221,221,228,194,163,139,163,275 -"YHR096C",17652,13565,7590,1311,321,5292,10265,15250,25312 -"YHR097C",2197,2005,1187,270,447,2196,1587,1794,2910 -"YHR098C",1200,1229,1095,1316,1422,997,996,840,1329 -"YHR099W",804,975,1061,1255,1264,765,653,623,975 -"YHR100C",264,263,295,284,366,206,202,201,323 -"YHR101C",378,313,229,124,189,384,328,340,562 -"YHR102W",789,837,757,610,546,500,541,588,797 -"YHR103W",842,829,856,1001,989,793,615,810,1077 -"YHR104W",3698,2601,1156,273,394,5122,2660,3277,6065 -"YHR105W",269,266,157,46,49,191,184,195,308 -"YHR106W",2099,1911,1269,445,246,1841,1452,1627,2908 -"YHR107C",711,846,791,975,1148,695,744,554,897 -"YHR108W",1093,1178,1100,1119,769,953,876,748,1311 -"YHR109W",230,261,210,185,224,467,205,175,296 -"YHR110W",1133,1126,770,346,493,1346,1020,1077,1608 -"YHR111W",845,836,826,651,803,557,595,713,1187 -"YHR112C",1442,1437,1274,1172,803,1385,1021,1174,2236 -"YHR113W",1548,1558,1275,669,619,1737,1428,1445,2309 -"YHR114W",842,817,728,612,672,736,760,677,1072 -"YHR115C",691,814,677,621,927,624,676,546,827 -"YHR116W",196,179,139,98,114,1445,368,273,307 -"YHR117W",699,809,698,596,538,747,679,580,992 -"YHR118C",385,417,554,515,585,229,354,301,506 -"YHR119W",693,708,684,834,893,496,511,448,788 -"YHR120W",374,418,474,558,445,256,242,199,344 -"YHR121W",609,669,683,793,957,781,683,606,815 -"YHR122W",506,654,658,791,833,409,356,402,655 -"YHR123W",352,447,502,634,473,216,320,362,475 -"YHR124W",251,253,201,211,273,208,206,220,369 -"YHR125W",10,11,12,11,3,13,11,10,15 -"YHR126C",15,34,89,533,396,16,14,10,23 -"YHR127W",264,330,293,245,262,129,242,249,384 -"YHR128W",266,386,588,1468,1282,106,170,161,333 -"YHR129C",237,241,266,255,200,125,175,183,295 -"YHR130C",54,41,31,30,76,36,27,44,62 -"YHR131C",741,794,605,591,799,513,552,566,916 -"YHR132C",1564,1631,1336,1124,1390,1733,1521,1455,2317 -"YHR132W-A",1162,924,446,204,453,2108,1964,1606,2136 -"YHR133C",425,519,492,666,674,208,374,350,622 -"YHR134W",236,272,275,288,215,131,175,179,297 -"YHR135C",1929,1922,1719,1552,1548,1819,1854,1588,2270 -"YHR136C",16,14,7,1,4,20,19,10,21 -"YHR137W",1483,1362,886,173,44,3144,3078,2033,2433 -"YHR138C",2363,2203,1586,750,289,1955,1656,2044,3745 -"YHR139C",14,20,8,4,2,4,2,10,24 -"YHR140W",290,229,133,31,30,548,280,251,409 -"YNCH0012W",1,1,3,5,5,1,3,2,4 -"YHR141C",2210,2330,2409,4038,6677,811,1710,1897,3208 -"YHR142W",589,623,572,678,1059,343,555,534,823 -"YHR143W",2965,1771,1747,3177,3443,464,828,3841,6625 -"YHR143W-A",336,438,572,1008,1073,173,355,313,495 -"YHR144C",129,197,268,449,428,47,94,84,151 -"YHR146W",3821,3583,2997,2193,2002,3123,3040,3134,4944 -"YHR147C",406,407,340,313,416,1756,537,464,609 -"YHR148W",188,264,440,955,905,24,84,78,170 -"YHR149C",385,523,749,1240,1753,123,250,294,394 -"YHR150W",1057,1099,973,454,378,824,811,917,1503 -"YHR151C",301,361,499,591,375,172,239,267,342 -"YHR152W",344,414,400,426,329,884,1280,769,690 -"YHR153C",12,25,19,14,32,39,13,26,19 -"YHR154W",472,584,666,746,997,349,342,352,529 -"YHR155W",697,730,609,432,606,554,495,483,764 -"YNCH0014W",18,9,10,13,16,13,15,17,23 -"YHR156C",358,388,332,280,333,229,250,250,504 -"YHR157W",55,51,33,41,56,75,44,49,97 -"YHR158C",1212,1193,890,608,671,924,849,866,1319 -"YHR159W",358,346,214,61,79,347,276,242,416 -"YHR160C",413,377,215,25,47,422,287,289,523 -"YHR161C",3073,2546,1736,562,706,3248,2800,2746,4041 -"YHR162W",1118,1374,1851,3645,4023,1765,1549,1231,1984 -"YHR163W",1398,1946,2352,3107,1445,2039,1389,1198,1969 -"YHR164C",635,643,567,451,373,349,391,335,622 -"YHR165C",912,1048,1028,1080,1557,716,679,627,957 -"YHR166C",457,416,329,245,426,365,314,378,572 -"YHR167W",115,146,148,205,257,106,107,108,177 -"YHR168W",194,230,188,212,218,296,164,169,234 -"YHR169W",305,474,756,1615,972,136,254,236,448 -"YHR170W",1208,2001,3412,7888,5940,252,739,717,1132 -"YHR171W",1132,1104,608,42,72,817,873,999,1538 -"YHR172W",242,256,291,161,262,373,275,202,247 -"YHR173C",44,37,32,23,39,53,63,34,49 -"YHR174W",38349,33126,25905,19876,7285,10270,10023,21445,53234 -"YHR175W",289,293,295,214,284,343,357,323,469 -"YHR175W-A",22,26,29,19,36,38,39,42,46 -"YHR176W",260,335,317,390,322,319,160,162,292 -"YHR177W",129,138,114,62,191,154,119,111,144 -"YHR178W",665,706,626,365,331,470,605,592,877 -"YHR179W",2061,4108,9338,21829,10282,542,545,859,1735 -"YHR180W",213,210,152,68,113,210,176,191,314 -"YHR181W",434,472,386,373,437,315,380,358,603 -"YHR182W",322,374,379,359,347,286,213,188,359 -"YHR183W",9172,11677,13930,17953,7886,11234,8701,7588,12129 -"YHR184W",196,233,228,320,238,108,140,167,270 -"YHR185C",14,5,6,7,7,12,14,13,20 -"YHR186C",722,864,808,867,924,471,544,457,763 -"YHR187W",495,590,558,554,644,339,363,410,698 -"YHR188C",902,1042,812,623,779,1070,816,785,1275 -"YHR189W",129,121,94,46,51,115,105,99,167 -"YHR190W",3052,2779,2102,1143,1037,3474,3380,3059,4573 -"YHR191C",239,238,233,193,243,236,231,250,387 -"YHR192W",719,742,657,551,624,533,600,601,1055 -"YHR193C",3455,3493,3341,4485,6043,2353,3015,3300,5476 -"YHR194W",447,412,348,150,204,605,444,417,769 -"YHR195W",946,806,548,312,488,910,803,890,1399 -"YHR196W",449,900,1437,3336,2770,60,257,266,439 -"YHR197W",463,732,1191,2890,2528,56,158,178,328 -"YHR198C",774,724,520,277,471,1884,824,778,1216 -"YHR199C",745,795,625,444,483,691,574,620,1039 -"YHR199C-A",150,155,104,73,75,119,106,103,173 -"YHR200W",1592,1525,1451,1026,1029,1517,1959,1627,2691 -"YHR201C",650,824,1113,1937,1070,423,558,546,837 -"YHR202W",690,586,451,266,312,771,602,533,828 -"YHR203C",2059,2346,2706,4432,5864,600,1624,1802,3313 -"YHR204W",297,396,401,526,460,190,228,206,376 -"YHR205W",1423,1700,1852,2126,2084,942,1127,995,1517 -"YHR206W",1037,1168,1240,1403,1542,369,602,628,1064 -"YHR207C",846,888,1124,1420,806,569,625,604,1008 -"YHR208W",1654,2587,3933,10073,10731,570,1035,1056,1649 -"YHR209W",609,515,356,161,126,628,408,459,833 -"YHR210C",49,38,46,43,54,79,33,39,54 -"YHR211W",437,367,255,194,369,440,315,315,525 -"YHR213W-B",11,7,6,9,14,8,10,12,17 -"YHR214W",6,11,6,17,6,6,5,2,9 -"YHR214C-B",49,50,47,56,58,24,15,9,24 -"YHR214C-E",1,1,1,1,1,2,1,1,1 -"YHR215W",31,19,16,11,12,15,20,25,29 -"YHR216W",35,37,30,43,73,92,39,37,53 -"YIL173W",10,12,11,19,13,9,5,6,16 -"YIL171W",5,16,8,7,15,11,7,4,6 -"YIL170W",25,23,24,26,44,19,12,22,26 -"YIL169C",1665,1536,1219,876,907,1020,1018,1071,2074 -"YIL167W",239,315,340,314,338,181,176,208,341 -"YIL166C",578,502,393,315,471,178,266,353,603 -"YIL165C",158,182,199,286,240,118,128,127,256 -"YIL164C",204,275,287,394,276,192,174,189,341 -"YIL163C",30,32,30,41,66,13,29,26,42 -"YIL162W",1595,1433,973,575,1350,6950,1860,1123,1958 -"YIL161W",380,443,447,509,659,287,344,356,607 -"YIL160C",4240,3664,2469,804,121,14540,6902,5817,7926 -"YIL159W",352,402,436,612,441,150,197,212,328 -"YIL158W",130,114,128,87,80,746,957,402,268 -"YIL157C",671,667,466,338,448,3043,1036,804,1056 -"YIL156W-B",414,413,317,217,218,631,606,600,827 -"YIL156W",588,642,545,441,500,466,420,460,656 -"YIL155C",13593,9619,5610,1653,863,37171,24894,17367,22761 -"YIL154C",667,592,509,368,426,1183,713,637,1246 -"YIL153W",635,526,404,306,427,1399,897,782,1232 -"YIL152W",453,425,353,287,255,540,478,450,687 -"YIL151C",800,761,674,652,872,553,590,572,946 -"YIL150C",151,198,217,192,85,52,60,87,144 -"YIL149C",1522,1472,1420,1469,1225,1105,1256,1178,1719 -"YIL148W",4301,4756,4844,7321,13388,2001,3995,4098,7083 -"YIL147C",714,865,919,1019,1008,394,418,472,811 -"YIL146C",870,940,661,478,438,515,569,634,985 -"YIL145C",354,399,446,848,643,233,274,246,475 -"YIL144W",602,617,499,509,574,555,491,427,681 -"YIL143C",1083,1144,933,866,1452,966,928,967,1491 -"YIL142W",2847,3190,3317,4158,3852,1809,2661,2578,4225 -"YIL140W",380,495,406,241,539,507,192,268,483 -"YIL139C",308,350,286,228,251,140,228,207,444 -"YIL138C",1434,1392,1175,1070,927,1940,1645,1262,1819 -"YIL137C",917,861,703,586,619,955,804,658,1075 -"YIL136W",24222,16739,10452,2950,475,27758,24853,25245,42782 -"YIL135C",774,811,718,491,660,589,638,626,959 -"YNCI0001W",70,57,57,72,74,32,53,38,73 -"YIL134W",194,244,231,275,302,191,156,150,269 -"YIL133C",2080,2497,2812,5117,6607,482,1437,1389,2798 -"YIL132C",61,66,66,80,52,34,19,33,68 -"YIL131C",453,561,571,657,649,499,493,371,522 -"YIL130W",818,997,1354,1953,876,311,479,453,729 -"YIL129C",1442,1408,1229,823,828,1046,973,895,1439 -"YIL128W",824,933,909,1082,1102,446,477,505,801 -"YIL127C",566,729,941,1851,2073,91,332,303,669 -"YIL126W",2651,2593,2343,2628,2411,1477,1976,1854,2830 -"YIL125W",5398,4759,3108,1252,1983,6211,4762,4410,6406 -"YIL124W",8887,7179,4524,1629,246,7157,9313,10458,15840 -"YIL123W",565,699,671,629,779,1163,696,398,561 -"YIL122W",269,273,302,183,285,191,297,201,330 -"YIL121W",125,128,132,148,475,183,111,130,186 -"YIL120W",471,519,388,91,277,791,466,436,643 -"YIL119C",907,789,663,551,1332,545,746,683,934 -"YIL118W",400,603,1226,2789,1686,421,513,422,616 -"YIL117C",639,632,514,380,722,276,237,387,721 -"YIL116W",1626,1695,1538,1647,2148,914,1171,1285,2220 -"YIL115C",2190,2210,1937,1690,1360,1412,1719,1679,2409 -"YIL114C",190,248,379,669,228,125,200,182,296 -"YIL113W",223,215,115,21,35,236,221,242,342 -"YIL112W",1131,1148,955,770,855,981,922,863,1323 -"YIL111W",104,118,96,71,100,219,112,112,169 -"YIL110W",384,482,752,1301,1200,122,226,233,393 -"YIL109C",2439,2591,2228,2074,1572,2191,2030,1928,3118 -"YIL108W",617,639,556,484,579,672,578,575,836 -"YIL107C",3767,3034,1748,321,483,3870,3046,3160,4988 -"YIL106W",421,498,444,344,559,491,671,445,572 -"YIL105C",1959,1796,1107,436,663,1995,1620,1681,2517 -"YIL104C",241,314,462,1056,717,27,112,118,221 -"YIL103W",451,544,752,1329,1202,159,242,269,459 -"YIL102C-A",69,65,91,82,85,35,34,47,99 -"YIL102C",18,12,18,6,9,10,13,15,25 -"YIL101C",3240,2230,1135,95,286,5115,2888,2714,4126 -"YIL099W",331,260,170,42,45,420,335,380,532 -"YIL098C",225,239,170,110,187,926,232,230,334 -"YIL097W",1007,851,532,154,331,789,724,814,1281 -"YIL096C",231,399,654,1335,843,44,134,145,235 -"YIL095W",310,380,429,463,469,305,286,234,340 -"YIL094C",2903,4664,6433,12842,17664,873,1266,1453,2671 -"YIL093C",347,374,435,389,558,1504,368,326,483 -"YIL092W",343,331,416,483,398,106,195,205,381 -"YIL091C",563,946,1487,2982,2109,66,230,282,544 -"YIL090W",885,952,862,1054,964,432,587,645,1024 -"YIL089W",319,331,190,105,130,272,235,266,453 -"YIL088C",1338,1315,1135,842,518,1277,821,967,1638 -"YIL087C",1718,1318,849,292,222,1774,1491,1731,2872 -"YIL086C",74,55,33,8,10,88,60,74,132 -"YIL085C",895,911,936,1290,1196,526,635,603,1088 -"YIL084C",262,303,271,258,188,121,172,144,244 -"YIL083C",999,1020,842,489,368,789,737,803,1412 -"YIL082W-A",84,65,67,47,51,73,60,79,110 -"YIL079C",209,339,597,1171,649,48,108,105,232 -"YIL078W",4024,4539,4595,7544,10806,2007,2694,2820,4286 -"YIL077C",679,607,363,136,230,993,641,600,1065 -"YIL076W",950,964,880,792,889,933,842,809,1185 -"YIL075C",7122,6709,5500,3988,3473,6465,6533,5895,9130 -"YIL074C",1775,2707,3234,6443,4111,507,938,1039,1808 -"YIL073C",746,668,473,375,353,466,475,496,840 -"YIL072W",277,239,167,71,155,223,166,204,337 -"YIL071C",790,745,545,211,246,359,405,450,910 -"YIL070C",491,535,467,292,572,3902,605,479,686 -"YIL069C",1649,1979,2206,4132,5913,327,1278,1191,2231 -"YIL068C",680,725,589,550,582,635,652,565,888 -"YIL067C",444,511,570,566,505,207,292,304,545 -"YIL066C",262,224,143,95,45,118,87,140,280 -"YIL065C",600,547,380,298,437,807,718,740,1069 -"YIL064W",399,520,676,981,1298,124,246,297,584 -"YIL063C",1107,1075,977,969,1060,793,866,961,1548 -"YIL062C",1031,920,713,408,402,1462,1174,1339,1828 -"YIL061C",201,235,259,243,227,112,131,139,277 -"YIL060W",82,65,49,25,50,216,110,120,201 -"YIL057C",12815,6363,1916,247,113,48486,46081,35384,37389 -"YIL056W",562,508,502,449,421,557,326,326,559 -"YIL055C",1151,1068,713,132,88,684,726,717,1234 -"YIL054W",2,2,1,6,1,6,5,2,3 -"YIL053W",1977,4004,9556,23112,5484,118,255,571,1694 -"YIL052C",2491,2772,3059,4821,8814,771,1824,2002,3666 -"YIL051C",1149,1038,788,739,1130,997,835,834,1404 -"YIL050W",941,1030,875,825,864,1164,755,772,1323 -"YIL049W",120,119,86,67,114,145,134,145,194 -"YIL048W",1180,1295,1175,969,1047,689,763,771,1226 -"YIL047C",2759,2838,2642,3200,2641,1358,2179,2221,3628 -"YIL046W",1241,1470,1251,1121,1076,606,1007,1014,1795 -"YIL045W",3272,2551,1131,128,211,1869,1576,2102,4431 -"YIL044C",374,416,403,466,499,239,290,248,415 -"YIL043C",1788,1921,1615,1716,1982,2020,1806,1847,2910 -"YIL042C",696,673,565,268,173,642,607,616,981 -"YIL041W",3081,2796,2382,1971,1374,2387,2253,2285,3815 -"YIL040W",322,333,337,400,402,223,276,306,488 -"YIL039W",1462,1503,1370,1478,1525,1365,1254,1193,1848 -"YIL038C",1262,1254,1332,1700,1862,701,969,857,1283 -"YIL037C",375,384,275,202,186,261,244,263,447 -"YIL036W",1601,1296,752,338,770,1667,1387,1378,1965 -"YIL035C",823,949,840,1087,1417,596,792,737,1032 -"YIL034C",986,914,752,635,491,903,713,729,1177 -"YIL033C",2615,2349,1665,813,739,3016,2196,2401,3853 -"YIL031W",512,553,473,448,407,378,385,383,563 -"YIL030C",2820,2791,2402,2180,2017,1395,1849,1747,2857 -"YIL029C",44,68,64,10,13,38,47,57,71 -"YIL027C",395,431,311,394,468,416,383,443,648 -"YIL026C",1116,1179,821,330,721,755,618,776,1225 -"YIL024C",667,634,524,246,251,750,659,693,1136 -"YIL023C",594,512,468,422,485,487,510,517,883 -"YIL022W",803,922,961,1164,1174,1339,766,647,1030 -"YIL021W",824,893,950,1268,1563,642,930,791,1139 -"YIL020C",404,493,545,828,875,117,218,266,468 -"YIL019W",455,646,916,1950,2044,99,220,245,519 -"YIL018W",4640,5383,6233,10133,17720,1436,3814,3858,7240 -"YIL017C",1214,1048,572,131,184,922,779,859,1458 -"YIL016W",301,392,384,426,408,214,322,371,575 -"YIL015W",108,102,105,96,126,106,99,75,115 -"YIL014C-A",531,525,398,362,361,489,397,376,661 -"YIL014W",954,1028,905,791,962,463,589,641,1123 -"YIL013C",588,524,438,339,370,542,462,451,736 -"YIL012W",8,3,2,4,8,8,5,1,7 -"YIL011W",122,105,135,159,190,156,120,112,160 -"YIL010W",316,351,371,421,245,329,229,208,333 -"YIL009C-A",194,178,199,145,207,179,132,126,244 -"YIL009W",502,622,604,512,690,369,411,599,704 -"YIL008W",387,459,522,719,1208,246,273,326,530 -"YIL007C",580,636,485,217,309,660,585,645,984 -"YIL006W",170,191,139,75,92,204,141,136,204 -"YIL005W",908,985,823,774,844,734,654,626,1057 -"YIL004C",439,387,390,423,529,440,383,383,607 -"YIL003W",350,409,395,445,450,223,287,243,540 -"YIL002W-A",426,459,406,421,616,412,379,402,685 -"YIL002C",789,840,689,426,373,475,495,503,868 -"YIL001W",520,520,476,287,438,287,399,413,680 -"YIR001C",584,591,549,579,624,663,572,537,772 -"YIR002C",998,1025,917,791,882,694,550,638,1093 -"YIR003W",975,980,764,523,627,1205,870,810,1290 -"YIR004W",1034,1177,1050,1124,1226,1116,931,903,1415 -"YIR005W",178,197,155,164,174,116,135,173,236 -"YIR006C",2148,2231,1817,1520,1129,1579,1492,1415,2311 -"YIR007W",317,377,266,146,95,288,198,202,358 -"YIR008C",530,593,599,639,703,349,465,468,747 -"YIR009W",136,155,166,153,121,97,88,101,172 -"YIR010W",425,467,510,641,533,529,455,321,513 -"YIR011C",712,896,1177,1626,1069,620,695,731,1169 -"YIR012W",646,1059,1878,3922,2653,184,467,472,920 -"YIR013C",4,1,3,2,5,1,3,2,2 -"YIR014W",215,151,123,15,20,174,171,163,286 -"YIR015W",236,211,179,40,71,217,184,184,299 -"YIR016W",3395,2393,1195,191,384,7589,6987,5495,7675 -"YIR017C",901,964,796,984,343,277,647,757,1362 -"YIR018W",325,339,335,379,230,134,171,241,411 -"YIR018C-A",74,70,46,76,76,36,42,68,91 -"YIR019C",130,88,52,41,81,211,117,88,141 -"YNCI0012",114,132,117,39,54,82,81,79,137 -"YIR021W",152,172,216,171,249,334,192,191,254 -"YIR022W",802,805,691,581,663,1021,901,878,1339 -"YIR023W",557,624,690,811,895,315,454,368,531 -"YIR024C",338,336,325,246,310,556,318,303,461 -"YIR025W",451,466,389,257,268,282,358,376,651 -"YIR026C",354,581,1007,2349,1923,87,187,208,327 -"YIR027C",110,154,128,160,180,101,67,86,174 -"YIR028W",170,239,254,255,347,143,106,166,237 -"YIR029W",518,796,1071,1416,1694,190,263,326,572 -"YIR030C",128,126,146,229,285,57,82,68,127 -"YIR031C",546,907,1287,1951,1754,131,207,283,510 -"YIR032C",573,716,738,907,1502,460,469,652,867 -"YIR033W",1197,1380,1425,1645,986,946,1168,744,1039 -"YIR034C",1115,1836,2840,6824,7176,334,480,497,894 -"YIR035C",657,649,683,813,796,457,466,559,1081 -"YIR036C",1131,1037,700,293,74,893,982,1073,2077 -"YIR037W",3895,3481,2553,1701,763,2431,2604,2864,5283 -"YIR038C",4215,3875,2901,1746,676,2332,2171,2734,5709 -"YIR039C",145,123,72,20,16,356,154,150,195 -"YIR041W",13,4,1,1,1,34,8,8,23 -"YIR042C",152,204,173,190,181,190,137,146,225 -"YIR043C",60,52,42,39,55,62,36,51,88 -"YJL222W",6,18,11,10,11,7,5,6,2 -"YJL219W",57,44,51,33,12,44,42,34,77 -"YJL218W",17,24,14,28,34,84,42,56,29 -"YJL217W",437,366,337,211,265,2748,1277,1451,1217 -"YJL216C",186,187,142,47,104,1371,556,274,340 -"YJL214W",100,99,86,58,107,137,99,102,142 -"YJL213W",53,70,52,46,99,140,53,36,65 -"YJL212C",506,566,680,1267,220,210,190,257,485 -"YJL210W",945,865,705,548,324,1006,1128,1132,1740 -"YJL209W",265,338,571,801,311,228,234,203,296 -"YJL208C",229,355,621,1063,816,236,241,208,273 -"YJL207C",847,1036,1031,1010,1093,490,555,574,887 -"YJL206C",532,568,454,236,231,394,372,337,639 -"YJL205C",216,165,112,88,96,423,266,255,366 -"YJL204C",470,512,453,416,397,276,358,304,451 -"YJL203W",361,356,384,360,393,275,294,277,433 -"YJL201W",316,353,330,315,676,385,339,270,401 -"YJL200C",3624,5604,7502,15533,13805,275,1108,1251,2578 -"YJL199C",177,135,147,67,16,159,167,147,263 -"YJL198W",457,880,1961,4623,1622,123,306,313,460 -"YJL197W",779,946,1078,1311,1125,413,513,526,820 -"YJL196C",522,642,525,260,458,986,703,595,814 -"YJL194W",116,183,175,181,489,54,166,157,150 -"YJL193W",185,274,256,421,321,102,138,139,242 -"YJL192C",642,650,686,872,1029,511,500,538,819 -"YJL191W",1623,1607,1771,2818,3384,336,1168,1182,2269 -"YJL190C",1815,2489,2928,5874,9893,516,1188,1311,2555 -"YJL189W",3561,3710,3606,5627,10732,1182,2837,3370,5466 -"YJL187C",358,360,372,335,508,414,280,261,342 -"YJL186W",1695,2083,2210,2163,1927,1281,1431,1359,2029 -"YJL185C",562,565,355,122,85,411,372,400,712 -"YJL184W",456,431,362,326,526,419,422,502,726 -"YJL183W",770,852,868,1142,1341,862,816,724,1096 -"YJL181W",182,240,150,135,305,190,131,163,230 -"YJL180C",413,462,395,260,228,1383,490,396,611 -"YJL179W",296,309,294,394,466,195,284,282,397 -"YJL178C",1325,1307,1100,913,868,919,1020,1163,1859 -"YJL177W",2620,3015,3459,6047,9709,649,1796,1821,3499 -"YJL176C",1383,1433,1393,1292,1080,1216,1194,1012,1477 -"YJL174W",2047,2252,2710,4516,3698,1923,1952,2045,2911 -"YJL173C",725,715,547,306,297,575,478,698,1093 -"YJL172W",1525,1767,1394,731,370,835,859,1131,1592 -"YJL171C",372,440,563,1079,1023,415,352,341,543 -"YJL170C",31,26,18,17,28,19,34,29,50 -"YJL168C",611,681,807,1067,1047,438,617,518,722 -"YJL167W",4947,4869,4146,3182,2110,4533,4242,3890,6029 -"YJL166W",2300,2052,1394,1050,2304,4906,4476,3576,4459 -"YJL165C",943,925,709,624,750,759,683,690,1235 -"YJL164C",715,592,210,16,60,650,490,545,902 -"YJL163C",1232,1150,642,49,52,1264,948,1110,1744 -"YJL162C",352,402,425,468,428,130,193,216,353 -"YJL161W",453,368,193,27,32,505,288,450,727 -"YJL160C",51,61,51,38,35,43,44,55,98 -"YJL159W",23189,19082,17886,24005,26110,3281,10121,22512,29281 -"YJL158C",303,517,771,2125,2083,977,646,358,319 -"YJL157C",507,740,1017,1125,1668,284,406,463,519 -"YJL156C",1060,1104,999,1265,1331,689,751,744,1121 -"YJL155C",1056,944,614,238,434,1045,827,937,1424 -"YJL154C",1439,1449,1133,703,522,856,835,995,1632 -"YJL153C",12135,8979,7305,5451,1758,11012,33708,35782,29062 -"YJL151C",927,770,635,495,648,1246,1147,1219,1903 -"YJL149W",524,610,419,320,377,295,361,379,593 -"YNCJ0003C",1,1,1,4,8,5,4,1,3 -"YNCJ0004C",3,4,2,3,5,6,5,2,7 -"YJL148W",523,930,1409,3125,3091,68,346,371,625 -"YJL147C",400,407,319,265,333,233,312,287,452 -"YJL146W",748,722,646,404,535,469,579,600,938 -"YJL145W",539,679,762,915,769,380,391,412,669 -"YJL144W",1039,786,340,32,63,852,760,1023,1922 -"YJL143W",623,629,588,655,1026,1302,789,690,1066 -"YJL142C",27,21,15,10,30,34,25,28,30 -"YJL141C",2872,2370,1216,238,479,2389,2126,2284,3275 -"YJL140W",1710,1568,1309,1254,1973,1997,1723,1661,2591 -"YJL139C",439,496,459,471,439,265,250,258,532 -"YJL138C",509,615,659,1175,1509,332,393,478,774 -"YJL137C",876,788,503,112,119,860,780,686,1188 -"YJL136W-A",6,7,5,1,7,6,4,4,5 -"YJL136C",2130,2621,2840,4730,8472,801,1686,1733,3343 -"YJL134W",433,559,656,895,938,401,439,363,679 -"YJL133C-A",1063,1033,901,561,2453,2150,1988,1404,1719 -"YJL133W",188,279,527,851,642,222,205,179,234 -"YJL132W",656,478,275,61,149,646,492,603,896 -"YJL131C",402,386,284,148,236,756,432,352,579 -"YJL130C",7743,8422,8193,12568,10681,3421,5224,5099,7922 -"YJL129C",963,1196,1155,1500,1495,564,639,593,1057 -"YJL128C",756,826,833,755,724,474,504,519,835 -"YJL127C-B",227,205,176,147,166,211,238,278,402 -"YJL127C",405,397,406,447,338,202,255,263,423 -"YJL126W",299,290,308,292,236,263,275,253,423 -"YJL125C",480,536,798,1484,1404,219,350,343,556 -"YJL124C",680,708,604,680,1105,825,757,703,987 -"YJL123C",2715,2600,2355,1847,2065,2110,2281,2617,4036 -"YJL122W",353,688,1219,2856,2956,41,221,207,444 -"YJL121C",669,694,766,881,880,741,604,599,1144 -"YJL118W",65,83,85,92,115,82,87,61,87 -"YJL117W",985,939,771,575,603,845,911,957,1480 -"YJL116C",1061,1354,1903,3483,2659,557,408,499,1135 -"YJL115W",754,777,803,574,589,446,488,649,1053 -"YJL112W",1060,1059,785,509,764,1731,974,855,1307 -"YJL111W",2873,2995,3021,3896,3189,1616,2098,1962,3293 -"YJL110C",693,810,1046,1457,1227,223,436,435,592 -"YJL109C",1120,1873,2910,8208,4842,172,537,450,948 -"YJL108C",71,97,114,158,191,85,32,51,79 -"YJL107C",53,70,63,129,171,82,30,20,44 -"YJL106W",130,108,47,22,67,190,138,136,176 -"YJL105W",114,80,70,34,147,203,165,108,177 -"YJL104W",334,408,404,510,764,971,380,350,462 -"YNCJ0007C",5,7,2,6,3,4,13,5,3 -"YJL103C",1233,1219,787,395,679,878,965,1017,1486 -"YJL102W",599,689,505,321,438,660,556,469,698 -"YJL101C",2269,2729,2326,2115,1659,553,950,1245,2110 -"YJL100W",605,616,479,351,445,545,562,449,635 -"YJL099W",554,528,379,228,273,414,381,415,673 -"YJL098W",1104,1541,1870,3304,2346,377,519,561,1050 -"YJL097W",597,500,450,421,566,544,501,541,774 -"YJL096W",327,363,266,279,431,1519,364,298,464 -"YJL095W",635,652,615,484,427,279,358,326,550 -"YJL094C",1237,1211,974,549,675,842,972,1004,1576 -"YJL093C",735,796,629,486,628,712,624,699,961 -"YJL092W",595,594,500,393,312,763,709,502,688 -"YJL091C",594,568,438,416,548,481,434,484,704 -"YJL090C",438,516,480,539,781,363,360,367,634 -"YJL089W",1721,1182,570,165,238,836,1580,1488,2208 -"YJL088W",2796,2406,2522,3010,4190,907,2159,1780,3082 -"YJL087C",489,633,658,987,861,250,328,343,532 -"YJL085W",673,760,606,518,719,506,542,481,786 -"YJL084C",1125,1196,1111,1163,611,698,696,722,1144 -"YJL083W",313,283,262,283,120,256,222,215,356 -"YJL082W",1627,1584,1109,303,541,1053,1134,1248,2061 -"YJL081C",1336,1429,1281,1445,1061,1324,1355,1189,1905 -"YJL080C",1776,2382,2643,4413,3223,848,1268,1127,1656 -"YJL079C",2217,2679,2583,3349,9021,1890,3655,2278,2510 -"YJL078C",1385,1128,1030,1114,1237,928,1032,2002,2461 -"YJL077W-B",35,30,29,34,54,40,31,40,37 -"YJL077C",87,94,82,52,147,162,174,113,169 -"YJL076W",986,1175,1350,2182,1684,718,929,770,1036 -"YJL075C",14,12,17,23,19,9,8,6,9 -"YJL074C",1376,1450,1121,540,872,1346,723,972,1394 -"YJL073W",371,372,402,337,579,255,359,330,473 -"YJL072C",319,340,308,378,442,209,269,245,432 -"YJL071W",623,653,624,600,579,366,540,422,739 -"YJL070C",721,742,495,119,193,589,569,552,898 -"YJL069C",396,672,1148,2534,1611,111,264,271,490 -"YJL068C",1490,1306,991,483,281,1944,1559,1558,2415 -"YJL066C",1277,1021,739,266,155,3692,1613,1360,2196 -"YJL065C",246,263,213,276,284,254,243,211,377 -"YJL063C",367,367,356,307,399,2026,539,442,654 -"YJL062W-A",317,295,243,154,213,1753,492,433,597 -"YJL062W",429,488,469,414,320,365,394,328,499 -"YJL061W",814,1004,959,1303,1206,429,630,630,931 -"YJL060W",1452,1736,1663,1785,602,683,1168,1033,1861 -"YJL059W",351,326,156,71,164,360,354,301,549 -"YJL058C",184,228,215,248,239,162,183,126,190 -"YJL057C",2405,2111,1139,170,343,2642,1993,2082,3322 -"YJL056C",505,516,436,289,319,265,335,322,532 -"YJL055W",1342,1173,986,735,821,2331,1509,1420,2230 -"YJL054W",780,913,935,997,1168,1092,662,602,966 -"YJL053W",946,825,600,334,400,831,815,796,1287 -"YJL052W",21272,16913,11048,3722,738,19197,4335,10070,28539 -"YJL051W",184,199,164,169,250,393,519,297,260 -"YJL050W",1004,1577,2454,5604,4241,148,385,449,935 -"YJL049W",673,632,488,417,495,609,565,562,922 -"YJL048C",5440,4538,2986,1267,886,6630,6300,6097,8034 -"YJL047C-A",7,3,1,1,3,1,2,3,4 -"YJL047C",651,711,624,444,404,338,379,383,632 -"YJL046W",371,409,341,320,343,768,308,341,440 -"YJL045W",4390,3769,2524,1017,117,1297,2421,2965,5396 -"YJL044C",770,849,811,966,601,431,664,667,1018 -"YJL043W",34,25,28,31,16,39,27,27,39 -"YJL042W",1903,1735,1391,742,672,1867,1386,1399,2273 -"YJL041W",1314,1444,1322,1460,1377,807,998,935,1379 -"YJL039C",1461,1656,1528,1893,1838,720,885,871,1356 -"YJL038C",101,161,201,308,177,64,55,56,126 -"YJL037W",222,215,163,125,111,226,167,212,298 -"YJL036W",1574,1521,1059,337,459,1388,1352,1399,2235 -"YJL035C",84,73,68,74,163,93,53,55,106 -"YJL034W",9264,7920,5731,2203,1605,5035,4147,5161,10934 -"YJL033W",679,1047,1653,3891,3270,94,384,377,623 -"YJL031C",575,623,561,468,371,482,554,445,740 -"YJL030W",402,437,406,416,310,368,442,403,614 -"YJL029C",696,737,644,667,477,553,521,505,837 -"YJL028W",1,3,3,1,4,4,6,14,8 -"YJL027C",15,5,4,3,6,14,9,3,16 -"YJL026W",8793,8200,6790,5506,3266,3448,3284,5032,10584 -"YJL025W",123,180,257,445,268,64,113,93,190 -"YJL024C",432,464,465,544,559,276,303,329,564 -"YJL023C",547,524,365,217,419,496,540,506,787 -"YJL020C",2665,2351,1526,526,535,2594,1834,1896,3037 -"YJL019W",310,393,354,296,367,192,226,213,346 -"YJL016W",1646,1204,646,376,700,1061,798,993,1987 -"YJL014W",2667,3168,3118,4035,3684,1747,2343,2159,3296 -"YJL013C",587,586,440,361,534,653,647,530,843 -"YJL012C",1475,1627,1595,1749,1682,877,960,975,1596 -"YJL011C",138,205,284,600,514,45,112,106,189 -"YJL010C",597,885,1176,2670,2102,131,266,319,579 -"YJL008C",3656,3954,3531,3643,2967,2138,2807,2740,4292 -"YJL006C",321,325,336,308,375,206,256,245,352 -"YJL005W",2205,2102,1424,616,390,1848,1360,1461,2491 -"YJL004C",693,638,452,296,506,568,545,597,983 -"YJL003W",376,395,229,141,196,445,332,337,534 -"YJL002C",2102,2233,2029,1921,1797,1338,1411,1569,2470 -"YJL001W",3232,2863,2257,1579,948,2630,3237,3355,5176 -"YJR001W",1174,1205,934,721,867,1192,1008,1029,1698 -"YJR002W",1221,1468,1869,3346,3304,334,609,709,1357 -"YJR003C",613,662,545,706,1276,293,515,477,707 -"YJR004C",1021,1075,908,882,2032,3180,721,607,987 -"YJR005W",817,755,596,614,1122,820,747,652,1006 -"YJR006W",453,479,459,322,513,384,386,394,531 -"YJR007W",1394,1709,1980,3063,2603,768,982,940,1546 -"YJR008W",6372,4829,2510,347,408,8009,9183,8877,12127 -"YJR009C",10181,9365,8315,8050,3476,2576,1479,4709,13642 -"YJR010W",2024,3663,4963,12811,10598,1987,1114,1213,2013 -"YJR010C-A",203,215,180,152,231,162,174,187,307 -"YJR011C",343,368,295,200,309,264,255,309,428 -"YJR012C",246,299,232,177,218,247,290,281,416 -"YJR013W",536,581,516,465,632,550,511,442,705 -"YJR014W",776,996,1085,1762,1668,518,579,629,1061 -"YJR015W",1042,1117,1140,1194,1573,816,748,761,1156 -"YJR016C",3651,4469,5555,10242,7418,1227,2343,2278,4301 -"YJR017C",601,622,559,572,524,621,629,587,948 -"YJR019C",1479,1602,1337,361,146,5027,2458,1888,2405 -"YJR021C",567,543,400,183,238,635,516,528,835 -"YJR022W",131,121,101,57,104,109,89,85,182 -"YJR024C",879,1054,950,1121,1498,683,763,814,1454 -"YJR025C",1967,1842,1382,1103,967,1712,1534,1903,3067 -"YJR027W",178,183,135,188,105,102,75,91,138 -"YJR030C",235,273,240,147,510,223,162,199,279 -"YJR031C",812,830,726,742,821,517,540,470,823 -"YJR032W",548,747,757,962,747,249,382,392,636 -"YJR033C",1077,1037,688,308,221,780,695,712,1092 -"YJR034W",188,178,128,65,132,763,274,244,360 -"YJR035W",941,946,749,466,400,579,549,592,981 -"YJR036C",419,440,268,73,88,339,294,298,500 -"YJR039W",761,700,381,133,231,746,562,580,964 -"YJR040W",566,686,716,637,320,329,440,418,647 -"YJR041C",390,703,895,1810,1646,70,203,167,294 -"YJR042W",1165,1342,1224,1639,2188,824,1021,905,1392 -"YJR043C",207,296,344,375,427,155,195,196,268 -"YJR044C",856,889,678,349,288,1052,1007,928,1315 -"YJR045C",9794,8669,6306,3757,4874,26175,7924,6886,11035 -"YJR046W",958,1047,1043,721,580,360,420,533,1185 -"YJR047C",17,30,63,280,155,9,15,19,36 -"YJR048W",648,681,648,714,1960,4039,3481,1396,1064 -"YJR049C",1048,1053,898,640,572,730,760,923,1411 -"YJR050W",335,356,352,308,383,215,315,351,617 -"YJR051W",928,914,793,811,813,778,797,823,1242 -"YJR052W",745,770,802,797,553,446,476,515,885 -"YJR053W",185,231,217,236,150,158,135,120,183 -"YJR054W",278,327,560,825,381,197,196,201,332 -"YJR055W",135,148,170,222,197,52,65,92,151 -"YJR056C",341,390,382,508,452,242,290,283,495 -"YJR057W",283,304,259,248,364,244,227,250,422 -"YJR058C",329,273,213,192,304,333,300,280,500 -"YJR059W",1401,1131,705,219,446,1305,969,989,1603 -"YJR060W",478,443,415,299,444,407,449,453,695 -"YJR061W",2803,2825,2210,1107,1198,1878,2088,2214,3689 -"YJR062C",523,571,541,459,253,308,350,369,509 -"YJR063W",184,295,502,1148,1027,35,129,141,244 -"YJR064W",2388,2697,2643,3639,3444,1219,1875,1903,2996 -"YJR065C",1701,1644,1091,665,701,1742,1602,1433,2367 -"YJR066W",913,958,799,678,623,705,646,597,929 -"YJR067C",180,214,196,231,317,129,127,152,302 -"YJR068W",664,760,736,790,961,533,630,610,923 -"YJR069C",303,500,520,1019,1119,284,316,303,466 -"YJR070C",702,1094,1985,5035,4126,150,389,427,842 -"YJR072C",743,933,1069,1641,1644,449,617,643,1190 -"YJR073C",3865,3296,2725,1770,821,4467,5729,6405,9286 -"YJR074W",895,781,733,493,459,805,951,1057,1656 -"YJR075W",1155,1328,1320,1579,1635,752,797,837,1431 -"YJR076C",1105,1219,1202,1256,1248,1577,1314,1031,1526 -"YJR077C",1882,2224,2400,3189,4385,3953,2703,2096,2541 -"YJR078W",730,831,807,977,722,361,341,496,967 -"YJR079W",42,40,41,33,39,24,25,39,43 -"YJR080C",540,564,477,455,518,1351,610,532,754 -"YJR082C",684,669,637,582,539,395,468,565,916 -"YJR083C",267,311,272,176,161,322,298,272,436 -"YJR084W",332,409,414,376,320,313,399,374,585 -"YJR085C",1637,1496,1084,539,441,2524,2376,2381,3590 -"YJR086W",440,356,255,212,444,494,447,468,676 -"YJR088C",1127,1166,1081,1010,1342,987,1085,983,1554 -"YJR089W",1218,1284,1078,851,822,889,836,811,1324 -"YJR090C",1038,981,828,751,833,631,632,650,1005 -"YJR091C",1628,1483,1127,448,681,1412,1245,1248,1869 -"YJR092W",311,339,293,338,502,1029,1383,774,557 -"YJR093C",339,385,358,386,542,269,287,275,436 -"YJR094C",472,372,246,120,107,268,313,553,676 -"YNCJ0028C",4993,4015,2658,1883,792,1594,2050,2864,7632 -"YJR094W-A",1307,1566,1721,2951,5253,566,1437,1479,2380 -"YJR095W",2780,2998,2172,544,373,3234,5170,3516,4387 -"YJR096W",5017,4466,2444,462,194,4169,2004,2903,7081 -"YJR097W",261,369,528,909,807,88,193,192,351 -"YJR098C",185,168,146,91,144,332,288,258,314 -"YJR099W",514,496,423,235,180,780,691,572,787 -"YJR100C",565,541,514,380,522,934,550,485,768 -"YJR101W",308,354,278,338,524,1536,363,338,442 -"YJR102C",360,362,286,173,206,373,303,325,473 -"YJR103W",993,899,707,465,572,1680,1146,1218,1871 -"YJR104C",14696,10859,6865,3165,3962,18046,16876,20611,33584 -"YJR105W",3516,3931,4202,5464,7177,2447,3621,3792,5248 -"YJR106W",584,638,504,314,218,383,338,352,574 -"YJR107W",443,387,260,185,322,444,393,377,643 -"YJR107C-A",256,303,252,269,194,168,179,214,373 -"YJR108W",37,29,16,12,15,42,40,39,68 -"YJR109C",5604,4641,3872,4706,3461,1245,3716,3199,5715 -"YJR110W",442,470,458,325,345,291,328,330,485 -"YJR111C",251,325,401,663,433,88,181,208,309 -"YJR112W",226,256,347,343,117,148,204,186,368 -"YJR112W-A",253,302,223,157,182,271,301,300,573 -"YJR113C",680,658,609,411,571,2533,962,811,1208 -"YJR115W",263,195,78,11,116,294,151,190,352 -"YJR116W",186,196,196,105,136,195,155,170,306 -"YJR117W",2963,2485,1673,752,1146,2010,1989,2198,4101 -"YJR118C",434,500,421,394,403,479,504,403,684 -"YJR119C",578,660,675,758,997,187,307,402,580 -"YJR120W",151,221,145,119,129,333,207,172,206 -"YJR121W",9295,9662,7620,6829,9030,16551,12362,10538,12529 -"YJR122W",573,584,500,232,313,2250,635,515,759 -"YJR123W",13417,14884,15912,26821,45557,3918,9236,9813,17988 -"YJR124C",203,350,436,834,923,76,140,116,232 -"YJR125C",1458,1322,1037,484,689,1850,1645,1517,2188 -"YJR126C",1785,1676,1195,536,604,1415,1325,1459,2449 -"YJR127C",711,581,504,488,599,642,527,592,851 -"YJR128W",16,15,8,4,9,4,3,7,17 -"YNCJ0030W",57,67,80,100,91,28,25,29,55 -"YJR129C",262,322,390,456,286,119,83,125,276 -"YJR130C",1387,1309,1027,788,921,937,1008,997,1658 -"YJR131W",507,568,403,320,288,246,270,290,530 -"YJR132W",997,1231,1311,2350,2810,529,592,585,968 -"YJR133W",582,677,574,478,547,1567,905,785,949 -"YJR134C",984,994,805,717,848,849,852,840,1365 -"YJR135C",146,189,148,121,130,141,128,129,223 -"YJR135W-A",266,311,292,299,298,896,329,324,463 -"YJR136C",343,303,219,215,329,261,293,273,498 -"YJR137C",6455,8689,9678,16883,12461,1778,2593,3017,5410 -"YJR138W",924,946,739,606,520,451,493,553,884 -"YJR139C",3420,3781,3238,3548,4252,3904,3051,3436,5380 -"YJR140C",763,823,815,668,664,567,465,391,701 -"YJR141W",390,381,352,284,407,240,347,348,540 -"YJR142W",471,451,313,311,325,585,398,403,603 -"YJR143C",1066,1248,1382,1721,1986,605,729,702,1232 -"YJR144W",1162,1290,1206,1311,1173,887,1093,1160,1743 -"YJR145C",2529,2952,3354,5545,8705,721,1824,2013,3904 -"YJR146W",69,59,48,27,30,168,94,69,104 -"YJR147W",220,221,181,222,295,356,246,238,362 -"YJR148W",2235,2298,1909,1113,475,10416,4626,2845,3761 -"YJR149W",331,273,219,103,107,1565,584,310,433 -"YJR150C",30,23,29,14,10,32,21,26,51 -"YJR151C",613,522,449,139,166,439,392,386,572 -"YJR152W",415,566,527,467,736,213,218,264,468 -"YJR153W",159,165,151,176,147,78,76,95,171 -"YJR154W",675,712,655,998,943,170,313,435,828 -"YJR155W",1184,1187,1128,1539,1720,372,599,777,1547 -"YJR156C",115,137,85,51,51,134,71,89,177 -"YJR159W",5,14,4,6,5,6,4,10,16 -"YJR160C",7,13,8,6,13,26,7,10,16 -"YJR161C",61,55,34,42,37,35,42,52,86 -"YKL222C",483,488,357,331,353,347,340,319,521 -"YKL221W",257,202,141,39,61,148,120,121,287 -"YKL220C",149,97,53,51,122,225,128,102,182 -"YKL219W",422,443,299,237,393,442,367,411,640 -"YKL218C",230,167,106,97,168,1648,426,305,395 -"YKL217W",70201,46534,23665,1478,2666,155322,126111,100692,128185 -"YKL216W",778,1144,1389,2573,4091,178,380,520,935 -"YKL215C",975,1005,738,423,587,1017,761,711,1067 -"YKL214C",454,459,412,368,404,359,394,372,636 -"YKL213C",1464,1479,1264,880,510,1250,1267,1102,1840 -"YKL212W",1107,1250,1423,2413,3198,743,954,841,1295 -"YKL211C",881,972,1097,1348,1432,536,911,813,1208 -"YKL210W",9683,9346,7026,4452,2781,7347,8285,7835,11918 -"YKL209C",456,456,377,173,157,351,305,322,563 -"YKL208W",190,212,204,160,253,291,227,213,297 -"YKL207W",1029,1038,952,909,917,1019,909,988,1585 -"YKL206C",420,457,335,331,378,382,430,396,598 -"YKL205W",598,818,960,1665,1866,270,408,369,600 -"YKL204W",832,824,810,643,531,809,725,657,973 -"YKL203C",926,1040,876,580,706,654,658,635,972 -"YKL201C",2815,3051,3156,4446,2514,4047,2344,2430,3656 -"YKL198C",996,968,848,505,447,1134,860,751,1349 -"YKL197C",974,1083,881,354,115,662,457,583,1003 -"YKL196C",1839,1801,1538,1389,1445,1744,1963,1856,2812 -"YKL195W",2571,2262,1686,732,1124,11250,3597,2928,3981 -"YKL194C",192,237,187,127,165,905,250,221,310 -"YKL193C",939,945,610,216,193,939,806,823,1268 -"YKL192C",566,579,488,365,480,1428,686,546,861 -"YKL191W",842,1050,1344,2136,1581,270,453,506,928 -"YKL190W",934,882,869,815,710,766,850,844,1436 -"YKL189W",385,342,247,153,313,580,434,378,575 -"YKL188C",2741,2718,1484,67,33,5266,2999,2647,3633 -"YKL187C",6752,5401,2549,168,66,17738,8556,5441,8376 -"YKL186C",686,597,540,563,795,1416,978,910,1277 -"YKL185W",1481,1403,1084,642,817,295,1460,3023,2711 -"YKL184W",901,1007,997,1183,1282,504,556,533,933 -"YKL183C-A",12,13,9,15,13,8,13,5,14 -"YKL183W",168,176,267,395,412,135,266,257,276 -"YKL182W",45876,46671,37795,29485,14486,26538,40221,30103,42378 -"YKL181W",1955,2665,3156,5500,7367,938,1532,1603,2557 -"YKL180W",2675,2942,3340,5803,7885,744,1750,1680,3424 -"YKL179C",1232,1237,1104,730,701,888,998,879,1393 -"YKL178C",2374,2900,2290,1716,4849,2058,1071,1480,2560 -"YKL176C",1558,1617,1450,1436,1688,934,1054,1052,1664 -"YKL175W",848,920,856,759,725,566,658,664,1056 -"YKL174C",791,894,880,1000,917,380,528,538,1006 -"YKL173W",1047,1149,1030,1114,1084,505,658,614,1097 -"YKL172W",1498,2162,3517,7596,6660,271,918,958,1640 -"YKL171W",1335,1050,679,284,589,1943,1510,1443,1776 -"YKL170W",552,525,386,275,496,2188,791,618,942 -"YKL168C",537,510,323,80,144,355,335,384,600 -"YKL167C",322,316,246,231,328,843,338,274,436 -"YKL166C",294,398,471,774,978,162,194,210,330 -"YKL165C",523,587,575,383,535,421,369,361,537 -"YKL164C",2569,1447,1260,1174,1024,1174,4403,11709,7661 -"YKL163W",1906,1922,1229,334,179,303,260,666,1932 -"YKL162C",330,310,228,96,97,290,283,261,461 -"YKL161C",411,379,260,126,201,275,212,308,500 -"YKL160W",1068,1141,1035,961,1146,1394,1114,1080,1781 -"YKL159C",204,208,189,184,213,127,126,130,207 -"YKL157W",4095,3919,3012,1934,1250,3282,2845,2924,4634 -"YKL156W",1652,1883,2288,3917,4849,550,1420,1437,2317 -"YKL155C",436,578,601,695,613,594,463,305,497 -"YKL154W",339,473,478,600,561,239,359,279,453 -"YKL152C",60017,48273,33456,18293,7769,22083,18256,39608,90640 -"YKL151C",2962,2274,1444,440,77,4022,1677,2314,4841 -"YKL150W",9329,7080,4340,1657,1785,19562,10617,9886,14691 -"YKL149C",734,778,598,356,368,662,805,702,1057 -"YKL148C",5587,5282,3992,1762,3189,12875,8286,7028,8653 -"YKL146W",1315,1217,1094,575,1220,1304,1238,1156,1748 -"YKL145W",6888,6465,5158,3781,3198,5237,6526,6277,9592 -"YKL144C",236,367,397,724,841,158,222,225,322 -"YKL143W",567,884,1347,2630,3182,64,319,335,588 -"YKL142W",3925,3333,2040,593,611,4341,3422,3578,5545 -"YKL141W",4278,3937,2940,1819,2406,9826,6590,5693,7415 -"YKL140W",1051,947,727,361,426,921,762,965,1423 -"YKL139W",491,567,604,682,646,252,330,339,510 -"YKL138C-A",502,457,396,250,234,450,487,465,731 -"YKL138C",256,269,208,172,252,1196,360,269,382 -"YKL137W",303,317,248,179,293,1850,438,359,526 -"YKL135C",1496,1611,1190,1002,1163,1311,1333,1266,2007 -"YKL134C",666,698,556,376,403,621,539,476,717 -"YKL133C",625,539,369,154,285,572,468,519,788 -"YKL132C",164,148,150,146,197,156,116,123,195 -"YKL130C",419,433,415,358,446,324,340,326,499 -"YKL129C",1053,987,849,283,235,800,771,763,1123 -"YKL128C",214,262,330,598,472,277,206,185,301 -"YKL127W",769,744,661,458,291,869,526,701,1030 -"YKL126W",1414,1416,1129,574,833,1569,1246,1234,1859 -"YKL125W",583,531,458,668,1358,447,457,506,833 -"YKL124W",993,887,665,255,646,1239,996,899,1568 -"YKL122C",871,845,884,1034,1367,642,807,754,1102 -"YKL121W",557,609,447,226,250,519,430,490,749 -"YKL120W",461,1047,2398,5714,3898,108,319,286,513 -"YKL119C",272,343,270,237,311,362,316,347,446 -"YKL117W",6124,5459,4498,3239,2024,6265,5530,5370,8403 -"YKL116C",363,372,326,202,271,234,353,468,639 -"YKL114C",682,831,937,1410,1280,438,583,535,874 -"YKL113C",673,775,837,647,902,352,428,606,966 -"YKL112W",1550,1633,1532,1355,1776,1000,1435,1123,1657 -"YKL110C",425,452,563,854,704,722,285,334,509 -"YKL109W",1531,1627,1528,801,6090,2757,1966,1466,1740 -"YKL108W",263,337,312,185,391,182,201,244,371 -"YKL107W",1776,1388,861,148,30,621,686,1071,2539 -"YKL106C-A",29,21,13,4,2,15,16,28,56 -"YKL106W",927,996,924,1110,726,854,963,825,1298 -"YKL105C",960,1029,817,361,405,861,747,721,1060 -"YKL104C",3020,2972,2398,1648,2412,1922,2638,2440,3591 -"YKL103C",1932,1918,1273,309,177,1396,1237,1506,2571 -"YKL101W",643,861,797,526,859,731,488,462,677 -"YKL100C",3553,2958,1676,452,638,3670,2918,2933,4794 -"YKL099C",361,571,721,1367,1588,55,185,243,393 -"YKL098W",326,376,358,351,358,275,292,346,536 -"YKL096C-B",22,10,8,11,4,23,23,23,38 -"YKL096W-A",13816,15222,13819,11521,10658,13868,12476,8302,13192 -"YKL096W",141,114,51,25,26,461,94,101,191 -"YKL095W",339,357,340,314,331,180,180,211,365 -"YKL094W",2318,2331,1779,1296,1419,2121,2521,2500,3748 -"YKL093W",1943,1722,1279,416,497,1559,1442,1604,2670 -"YKL092C",413,487,387,326,463,340,317,254,387 -"YKL091C",1354,923,414,72,202,3505,1627,1600,2290 -"YKL090W",345,337,260,286,510,312,239,240,444 -"YKL089W",279,325,387,367,458,219,214,199,322 -"YKL088W",595,678,699,873,1173,529,531,464,742 -"YKL087C",410,418,312,235,540,2265,594,499,623 -"YKL086W",82,100,45,18,39,74,74,98,167 -"YKL085W",4150,3549,2044,1061,2996,7139,5058,5351,7661 -"YKL084W",113,137,118,138,123,168,90,99,161 -"YKL082C",1206,1443,2082,3836,3289,248,685,760,1381 -"YKL081W",1980,2713,3621,7329,8113,1024,1445,1369,2265 -"YKL080W",2031,2224,2070,2232,2231,1549,1669,1741,2726 -"YKL079W",644,752,874,1044,856,444,543,536,824 -"YKL078W",173,322,694,1538,847,31,50,70,123 -"YKL077W",1327,1569,1610,1760,1574,898,1085,1086,1682 -"YKL075C",783,847,777,834,960,511,654,676,1028 -"YKL074C",534,566,564,739,786,227,369,366,621 -"YKL073W",730,893,899,1045,997,430,540,472,833 -"YKL072W",287,389,455,501,437,102,111,120,261 -"YKL071W",263,223,184,256,286,200,179,222,370 -"YKL070W",242,262,209,190,220,163,202,172,365 -"YKL069W",711,682,567,463,303,664,598,650,1159 -"YKL068W-A",505,892,1565,5392,552,74,357,287,577 -"YKL068W",713,984,1281,2074,1109,274,526,509,765 -"YKL067W",2511,2140,1130,438,1046,4508,2331,2607,4092 -"YKL065W-A",1203,893,404,119,31,468,802,1049,2066 -"YKL065C",2369,2147,1332,606,679,2485,2126,2383,3742 -"YKL064W",2015,1746,1525,897,1179,1669,1513,1577,2449 -"YKL063C",401,476,580,800,699,315,381,378,575 -"YKL062W",760,791,774,565,480,515,521,694,953 -"YKL061W",312,265,228,181,270,304,304,278,427 -"YKL060C",141209,111932,89435,66194,38840,82001,75963,107121,204068 -"YKL059C",421,509,397,319,522,353,378,389,672 -"YKL058W",685,680,531,389,633,796,735,707,1171 -"YKL057C",1561,1856,1770,1684,1270,1160,1425,1195,1634 -"YKL056C",4769,6344,8092,15361,22683,1619,2105,3153,6609 -"YKL055C",70,86,130,136,46,27,33,36,73 -"YKL054C",3921,3733,3442,4207,5473,4179,3924,3189,4365 -"YKL053C-A",237,192,169,127,190,920,277,261,389 -"YKL052C",545,684,549,407,426,546,598,553,823 -"YKL051W",464,479,362,410,418,325,394,276,584 -"YKL050C",1741,1549,1056,223,205,479,498,676,1611 -"YKL049C",601,679,665,552,491,476,551,535,821 -"YKL048C",306,395,476,506,416,299,294,239,389 -"YKL047W",545,470,461,361,700,488,492,443,691 -"YKL046C",1163,1244,1136,1171,1573,1363,1247,1202,1806 -"YKL045W",651,806,669,540,844,592,490,625,883 -"YKL044W",174,104,84,61,150,249,167,176,201 -"YKL043W",1809,1235,976,808,1979,2465,1867,1862,2597 -"YKL042W",199,220,175,168,345,169,133,118,180 -"YKL041W",641,646,625,518,682,599,545,543,936 -"YKL040C",847,976,941,785,922,822,862,788,1151 -"YKL039W",1215,1269,1009,889,1027,1243,844,888,1496 -"YNCK0013W",15,21,14,17,18,8,11,16,23 -"YKL038W",838,807,603,380,411,840,605,609,998 -"YKL037W",21,19,7,8,8,41,32,24,32 -"YKL035W",3568,2892,1566,446,762,7656,3009,3104,4880 -"YKL034W",722,706,535,181,272,554,501,467,734 -"YKL033W-A",537,510,455,527,668,666,749,564,795 -"YKL033W",670,699,628,600,629,356,437,391,654 -"YKL032C",1087,943,880,753,909,1382,1335,976,1154 -"YKL029C",706,1458,3271,13765,5198,205,335,310,638 -"YKL028W",1208,1368,1382,1641,1589,872,1105,1026,1571 -"YKL027W",537,736,1190,2389,1370,339,593,461,662 -"YKL026C",2361,1870,837,188,96,2856,2052,2375,4009 -"YKL025C",677,756,594,388,450,474,460,407,660 -"YKL024C",324,458,602,1510,1385,240,215,280,433 -"YKL023C-A",115,159,261,642,516,94,99,98,98 -"YKL023W",802,691,559,316,293,596,572,585,1006 -"YKL022C",834,859,790,726,726,485,628,565,921 -"YKL021C",681,828,1153,2136,2648,297,462,468,736 -"YKL020C",2227,2122,1397,939,1124,1486,1525,1567,2466 -"YKL019W",733,757,659,558,594,837,682,754,1226 -"YKL018C-A",375,348,392,386,264,425,388,345,616 -"YKL018W",237,261,295,378,345,236,233,222,336 -"YKL017C",464,530,497,347,331,295,330,334,525 -"YKL016C",3444,3372,2813,2066,3067,5631,5430,4620,6104 -"YKL015W",2826,2732,2091,1730,1165,1854,2077,1961,2995 -"YKL014C",687,1000,1330,2740,2684,97,306,306,522 -"YKL013C",1470,1293,911,602,624,1859,1562,1498,2252 -"YKL012W",879,812,726,553,700,571,602,659,1084 -"YKL011C",279,292,200,178,241,320,256,239,329 -"YKL010C",2317,2319,1931,1376,1422,1147,1299,1355,2380 -"YKL009W",758,1221,2062,4898,3979,72,394,425,810 -"YKL008C",770,793,769,977,828,419,515,623,1111 -"YKL007W",1252,1310,1074,645,333,1001,1117,1105,1681 -"YKL006C-A",330,338,300,301,255,266,338,301,483 -"YNCK0015C",10,8,6,1,6,2,9,16,15 -"YKL006W",1348,1722,2062,3778,5690,375,933,980,1888 -"YKL005C",972,909,682,481,700,993,867,899,1454 -"YKL004W",862,1027,1283,2206,1883,402,627,542,897 -"YKL003C",299,290,279,231,296,941,386,302,442 -"YKL002W",1380,1219,959,591,680,1693,1329,1457,2362 -"YKL001C",1550,2410,3317,7579,6641,712,1071,1108,1754 -"YKR001C",3622,3579,2928,2242,2318,3032,2747,3028,4735 -"YKR002W",855,948,823,569,798,900,789,746,1021 -"YKR003W",701,797,539,177,207,704,609,618,1060 -"YKR004C",342,359,301,229,204,270,324,333,460 -"YKR005C",234,254,184,137,174,334,176,172,302 -"YKR006C",518,528,484,401,522,2418,538,475,718 -"YKR007W",576,593,430,358,600,468,520,599,938 -"YKR008W",637,713,784,814,886,548,583,518,750 -"YKR009C",10137,9502,5825,757,64,31733,15071,11308,15668 -"YKR010C",470,474,433,484,654,450,452,380,549 -"YKR011C",626,602,408,199,374,650,683,553,847 -"YKR013W",568,678,746,832,1625,366,259,381,715 -"YKR014C",2087,1780,1318,910,1104,2192,1941,1853,3028 -"YKR015C",302,278,184,121,360,182,191,223,368 -"YKR016W",1220,1458,1285,1204,2149,2120,1721,1312,1527 -"YKR017C",572,578,407,228,359,522,464,497,776 -"YKR018C",5284,4398,3042,1731,1238,3940,3364,3544,6031 -"YKR019C",214,277,284,266,263,166,175,174,269 -"YKR020W",399,384,289,197,262,324,336,356,585 -"YKR021W",1134,1150,987,784,778,765,969,876,1388 -"YKR022C",517,574,579,480,505,396,422,440,764 -"YKR023W",426,444,491,472,499,281,341,275,469 -"YKR024C",445,614,1032,2113,1399,77,195,201,438 -"YKR025W",373,490,1082,1794,891,116,231,259,483 -"YKR026C",367,542,679,1219,1108,95,289,271,469 -"YKR027W",373,412,341,319,295,279,372,300,462 -"YKR028W",1239,1237,1182,1129,1100,805,929,1000,1491 -"YKR029C",854,771,642,482,638,647,678,596,934 -"YKR030W",529,525,481,408,678,385,401,416,594 -"YKR031C",1859,1917,1389,913,839,1230,1229,1277,2026 -"YKR034W",161,231,228,215,215,116,63,97,208 -"YKR035W-A",862,889,876,676,766,1212,1019,947,1526 -"YKR036C",668,786,728,945,966,365,433,455,817 -"YKR037C",263,300,298,266,418,402,351,291,455 -"YKR038C",635,681,634,717,1091,568,642,575,879 -"YKR039W",12717,15900,16097,17013,17124,4648,8847,10771,16200 -"YKR041W",56,84,118,167,57,38,47,34,72 -"YKR042W",2699,3797,6669,17349,23569,3879,4451,2867,3658 -"YKR043C",818,1007,1302,2124,1852,343,584,545,1142 -"YKR044W",361,403,489,723,562,239,277,262,447 -"YKR045C",110,177,181,232,214,81,68,85,161 -"YKR046C",9256,8160,6503,4317,2332,11931,13962,10409,15776 -"YKR048C",1961,2137,2080,2363,2908,1853,1794,1592,2664 -"YKR049C",1602,1308,1008,613,264,1831,1392,1736,3201 -"YKR050W",631,643,500,367,289,526,429,403,723 -"YKR051W",550,538,391,176,263,474,429,419,640 -"YKR052C",239,222,152,86,193,267,199,227,314 -"YKR053C",161,149,139,142,263,227,152,169,252 -"YKR054C",947,1006,910,758,674,928,663,614,900 -"YKR055W",476,493,424,265,298,428,417,440,660 -"YKR056W",561,727,1196,2099,1383,138,392,373,729 -"YKR057W",1764,1999,2141,3338,6177,594,1620,1769,3121 -"YKR058W",1478,1177,665,103,353,1786,1328,1269,2002 -"YKR059W",1232,1381,1621,3037,4160,682,736,884,1331 -"YKR060W",203,298,421,763,890,39,122,127,211 -"YKR061W",239,337,476,1035,650,205,127,147,243 -"YNCK0020C",12,13,5,12,17,19,12,15,27 -"YKR062W",637,685,809,898,705,449,476,533,824 -"YKR063C",611,786,801,992,781,212,377,444,736 -"YKR064W",717,719,672,565,461,446,471,435,868 -"YKR065C",545,581,436,311,421,1063,544,510,715 -"YKR066C",1853,1623,1214,755,637,3056,1954,1838,2997 -"YKR067W",2487,1874,887,168,570,7910,3516,2568,3279 -"YKR068C",807,887,759,709,822,502,604,698,1201 -"YKR069W",819,1390,2051,4817,1270,316,505,451,761 -"YKR070W",558,561,433,324,239,501,507,490,821 -"YKR071C",1655,2320,4207,7874,4080,907,1239,1181,2034 -"YKR072C",1114,1170,1180,1409,1348,523,796,789,1368 -"YKR073C",27,30,32,28,33,10,14,12,24 -"YKR074W",812,735,544,554,805,710,690,809,1203 -"YKR075C",471,509,981,124,381,1201,820,524,719 -"YKR076W",4396,3780,2306,521,78,2503,1991,2428,5210 -"YKR077W",482,601,487,333,1137,159,216,377,494 -"YKR078W",418,374,338,249,271,298,328,293,494 -"YKR079C",386,480,599,1014,1354,121,154,146,300 -"YKR080W",820,901,1063,4436,3178,545,617,708,1081 -"YKR081C",591,922,1452,3474,3441,77,327,272,515 -"YKR082W",1150,1394,1463,2080,1700,611,691,679,1097 -"YKR083C",156,148,135,95,142,150,162,152,223 -"YKR084C",1212,1229,1148,1064,1050,723,778,780,1345 -"YKR085C",358,376,333,279,428,1675,508,353,483 -"YKR086W",790,877,775,783,911,326,459,463,870 -"YKR087C",427,466,369,382,577,370,444,377,618 -"YKR088C",532,591,469,407,536,458,425,464,706 -"YKR089C",1097,1050,759,528,749,1102,895,915,1448 -"YKR090W",467,557,609,733,819,354,430,403,605 -"YKR091W",456,470,231,25,76,297,275,354,565 -"YKR092C",631,1080,1953,5177,4698,258,482,378,638 -"YKR093W",491,585,656,571,190,659,808,264,489 -"YKR094C",3048,3540,3959,6753,11083,1213,2541,2539,4291 -"YKR095W",2683,2604,2313,2255,1815,2119,1952,1821,2921 -"YKR095W-A",184,173,162,174,226,158,183,181,252 -"YKR096W",1440,1416,1063,613,846,1109,1037,937,1545 -"YKR097W",168,263,183,154,265,250,273,203,308 -"YKR098C",222,230,261,94,148,282,175,231,278 -"YKR099W",385,530,1005,1536,704,63,264,264,390 -"YKR100C",681,694,616,633,1011,718,614,509,863 -"YKR101W",552,588,451,330,527,322,392,406,708 -"YKR102W",211,190,122,51,167,327,254,179,327 -"YKR103W",268,225,131,97,179,257,174,162,275 -"YKR104W",101,86,72,40,115,119,99,91,147 -"YKR105C",39,51,76,88,61,21,27,26,39 -"YKR106W",133,171,111,99,122,104,106,106,182 -"YLL062C",169,216,280,413,271,237,166,130,205 -"YLL061W",2196,2689,2634,2801,1175,927,1975,1726,3005 -"YLL060C",343,324,314,318,206,168,208,276,521 -"YLL058W",725,637,749,922,576,223,345,450,874 -"YLL057C",180,152,99,82,83,197,124,113,230 -"YLL056C",668,575,486,305,235,151,285,402,917 -"YLL055W",2247,2408,2308,3076,1424,816,643,1020,2367 -"YLL054C",418,489,480,443,417,490,252,239,400 -"YLL053C",974,1292,1360,2253,1891,280,635,596,1099 -"YLL052C",790,934,1080,1669,1343,187,479,525,916 -"YLL051C",564,599,589,604,468,284,366,377,591 -"YLL050C",3674,3298,2450,1952,1787,4091,3593,4004,6206 -"YLL049W",360,421,266,191,242,401,351,362,614 -"YLL048C",2490,2617,2154,1950,2655,1248,1423,1545,2560 -"YLL046C",11,10,9,4,3,3,6,5,14 -"YLL045C",6020,7125,8425,15438,24584,1377,4336,4551,8647 -"YLL043W",1085,1362,1370,1101,1308,880,1000,827,1501 -"YLL042C",103,99,73,76,111,112,104,100,160 -"YLL041C",8236,7168,4729,2162,3502,14362,11313,9857,13465 -"YLL040C",2948,2763,2019,1069,185,2510,1884,1940,3251 -"YLL039C",15255,12735,9456,6080,2939,11577,10866,13197,20734 -"YLL038C",147,186,213,365,198,94,119,102,180 -"YLL036C",446,524,595,833,798,303,428,376,595 -"YLL035W",228,341,479,818,525,46,112,126,223 -"YLL034C",592,956,1399,3046,2567,69,296,262,513 -"YLL033W",142,177,190,184,219,64,88,104,178 -"YLL032C",377,420,414,302,245,371,407,301,421 -"YLL031C",1200,1386,1287,1198,704,882,1015,968,1356 -"YLL029W",2091,2071,1666,1082,1391,1568,1659,1690,2817 -"YLL028W",837,834,1020,990,466,299,487,548,1049 -"YLL027W",1056,1102,918,779,1877,500,706,832,1286 -"YLL026W",57809,41741,22519,4471,1372,34578,30418,36697,73584 -"YLL025W",45,38,28,10,26,56,37,38,60 -"YLL024C",7709,6887,6024,4069,1532,6037,4827,4857,9315 -"YLL023C",1435,1238,800,362,325,1214,1026,1237,2180 -"YLL022C",523,573,608,388,420,350,300,415,749 -"YLL021W",1606,1728,1620,1265,1714,1042,984,1140,1903 -"YLL019C",3133,3187,2454,1559,1601,2471,2368,2272,3704 -"YLL018C-A",111,123,157,234,106,43,65,76,126 -"YLL018C",3579,3656,3462,4337,4157,1906,2115,2359,4131 -"YLL017W",71,69,52,22,43,48,55,56,106 -"YLL016W",787,762,608,301,370,465,569,564,921 -"YLL015W",2773,2620,1676,650,616,1756,1471,1700,2830 -"YLL014W",364,424,355,494,743,341,328,357,543 -"YLL013C",591,718,756,750,579,501,383,294,447 -"YLL012W",570,810,1188,1963,1140,176,299,297,604 -"YLL011W",578,827,1379,2729,2260,73,340,324,613 -"YLL010C",349,421,661,841,485,212,208,241,390 -"YLL009C",233,236,189,125,140,2272,355,291,489 -"YLL008W",593,1010,1881,4817,3415,47,253,280,521 -"YLL007C",325,287,235,137,230,200,203,187,324 -"YLL006W-A",5,8,10,2,5,4,4,1,6 -"YLL006W",441,488,403,279,207,324,275,252,438 -"YLL005C",616,598,409,199,359,433,422,386,701 -"YLL004W",289,420,611,915,403,158,208,215,339 -"YLL003W",889,1035,825,640,668,658,622,663,1126 -"YLL002W",204,205,143,72,151,199,203,170,250 -"YLL001W",1411,1512,1029,587,928,2613,1255,1065,1506 -"YLR001C",1487,1525,1137,580,701,1168,993,993,1559 -"YLR002C",536,812,1143,2400,2206,88,266,289,529 -"YLR003C",534,637,774,1209,1469,237,373,355,624 -"YLR004C",3454,4660,5381,7775,12544,645,923,1449,3318 -"YLR005W",1221,1294,1135,831,1362,886,930,1130,1730 -"YLR006C",622,658,445,309,433,514,476,466,783 -"YLR007W",700,826,1219,1459,742,459,505,630,995 -"YLR008C",246,331,437,720,646,407,267,213,290 -"YLR009W",807,1341,2165,5333,4626,127,415,450,891 -"YLR010C",166,176,142,75,52,152,173,200,286 -"YLR011W",227,244,207,117,91,198,202,222,349 -"YLR013W",9,6,3,1,1,6,4,7,8 -"YLR014C",351,462,669,1196,758,101,174,190,374 -"YLR015W",472,579,634,673,497,434,408,384,652 -"YLR016C",287,337,395,569,369,192,238,246,357 -"YLR017W",1192,1640,2164,4019,3240,394,808,1008,1672 -"YLR018C",761,836,1280,1856,1141,418,641,685,970 -"YLR019W",812,904,1138,1120,580,546,646,646,1024 -"YLR020C",342,513,654,983,938,235,292,254,394 -"YLR021W",285,300,315,307,260,250,277,256,403 -"YLR022C",256,312,466,922,684,92,141,133,269 -"YLR023C",1034,1701,3388,5026,5616,1227,978,694,968 -"YLR024C",721,953,1010,720,381,417,355,360,578 -"YLR025W",1671,1545,1189,1062,1339,1606,1644,1585,2602 -"YLR026C",274,329,413,602,564,253,257,200,336 -"YLR027C",2173,2220,1902,1494,2664,1900,1885,1815,3126 -"YNCL0003W",10,9,9,10,32,20,15,10,32 -"YLR028C",5236,4809,3842,2527,1814,4031,3389,3978,7252 -"YLR029C",6962,8204,9614,16808,25406,1796,5419,5071,9353 -"YLR030W",445,499,317,86,141,293,242,307,528 -"YLR031W",369,400,261,71,96,185,179,224,413 -"YLR032W",615,664,607,353,671,322,327,336,741 -"YLR033W",851,869,906,1046,1212,616,739,674,1011 -"YLR034C",878,858,648,451,919,607,768,748,1176 -"YLR035C",457,398,372,253,177,310,260,273,481 -"YLR036C",104,94,41,33,67,113,82,83,148 -"YLR037C",85,71,58,35,32,114,87,96,116 -"YLR038C",1731,1486,1071,749,1345,3360,3204,2437,2899 -"YLR039C",1018,1069,853,506,250,552,590,674,1035 -"YLR040C",811,1185,1351,2228,3231,895,526,580,942 -"YLR042C",110,144,155,177,312,87,54,57,147 -"YLR043C",2125,2156,1692,1396,1171,2773,2613,2362,3743 -"YLR044C",35399,36037,31968,39186,31877,6347,5218,12503,35690 -"YLR045C",550,595,586,538,585,841,715,485,756 -"YLR046C",199,193,157,134,188,145,166,161,260 -"YLR047C",391,463,454,428,202,226,255,234,386 -"YLR048W",3881,4668,5591,11000,14190,945,2419,2326,4515 -"YLR049C",291,257,192,72,389,241,393,917,780 -"YLR050C",499,508,406,331,423,558,345,502,888 -"YLR051C",441,674,1004,1941,1778,74,254,308,525 -"YLR052W",453,481,521,593,578,271,367,330,548 -"YLR053C",215,218,147,37,59,302,198,204,328 -"YLR054C",190,182,182,128,125,144,131,133,233 -"YLR055C",406,399,477,484,540,317,336,318,497 -"YLR056W",5165,6629,6477,5032,9245,1006,2002,2321,4824 -"YLR057W",651,704,665,781,1433,355,607,546,811 -"YLR058C",2072,3348,5091,21530,13011,691,583,788,1782 -"YLR059C",217,245,292,510,406,276,348,265,371 -"YLR060W",1180,1514,2094,4104,4484,611,1118,926,1351 -"YLR061W",1847,2313,2756,5212,7297,400,1181,1241,2507 -"YLR063W",138,221,462,737,221,13,48,57,95 -"YLR064W",822,897,844,748,636,557,516,566,1015 -"YLR065C",521,648,614,826,1058,265,389,415,720 -"YLR066W",672,647,545,515,593,472,641,598,932 -"YLR067C",265,336,353,399,355,333,268,196,276 -"YLR068W",274,349,521,1083,1058,59,138,130,267 -"YLR069C",855,899,828,674,1001,6435,1194,829,1196 -"YLR070C",913,788,527,98,32,1389,842,878,1441 -"YLR071C",667,820,817,871,985,485,518,440,723 -"YLR072W",855,835,694,425,427,539,660,703,983 -"YLR073C",112,196,390,818,462,22,45,64,109 -"YLR074C",342,556,1225,2788,1470,94,192,244,441 -"YLR075W",19502,21600,21284,30448,46818,6256,12518,14604,26334 -"YLR077W",750,812,716,515,357,965,650,611,1021 -"YLR078C",478,546,449,425,584,374,431,514,767 -"YLR079W",645,604,516,401,526,441,801,1371,1354 -"YLR080W",1014,923,606,151,58,715,511,651,1145 -"YLR081W",111,109,92,95,68,170,91,77,155 -"YLR082C",487,534,453,300,386,386,417,434,736 -"YLR083C",993,1274,1594,3067,3204,432,613,531,903 -"YLR084C",251,362,633,1074,804,439,493,315,269 -"YLR085C",491,538,475,399,445,383,446,428,715 -"YLR086W",1313,1237,1112,880,731,836,911,889,1396 -"YLR087C",656,755,518,445,461,448,444,422,736 -"YLR088W",994,953,813,784,647,674,652,683,1124 -"YLR089C",2563,2876,2394,2149,2918,3990,2478,2068,3109 -"YLR090W",439,485,515,532,683,1186,407,371,542 -"YLR091W",187,206,209,175,158,203,230,220,352 -"YLR092W",1218,1796,2278,5450,1815,332,713,631,1197 -"YLR093C",2196,1953,1335,697,821,2604,2379,2354,3460 -"YLR094C",342,382,346,187,183,158,200,209,380 -"YLR095C",559,655,663,591,627,440,494,426,609 -"YLR096W",884,1033,967,1312,1106,448,622,621,991 -"YLR097C",687,744,526,350,351,510,536,577,944 -"YLR098C",277,308,260,265,280,222,246,213,387 -"YLR099C",528,599,552,315,616,402,341,385,691 -"YLR099W-A",138,188,126,125,173,228,247,233,329 -"YLR100W",1082,1222,1046,906,1033,1254,1105,1020,1506 -"YLR102C",417,371,321,169,199,457,459,386,585 -"YLR103C",233,288,281,217,573,176,156,195,286 -"YLR104W",328,334,312,278,408,249,267,343,499 -"YLR105C",385,412,379,410,471,376,310,305,555 -"YLR106C",1784,2383,2850,6228,10021,806,878,855,1547 -"YLR107W",500,595,1036,1499,617,315,362,349,683 -"YLR108C",658,644,436,41,56,347,330,405,735 -"YLR109W",14877,11103,7220,2625,262,8668,8313,9358,20060 -"YLR110C",8625,9656,11606,19170,25239,22603,18463,13705,14099 -"YLR111W",13,8,4,3,2,15,15,11,15 -"YLR112W",16,10,21,12,22,70,60,42,34 -"YLR113W",746,782,1078,1574,1381,1317,901,943,1280 -"YLR114C",1872,1951,1627,1362,1215,1304,1331,1344,2150 -"YLR115W",735,794,701,724,324,477,443,457,695 -"YLR116W",449,556,622,598,418,246,279,299,509 -"YLR117C",965,1013,763,630,704,809,753,720,1118 -"YLR118C",501,511,464,356,226,384,330,351,707 -"YLR119W",239,226,190,114,135,225,169,175,349 -"YLR120C",1124,1114,877,522,556,962,787,799,1381 -"YLR121C",540,537,506,426,470,573,375,442,839 -"YLR122C",42,51,51,36,52,58,55,49,95 -"YLR125W",115,98,97,53,68,91,63,87,156 -"YLR126C",524,557,554,485,412,311,313,352,673 -"YLR127C",432,499,409,335,306,289,288,257,484 -"YLR128W",264,265,233,158,108,204,209,176,329 -"YLR129W",780,1162,1835,4152,3056,151,401,370,654 -"YLR130C",528,706,691,1220,1015,309,454,431,733 -"YLR131C",319,299,224,153,236,789,982,582,458 -"YLR132C",313,315,268,207,130,272,377,338,426 -"YLR133W",661,782,659,509,321,584,606,590,766 -"YLR134W",214,204,181,703,1155,259,247,225,298 -"YLR135W",388,455,362,417,528,289,293,312,488 -"YLR136C",106,104,92,43,19,59,43,40,92 -"YLR137W",168,139,87,43,105,221,195,169,281 -"YLR138W",1516,1663,1638,1779,2028,834,1073,1032,1869 -"YLR139C",143,193,177,261,247,220,121,88,143 -"YLR141W",327,291,222,211,197,398,380,444,612 -"YLR142W",3882,4749,4805,3901,9907,651,1752,2313,4128 -"YLR143W",372,512,579,691,580,153,218,217,373 -"YLR144C",542,552,551,478,484,387,391,324,608 -"YLR145W",217,209,213,288,325,161,212,181,314 -"YLR146C",122,191,223,404,593,107,94,113,185 -"YLR146W-A",79,88,80,105,130,91,91,90,132 -"YLR147C",241,249,233,315,422,188,234,216,301 -"YLR148W",873,957,658,512,550,631,627,678,1047 -"YLR149C",3269,2753,1185,71,165,3915,2973,3000,4526 -"YLR150W",6737,7458,7547,10626,14474,1836,3926,4246,8586 -"YLR151C",766,609,340,71,171,1394,860,794,1148 -"YLR152C",1410,1436,1133,609,337,1250,1073,1004,1695 -"YLR153C",5904,5968,4968,3766,3514,5631,5361,5124,8041 -"YLR154C",229,208,150,87,141,257,252,234,362 -"YNCL0018W",20,42,23,25,55,62,46,44,44 -"YLR162W",3,2,4,3,2,7,14,9,10 -"YLR162W-A",7,10,4,3,8,6,9,5,6 -"YLR163C",1021,1049,960,722,905,2335,966,861,1239 -"YLR164W",1207,1041,593,60,44,283,311,619,1538 -"YLR165C",213,200,166,144,156,233,176,187,307 -"YLR166C",1387,1337,1062,835,735,894,812,796,1464 -"YLR167W",12786,14656,15832,28397,54045,3297,7622,9145,17421 -"YLR168C",416,553,626,820,1931,470,632,427,680 -"YLR170C",441,442,396,289,393,387,503,547,812 -"YLR172C",761,806,868,1438,1646,283,472,521,909 -"YLR173W",724,692,653,470,324,341,482,538,837 -"YLR174W",6604,6317,4138,1182,475,7828,10930,8874,11179 -"YLR175W",1734,2809,4521,11273,10769,235,842,875,1666 -"YLR176C",155,169,196,263,388,112,135,91,150 -"YLR177W",603,502,269,97,368,1138,474,610,965 -"YLR178C",2941,2291,1356,311,119,3828,2393,2879,4929 -"YLR179C",311,433,624,1730,1979,397,273,326,479 -"YLR180W",828,1889,4237,14065,7613,215,504,494,849 -"YLR181C",959,1016,846,544,433,1096,1019,915,1310 -"YLR182W",782,838,680,620,787,1170,911,733,985 -"YLR183C",220,228,220,146,349,229,173,191,271 -"YLR185W",1865,2251,2216,4061,5643,392,989,1170,2117 -"YLR186W",388,644,879,1704,1883,77,330,323,527 -"YLR187W",303,303,286,307,325,122,161,166,261 -"YLR188W",947,1038,943,852,797,692,764,743,1179 -"YLR189C",2134,2108,1437,753,828,1691,1411,1444,2440 -"YLR190W",757,755,656,527,646,1354,2181,1190,1089 -"YLR191W",413,515,427,406,468,498,423,391,656 -"YLR192C",1547,1589,1422,1671,2096,1004,1199,1284,2207 -"YLR193C",728,675,638,440,582,1121,794,670,1013 -"YLR194C",1073,790,732,752,1094,555,1070,2100,2442 -"YLR195C",677,774,733,885,996,570,533,534,767 -"YLR196W",841,1386,2304,5501,4782,98,446,458,810 -"YLR197W",1612,2774,4318,10425,12853,292,821,795,1462 -"YLR199C",863,903,752,696,609,523,705,604,1159 -"YLR200W",416,470,582,765,714,266,337,322,569 -"YLR201C",719,677,511,318,271,884,645,625,903 -"YLR203C",640,776,539,447,659,2211,679,556,772 -"YLR204W",464,504,381,253,448,2074,629,583,754 -"YLR205C",624,631,464,150,260,1847,2462,1239,1253 -"YLR206W",1836,1620,1220,673,1166,2437,1851,1590,2429 -"YLR207W",495,499,478,350,322,391,361,360,555 -"YLR208W",1976,2093,1920,1850,1753,1850,2019,1792,2858 -"YLR209C",317,339,292,332,361,481,343,324,434 -"YLR210W",302,316,362,403,373,249,288,212,376 -"YLR211C",604,539,391,209,143,362,498,424,728 -"YLR212C",432,512,452,340,535,313,416,442,609 -"YLR213C",129,110,99,114,130,199,141,143,182 -"YLR214W",292,317,249,254,247,273,230,216,386 -"YLR215C",327,414,468,665,600,156,213,243,396 -"YLR216C",6287,5434,3937,1911,798,5161,4128,4813,9567 -"YLR218C",178,155,80,22,53,583,243,217,312 -"YLR219W",2208,2034,1406,340,420,1601,1501,1498,2447 -"YLR220W",2014,1972,1706,1339,1959,1327,1663,1720,2779 -"YLR221C",425,577,740,1583,1885,186,310,310,532 -"YLR222C",508,839,1391,3040,2123,32,196,190,348 -"YLR223C",708,1111,2491,4729,976,180,404,408,795 -"YLR224W",545,756,1178,1356,805,206,293,341,620 -"YLR225C",711,725,673,472,556,496,537,531,971 -"YLR226W",274,382,651,907,378,114,177,165,249 -"YLR227C",393,345,401,462,426,589,597,373,540 -"YNCL0032C",54,63,28,15,29,90,92,59,99 -"YLR227W-B",298,303,245,260,135,160,147,120,186 -"YLR228C",779,607,384,211,448,988,791,714,1096 -"YLR229C",1100,1190,1213,1237,1899,1468,1276,1202,1773 -"YLR231C",1528,1625,1453,1121,963,1162,1042,1304,2113 -"YLR233C",497,515,392,246,310,292,317,388,596 -"YLR234W",146,173,163,86,110,117,122,103,166 -"YLR236C",37,47,51,30,32,35,49,33,77 -"YLR237W",11694,13077,17222,35894,23359,3007,5240,6918,14377 -"YLR238W",358,366,333,352,353,309,332,299,501 -"YLR239C",348,336,305,241,245,877,338,305,460 -"YLR240W",870,846,696,364,347,616,584,572,918 -"YLR241W",1947,1858,1447,831,590,1363,1441,1440,2202 -"YLR242C",230,221,179,182,219,129,175,174,283 -"YLR243W",371,431,538,883,943,166,261,287,386 -"YLR244C",868,1216,1523,3214,2399,330,486,484,924 -"YLR245C",97,110,133,153,120,49,56,56,110 -"YLR246W",401,465,385,303,277,234,288,284,494 -"YLR247C",2033,1897,1278,897,1281,1117,1261,1287,1998 -"YLR248W",2420,2364,1894,1593,1697,1920,1537,1758,3177 -"YLR249W",11412,20268,34548,93334,78474,1799,4753,5354,10454 -"YLR250W",1060,1104,880,637,904,1065,1011,1007,1526 -"YLR251W",934,848,516,121,114,770,608,837,1527 -"YLR253W",632,664,660,722,761,1995,735,590,794 -"YLR254C",716,676,480,307,524,548,902,827,1262 -"YLR255C",11,7,5,1,6,10,8,8,15 -"YLR256W",2710,2336,1872,1237,1403,1167,1616,1811,2825 -"YLR256W-A",13,12,17,12,14,15,5,9,15 -"YLR257W",2973,2976,2014,1608,2373,2709,1793,2316,4053 -"YLR258W",2351,1618,800,180,156,3746,1670,2584,4075 -"YLR259C",9483,7693,5281,2382,2995,23725,8309,7155,13083 -"YLR260W",657,687,629,534,461,411,419,462,743 -"YLR261C",2,5,6,1,5,10,4,5,3 -"YLR262C",287,326,273,268,299,222,272,236,396 -"YLR262C-A",954,921,819,1033,1690,712,904,969,1619 -"YLR263W",383,432,338,428,385,184,201,212,391 -"YLR264W",1012,1187,1227,2071,3068,362,947,965,1679 -"YLR264C-A",598,646,679,1256,1997,175,453,418,699 -"YLR265C",502,453,300,177,217,380,347,418,720 -"YLR266C",668,637,453,253,507,500,543,557,832 -"YLR267W",644,669,352,70,131,531,469,510,793 -"YLR268W",637,692,655,667,719,699,668,623,954 -"YLR270W",2188,1859,1096,270,231,2347,1678,1778,2823 -"YLR271W",471,426,319,185,105,386,316,335,624 -"YLR272C",543,632,578,684,799,457,471,354,651 -"YLR273C",1239,1222,940,459,593,551,890,1224,1670 -"YLR274W",1720,1908,1709,1748,2709,540,1323,1716,2253 -"YLR275W",227,224,214,279,266,145,179,158,350 -"YLR276C",1145,1643,2274,5105,4731,199,685,657,1121 -"YLR277C",414,482,458,467,434,237,316,279,448 -"YLR278C",1157,1275,1407,2113,1525,709,842,832,1126 -"YLR281C",229,202,132,74,91,293,298,301,513 -"YLR283W",376,429,341,210,247,373,327,306,492 -"YLR284C",1648,1773,1171,328,80,4949,2822,2167,2998 -"YLR285W",331,423,557,718,767,321,352,280,386 -"YLR285C-A",151,84,65,93,114,26,45,164,238 -"YLR286C",9991,5329,4227,5798,5450,1119,2714,12524,22713 -"YLR287C",710,936,1038,1657,1108,151,422,435,769 -"YLR287C-A",4622,4677,4646,6433,10211,2209,3146,3226,5699 -"YLR288C",742,704,557,412,413,594,550,584,1024 -"YLR289W",266,305,239,225,246,1010,290,239,328 -"YLR290C",632,609,393,221,127,539,544,572,871 -"YLR291C",626,796,893,1357,1202,298,399,396,714 -"YLR292C",647,760,714,832,949,411,518,526,860 -"YLR293C",1413,2141,3354,6715,5659,480,906,876,1485 -"YLR295C",2628,2493,2274,2182,2829,4281,4032,3117,3907 -"YLR296W",7,8,5,1,11,6,8,3,3 -"YLR297W",803,645,327,241,508,529,498,621,1007 -"YLR298C",419,484,463,439,499,417,481,449,665 -"YLR299W",1336,1425,1430,1150,759,1267,1005,1073,1698 -"YLR300W",2810,3730,5340,9792,5923,1147,2843,6027,4786 -"YLR301W",928,1051,1073,1272,881,544,814,804,1324 -"YLR302C",11,4,8,4,2,8,12,10,7 -"YLR303W",14765,16884,17252,27615,29135,11996,11068,11742,19128 -"YLR304C",14027,11717,7606,2601,5897,22199,12818,12602,18952 -"YLR305C",1581,1728,1425,1391,1358,937,979,973,1491 -"YLR306W",194,176,111,118,116,157,188,174,256 -"YLR307W",215,255,212,133,128,137,184,223,345 -"YLR307C-A",1386,1356,1021,530,263,410,710,818,1802 -"YLR308W",16,12,9,4,3,13,15,16,34 -"YLR309C",1519,1618,1430,1329,1360,1512,1207,1142,1666 -"YLR310C",3539,3433,2632,1938,2037,2066,2225,2293,3626 -"YLR312C",2690,2364,1296,196,512,3011,2439,2709,4062 -"YLR312W-A",349,416,368,451,652,1346,484,371,521 -"YLR313C",220,226,201,133,194,93,133,138,226 -"YLR314C",1071,1319,1306,1571,2498,2360,1802,1339,1527 -"YLR315W",70,69,60,41,57,56,68,69,88 -"YLR316C",351,361,427,523,520,245,288,284,491 -"YLR318W",295,317,396,492,388,126,185,187,297 -"YLR319C",679,737,671,675,676,431,474,463,765 -"YLR320W",501,604,545,538,519,278,313,333,564 -"YLR321C",444,500,522,639,536,268,386,311,558 -"YLR323C",300,371,386,428,383,150,165,204,401 -"YLR324W",1165,1149,927,383,290,889,928,872,1593 -"YLR325C",3171,3820,4004,6619,12348,1028,2829,2640,4957 -"YLR326W",246,304,393,601,408,411,225,258,401 -"YLR327C",25203,13250,5601,1125,4717,72557,55048,46481,54732 -"YLR328W",463,563,559,648,725,449,394,423,577 -"YLR329W",58,51,36,19,55,62,55,65,87 -"YLR330W",2229,2037,1771,1328,1624,2793,2253,2096,3244 -"YLR331C",1,2,1,2,6,3,2,1,2 -"YLR332W",226,314,499,862,1180,390,239,233,243 -"YNCL0041C",6,6,8,4,32,21,10,12,15 -"YNCL0042C",9,11,4,7,8,5,8,5,14 -"YNCL0043C",8,11,13,8,7,11,4,5,14 -"YLR333C",1698,2106,2190,4101,6673,438,967,1232,2284 -"YLR335W",1268,1519,1460,1867,1707,926,954,946,1359 -"YLR336C",816,972,1360,2243,1608,217,395,456,863 -"YLR337C",1229,1228,1010,482,361,770,677,761,1195 -"YLR340W",6249,7238,8565,14743,19288,1595,3892,3885,7316 -"YLR341W",10,16,10,23,43,14,18,14,19 -"YLR342W",2490,3858,6113,21008,17485,970,1159,1370,1905 -"YLR342W-A",16,23,28,109,181,5,15,10,14 -"YLR343W",82,90,78,71,184,77,58,68,132 -"YLR344W",2655,3064,3532,5529,8533,861,2007,2276,3940 -"YLR345W",3448,2948,1838,355,654,3519,3023,3145,4907 -"YLR346C",295,394,312,181,28,83,93,139,367 -"YLR347C",1713,2096,2260,2589,1859,797,905,1113,1918 -"YLR348C",2537,2532,2108,1184,392,7207,4532,3394,4690 -"YLR350W",712,634,531,347,592,970,780,796,1367 -"YLR351C",1083,1117,1049,938,939,1352,1041,1146,1552 -"YLR352W",686,588,358,95,296,833,627,595,824 -"YLR353W",474,514,497,369,296,477,568,418,592 -"YLR354C",7669,6581,4957,3987,2675,11741,8838,8257,13385 -"YLR355C",9562,11696,15678,33852,22884,1817,6537,5913,10297 -"YLR356W",1350,1348,907,496,158,1005,1074,1143,1685 -"YLR357W",373,423,480,495,503,287,304,292,408 -"YLR358C",19,9,20,32,35,9,14,8,23 -"YLR359W",3020,3853,4056,9767,11313,2588,2175,2212,3499 -"YLR360W",452,489,436,315,378,360,388,419,597 -"YLR361C",685,657,538,438,542,468,400,395,725 -"YLR361C-A",229,216,162,171,146,415,237,244,415 -"YLR362W",1309,1225,921,584,510,699,764,789,1442 -"YLR363C",253,316,254,216,227,157,188,189,315 -"YLR363W-A",179,278,364,693,805,63,114,119,196 -"YLR364W",179,252,353,814,855,115,98,112,182 -"YLR367W",1853,2069,1955,3018,5505,973,1300,1507,2835 -"YNCL0046W",43,48,43,68,97,16,30,29,75 -"YLR368W",498,487,465,568,560,306,351,295,507 -"YLR369W",801,950,868,672,632,701,666,685,1006 -"YLR370C",1315,1125,746,486,524,1749,1396,1320,1961 -"YLR371W",1265,1157,875,675,854,865,952,950,1392 -"YLR372W",742,1131,1590,3324,5217,346,645,550,830 -"YLR373C",881,868,813,809,642,1025,890,748,950 -"YLR375W",619,786,777,1135,796,508,600,583,1008 -"YLR376C",215,251,197,134,157,120,142,135,229 -"YLR377C",279,301,211,65,79,393,639,723,696 -"YLR378C",2168,2240,1925,1425,1406,1380,1532,1415,2189 -"YLR380W",695,734,875,1048,909,402,448,501,825 -"YLR381W",291,328,277,201,243,373,266,268,428 -"YLR382C",496,546,439,325,453,1628,568,430,648 -"YLR383W",599,595,607,456,650,459,315,369,640 -"YLR384C",2027,2353,2410,3618,3816,910,1186,1273,2139 -"YLR385C",36,31,36,42,23,24,16,25,28 -"YLR386W",712,734,540,391,466,522,457,488,710 -"YLR387C",1556,1583,1427,1207,1338,1000,1193,1182,1883 -"YLR388W",944,1167,1298,2250,4296,296,677,687,1346 -"YLR389C",1178,1153,945,968,1265,911,852,797,1191 -"YLR390W",119,147,85,74,97,372,131,141,228 -"YLR390W-A",3105,3605,4233,6736,7313,3234,2481,2118,3056 -"YLR392C",709,703,482,164,375,647,643,630,940 -"YLR393W",107,103,114,117,147,92,79,52,107 -"YLR394W",187,224,202,217,434,221,168,139,179 -"YLR395C",2336,2252,1750,1289,1480,3679,3944,3112,3938 -"YLR396C",568,626,498,356,473,467,506,423,668 -"YLR397C",399,590,681,1451,1367,230,258,281,461 -"YLR398C",954,1061,1162,1199,968,555,614,530,909 -"YLR399C",2391,1763,1173,1050,1697,2355,2662,2745,3836 -"YLR401C",338,608,1198,2755,1864,69,158,129,327 -"YLR403W",1054,1293,1413,1671,1268,641,760,704,1086 -"YLR404W",331,401,320,199,200,161,271,259,477 -"YLR405W",214,286,350,501,447,130,209,174,343 -"YLR406C",2278,2740,3153,5558,9511,474,1406,1496,2982 -"YLR407W",526,828,1466,1656,878,200,344,411,731 -"YLR408C",89,109,78,28,54,89,77,98,145 -"YLR409C",711,1053,1679,4071,3404,84,347,364,678 -"YLR410W",1132,1204,1153,1456,1210,695,856,762,1272 -"YLR411W",83,77,48,3,26,96,64,48,146 -"YLR412W",340,364,444,541,495,178,247,253,414 -"YLR413W",114,182,272,1866,1370,92,73,61,134 -"YLR414C",940,865,744,897,1410,1110,824,1280,1438 -"YLR415C",18,10,13,10,16,25,20,16,24 -"YLR417W",459,438,308,148,279,529,526,495,754 -"YLR418C",677,801,792,838,806,475,678,722,1026 -"YLR419W",931,1030,1172,1279,818,547,680,618,1093 -"YLR420W",731,869,921,1171,1256,505,508,574,891 -"YLR421C",1286,1168,985,741,879,1065,1133,1156,1895 -"YLR422W",987,1039,761,475,432,826,734,735,1140 -"YLR423C",526,458,272,119,151,449,403,408,659 -"YLR424W",396,402,348,307,368,349,293,282,439 -"YLR425W",630,628,542,364,349,432,401,367,685 -"YLR426W",226,246,212,223,267,167,183,164,283 -"YLR427W",944,958,794,678,778,704,717,747,1178 -"YLR429W",1132,1290,1197,1235,1391,1228,1254,1039,1353 -"YLR430W",1039,1126,1025,1052,1588,655,778,715,1102 -"YLR431C",1073,954,668,451,309,824,855,879,1259 -"YLR432W",791,1215,1832,3830,3543,185,322,376,860 -"YLR433C",789,729,478,475,892,595,576,585,991 -"YLR435W",307,484,646,1499,1555,47,185,146,315 -"YLR436C",1434,1311,870,680,1107,1550,1269,1190,1602 -"YLR437C",206,224,320,454,292,346,359,247,361 -"YLR438W",1420,1483,1283,807,255,2313,1153,1034,1802 -"YLR438C-A",712,720,684,888,1042,816,861,881,1342 -"YLR439W",411,392,394,391,470,1679,498,352,447 -"YLR440C",795,836,782,716,720,404,503,501,888 -"YLR441C",9518,10586,11084,18005,29386,2751,6337,6964,12367 -"YLR442C",700,782,715,532,370,530,557,537,822 -"YLR443W",405,472,479,514,621,280,321,365,544 -"YLR445W",5,9,7,11,14,5,4,5,7 -"YLR446W",366,371,221,117,135,284,231,298,439 -"YLR447C",2353,2451,2101,2248,2337,1742,1882,1983,2958 -"YLR448W",1927,2344,2729,5342,5905,322,1001,1027,1909 -"YLR449W",656,906,1339,2970,2978,136,352,389,682 -"YLR450W",1654,1467,985,417,380,1298,1221,1307,2077 -"YLR451W",798,805,788,1018,1043,343,484,473,827 -"YLR452C",584,595,482,553,1762,587,419,437,569 -"YLR453C",325,263,248,202,216,160,176,224,371 -"YLR454W",2346,2264,1620,697,258,1669,1552,1540,2421 -"YLR455W",421,534,539,688,549,455,387,302,519 -"YLR456W",154,165,116,80,112,81,114,123,161 -"YLR457C",285,302,258,168,304,182,235,229,344 -"YLR459W",661,669,627,574,712,533,518,525,735 -"YLR460C",76,101,87,34,31,58,40,59,93 -"YML131W",22476,18622,12466,6080,1465,24778,21270,22060,33886 -"YML130C",852,1280,2510,4827,844,343,340,447,866 -"YML129C",351,301,226,153,272,1733,532,470,600 -"YML128C",35629,23394,12701,3442,360,29249,23505,29228,55825 -"YML127W",764,903,822,798,928,640,655,682,979 -"YML126C",4893,4194,3515,2325,1437,3379,5228,4134,6238 -"YML125C",925,1167,1478,2168,1302,308,600,611,1259 -"YML124C",562,748,887,1298,786,830,742,533,734 -"YNCM0001W",51,53,49,56,57,21,26,44,73 -"YML121W",896,1163,1387,1907,724,470,584,745,1267 -"YML120C",3477,3238,2069,1088,2752,8251,5464,4145,5074 -"YML119W",340,348,371,466,371,441,619,432,540 -"YML118W",164,175,140,57,31,68,68,65,174 -"YML117W",1878,1753,1352,802,885,1487,1197,1229,2019 -"YML116W",735,996,938,1530,1578,222,318,384,794 -"YML115C",980,1191,1193,1592,1618,587,675,679,1157 -"YML114C",426,476,481,544,447,289,304,254,464 -"YML113W",343,433,748,1338,935,73,199,218,344 -"YML112W",247,260,302,371,327,154,201,201,305 -"YML111W",681,845,839,866,928,536,531,460,790 -"YML110C",1941,1942,1303,728,418,3790,2114,1945,2928 -"YML109W",597,691,591,381,662,353,418,431,588 -"YML108W",175,297,379,771,521,93,130,163,299 -"YML107C",361,378,363,448,338,190,237,243,416 -"YML106W",1453,1766,2140,3597,4817,956,1397,1251,1925 -"YML105C",622,785,873,1350,1395,565,728,612,926 -"YML104C",810,874,838,885,650,633,670,645,837 -"YML103C",1646,1751,1543,1802,2020,882,1055,1028,1554 -"YNCM0002C",1,3,1,2,6,4,1,2,2 -"YML102W",362,452,402,366,579,237,263,367,555 -"YML101C",230,199,127,66,122,388,376,340,465 -"YML100W",4958,2918,1003,60,152,10639,4322,4908,7131 -"YML099C",644,748,786,1009,973,272,367,424,736 -"YML098W",796,876,799,719,808,427,622,735,1216 -"YML097C",486,574,710,772,538,323,451,393,667 -"YML096W",382,466,667,1035,720,193,280,261,421 -"YML095C",190,209,193,150,134,118,121,126,233 -"YML094W",375,442,483,785,951,232,296,309,527 -"YML093W",1002,1628,2576,5981,4918,91,550,473,987 -"YML092C",1980,1881,1597,1282,1248,2194,2247,2039,3061 -"YML091C",3325,3321,2593,1286,5641,3160,3065,2556,3690 -"YML088W",835,967,1015,839,572,326,452,541,1013 -"YML087C",199,219,149,117,357,600,193,184,292 -"YML086C",1685,1865,1679,1410,1266,836,962,1026,1834 -"YML085C",1278,1209,1065,979,926,3238,1772,1393,1785 -"YML083C",31,43,29,6,16,85,28,35,61 -"YML082W",278,415,530,859,769,59,203,181,345 -"YML081C-A",1382,1320,1067,975,1205,2655,2258,1867,2431 -"YML081W",724,862,942,1244,1331,324,497,488,759 -"YML080W",364,553,1027,2061,1337,128,259,256,378 -"YML079W",999,933,817,640,431,992,856,804,1376 -"YML078W",1403,1493,1298,1245,1282,2053,1305,1328,2027 -"YML077W",274,331,321,547,570,168,219,201,326 -"YML076C",563,575,597,549,597,317,423,383,640 -"YML075C",5985,5160,3834,1305,1345,5324,5726,4802,7306 -"YML074C",1537,1891,2027,2673,3142,1121,1070,1094,1865 -"YML073C",3336,3897,3832,6831,9372,739,1796,1930,3833 -"YML072C",3688,3693,2910,2120,783,2507,2233,2213,3721 -"YML071C",839,844,851,817,754,453,558,525,1015 -"YML070W",1997,1834,1546,1083,682,1953,1614,1722,2857 -"YML069W",2104,2049,1643,1044,1723,1832,1771,1701,2563 -"YML068W",469,447,325,249,267,296,324,387,597 -"YML067C",976,964,822,798,980,587,664,722,1182 -"YML066C",89,108,81,75,92,70,69,49,129 -"YML065W",931,1050,991,836,861,622,579,629,1117 -"YML064C",255,328,345,356,284,286,375,292,391 -"YML063W",7896,9027,9742,17592,27292,1782,4796,5118,9417 -"YML062C",715,726,763,660,717,470,594,550,892 -"YML061C",666,772,748,742,871,427,478,472,749 -"YML060W",200,305,344,548,751,67,94,111,198 -"YML059C",487,492,387,409,889,500,433,368,467 -"YML058W-A",2,4,6,2,4,6,6,7,9 -"YML058W",998,944,814,712,1125,1762,1689,1182,1595 -"YML057W",1047,953,730,406,471,994,749,761,1075 -"YML056C",239,521,1619,5757,2547,62,109,108,212 -"YML055W",461,459,491,618,693,216,226,308,551 -"YML054C",9392,6555,3263,555,451,66969,44215,22607,21185 -"YML054C-A",15,9,8,1,14,13,13,4,22 -"YML053C",902,795,475,398,781,743,1040,952,1161 -"YML052W",343,320,311,319,659,2505,2546,1226,847 -"YML051W",307,334,291,259,409,272,246,222,411 -"YML050W",235,254,229,145,182,741,236,182,312 -"YML049C",1274,1291,1083,683,651,792,879,794,1290 -"YML048W",3893,3742,3289,2343,2876,3708,3814,3458,4959 -"YML047C",19,27,18,10,25,16,10,22,25 -"YML046W",473,576,588,780,859,249,302,343,536 -"YML043C",120,255,921,1847,292,38,70,49,101 -"YML042W",4767,3939,2218,237,42,27198,10392,6373,7883 -"YML041C",285,313,277,239,366,319,316,321,460 -"YML038C",503,609,549,623,489,297,364,370,611 -"YML037C",98,105,131,101,73,46,58,57,67 -"YML036W",212,260,261,305,380,245,214,184,267 -"YML035C",853,1026,1310,1657,848,735,479,543,937 -"YML034W",1696,1517,1167,635,798,1467,1689,1401,1891 -"YML032C",822,813,739,642,581,715,752,669,1034 -"YML031W",655,695,701,718,679,552,650,551,845 -"YML030W",1325,1039,581,231,393,3736,1680,1608,2474 -"YML029W",960,1019,820,631,454,573,637,688,1183 -"YML028W",9957,8768,6447,3639,2092,13159,11297,11320,17165 -"YML027W",315,421,297,133,304,191,200,231,402 -"YML026C",4919,5610,6290,11531,20370,1282,3244,3255,5987 -"YML025C",312,369,356,367,434,878,413,324,456 -"YML024W",3837,4158,4234,7006,12373,1248,2761,2905,5095 -"YML023C",447,538,504,596,437,209,272,266,497 -"YML022W",998,1326,1560,2803,4289,443,657,735,1266 -"YML021C",232,269,282,263,390,131,159,180,287 -"YML020W",537,573,480,272,495,371,363,387,598 -"YML019W",556,602,594,600,738,357,442,435,754 -"YML018C",631,1139,1919,4522,1659,130,428,433,663 -"YML017W",607,726,580,420,560,405,415,415,674 -"YML016C",848,741,615,751,1634,1007,826,743,1002 -"YML015C",593,707,669,750,754,340,520,518,777 -"YML014W",285,367,418,649,762,120,160,221,395 -"YML013W",1151,1139,998,524,296,828,856,808,1313 -"YML012W",2206,2097,1633,1325,1788,2361,2257,2429,3873 -"YML011C",186,234,226,215,288,141,167,149,255 -"YML010W",2116,2107,1862,2032,2485,1773,1855,1722,2782 -"YML009C",286,280,258,188,357,1226,426,345,469 -"YML008C",7243,7198,5573,3113,1953,8847,7478,6141,9113 -"YML007C-A",14,5,1,2,14,7,8,6,9 -"YML007W",5473,4752,3717,2455,2293,3590,3892,3987,6408 -"YML006C",354,520,660,894,515,304,274,277,394 -"YML005W",523,556,628,679,654,282,337,390,603 -"YML004C",7135,4712,2397,776,749,5011,5376,6356,10679 -"YML003W",189,183,119,91,65,83,96,127,166 -"YML002W",802,707,470,304,446,457,435,502,876 -"YML001W",968,936,773,524,607,952,1078,1062,1780 -"YMR001C",270,296,357,417,354,870,1192,633,509 -"YMR001C-A",8,3,4,7,3,32,53,22,13 -"YMR002W",2355,2304,2141,2051,2853,4748,3489,2516,3543 -"YMR003W",156,200,207,179,223,433,268,188,201 -"YMR004W",884,876,763,505,446,599,591,625,981 -"YMR005W",822,925,888,992,1321,622,695,751,1187 -"YMR006C",2341,2176,1493,758,555,3400,3303,1852,2869 -"YMR007W",48,42,23,10,26,67,52,33,80 -"YMR008C",1863,1838,1383,875,947,1231,1211,1329,2287 -"YMR008C-A",36,36,20,11,14,63,53,48,79 -"YMR009W",1427,1512,1477,1216,701,1536,1898,1571,2298 -"YMR010W",346,541,973,1609,737,328,284,248,430 -"YMR011W",1724,2587,5598,2975,5437,2626,2455,2385,2436 -"YMR012W",2135,2687,2857,3802,3190,3151,1723,1445,1998 -"YMR013C",346,373,296,409,871,231,294,320,483 -"YNCM0012W",8,1,12,5,4,2,4,3,10 -"YNCM0013W",13,12,13,14,16,3,4,6,13 -"YNCM0014W",6,6,4,8,6,1,3,4,8 -"YNCM0015W",3,7,3,3,2,1,1,4,11 -"YMR014W",754,1038,1424,2702,2301,212,568,547,929 -"YMR015C",8864,9833,8143,5076,5438,2698,5374,4926,8753 -"YMR016C",553,743,1026,1597,1351,341,315,315,530 -"YMR017W",158,140,88,35,48,201,178,158,228 -"YMR018W",426,297,120,61,119,453,716,679,823 -"YMR019W",891,912,755,593,689,542,631,611,1047 -"YMR020W",766,871,677,491,361,417,449,490,927 -"YMR021C",407,431,401,384,572,362,332,320,532 -"YMR022W",529,502,434,317,551,584,515,588,825 -"YMR023C",266,265,213,211,371,354,203,196,310 -"YMR024W",462,551,528,585,693,1662,532,424,532 -"YMR025W",257,250,174,107,110,185,179,189,334 -"YMR026C",643,699,684,633,516,474,524,530,950 -"YMR027W",2123,2089,1646,1153,1103,2037,1640,1721,2850 -"YMR028W",490,591,579,527,513,401,441,424,680 -"YMR029C",1324,1365,931,436,561,1525,1330,1311,1894 -"YMR030W",537,510,368,135,206,788,711,542,754 -"YMR031C",7108,5346,3226,773,943,11868,8590,7282,10444 -"YMR032W",85,67,68,40,61,599,1103,535,263 -"YMR030W-A",1,5,3,3,1,11,17,13,7 -"YMR033W",621,778,781,995,1085,607,608,503,723 -"YMR034C",1032,983,716,378,425,390,611,805,1375 -"YMR035W",305,327,269,229,262,295,240,286,488 -"YMR036C",1118,928,556,283,311,883,880,862,1492 -"YMR037C",1192,1236,1171,738,801,752,840,696,1142 -"YMR038C",1038,1323,1509,1941,1702,582,602,753,1404 -"YMR039C",1091,1313,1485,1769,1590,955,815,909,1471 -"YMR040W",105,86,75,18,47,113,79,123,173 -"YMR041C",1041,1007,726,320,175,933,728,821,1470 -"YMR042W",239,292,338,412,400,210,243,237,422 -"YMR043W",949,938,960,1007,1111,927,876,945,1315 -"YMR044W",818,954,956,1038,1060,682,719,700,1157 -"YMR047C",1126,1209,1078,930,948,1077,1090,931,1441 -"YMR048W",283,338,273,178,451,315,258,252,395 -"YMR049C",716,1151,1966,4824,4071,81,292,277,539 -"YNCM0021C",2,2,3,1,2,1,3,1,2 -"YMR052W",212,241,222,213,276,142,164,178,285 -"YMR053C",907,806,476,57,151,588,555,624,949 -"YMR054W",1193,1174,988,664,809,1386,960,923,1388 -"YMR055C",205,237,232,258,167,100,171,163,264 -"YMR056C",441,445,398,316,389,715,526,500,825 -"YMR058W",376,405,451,386,475,229,279,254,455 -"YMR059W",139,148,117,108,122,61,125,130,200 -"YMR060C",378,359,337,230,370,602,400,370,577 -"YMR061W",1012,987,775,769,1522,912,978,934,1384 -"YMR062C",2094,1836,1494,1825,2347,786,1498,1453,2678 -"YMR063W",117,111,105,94,66,74,72,78,116 -"YMR064W",588,619,522,507,505,576,502,403,651 -"YMR065W",182,169,168,135,207,198,165,149,240 -"YMR066W",460,489,419,463,478,510,337,300,515 -"YMR067C",803,900,742,709,453,509,643,528,846 -"YMR068W",328,370,354,196,177,318,361,366,553 -"YMR069W",37,48,65,87,44,30,28,38,54 -"YMR070W",898,890,967,951,869,878,1000,755,1130 -"YMR071C",516,568,559,384,236,510,421,501,947 -"YMR072W",2950,2830,2148,1790,1172,3338,2927,2709,4231 -"YMR073C",397,434,370,325,455,438,412,406,610 -"YMR074C",555,436,339,310,558,749,602,632,965 -"YMR075W",554,543,412,350,505,365,399,380,620 -"YMR075C-A",5,7,2,2,5,7,6,1,5 -"YMR076C",1043,1063,872,359,828,883,731,813,1154 -"YMR077C",364,436,383,308,319,262,300,325,528 -"YMR078C",370,406,387,215,419,332,257,319,502 -"YMR079W",1013,1252,1228,1837,1757,527,700,681,997 -"YMR080C",1467,1644,1714,2163,1689,922,1143,1114,1766 -"YMR081C",1568,1175,694,119,2106,2210,1980,1971,2379 -"YMR083W",2056,2196,2290,2425,2944,1980,1243,1792,2926 -"YMR084W",164,136,104,20,21,123,104,104,164 -"YMR085W",407,386,224,54,116,265,300,304,469 -"YMR086W",1363,1518,1245,664,408,914,1005,957,1563 -"YMR087W",279,204,140,46,142,348,250,223,389 -"YMR088C",1067,1361,1513,1469,1507,522,632,658,1301 -"YMR089C",1764,1690,1577,1277,1301,3396,1501,1254,1972 -"YMR090W",2593,1977,1232,603,234,2516,1919,2179,4337 -"YMR091C",616,723,769,1010,1172,506,604,472,786 -"YMR092C",1831,1845,1418,924,1087,1728,1740,1638,2410 -"YMR093W",340,543,979,1944,1498,41,218,169,275 -"YMR094W",145,138,138,123,92,102,87,71,139 -"YMR095C",218,221,207,206,195,142,121,127,228 -"YMR096W",834,960,916,1060,944,639,541,666,1162 -"YMR097C",454,533,396,310,524,596,492,477,690 -"YMR098C",643,663,580,537,592,963,485,445,714 -"YMR099C",1791,1719,1453,1054,881,2051,1706,1677,2766 -"YMR100W",1926,1797,1156,824,831,795,1082,1167,2076 -"YMR101C",52,48,36,34,50,56,34,31,68 -"YMR102C",466,518,468,362,262,393,376,413,685 -"YMR103C",340,305,171,27,121,720,468,435,595 -"YMR104C",1405,1197,689,132,493,2937,1758,1654,2097 -"YMR105C",7110,4783,1811,193,394,13069,4886,6265,10809 -"YMR105W-A",40,33,39,12,11,18,18,20,37 -"YMR106C",299,350,317,178,108,71,148,180,304 -"YMR107W",24004,15034,8193,1737,264,45446,41600,34934,49326 -"YMR108W",6635,7746,9389,15673,12081,1462,3060,3147,6554 -"YMR109W",1149,1106,928,635,679,863,770,742,1128 -"YMR110C",8615,7326,4312,1084,511,9740,9627,8415,12571 -"YMR111C",342,360,330,319,342,295,284,274,445 -"YMR112C",276,267,251,202,291,222,250,247,409 -"YMR113W",353,436,384,426,343,272,271,248,464 -"YMR114C",1293,1106,768,243,233,1242,977,1001,1783 -"YMR115W",929,1079,833,467,842,1011,756,708,1102 -"YMR116C",7281,9127,11021,20716,33894,1539,4080,5271,10748 -"YNCM0026C",23,15,19,43,22,1,6,17,19 -"YMR117C",213,269,254,187,154,136,168,126,259 -"YMR118C",2795,2678,1617,228,111,552,701,1410,3279 -"YMR119W",1068,1110,691,216,472,828,806,822,1366 -"YMR120C",3136,4365,4832,14335,15819,1745,745,1343,2568 -"YMR121C",462,545,539,474,416,253,343,436,753 -"YMR122C",50,26,37,19,28,58,68,47,73 -"YMR122W-A",1764,1513,1465,1805,2557,1562,2191,4412,3687 -"YMR123W",278,347,430,682,647,133,234,246,389 -"YMR124W",699,758,898,762,495,524,579,512,752 -"YMR125W",3177,3129,2498,2623,2468,1900,2486,2382,3546 -"YMR126C",182,217,207,195,209,178,210,148,252 -"YMR127C",279,385,377,547,520,152,195,227,384 -"YMR128W",655,962,1272,2488,1939,104,297,305,640 -"YMR129W",896,1150,1117,1341,1293,529,606,634,883 -"YMR130W",680,700,644,685,670,432,604,541,860 -"YMR131C",1004,1974,3999,9635,5920,176,609,506,989 -"YMR132C",84,115,149,209,218,102,100,95,123 -"YMR133W",199,162,90,34,66,265,168,160,266 -"YMR134W",367,462,428,360,468,324,333,298,501 -"YMR135C",1740,1598,1135,647,1121,1658,1600,1699,2667 -"YMR136W",3052,2360,1360,467,976,2623,2453,2231,3454 -"YMR137C",582,567,431,297,411,283,323,347,700 -"YMR138W",177,235,190,181,200,74,104,144,215 -"YMR139W",980,850,484,134,264,1118,996,952,1415 -"YMR140W",702,651,389,123,240,524,479,524,789 -"YMR141C",111,100,70,19,56,83,84,98,153 -"YMR142C",5091,5766,5969,9259,13345,1622,3397,3600,6706 -"YMR143W",3817,4107,4179,6788,11557,1236,2935,3323,5871 -"YMR144W",216,233,223,114,351,274,338,266,281 -"YMR145C",5641,6126,5241,4010,9432,8977,7009,5037,7110 -"YMR146C",1720,2113,2511,3866,4611,971,1354,1239,2133 -"YMR147W",799,858,781,816,412,935,759,633,930 -"YMR149W",803,840,691,708,791,659,766,732,1235 -"YMR150C",503,465,373,273,255,616,552,535,839 -"YMR152W",2198,1998,1454,825,506,2183,1758,1875,3046 -"YMR153W",698,761,767,835,926,503,530,546,827 -"YMR154C",393,387,304,185,227,251,241,258,400 -"YMR155W",595,652,500,297,416,725,486,564,761 -"YMR156C",231,262,198,113,92,254,184,192,302 -"YMR157C",247,281,223,175,235,1529,308,260,415 -"YMR158W",240,269,235,284,418,944,299,236,345 -"YMR158C-A",59,81,63,20,14,41,46,65,116 -"YMR159C",211,187,139,36,33,109,121,159,279 -"YMR160W",871,786,456,136,126,774,670,732,1129 -"YMR161W",571,624,578,506,696,425,484,508,813 -"YMR162C",1412,1368,997,604,899,926,1005,947,1573 -"YMR163C",392,409,295,165,316,341,393,327,530 -"YMR164C",731,766,620,328,398,819,586,546,923 -"YMR165C",1106,1174,821,413,347,1071,797,859,1429 -"YMR166C",177,198,193,190,279,594,245,169,228 -"YMR167W",569,614,674,641,532,318,334,392,541 -"YMR168C",520,553,478,434,521,385,386,402,597 -"YMR169C",2873,1558,731,132,65,1547,1042,1743,5081 -"YMR170C",523,522,355,152,54,433,296,328,769 -"YMR171C",648,719,594,561,755,352,417,434,728 -"YMR172W",632,717,686,622,718,449,514,494,754 -"YMR173W",11429,9197,6084,2884,1022,6330,4238,7064,12486 -"YMR174C",5426,3635,2250,832,122,3270,4124,4749,9655 -"YMR175W",22524,14029,7621,1572,224,7150,15090,17780,40353 -"YMR175W-A",658,428,194,44,4,189,418,578,1295 -"YMR176W",1177,1190,1031,753,730,627,710,740,1176 -"YMR177W",185,272,366,946,1083,118,152,150,207 -"YMR178W",605,612,526,473,440,606,620,641,877 -"YMR179W",192,215,194,99,291,191,139,127,198 -"YMR180C",420,340,268,205,287,545,377,340,543 -"YMR181C",1274,1124,976,729,263,1195,1090,1104,1725 -"YMR182C",237,208,346,560,118,222,160,201,364 -"YMR182W-A",18,15,14,4,4,23,17,16,28 -"YNCM0030W",29,28,29,20,51,53,35,37,34 -"YMR183C",1541,1525,1277,1224,939,1322,1356,1277,2037 -"YMR184W",333,437,325,225,243,266,335,351,586 -"YMR185W",845,867,772,729,954,269,480,572,957 -"YMR186W",50532,41059,26962,14526,8381,32913,34284,35175,63124 -"YMR187C",258,286,301,287,404,150,186,173,317 -"YMR188C",339,369,330,339,594,1243,433,336,524 -"YMR189W",1122,1601,1695,2740,2003,404,470,569,991 -"YMR190C",680,712,655,460,448,532,545,455,696 -"YMR191W",4791,4243,3335,1990,1665,5091,5014,4816,7003 -"YMR192W",413,419,316,346,512,219,289,269,475 -"YMR193W",349,438,352,356,472,1430,399,370,532 -"YMR194W",894,1080,1274,2283,3239,264,715,684,1290 -"YNCM0031W",108,78,47,30,39,189,138,136,229 -"YMR194C-B",163,146,94,25,56,327,229,226,330 -"YMR195W",94,139,127,122,233,60,60,98,163 -"YMR196W",6112,5426,3316,726,205,9024,5314,5235,7699 -"YMR197C",1277,1138,858,435,655,1350,1393,1208,1819 -"YMR198W",335,407,351,371,409,327,345,245,359 -"YMR199W",281,311,223,164,587,1024,541,449,444 -"YMR200W",1455,1318,1134,1172,1487,1081,1195,1113,1771 -"YMR201C",514,444,391,264,306,448,391,404,761 -"YNCM0032C",18,15,11,7,5,17,17,10,36 -"YMR202W",1635,1817,1613,1518,1901,1600,1816,1689,2580 -"YMR203W",1627,1830,1602,1498,1634,3537,1584,1350,1906 -"YMR204C",248,324,204,121,250,257,252,251,378 -"YMR205C",8545,7637,6093,7098,4241,3942,4734,6061,9787 -"YMR206W",1179,736,301,35,311,2525,1873,1849,2122 -"YMR207C",813,928,887,764,459,508,556,561,938 -"YMR208W",1190,1253,1095,882,1138,925,1115,1031,1471 -"YMR209C",330,294,308,277,352,359,351,291,416 -"YMR210W",356,358,303,164,244,775,428,373,502 -"YMR211W",394,475,432,468,489,253,353,334,516 -"YMR212C",872,983,994,1147,1484,548,733,685,1002 -"YMR213W",357,385,421,416,426,232,287,257,435 -"YMR214W",404,446,542,606,528,196,261,321,523 -"YMR215W",588,739,737,1129,1598,1189,540,324,597 -"YMR216C",744,958,1335,1771,865,482,541,547,816 -"YMR217W",1330,2726,5729,16445,11684,243,612,651,1250 -"YMR218C",630,698,677,659,508,335,405,358,614 -"YMR219W",1027,1077,937,755,801,933,725,667,1113 -"YMR220W",1023,1091,1016,991,983,1084,1135,946,1454 -"YMR221C",902,1003,911,875,993,660,728,656,1118 -"YMR222C",245,244,211,218,207,199,245,216,375 -"YMR223W",289,303,324,436,480,160,214,204,317 -"YMR224C",498,515,396,263,297,361,373,344,623 -"YMR225C",254,239,242,215,210,763,297,259,382 -"YMR226C",2855,2733,2259,2001,1878,3702,2574,2849,4437 -"YMR227C",670,750,746,889,908,392,584,538,997 -"YMR228W",221,291,270,282,259,341,179,191,333 -"YMR229C",1950,3057,4142,10110,9110,323,981,914,1678 -"YMR230W",2699,3120,3330,5429,9238,972,2047,2174,3738 -"YMR231W",599,626,611,525,414,230,338,335,509 -"YMR232W",381,319,190,83,248,319,226,292,452 -"YMR233W",236,310,227,317,566,243,337,328,492 -"YMR234W",404,397,426,468,519,198,261,262,449 -"YMR235C",1510,1726,1575,2340,2964,902,1147,1153,1814 -"YMR236W",449,435,492,457,606,524,505,502,724 -"YMR237W",766,911,663,566,642,790,672,676,971 -"YMR238W",992,1056,1184,1330,560,842,814,836,1422 -"YMR239C",304,524,924,1908,1293,36,125,163,311 -"YMR240C",404,441,578,634,750,278,319,333,460 -"YMR241W",1554,2336,3005,5504,8549,986,1525,1312,1782 -"YMR242C",2991,3625,4242,7728,12017,800,2227,2221,4050 -"YMR243C",2319,2776,3060,5349,4297,1232,1455,1605,2866 -"YMR244W",156,237,459,3746,2969,54,93,125,243 -"YMR244C-A",786,605,517,393,348,1311,865,693,1084 -"YMR246W",7420,7338,6193,3895,2442,6290,6874,5544,8900 -"YNCM0034C",403,311,233,200,444,334,320,337,584 -"YMR247C",959,1054,1025,1276,1450,524,503,557,931 -"YMR250W",3236,2611,1478,255,34,2380,1591,2038,4452 -"YMR251W",146,126,128,28,16,54,47,54,129 -"YMR251W-A",7280,4928,2651,1472,1905,23358,16367,12677,16174 -"YMR252C",195,220,148,86,69,188,158,174,282 -"YMR253C",478,464,319,157,119,371,353,421,707 -"YMR254C",27,30,25,14,14,20,23,17,42 -"YMR255W",1013,1038,875,756,1024,1114,1028,974,1464 -"YMR256C",1553,1451,1035,719,1072,2624,2863,2527,2889 -"YMR257C",425,378,358,294,379,543,316,272,387 -"YMR258C",1160,1010,591,233,538,898,953,995,1510 -"YMR259C",683,843,915,1459,1598,235,380,395,589 -"YMR260C",1338,1797,2093,3725,6173,610,1055,983,1700 -"YMR261C",1510,1428,894,286,428,1550,1025,1119,1805 -"YMR262W",442,331,164,28,91,713,553,596,850 -"YMR263W",284,288,310,372,331,210,233,218,346 -"YMR264W",840,854,751,698,762,802,910,887,1543 -"YMR265C",326,372,405,460,394,265,309,382,501 -"YMR266W",1938,2074,2294,3410,2727,931,1167,1460,2156 -"YMR267W",582,636,514,378,344,1645,678,638,897 -"YMR268C",325,380,378,462,382,169,216,205,397 -"YMR269W",191,318,463,1023,1273,52,120,85,218 -"YMR270C",308,390,402,448,499,340,331,259,398 -"YMR271C",880,808,607,281,146,995,502,675,1293 -"YMR272C",1223,1278,1252,1443,1514,703,886,846,1503 -"YMR272W-B",10,15,8,6,10,6,6,7,5 -"YMR273C",422,481,487,411,373,255,284,255,421 -"YMR274C",125,134,128,173,206,129,145,106,129 -"YMR275C",666,770,753,735,773,522,462,478,717 -"YMR276W",2287,2036,1786,1407,1171,2104,2295,2058,3676 -"YMR277W",710,760,714,1064,1289,583,620,543,874 -"YMR278W",1083,1101,881,494,289,634,575,684,1336 -"YMR279C",232,164,124,53,63,206,169,175,275 -"YMR280C",1062,1061,751,146,583,1085,1053,973,1289 -"YMR281W",246,218,133,121,248,259,222,192,304 -"YMR282C",497,509,434,417,629,575,473,413,607 -"YMR283C",299,341,357,473,553,219,222,235,355 -"YMR284W",724,727,482,127,105,466,451,482,807 -"YMR285C",243,342,324,515,628,189,229,171,320 -"YMR286W",342,323,300,235,370,963,407,414,563 -"YMR287C",401,471,420,436,428,650,341,273,415 -"YMR288W",518,547,625,673,567,339,301,328,536 -"YMR289W",872,862,786,586,413,788,737,729,1141 -"YMR290C",470,869,1820,4829,3710,170,298,246,442 -"YMR291W",874,727,740,301,275,892,745,793,1130 -"YMR292W",359,392,336,305,427,289,274,317,544 -"YMR293C",305,328,294,257,270,749,268,291,397 -"YMR294W",527,575,537,585,458,459,408,406,703 -"YMR295C",2252,2392,2094,2275,3290,3068,2271,2177,3620 -"YMR296C",690,834,1581,3424,1017,411,527,501,644 -"YMR297W",19054,15337,10715,5686,1670,20239,15225,18392,29372 -"YMR298W",681,703,585,549,313,437,468,504,923 -"YMR299C",399,420,442,393,314,396,424,338,588 -"YMR300C",1153,1733,2772,7239,5754,258,554,662,1095 -"YMR301C",597,807,910,1274,1084,325,378,404,641 -"YMR302C",2774,2727,2018,1027,1079,4165,2500,2289,3324 -"YMR303C",47538,31564,17518,3601,453,101163,98363,82852,103486 -"YMR304W",3855,3471,2158,416,264,3511,3050,3022,4193 -"YMR305C",952,1371,1696,3694,12746,1138,718,590,806 -"YMR306W",390,394,340,270,252,271,188,205,358 -"YMR307W",2967,4531,6905,19060,23952,5656,5176,3752,3571 -"YMR308C",1691,2124,2563,5175,5089,685,1178,1053,1722 -"YMR309C",2354,2962,3852,7368,5827,554,1296,1180,1989 -"YMR310C",276,407,641,1156,933,64,144,141,256 -"YMR311C",2124,1782,1242,655,1216,2555,2252,2339,3747 -"YMR312W",468,537,550,773,870,227,273,290,514 -"YMR313C",703,721,574,406,577,522,495,511,781 -"YMR314W",2327,2241,1862,1457,1371,1924,2300,2281,3464 -"YMR315W",2439,2400,1728,732,369,3162,2137,2205,3647 -"YMR315W-A",8,4,7,1,3,10,5,6,8 -"YMR316W",198,163,204,212,223,113,138,156,336 -"YMR316C-A",5,3,4,1,7,8,5,5,8 -"YMR317W",550,489,494,329,286,441,314,372,632 -"YMR318C",831,1634,3663,7710,3413,1658,685,661,936 -"YMR319C",577,584,517,566,463,414,482,435,668 -"YMR320W",34,20,23,30,67,61,43,49,86 -"YMR321C",21,15,22,34,43,12,9,14,27 -"YMR322C",437,300,219,48,21,451,353,340,691 -"YMR323W",1057,719,350,42,21,848,462,617,1516 -"YNL336W",193,133,110,86,108,166,118,163,284 -"YNL335W",45,36,35,23,18,32,17,27,42 -"YNL334C",20,39,45,37,58,22,19,17,44 -"YNL333W",153,211,222,222,352,367,107,128,224 -"YNL332W",433,395,328,145,115,419,361,464,768 -"YNL331C",773,811,653,389,799,604,450,537,1027 -"YNL330C",837,847,758,693,1026,1086,968,822,1225 -"YNL329C",884,829,681,493,570,1118,850,871,1121 -"YNL328C",69,65,47,33,22,37,48,64,66 -"YNL327W",2617,1386,1334,2369,870,583,2851,8838,6848 -"YNL326C",388,415,421,508,654,231,279,299,453 -"YNL325C",663,696,551,429,454,414,458,441,727 -"YNL323W",839,929,853,840,920,573,603,589,951 -"YNL322C",1589,1634,1682,1728,1671,1446,1538,1445,2149 -"YNL321W",956,975,670,330,439,1392,1046,839,1156 -"YNL320W",398,428,372,385,316,360,345,345,514 -"YNL318C",52,65,56,36,23,31,23,36,74 -"YNL317W",306,358,310,309,250,192,228,239,405 -"YNL316C",254,279,289,425,404,212,277,190,329 -"YNL315C",684,679,625,552,704,3146,843,692,1010 -"YNL314W",276,281,256,193,163,262,265,243,443 -"YNL313C",699,919,1364,2203,1737,115,375,392,658 -"YNL312W",834,873,714,394,644,568,630,688,1198 -"YNL311C",520,548,564,565,523,186,301,334,577 -"YNL310C",223,224,230,118,205,249,235,227,380 -"YNL309W",249,273,210,170,321,128,163,187,277 -"YNL308C",1066,1477,2236,4939,4101,286,687,620,1139 -"YNL307C",1955,1865,1496,992,1012,2213,2058,1713,2469 -"YNL306W",712,804,723,628,743,3102,1000,809,1180 -"YNL305C",1427,1302,867,252,438,1426,1209,1347,2238 -"YNL304W",192,221,192,66,153,164,154,181,294 -"YNL302C",2975,3420,3880,6091,10515,997,2540,2942,5180 -"YNL301C",682,785,838,1589,3554,374,603,649,1005 -"YNL300W",221,240,256,226,431,221,106,93,163 -"YNL299W",354,478,687,1074,705,112,207,210,407 -"YNL298W",384,512,637,1168,1766,223,355,299,366 -"YNL297C",1227,1190,936,599,533,748,810,736,1182 -"YNL295W",450,472,374,322,391,466,317,292,532 -"YNL294C",958,914,735,598,649,719,725,777,1296 -"YNL293W",640,535,382,198,334,643,547,573,882 -"YNL292W",362,495,638,989,1167,228,260,261,420 -"YNL291C",420,427,495,482,531,256,330,326,536 -"YNL290W",474,573,657,777,921,391,581,472,768 -"YNL289W",244,282,262,290,848,207,110,133,234 -"YNCN0001W",3,3,6,1,4,3,4,6,9 -"YNL288W",616,598,592,602,732,507,589,547,892 -"YNL287W",3365,3629,2857,2506,2503,2363,2496,2460,3613 -"YNL286W",364,364,372,334,313,312,307,294,530 -"YNL284C-B",42,43,26,22,30,35,19,27,37 -"YNCN0003W",3,4,1,3,2,2,2,4,6 -"YNL284C",627,661,595,534,804,2845,772,569,851 -"YNL283C",475,539,542,469,714,697,516,371,524 -"YNL282W",96,145,140,296,251,32,53,61,114 -"YNL281W",2172,2136,1769,1691,1107,1499,1709,2023,3945 -"YNL280C",1422,1467,1179,865,557,765,776,1035,1969 -"YNL279W",181,168,122,123,194,257,163,139,202 -"YNL278W",256,274,269,141,268,281,253,184,307 -"YNL277W-A",24,17,10,10,10,9,6,21,40 -"YNL277W",1682,2113,2671,4235,1634,460,1153,1234,2127 -"YNL275W",606,569,398,274,432,706,741,581,854 -"YNL274C",4947,4673,3316,1694,515,7786,4793,4892,7818 -"YNL273W",501,540,477,286,639,283,280,350,562 -"YNL272C",915,921,713,423,808,726,810,734,1042 -"YNL271C",934,929,784,611,523,597,637,634,1000 -"YNL270C",959,894,646,111,87,726,640,934,1367 -"YNL269W",18,13,8,6,13,11,10,8,16 -"YNL268W",1983,2476,4047,6552,3498,913,1228,1373,2145 -"YNL267W",1413,1300,1157,850,973,972,1128,1017,1713 -"YNL265C",1045,953,783,476,668,1032,1004,971,1479 -"YNL264C",266,264,257,323,251,206,261,268,373 -"YNL263C",777,875,718,703,1004,599,733,741,1065 -"YNL262W",758,869,760,506,771,613,534,649,937 -"YNL261W",546,527,508,688,781,358,377,393,614 -"YNL260C",194,223,223,193,236,139,139,141,268 -"YNL259C",409,408,255,244,275,462,438,452,679 -"YNL258C",1195,1182,944,722,1233,910,945,994,1443 -"YNL257C",1330,1242,985,615,403,1000,993,1008,1510 -"YNL256W",727,972,1272,2626,1751,232,459,466,795 -"YNL255C",1904,2267,2435,3578,5209,1103,1655,1843,3068 -"YNL254C",258,315,359,350,242,97,157,157,298 -"YNL253W",506,482,389,283,350,430,385,403,591 -"YNL252C",396,455,562,601,485,1155,412,317,528 -"YNL251C",1440,923,496,386,2876,4338,1406,1120,1706 -"YNL250W",1065,1301,1093,849,532,459,551,564,1012 -"YNL249C",400,341,251,239,259,252,270,303,457 -"YNL248C",715,1347,2003,5209,4749,68,376,344,631 -"YNL247W",887,1148,1365,2742,2769,466,734,639,1080 -"YNL246W",890,840,999,1025,578,551,605,667,1194 -"YNL245C",313,355,476,533,241,183,207,235,392 -"YNL244C",1694,1825,1845,2862,3878,1132,1389,1492,2480 -"YNL243W",2152,2024,1616,1139,1622,2047,2000,1910,2826 -"YNL242W",760,814,686,244,156,469,495,473,800 -"YNL241C",3719,2906,1976,1208,1325,4067,3225,2904,4899 -"YNL240C",765,816,911,1179,896,649,635,681,1189 -"YNL239W",2593,2240,1754,1010,448,4282,3134,2697,3975 -"YNL238W",684,785,965,1282,903,470,540,470,810 -"YNL237W",781,718,507,106,113,715,675,643,1069 -"YNL236W",534,621,628,668,630,312,332,338,496 -"YNL234W",44,53,103,210,60,33,33,31,49 -"YNL233W",476,566,592,593,992,279,383,365,570 -"YNL232W",503,599,922,1156,1050,303,498,476,786 -"YNL231C",525,682,782,1038,1906,229,328,345,621 -"YNL230C",262,311,297,306,240,136,171,172,284 -"YNL229C",980,1089,1082,1174,1256,758,866,926,1335 -"YNL227C",658,882,1167,2075,2194,297,475,415,800 -"YNL225C",577,628,593,425,613,475,561,487,791 -"YNL224C",651,650,618,531,522,361,474,475,773 -"YNL223W",540,453,309,99,158,442,394,450,772 -"YNL222W",307,264,178,148,353,320,368,337,423 -"YNCN0005C",46,50,20,20,26,38,42,49,102 -"YNL221C",910,1184,1530,3278,1483,311,618,601,971 -"YNL220W",966,1280,2186,5614,4466,958,841,914,1280 -"YNL219C",903,893,771,667,672,673,677,678,1089 -"YNL218W",432,448,409,231,278,246,230,332,531 -"YNL217W",320,346,361,703,598,339,291,295,421 -"YNL216W",747,871,867,1137,1509,894,1005,787,1014 -"YNL215W",1167,1122,991,809,868,1086,925,962,1586 -"YNL214W",221,197,140,55,99,211,214,156,261 -"YNL213C",293,358,366,387,402,366,237,194,310 -"YNL212W",1524,1576,1317,731,818,1379,1337,1231,1875 -"YNL211C",65,64,69,114,133,73,59,77,124 -"YNL210W",23,33,56,105,49,10,14,14,19 -"YNL209W",4024,4938,6017,10975,12110,1219,2477,2714,5169 -"YNL208W",13931,10963,8724,5557,3567,15508,13770,17990,28086 -"YNL207W",570,763,984,1650,1811,116,357,396,677 -"YNL206C",736,766,716,681,1313,435,641,672,1032 -"YNL204C",59,57,52,56,111,58,42,57,86 -"YNL202W",2908,2618,1635,478,145,6557,4881,4027,5632 -"YNL201C",574,704,1361,2116,641,333,325,348,564 -"YNL200C",3060,2403,1406,263,118,3035,2623,2984,5340 -"YNL199C",731,832,779,983,1346,593,751,736,1094 -"YNL197C",826,859,907,1009,936,872,789,593,845 -"YNL196C",76,57,33,17,37,121,57,68,103 -"YNL195C",2218,1402,586,97,35,3658,2278,2661,4623 -"YNL194C",1886,1299,491,48,37,2515,1398,1647,2870 -"YNL193W",503,456,362,324,462,491,301,385,675 -"YNL192W",2250,1965,1631,1274,2297,1378,2313,4214,3858 -"YNL191W",419,684,1321,3215,426,168,388,339,594 -"YNL190W",2324,2397,2414,3773,2439,922,1328,1270,2136 -"YNL189W",2566,2696,2656,3051,2300,1946,2018,2030,3053 -"YNL188W",266,345,464,622,522,176,301,329,386 -"YNL187W",143,167,316,378,122,95,91,106,174 -"YNL186W",1503,1652,2074,2810,2390,615,1232,1175,1877 -"YNL185C",172,170,175,180,216,609,173,164,205 -"YNL184C",20,16,17,18,17,57,15,10,17 -"YNL183C",1127,1225,1141,855,1160,1165,939,942,1471 -"YNL182C",374,652,1162,2925,2479,41,181,196,325 -"YNL181W",672,837,795,841,831,557,450,530,906 -"YNL180C",3192,2383,2365,1873,1001,2271,2539,2535,4036 -"YNL178W",8308,9504,10674,18151,29581,2073,5303,6160,11540 -"YNL177C",803,855,734,698,934,2419,813,784,1017 -"YNL176C",791,969,1001,910,746,806,753,628,925 -"YNL175C",586,908,1489,3243,4024,86,255,275,558 -"YNL173C",3336,2780,1944,701,258,5005,3627,4091,5907 -"YNL172W",790,826,589,442,518,522,596,558,823 -"YNL169C",524,629,602,629,901,725,737,645,762 -"YNL168C",603,601,555,448,372,641,528,574,948 -"YNL167C",665,743,563,413,537,747,558,571,734 -"YNL166C",664,793,863,1104,1316,419,550,505,830 -"YNL165W",454,470,406,258,294,303,304,340,551 -"YNL164C",660,734,595,626,715,263,432,501,801 -"YNL163C",1166,1434,1878,3808,1782,432,619,665,1179 -"YNL162W-A",44,81,171,348,120,3,18,16,30 -"YNL162W",2082,2173,2237,3495,5647,534,1562,1723,3091 -"YNL161W",1433,1450,1299,968,1277,938,1080,1074,1529 -"YNL160W",15103,11015,6584,2466,488,9633,9535,10798,20082 -"YNL159C",555,600,391,165,164,466,396,523,836 -"YNL158W",237,246,230,270,237,166,203,218,305 -"YNL157W",1262,1056,800,619,1060,1216,1122,1221,1989 -"YNL156C",1368,1405,1179,1033,724,1573,1423,1395,2045 -"YNL155W",1515,1597,1421,1565,1164,1352,1369,1264,2101 -"YNL154C",1277,1287,1436,2007,3260,1214,1438,1116,1592 -"YNL153C",300,384,473,909,797,237,322,320,491 -"YNL152W",282,271,288,258,314,183,235,182,259 -"YNL151C",504,604,766,1326,1631,265,413,380,659 -"YNL149C",1763,1667,1566,1425,1380,1352,1635,1588,2592 -"YNL148C",337,348,327,273,179,184,173,259,498 -"YNL147W",451,472,439,466,604,335,444,461,774 -"YNL146C-A",5,9,5,6,14,2,8,8,12 -"YNL146W",76,71,58,37,76,72,77,80,96 -"YNL145W",28,28,15,14,52,34,37,30,30 -"YNL144C",737,592,338,83,1036,866,634,702,1080 -"YNL143C",30,24,24,9,23,23,27,28,49 -"YNL142W",4706,7951,10911,17694,32531,1263,1342,2796,5538 -"YNL141W",387,1112,3428,11909,6118,150,147,174,321 -"YNL140C",3,3,7,1,8,1,2,2,3 -"YNL139C",645,692,675,630,552,360,424,388,639 -"YNL138W-A",165,144,112,90,137,214,171,193,294 -"YNL138W",1670,1620,1241,652,404,1966,1539,1422,2091 -"YNL137C",792,831,689,567,967,2459,718,652,948 -"YNL136W",921,924,877,776,900,754,791,787,1216 -"YNL135C",3733,3322,2726,2523,2683,5190,4552,4898,7487 -"YNL134C",2534,2350,1564,276,346,791,837,1323,3243 -"YNL133C",409,403,353,270,269,298,319,327,625 -"YNL132W",769,1322,1907,4480,3369,106,319,338,605 -"YNL131W",1225,1226,934,741,950,3566,1544,1246,1848 -"YNL130C",2237,2120,1757,1324,1220,1482,2115,2267,3270 -"YNL130C-A",42,34,17,28,24,46,44,55,62 -"YNL129W",339,314,300,388,404,249,335,306,460 -"YNL128W",130,133,143,189,102,90,88,96,179 -"YNL127W",858,868,712,499,530,444,450,466,802 -"YNL126W",488,520,428,320,375,495,417,344,495 -"YNL125C",1785,1580,1456,1009,852,1839,1896,1690,2385 -"YNL124W",412,622,1251,2619,1046,206,228,260,433 -"YNL123W",1335,1697,2339,4148,2093,515,826,786,1252 -"YNL122C",230,196,179,142,179,759,266,196,306 -"YNL121C",2263,2242,2052,1704,1523,3987,1926,1734,2607 -"YNL119W",587,739,864,1350,1328,171,391,402,698 -"YNL118C",2498,2428,2157,1725,1687,1943,1910,1838,2711 -"YNL117W",3899,3661,2751,917,630,1695,2039,2710,4855 -"YNL116W",1300,1349,1056,726,757,783,1047,985,1606 -"YNL115C",3742,3142,1957,459,106,2646,2254,3067,5156 -"YNL113W",524,751,1095,2242,2044,89,361,366,670 -"YNL112W",649,1834,4430,14139,12341,56,111,197,379 -"YNL111C",1152,1573,1822,2522,1045,482,1338,943,1388 -"YNL110C",893,1305,1968,4030,3456,101,529,562,970 -"YNL108C",226,267,321,388,281,124,149,176,276 -"YNL107W",427,441,370,322,427,230,294,344,520 -"YNL106C",365,388,443,228,251,193,210,231,374 -"YNL104C",7971,7556,6485,5705,4844,9200,9428,7038,10649 -"YNL103W",1571,1530,1498,1627,1535,832,1202,1260,1942 -"YNL102W",465,569,517,416,816,258,269,319,485 -"YNL101W",1723,1954,1805,1719,1945,1175,1269,1318,1956 -"YNL100W",1196,1164,853,587,823,4460,1995,1533,2094 -"YNL099C",432,447,429,398,538,371,409,353,585 -"YNL098C",2100,1754,1241,789,808,7028,3384,2883,3797 -"YNL097C-B",4,11,6,15,19,10,8,4,13 -"YNL097C",547,514,532,263,507,445,534,561,902 -"YNL096C",1730,2204,2665,5166,5938,453,1160,1108,1973 -"YNL095C",293,384,494,607,388,163,166,188,366 -"YNL094W",1123,1177,1101,952,856,696,744,813,1373 -"YNL093W",378,348,233,51,49,310,223,248,517 -"YNL092W",353,380,264,45,31,212,212,225,439 -"YNL091W",2596,2542,2168,2126,2071,2719,2335,2051,3173 -"YNL090W",491,522,420,369,534,358,527,500,792 -"YNL088W",1729,1990,1883,2136,1279,1232,1230,1216,1814 -"YNL087W",1386,1635,1599,2211,3016,1289,1193,1078,1543 -"YNL086W",140,140,133,120,128,116,129,155,242 -"YNL085W",1817,1981,1836,1927,2040,988,1060,1033,1673 -"YNL084C",1098,1134,866,714,898,1176,1150,1066,1551 -"YNL083W",425,454,417,385,382,783,423,344,560 -"YNL082W",547,559,528,288,534,299,310,366,588 -"YNL081C",451,473,323,316,513,1647,604,559,754 -"YNL080C",379,418,461,469,472,292,448,399,554 -"YNL079C",3997,3985,3451,3259,3216,5125,4503,4334,6541 -"YNL078W",211,177,195,185,166,87,198,477,481 -"YNL077W",1649,1394,604,152,531,1098,1014,1292,2403 -"YNL076W",655,733,731,812,875,489,592,522,813 -"YNL075W",547,783,1079,2458,2538,88,279,295,602 -"YNL074C",844,1049,1023,961,1444,757,619,686,941 -"YNL073W",318,384,255,201,409,1993,473,397,561 -"YNL072W",151,177,165,125,144,179,132,130,216 -"YNL071W",4671,4462,3412,2406,1781,8141,5637,5327,7737 -"YNL070W",286,339,275,283,453,749,370,312,448 -"YNL069C",4150,5009,5908,10691,15240,1023,2690,2750,4883 -"YNL068C",773,1006,924,1207,737,347,469,441,667 -"YNL067W",3709,3952,3876,5660,5571,1441,2765,3591,5865 -"YNL066W",803,619,799,1813,1112,229,565,1651,2397 -"YNL065W",123,308,1788,4105,115,38,47,45,124 -"YNL064C",9067,9016,9255,9166,5665,3777,5027,5979,12198 -"YNL063W",202,223,195,168,188,264,201,188,351 -"YNL062C",352,524,941,2040,1485,55,162,148,333 -"YNL061W",1321,1957,2967,6273,5288,162,687,656,1292 -"YNL059C",1067,1114,1074,1088,943,842,919,779,1301 -"YNL058C",147,135,111,83,152,276,533,306,266 -"YNL056W",397,432,444,512,743,417,591,471,658 -"YNL055C",8091,6954,5044,2719,2319,13738,10149,9153,12631 -"YNCN0008C",9,7,7,2,4,13,17,7,9 -"YNL054W-B",262,242,196,187,152,235,158,146,215 -"YNL054W",879,991,905,738,799,537,561,532,807 -"YNL053W",256,313,337,388,454,220,263,183,327 -"YNL052W",3443,3368,2729,2021,3402,5070,5814,4529,5872 -"YNL051W",560,598,430,338,400,472,511,503,746 -"YNL050C",427,571,732,1091,1139,259,379,345,636 -"YNL049C",614,709,761,711,664,309,370,373,593 -"YNL048W",888,982,814,734,719,658,715,719,1043 -"YNL047C",463,469,442,409,487,299,351,352,526 -"YNL046W",177,162,148,82,104,204,238,369,407 -"YNL045W",1303,1267,897,415,284,1085,944,908,1472 -"YNL044W",1383,1371,1411,1858,2250,1618,1761,1602,2084 -"YNL042W",124,128,126,196,255,121,120,83,158 -"YNL041C",858,929,795,552,651,562,661,591,940 -"YNL040W",998,1117,989,1007,918,716,550,638,1158 -"YNL039W",828,856,755,852,1080,716,672,638,975 -"YNL038W",328,333,325,325,432,221,260,282,430 -"YNL037C",1829,1926,1792,1012,2934,2666,1685,1658,2519 -"YNL036W",9063,6363,3895,1492,1152,15568,13759,12920,17423 -"YNL035C",365,381,371,479,766,271,239,299,455 -"YNL034W",40,40,35,18,26,25,41,36,48 -"YNL032W",473,511,472,521,538,284,407,465,740 -"YNL031C",2557,2244,1629,1326,1815,5356,2756,2212,3362 -"YNL030W",617,657,649,733,1280,3828,1367,703,1038 -"YNL029C",311,353,336,528,788,171,278,254,361 -"YNL027W",1102,1140,973,894,992,892,928,881,1314 -"YNL026W",622,645,521,356,343,883,643,596,857 -"YNL025C",270,240,187,73,125,201,180,201,304 -"YNCN0013W",9,5,3,2,5,26,11,15,12 -"YNCN0014W",5,3,6,3,4,9,3,9,7 -"YNL024C-A",397,383,372,455,451,273,360,376,592 -"YNL024C",13,22,30,126,91,18,11,9,16 -"YNL023C",881,1006,1184,1419,1353,286,446,506,926 -"YNL022C",457,598,787,1336,1260,241,287,344,546 -"YNL021W",411,525,617,938,902,211,309,265,368 -"YNL020C",462,507,441,494,819,324,379,378,589 -"YNL019C",5,8,9,4,9,2,1,3,3 -"YNL018C",24,24,4,17,17,23,11,18,25 -"YNL016W",2150,2409,2438,3216,3038,1286,1396,1420,2180 -"YNL015W",5917,4345,2754,1308,468,6240,6001,8725,11095 -"YNL014W",6599,5686,3677,672,47,914,2023,3865,8058 -"YNL012W",1038,962,632,335,341,1161,862,865,1445 -"YNL011C",311,331,235,141,216,365,254,310,492 -"YNL010W",737,851,972,1341,1681,855,689,710,1142 -"YNL009W",2949,2686,1629,349,62,5893,3315,2888,4290 -"YNL008C",1208,1038,743,446,496,2399,1492,1225,1651 -"YNL007C",11368,8894,5734,1794,2211,5714,6835,8232,15765 -"YNL006W",1092,1083,855,360,572,995,859,919,1487 -"YNL005C",1020,1093,906,802,1129,4023,1211,1022,1501 -"YNL004W",1170,1244,1427,1938,2350,788,1032,1041,1661 -"YNL003C",467,490,352,234,331,614,512,474,658 -"YNL002C",1243,1743,2584,5785,5748,205,592,661,1364 -"YNL001W",380,547,657,1173,1050,207,339,310,511 -"YNR001C",11211,9703,6406,1881,2727,26039,15148,12436,16495 -"YNR002C",5035,4916,3633,501,560,10903,7305,5132,6987 -"YNR003C",449,520,535,767,1389,119,278,349,543 -"YNR004W",68,85,52,104,112,95,72,72,106 -"YNR006W",724,818,757,582,680,500,576,545,866 -"YNR007C",1007,884,605,181,324,989,796,814,1369 -"YNR008W",384,472,494,513,426,385,316,278,498 -"YNR009W",76,106,99,87,69,166,130,86,108 -"YNR010W",165,191,130,147,176,85,125,142,192 -"YNR011C",507,628,583,753,541,278,312,308,590 -"YNR012W",315,477,856,1850,1511,40,180,200,305 -"YNR013C",787,1032,1344,1880,949,367,440,498,756 -"YNR014W",40,47,73,88,135,46,29,28,61 -"YNR015W",322,376,437,776,1085,196,225,267,413 -"YNR016C",28113,26514,21104,17496,9500,17688,21740,18523,30377 -"YNR017W",547,609,767,968,1007,845,650,523,808 -"YNR018W",674,859,1461,2858,1454,388,419,523,888 -"YNR019W",2058,2094,1630,996,574,1573,1265,1071,2120 -"YNR020C",222,259,271,334,417,404,250,205,364 -"YNR021W",1435,1436,1281,1683,1936,921,1085,1017,1776 -"YNR022C",410,414,325,255,335,1790,485,393,667 -"YNR023W",470,482,493,494,584,442,396,382,583 -"YNR024W",336,378,444,710,878,159,249,229,422 -"YNR026C",495,604,895,1492,719,202,309,331,566 -"YNR027W",232,305,589,951,330,87,178,204,362 -"YNR028W",507,555,440,413,503,833,544,407,570 -"YNR029C",706,800,954,877,857,387,564,536,866 -"YNR030W",1487,1699,1531,1257,560,1016,1259,1125,1691 -"YNR031C",926,957,907,627,650,649,624,592,891 -"YNR032W",414,438,476,317,347,426,398,371,633 -"YNR032C-A",326,310,241,220,235,326,315,314,623 -"YNR033W",644,721,676,482,390,1615,630,618,933 -"YNR034W",409,364,187,43,110,340,292,351,677 -"YNR034W-A",5318,2984,1474,320,122,11298,6166,5631,10623 -"YNR035C",2007,1874,1422,986,1328,2764,2284,2269,3192 -"YNR036C",1048,920,759,442,810,5574,1869,1616,2160 -"YNR037C",199,201,164,152,206,965,279,243,349 -"YNR038W",424,593,846,1455,1090,108,283,276,461 -"YNR039C",676,741,696,750,734,290,407,440,752 -"YNR040W",155,223,177,154,175,469,142,146,196 -"YNR041C",265,315,257,256,393,635,484,367,460 -"YNR043W",1033,1116,1134,1309,1287,1323,1704,1218,1470 -"YNR044W",783,867,895,861,2089,1266,540,400,630 -"YNR045W",412,421,291,178,347,747,416,384,553 -"YNR046W",290,378,463,749,930,210,326,302,507 -"YNR047W",531,569,390,272,346,342,343,337,498 -"YNR048W",273,307,300,312,274,234,214,187,319 -"YNR049C",334,316,264,213,460,377,350,343,537 -"YNR050C",4501,9022,12329,23578,27653,1553,1220,1478,3028 -"YNCN0018W",3,10,7,14,25,7,5,7,16 -"YNR051C",1100,1158,1280,1880,1595,900,1081,893,1602 -"YNR052C",623,797,891,1005,1284,695,791,705,980 -"YNR053C",761,1294,2667,7049,3655,49,312,338,682 -"YNR054C",253,366,565,1045,980,70,131,167,313 -"YNR055C",1000,1091,1127,1666,1266,748,831,820,1313 -"YNR056C",4826,4870,4958,2581,2721,6263,6574,4912,6538 -"YNR057C",1294,1270,1112,1430,1387,756,1401,1517,2316 -"YNR058W",5422,5906,5906,7790,6925,1907,4372,4278,6850 -"YNR059W",295,322,272,173,242,269,270,249,448 -"YNR060W",446,403,349,265,238,547,372,376,554 -"YNR061C",698,599,386,205,378,578,549,631,1111 -"YNR062C",77,89,84,78,85,62,59,63,93 -"YNR063W",200,207,208,221,184,81,97,110,198 -"YNR064C",249,249,237,203,174,140,155,177,363 -"YNR065C",240,306,284,296,222,116,144,171,272 -"YNR066C",68,87,107,89,49,34,39,50,75 -"YNR067C",1797,1172,1434,3017,668,331,1174,4319,4309 -"YNR068C",262,236,149,82,63,146,109,149,292 -"YNR069C",269,271,187,81,67,133,124,143,281 -"YNR072W",5,7,5,1,2,4,4,1,8 -"YNR073C",33,33,20,7,15,59,31,37,67 -"YNR075W",22,18,29,30,44,22,17,6,22 -"YNR075C-A",3,2,2,7,6,2,2,1,2 -"YOL164W-A",16,10,6,6,5,16,8,10,12 -"YOL164W",433,477,501,470,317,293,262,295,493 -"YOL163W",65,72,53,69,60,76,50,60,108 -"YOL162W",47,46,34,45,42,47,50,40,68 -"YOL160W",6,8,11,11,11,13,3,9,14 -"YOL159C-A",76,80,51,52,76,60,57,72,104 -"YOL159C",258,238,151,91,165,220,190,234,379 -"YOL158C",426,454,376,345,302,324,365,367,547 -"YOL157C",44,21,20,6,16,197,76,47,80 -"YOL156W",48,56,44,38,49,58,24,40,61 -"YOL155C",21307,16016,10756,4866,2309,15650,17686,16696,24805 -"YOL154W",459,351,262,219,274,532,603,546,723 -"YOL153C",1152,942,523,116,127,1250,806,933,1663 -"YOL152W",164,167,105,85,118,184,126,96,213 -"YOL151W",4506,4124,2908,1447,655,1223,1979,2949,6005 -"YOL149W",420,481,401,436,631,358,449,460,695 -"YOL148C",455,507,451,425,529,456,505,469,686 -"YOL147C",3611,3646,2714,1188,923,8012,5148,4440,6176 -"YOL146W",313,317,263,195,275,306,320,288,482 -"YOL145C",1773,1974,1846,2128,2764,1230,1572,1424,2114 -"YOL144W",306,442,727,1332,1010,64,187,156,318 -"YOL143C",1201,1166,993,608,478,1756,1376,1370,2332 -"YOL142W",454,518,564,727,968,267,383,401,676 -"YOL141W",115,204,253,495,219,28,32,46,83 -"YOL140W",1335,1298,1404,2460,2204,224,695,672,1285 -"YOL139C",2595,2941,3258,5069,6491,1960,2346,2321,3509 -"YOL138C",841,860,766,626,728,554,602,600,926 -"YOL137W",354,359,347,424,806,235,325,306,440 -"YOL136C",310,531,1659,2730,1979,42,95,111,199 -"YOL135C",254,276,288,325,301,131,207,203,277 -"YOL133W",532,551,448,386,341,453,481,440,776 -"YOL132W",121,124,92,88,156,177,106,103,188 -"YOL131W",18,18,20,12,7,15,9,15,25 -"YOL130W",1081,1174,1209,1883,1745,790,711,802,1376 -"YOL129W",1804,1577,1220,647,514,2354,1787,1796,2769 -"YOL128C",214,277,313,476,493,84,86,110,187 -"YOL127W",6718,7372,7420,11934,20731,2303,5190,5573,10208 -"YOL126C",3296,2993,1864,315,200,2793,2885,2961,4832 -"YOL125W",356,435,618,1259,784,155,223,228,415 -"YOL124C",342,746,2002,4835,2616,39,143,158,245 -"YOL123W",1410,742,502,559,3380,7236,4478,2568,2835 -"YOL122C",925,964,693,317,369,1346,748,757,1182 -"YOL121C",1851,2423,2737,4388,7098,520,1437,1565,2936 -"YOL120C",4965,5624,6030,10363,16320,1330,3412,3762,6309 -"YOL119C",2321,2384,1979,1554,2116,884,1302,1309,2573 -"YOL118C",62,62,66,81,94,69,73,46,77 -"YOL117W",542,595,360,165,178,427,337,359,598 -"YOL116W",498,574,461,295,454,627,498,477,728 -"YOL115W",437,445,415,539,960,342,390,354,593 -"YOL114C",50,30,15,10,26,128,92,86,94 -"YOL113W",889,834,520,170,390,1216,1001,848,1159 -"YOL112W",612,659,601,568,564,426,442,465,807 -"YOL111C",779,730,526,363,474,661,631,598,1015 -"YOL110W",1050,848,532,240,271,1515,1154,1291,2109 -"YOL109W",24930,17775,11052,9002,13405,30325,28513,29138,45653 -"YOL108C",430,429,341,230,399,356,462,458,746 -"YOL107W",353,323,250,142,177,226,319,329,461 -"YOL105C",360,311,229,180,297,480,346,288,453 -"YOL104C",15,13,11,21,12,60,14,15,21 -"YOL103W",944,1143,1153,1742,1657,569,619,614,976 -"YOL102C",519,529,381,353,445,408,466,494,825 -"YOL101C",223,232,186,105,135,295,300,132,202 -"YOL100W",1918,1691,1273,628,903,1406,1466,1469,2197 -"YOL098C",2082,2161,1871,2240,1927,1099,1362,1256,1981 -"YNCO0003C",3,3,9,3,5,4,5,2,3 -"YOL097W-A",8,8,4,13,29,6,12,7,14 -"YOL097C",965,1333,1696,3435,4115,443,921,769,1139 -"YOL096C",345,327,209,85,86,764,380,345,535 -"YOL095C",230,293,269,312,261,136,168,113,229 -"YOL094C",345,380,376,541,557,178,257,279,481 -"YOL093W",438,580,688,1132,1110,162,290,322,564 -"YOL092W",881,906,1018,1464,1706,307,551,617,1079 -"YOL091W",143,160,143,203,169,110,116,95,159 -"YOL090W",699,818,712,418,766,355,377,484,725 -"YOL089C",796,878,735,438,522,589,595,548,799 -"YOL088C",1069,959,677,382,646,1356,1195,977,1522 -"YOL087C",1598,1516,1029,371,424,1484,1241,1227,2060 -"YOL086W-A",280,311,281,190,212,300,269,316,495 -"YOL086C",9137,7976,6112,7468,5808,25322,15581,13502,19565 -"YOL085C",23,12,3,4,2,28,14,21,35 -"YOL084W",2963,2073,755,51,54,3896,1895,2144,3915 -"YOL083W",3862,3565,2319,812,169,2949,3045,3540,5814 -"YOL082W",2160,2024,1526,592,351,2028,1667,1940,2914 -"YOL081W",5033,4708,3066,1315,782,2666,2185,2502,4721 -"YOL080C",154,278,574,1390,1026,22,98,77,141 -"YOL078W",439,478,568,726,624,227,248,293,417 -"YOL077W-A",1287,1166,978,914,1132,3187,1945,1515,1773 -"YOL077C",750,1221,1789,3952,4278,75,424,434,724 -"YOL076W",547,645,625,730,613,210,305,292,477 -"YOL075C",502,604,532,499,365,361,274,297,556 -"YOL073C",375,390,252,130,183,443,402,356,626 -"YOL072W",277,296,253,264,218,219,226,227,362 -"YOL071W",988,865,575,159,189,2301,910,835,1329 -"YOL070C",749,786,719,655,674,785,1158,1029,1185 -"YOL069W",354,354,325,285,314,320,360,275,309 -"YOL068C",1213,1305,1160,1339,1259,1071,1036,1010,1562 -"YOL067C",385,388,375,357,281,327,331,311,489 -"YOL066C",493,559,634,930,523,441,431,421,710 -"YOL065C",523,441,438,227,67,397,411,470,788 -"YOL064C",1463,1737,1765,2717,2276,650,975,1112,1798 -"YOL063C",786,790,713,499,481,541,558,519,916 -"YOL062C",812,919,885,870,773,1124,857,805,1144 -"YOL061W",1596,1970,2278,3386,4015,779,1223,1145,1880 -"YOL060C",2107,2004,1385,402,433,1322,1312,1391,2439 -"YOL059W",2152,2225,2691,3221,961,597,868,1228,2760 -"YOL058W",5694,4840,4955,5501,6711,1758,5936,4281,7933 -"YOL057W",1293,1418,1183,972,578,963,1035,1064,1792 -"YOL056W",160,211,223,291,283,128,143,140,212 -"YOL055C",2990,3505,3171,3788,6989,1843,1566,2263,4006 -"YOL054W",691,718,733,599,673,337,417,520,868 -"YOL053W",447,457,332,182,295,956,549,519,692 -"YOL052C-A",18991,12273,6508,1291,441,17680,16945,17525,28772 -"YOL052C",397,485,588,800,980,285,311,290,525 -"YOL051W",3100,3337,2847,2212,2558,1800,2077,2105,3052 -"YOL049W",1610,1550,1295,867,841,1654,1539,1510,2119 -"YOL048C",952,852,440,138,215,1251,1024,1165,1544 -"YOL047C",86,55,58,101,36,105,60,105,136 -"YOL045W",615,585,739,1108,727,317,267,393,693 -"YOL044W",700,675,494,289,444,625,649,704,1053 -"YOL043C",370,420,376,356,298,232,293,303,547 -"YOL042W",495,527,480,462,534,450,400,386,566 -"YOL041C",1127,1534,2067,4274,3715,113,604,676,1214 -"YOL040C",3465,3938,4584,7283,10403,901,2205,2199,4731 -"YOL039W",1884,2434,2663,4507,6679,464,1312,1326,2613 -"YOL038C-A",58,57,22,17,4,37,32,45,66 -"YOL038W",3666,3360,2834,2170,1704,3293,3785,3647,5913 -"YOL036W",1394,1630,1438,1410,1453,936,1139,935,1663 -"YOL034W",731,818,695,496,628,395,424,485,805 -"YOL033W",237,265,240,174,274,733,168,192,282 -"YOL032W",1619,1248,591,81,159,2078,1531,1668,2820 -"YOL031C",330,415,400,517,737,338,310,268,392 -"YOL030W",814,1151,1298,2305,3536,2074,1183,843,1022 -"YOL029C",166,232,271,424,516,147,181,130,205 -"YOL028C",169,191,258,405,383,126,135,122,192 -"YOL027C",1298,1438,1411,1616,1583,2095,1704,1201,1801 -"YOL026C",339,295,235,149,151,374,402,453,816 -"YOL025W",555,588,460,329,321,364,379,432,743 -"YOL024W",6,6,8,2,8,23,17,12,16 -"YOL023W",280,280,237,234,313,787,252,216,301 -"YOL022C",683,826,916,1718,1955,261,359,402,760 -"YOL021C",1073,1347,1597,2556,2289,522,763,674,1062 -"YOL020W",514,780,1119,1525,1345,201,350,335,520 -"YOL019W",310,308,396,385,486,106,265,580,513 -"YOL018C",777,902,690,268,272,721,728,745,1159 -"YOL017W",293,304,203,88,396,219,161,239,309 -"YOL016C",853,763,463,306,443,964,592,689,1233 -"YOL015W",43,38,29,7,44,38,31,37,61 -"YOL014W",18,28,26,62,98,26,27,27,46 -"YOL013C",773,771,631,223,390,672,718,680,1093 -"YOL012C",511,506,396,342,462,1018,841,653,940 -"YOL011W",486,379,326,532,1136,805,804,652,745 -"YOL010W",380,664,1226,2302,2009,75,252,249,399 -"YOL009C",306,297,216,201,253,266,242,230,371 -"YOL008W",185,231,214,219,211,200,159,151,266 -"YOL007C",118,139,149,112,224,110,84,79,120 -"YOL006C",1300,1287,1281,1516,1664,720,931,1121,1622 -"YOL005C",359,409,333,275,390,391,393,409,617 -"YOL004W",1579,1717,1447,1351,1285,1416,1309,1169,1879 -"YOL003C",474,465,394,332,356,385,332,319,557 -"YOL002C",473,723,760,855,790,494,389,340,586 -"YOL001W",352,330,247,200,422,299,250,255,418 -"YOR001W",813,1044,1126,1813,1760,300,450,442,886 -"YOR002W",1727,1663,1307,878,827,1296,1431,1616,2322 -"YOR003W",505,502,371,185,176,738,473,495,781 -"YOR004W",223,335,559,1379,1320,49,146,150,250 -"YOR005C",713,784,593,452,419,587,523,544,919 -"YOR006C",453,624,842,1435,881,223,318,330,573 -"YOR007C",15424,13336,9991,6872,4777,9898,10042,11070,21616 -"YOR008C",2523,2558,2155,1851,2403,2254,2081,2152,3249 -"YOR008C-A",5,5,7,5,9,19,6,7,11 -"YOR009W",165,134,114,85,180,238,163,142,217 -"YOR010C",117,124,129,117,142,156,107,100,157 -"YOR011W",811,905,796,761,383,283,409,460,857 -"YOR011W-A",18,11,13,8,9,12,11,7,18 -"YOR012W",75,88,137,309,154,78,65,53,92 -"YOR014W",1774,1776,1406,1020,1143,1237,1320,1203,1956 -"YOR015W",282,234,182,138,262,225,203,234,397 -"YOR016C",630,793,641,654,857,552,476,530,940 -"YOR017W",339,373,333,377,442,431,293,233,363 -"YOR018W",536,520,298,78,207,465,392,449,665 -"YOR019W",485,494,252,73,89,352,322,409,694 -"YOR020C",3875,3243,2470,1427,1687,12061,4543,4250,7037 -"YOR020W-A",1487,1429,1055,538,239,1334,1212,1491,2459 -"YOR021C",671,785,929,1408,1763,571,587,558,907 -"YOR022C",519,522,406,203,291,428,357,391,583 -"YOR023C",1205,1338,1048,682,977,963,886,843,1286 -"YOR025W",312,350,264,124,235,516,737,491,507 -"YOR026W",300,312,290,234,413,456,516,336,426 -"YOR027W",25975,20638,13312,3838,2321,10937,11920,14851,31636 -"YOR028C",876,576,250,79,150,1278,726,874,1651 -"YOR030W",676,686,590,563,397,1156,624,436,748 -"YOR031W",1486,1055,617,212,245,1874,1519,2192,4086 -"YOR032C",413,436,390,196,111,236,185,228,472 -"YOR032W-A",28,18,3,7,18,40,12,25,30 -"YOR033C",247,252,288,460,759,232,131,156,273 -"YOR034C",796,808,573,556,529,466,423,533,897 -"YOR034C-A",55,47,30,16,15,38,27,37,62 -"YOR035C",1114,1122,797,313,218,596,555,694,1216 -"YOR036W",1543,1298,875,307,589,1555,1316,1463,2499 -"YOR037W",370,374,292,266,422,523,344,328,470 -"YOR038C",570,600,441,484,597,417,498,423,617 -"YOR039W",1282,1279,1166,1072,1287,1043,1091,1126,1834 -"YOR040W",1301,1300,947,471,334,1392,1234,1297,2146 -"YNCO0014C",263,255,156,96,83,269,230,312,434 -"YOR042W",2232,2059,1537,810,672,2738,2317,2326,3479 -"YNCO0015C",10,16,6,4,7,12,20,12,26 -"YOR043W",1312,1402,1263,1442,1464,710,999,948,1533 -"YOR044W",384,362,327,264,202,200,233,281,482 -"YOR045W",240,244,198,196,283,1351,396,315,429 -"YOR046C",1139,1329,1536,2197,2782,668,983,901,1402 -"YOR047C",94,120,206,281,185,53,86,87,120 -"YOR048C",1027,1209,1402,1838,1713,437,665,678,1193 -"YOR049C",177,198,243,195,147,140,148,148,220 -"YOR051C",581,863,1626,3640,2543,237,509,536,837 -"YOR052C",2797,2578,2525,1673,1198,3771,2287,2357,4062 -"YOR054C",1756,1507,965,213,314,1706,1670,1643,2593 -"YOR056C",906,1165,1619,2988,3171,383,666,638,1201 -"YOR057W",622,631,586,465,359,341,423,469,823 -"YOR058C",384,498,513,634,530,577,829,509,566 -"YNCO0016W",5,2,2,2,3,4,1,1,4 -"YOR059C",971,911,761,556,469,896,911,809,1270 -"YOR060C",192,204,220,207,126,82,117,123,172 -"YOR061W",1264,1397,1431,1970,2093,992,1174,1070,1762 -"YOR062C",259,250,336,141,145,189,218,220,427 -"YOR063W",11330,13800,16801,31436,36002,2851,7160,7658,14027 -"YOR064C",448,504,392,341,562,410,493,457,676 -"YOR065W",4584,4115,2996,1963,3222,8081,7887,5393,6980 -"YOR066W",450,600,520,435,845,154,252,362,473 -"YOR067C",711,788,771,799,1051,347,496,482,786 -"YOR069W",729,749,649,557,664,549,652,579,901 -"YOR070C",691,710,576,295,430,506,526,532,851 -"YOR071C",546,574,449,456,577,353,365,425,676 -"YOR072W",25,24,15,15,25,29,22,24,39 -"YOR073W",424,498,491,472,474,435,509,383,519 -"YOR074C",261,268,246,151,306,202,148,199,293 -"YOR075W",639,683,541,309,656,471,536,580,900 -"YOR076C",463,503,472,388,478,351,310,371,515 -"YOR077W",250,254,199,233,229,156,196,246,394 -"YOR078W",625,871,1214,2323,1835,218,476,442,854 -"YOR079C",181,202,205,272,334,118,158,152,239 -"YOR080W",339,386,280,273,305,184,216,256,334 -"YOR081C",443,540,465,495,536,274,328,331,471 -"YOR083W",200,196,158,110,105,267,246,179,332 -"YOR084W",958,699,579,261,266,3273,2087,1414,1959 -"YOR085W",708,753,740,696,643,522,579,593,873 -"YOR086C",3599,3292,2406,1005,444,2825,2477,2521,4320 -"YOR087W",1122,1189,925,542,410,1320,1086,934,1467 -"YOR089C",1254,1277,1275,1322,1457,1158,1219,1148,2026 -"YOR090C",1168,996,724,450,488,849,782,827,1313 -"YOR091W",445,592,872,1571,1350,144,280,280,494 -"YOR092W",426,457,486,495,519,269,229,264,443 -"YOR093C",836,803,668,437,616,799,645,589,902 -"YOR094W",255,281,290,277,390,151,220,242,380 -"YOR095C",491,761,1177,2323,2075,39,257,324,540 -"YOR096W",4455,5192,5252,8882,14303,1064,2994,3625,6871 -"YOR097C",355,410,276,163,209,312,305,288,464 -"YOR098C",1134,1221,1447,1999,1497,741,916,850,1289 -"YOR099W",1593,1579,1289,1218,1762,1773,1727,1662,2507 -"YOR100C",530,551,435,171,129,1262,709,594,826 -"YOR101W",471,799,1417,2791,1471,144,130,204,506 -"YOR103C",465,455,399,345,350,408,455,505,716 -"YOR104W",284,311,306,249,297,190,210,219,392 -"YOR105W",15,24,14,13,21,9,14,21,21 -"YOR106W",370,397,422,438,515,299,361,329,467 -"YOR107W",184,243,369,580,267,114,193,184,291 -"YOR108W",384,566,915,2006,2563,46,150,162,370 -"YOR109W",1163,1385,1235,1264,1097,782,737,676,1108 -"YOR110W",385,428,397,350,465,329,340,302,496 -"YOR111W",311,345,255,169,191,292,286,282,413 -"YOR112W",517,588,562,519,702,462,475,415,612 -"YOR113W",850,831,607,168,294,741,670,603,899 -"YOR114W",219,253,155,55,86,259,177,176,264 -"YOR115C",516,580,585,682,766,314,350,396,591 -"YOR116C",1252,1609,1751,2737,2796,464,832,772,1328 -"YOR117W",4449,4335,3501,2939,2371,3674,4312,4021,6186 -"YOR118W",1600,1443,1229,996,1096,1213,1190,1219,1998 -"YOR119C",824,989,1072,1630,1073,487,497,529,990 -"YOR120W",8210,7123,4284,1350,411,11352,5300,6752,11527 -"YOR122C",3193,2846,2323,1912,1747,4458,3933,4040,5992 -"YOR123C",1798,1767,1694,1935,2301,1575,1637,1432,2371 -"YOR124C",2481,2341,1782,919,753,1912,1584,1673,2655 -"YOR125C",414,440,321,129,127,819,485,524,753 -"YOR126C",395,443,336,197,247,378,372,430,597 -"YOR127W",749,886,895,863,970,441,518,573,812 -"YOR128C",1592,1966,2202,5160,3288,710,902,1009,1721 -"YOR129C",348,377,381,504,535,301,368,260,383 -"YOR130C",311,377,332,360,398,184,277,272,446 -"YOR131C",293,314,298,218,260,440,348,326,479 -"YOR132W",815,820,587,256,436,719,608,614,1093 -"YOR133W",1076,1093,1057,1509,2210,546,643,752,1269 -"YOR134W",434,296,183,38,99,852,240,353,735 -"YOR136W",1856,1689,1405,739,2653,2442,1436,1518,2415 -"YOR137C",521,519,429,221,276,465,379,364,651 -"YOR138C",1333,1277,922,536,874,1286,1313,1321,2085 -"YOR140W",533,692,695,756,686,326,421,358,497 -"YOR141C",1264,1452,1424,833,788,935,1114,1074,1660 -"YOR142W",5303,4833,3588,1737,1479,12309,7707,6073,7623 -"YOR143C",288,394,592,958,847,130,239,214,373 -"YOR144C",313,427,449,456,471,167,188,200,307 -"YOR145C",1022,1408,1991,4099,4087,323,764,761,1336 -"YOR147W",1003,1064,818,678,875,1001,1023,883,1196 -"YOR148C",484,499,400,340,375,339,405,447,745 -"YOR149C",582,650,521,478,459,388,343,383,630 -"YOR150W",610,620,503,337,440,2720,830,686,971 -"YOR151C",3358,3626,3485,4834,4247,2184,2801,2536,3712 -"YOR152C",619,543,281,58,153,453,369,529,853 -"YOR153W",1609,2099,2078,2543,2980,832,862,982,1679 -"YOR154W",602,726,810,1087,743,308,368,392,674 -"YOR155C",853,806,612,278,215,734,731,782,1325 -"YOR156C",311,361,312,271,293,220,237,238,358 -"YOR157C",2256,2255,1950,1398,970,1492,1862,1616,2716 -"YOR158W",640,718,604,458,761,2697,787,682,939 -"YOR159C",272,273,312,522,477,192,248,228,419 -"YOR160W",621,692,739,1075,751,388,365,394,644 -"YOR161C",2740,2057,1011,312,311,3441,2118,2609,4597 -"YOR161C-C",7,7,6,6,9,20,8,7,10 -"YOR162C",1075,1023,860,374,465,996,801,738,1307 -"YOR163W",873,840,635,403,387,836,813,779,1314 -"YOR164C",969,938,773,696,602,684,747,695,1238 -"YOR165W",1648,1825,1570,1573,1572,1620,1230,1115,1723 -"YOR166C",691,747,642,677,639,315,448,462,772 -"YOR167C",3106,3193,3049,4357,7461,1439,2833,3114,5060 -"YOR168W",2272,2763,2990,5261,5150,886,1374,1401,2200 -"YOR171C",843,924,816,832,1059,687,698,666,1048 -"YOR172W",441,514,401,415,418,331,375,341,519 -"YOR173W",5706,4285,2167,381,114,7278,4425,5447,9014 -"YOR174W",306,326,301,298,525,365,346,347,505 -"YOR175C",1844,1700,1307,755,604,1758,1608,1636,2592 -"YOR176W",1128,1222,794,365,345,1237,1090,1179,1774 -"YOR177C",241,265,187,61,52,373,275,443,426 -"YOR178C",1895,1517,1044,248,856,2066,1155,1281,1949 -"YOR179C",314,304,368,323,331,193,310,290,480 -"YOR180C",859,789,504,137,88,2716,1520,1083,1263 -"YOR181W",635,566,466,277,343,443,470,442,683 -"YOR182C",1531,1618,1491,2196,3870,578,1285,1495,2463 -"YOR184W",2505,2889,3030,4953,3800,1619,1610,1931,3008 -"YNCO0022C",7,5,5,4,16,6,11,10,12 -"YOR185C",1581,1336,878,353,77,1441,1219,1347,2373 -"YOR186W",102,125,62,9,7,68,38,50,166 -"YOR187W",2106,2177,1983,1547,3156,9163,2711,2173,2815 -"YOR188W",538,638,814,1013,790,370,384,309,425 -"YOR189W",377,476,417,400,447,383,372,377,629 -"YOR190W",204,171,121,69,153,261,184,221,310 -"YOR191W",1641,1831,1512,1209,1112,926,1000,1013,1606 -"YOR192C",207,154,100,82,127,162,130,133,222 -"YOR192C-C",4,4,1,5,4,11,6,4,8 -"YOR192C-B",18,17,17,9,3,11,8,6,13 -"YOR193W",548,486,332,225,226,461,429,416,647 -"YOR194C",1065,1111,1036,942,1268,1156,1125,1000,1499 -"YOR195W",1142,1150,960,772,1062,665,755,694,1229 -"YOR196C",973,1009,1024,1192,1550,949,964,857,1235 -"YOR197W",1156,1149,1091,1092,1225,1070,933,1043,1486 -"YOR198C",1600,1730,1678,2246,2478,1654,1343,1140,1751 -"YOR201C",465,510,654,1052,817,681,483,375,604 -"YOR202W",548,561,649,1229,1068,325,482,457,928 -"YOR204W",1798,2575,4565,8502,3402,965,1144,1085,1813 -"YOR205C",320,313,372,562,374,353,259,211,315 -"YOR206W",1038,1742,2545,5944,5177,151,590,561,928 -"YOR207C",1300,1683,1881,3371,3462,341,701,702,1140 -"YOR208W",465,523,415,236,296,385,357,330,533 -"YOR209C",1454,1758,1957,3022,2808,801,1154,1110,1926 -"YOR210W",318,437,612,1090,1148,170,317,336,502 -"YOR211C",1054,1093,948,768,971,1119,749,642,1046 -"YOR212W",1038,1075,1040,982,1590,796,692,765,1383 -"YOR213C",334,349,375,382,520,230,296,237,433 -"YOR214C",15,21,12,5,4,28,17,18,25 -"YOR215C",5093,4275,2998,1432,417,5510,4830,4903,7782 -"YOR216C",674,753,822,908,667,421,527,542,789 -"YOR217W",936,1028,992,1145,968,649,770,685,1023 -"YOR219C",636,612,405,326,662,692,524,510,817 -"YOR220W",1255,1038,616,320,642,1415,1200,1184,1919 -"YOR221C",544,635,569,485,484,403,443,413,645 -"YOR222W",752,897,1004,2068,2456,461,647,537,927 -"YNCO0024C",4,3,7,3,16,7,6,8,5 -"YOR223W",532,491,385,135,233,533,570,540,892 -"YOR224C",494,581,765,1531,2075,312,593,466,758 -"YOR226C",165,218,377,741,694,70,117,129,210 -"YOR227W",2221,1885,1118,292,485,2353,1587,1643,2392 -"YOR228C",392,454,286,88,105,426,390,437,637 -"YOR229W",481,564,689,789,417,249,475,439,676 -"YOR230W",10099,7977,5634,3016,1260,6494,7226,10745,16628 -"YOR231W",473,491,369,290,553,363,416,351,570 -"YOR232W",937,1068,1079,1287,1600,2257,995,877,1243 -"YOR233W",373,457,582,870,803,255,287,240,412 -"YOR234C",1803,2145,2465,4781,6956,542,1501,1539,2622 -"YNCO0025W",32,32,18,8,8,20,40,32,45 -"YOR236W",245,310,318,379,193,110,189,260,451 -"YOR237W",71,69,65,74,62,48,36,26,66 -"YOR238W",370,407,369,375,339,251,225,255,468 -"YOR239W",868,1027,1158,1662,1397,878,843,737,1258 -"YOR241W",776,958,1000,1244,1283,520,696,735,1036 -"YOR242C",67,79,48,49,161,52,54,53,66 -"YOR243C",842,1171,1556,2937,2919,206,481,465,848 -"YOR244W",878,866,705,642,899,614,808,757,1124 -"YOR245C",1158,1108,858,649,731,1030,845,848,1450 -"YOR246C",587,750,749,986,980,514,625,583,977 -"YOR247W",565,660,663,611,1134,4296,2426,956,655 -"YOR249C",469,516,427,324,448,318,344,398,500 -"YOR250C",360,371,323,260,276,290,275,302,472 -"YOR251C",1413,1388,1129,1014,915,1142,1202,1370,2388 -"YOR252W",447,584,746,1420,2219,165,272,301,510 -"YOR253W",400,486,475,565,577,318,352,354,557 -"YOR254C",1625,1920,1942,2624,2853,683,1192,1138,1712 -"YOR255W",14,21,16,6,2,7,11,12,31 -"YOR256C",1244,1328,1100,864,975,934,891,874,1450 -"YOR257W",519,557,398,340,493,541,593,542,878 -"YOR258W",211,191,158,146,212,157,151,180,305 -"YOR259C",4800,4547,4163,3947,3231,4070,4893,4322,6536 -"YOR260W",1073,1185,1294,1825,2400,391,756,706,1028 -"YOR261C",3957,3721,2655,1773,2159,4305,4667,4375,6128 -"YOR262W",716,884,838,677,873,392,555,575,985 -"YOR264W",656,478,495,457,328,179,590,1645,1601 -"YOR265W",466,439,350,356,247,374,369,358,492 -"YOR266W",315,330,286,277,269,730,313,254,378 -"YOR267C",1061,952,848,578,467,698,572,604,942 -"YOR269W",101,134,177,191,110,36,63,72,131 -"YOR270C",3713,3867,3986,5749,2808,2404,2628,2750,4378 -"YOR271C",775,1156,1500,2516,2176,535,811,702,1050 -"YOR272W",662,996,1583,3352,3070,52,297,378,635 -"YOR273C",2838,2298,1160,186,201,5375,3471,2802,4087 -"YOR274W",575,640,715,746,692,396,407,428,686 -"YOR275C",750,767,596,325,287,653,507,521,909 -"YOR276W",991,1111,1245,1878,2643,528,847,882,1402 -"YNCO0027C",30,32,29,69,66,17,15,29,35 -"YNCO0028W",10,5,4,9,10,11,9,6,8 -"YOR278W",296,297,259,249,248,243,215,244,355 -"YOR279C",277,359,363,340,414,195,223,238,407 -"YOR280C",337,410,368,360,415,317,297,315,523 -"YOR281C",599,718,1092,1810,991,413,552,478,727 -"YOR283W",541,859,1512,3403,1836,184,354,412,693 -"YOR284W",273,286,235,78,122,201,220,257,387 -"YOR285W",12969,10496,6849,2972,2740,25079,22815,19179,25638 -"YOR286W",418,432,466,360,657,1476,496,454,679 -"YOR287C",220,441,655,1170,989,19,114,125,248 -"YOR288C",217,253,215,130,214,222,228,231,355 -"YOR289W",1285,1172,805,389,182,992,914,1233,2008 -"YNCO0029C",6,6,8,2,1,6,8,10,8 -"YOR290C",1973,1940,1547,1212,1255,1476,1382,1330,2150 -"YOR291W",823,901,828,924,702,486,552,491,848 -"YOR292C",495,475,280,73,228,442,346,439,681 -"YOR293W",4258,4782,5144,8785,16038,1220,3101,3204,5363 -"YOR294W",685,935,1327,2635,2415,119,463,519,903 -"YOR295W",208,238,286,304,295,133,160,133,262 -"YOR296W",538,564,450,409,568,342,315,311,522 -"YOR297C",197,231,219,299,388,176,178,166,245 -"YOR298W",149,118,86,97,121,210,156,144,220 -"YOR298C-A",7875,5874,3159,774,2452,6877,6430,6944,11846 -"YOR299W",430,519,567,657,608,326,294,321,490 -"YOR301W",279,287,276,314,263,214,222,303,477 -"YOR302W",655,510,477,628,279,214,451,456,803 -"YOR303W",9214,6784,7581,11606,5064,2855,6667,7319,13449 -"YOR304W",1017,1180,1228,1276,1370,597,700,757,1197 -"YOR304C-A",123,143,185,164,120,90,115,124,222 -"YOR305W",298,412,467,687,459,181,231,208,335 -"YOR306C",463,850,2947,8409,1402,238,314,245,438 -"YOR307C",753,864,885,1211,1046,415,606,552,942 -"YOR308C",358,480,490,562,320,158,244,290,414 -"YOR310C",958,1712,3414,9506,7588,93,444,418,731 -"YOR311C",437,503,598,819,692,228,313,365,552 -"YOR312C",4850,5546,6073,10160,17197,1555,3942,3896,6838 -"YOR313C",17,15,18,16,29,31,67,28,42 -"YOR315W",139,178,215,309,495,344,695,263,193 -"YOR316C",1074,1087,933,875,1097,722,795,998,1631 -"YOR316C-A",8,6,1,3,6,11,6,6,11 -"YOR317W",6632,5176,3499,1507,852,13105,11082,8459,11134 -"YOR319W",427,565,610,526,434,290,303,294,559 -"YOR320C",910,1064,865,742,1180,677,744,685,973 -"YOR321W",440,489,368,172,194,272,290,305,513 -"YOR322C",769,851,899,1178,867,494,554,452,790 -"YOR323C",1112,1299,1330,1695,1629,524,752,806,1402 -"YOR324C",711,728,611,352,542,875,745,605,832 -"YOR326W",3034,3078,2899,3300,2967,3096,2581,2450,3496 -"YOR327C",1329,1430,1331,1185,1095,1339,1286,1373,2076 -"YOR328W",2906,2913,1699,394,120,945,979,1423,2901 -"YOR329C",1415,1147,827,532,683,1618,1072,1000,1533 -"YOR330C",710,762,688,579,583,719,662,578,875 -"YOR332W",2676,2666,2447,2535,2250,2376,2318,2482,4402 -"YOR334W",237,264,277,331,199,281,185,177,284 -"YOR335C",3772,5199,6442,12504,10955,1883,2490,2633,4096 -"YOR336W",750,837,712,738,380,495,414,372,677 -"YOR337W",385,596,1161,2040,642,86,161,144,297 -"YOR338W",374,711,2451,6460,1854,88,108,153,359 -"YOR339C",100,101,90,90,98,74,80,98,164 -"YOR340C",445,721,1119,2165,1874,57,230,230,406 -"YOR341W",2045,3009,4144,10125,10593,336,966,958,1698 -"YOR342C",575,664,941,1642,2033,367,605,858,987 -"YOR343C",34,31,35,12,26,45,39,49,57 -"YOR343W-B",81,98,92,92,104,46,44,41,74 -"YOR344C",1568,1453,1016,798,633,896,924,1231,2182 -"YOR346W",741,839,908,1350,1538,533,665,581,832 -"YOR347C",420,448,321,109,77,477,374,421,669 -"YOR348C",3981,3374,1944,317,822,9888,9734,5831,6788 -"YOR349W",367,353,318,276,303,486,295,235,376 -"YOR350C",848,926,755,582,392,387,522,617,1014 -"YOR351C",35,39,17,16,28,52,26,17,40 -"YOR352W",548,561,357,186,356,575,466,488,711 -"YOR353C",730,749,689,551,684,477,571,563,836 -"YOR354C",1000,1074,926,758,1145,3644,1103,857,1132 -"YOR355W",3726,3028,2496,2234,2590,1027,3087,2602,3992 -"YOR356W",3093,3226,2833,2003,1557,3428,3797,2851,4137 -"YOR357C",324,327,215,188,385,390,360,364,514 -"YOR358W",278,307,266,155,167,383,235,251,446 -"YOR359W",309,475,1110,1724,699,73,154,148,230 -"YOR360C",426,795,2694,3828,462,206,268,302,454 -"YOR361C",2180,3065,3511,6654,7621,881,1526,1512,2469 -"YOR362C",3552,3377,2848,2276,1860,3759,4327,4008,5978 -"YOR363C",1178,1253,967,456,373,1629,1229,931,1322 -"YOR365C",257,191,138,100,201,533,274,236,403 -"YOR367W",491,571,406,269,410,386,413,398,706 -"YOR368W",262,325,281,292,462,170,183,192,285 -"YOR369C",5743,6682,7629,12254,23919,1484,4426,5192,10164 -"YOR370C",1344,1580,1736,2161,2294,872,1197,949,1571 -"YOR371C",403,408,376,311,251,244,243,241,437 -"YOR372C",648,754,874,976,447,724,614,443,656 -"YOR373W",624,531,454,359,318,1147,799,786,1088 -"YOR374W",122903,92856,63305,22265,1389,207054,177318,146394,205271 -"YOR375C",12106,19172,27543,46258,75002,5092,12143,11489,16221 -"YOR376W",16,26,19,8,32,57,42,37,53 -"YOR376W-A",69,93,78,37,62,73,53,41,74 -"YOR377W",724,735,491,334,684,719,507,500,817 -"YOR378W",248,266,227,187,117,116,124,137,214 -"YOR380W",374,393,283,169,217,287,322,322,495 -"YOR381W",258,246,219,178,319,112,146,164,326 -"YOR381W-A",9,18,15,24,34,4,2,3,18 -"YOR382W",180,202,189,170,184,328,132,134,203 -"YOR383C",335,320,280,168,170,732,345,292,452 -"YOR384W",491,503,366,199,196,339,289,311,520 -"YOR385W",583,635,520,550,526,296,342,425,717 -"YOR386W",709,651,331,58,84,692,483,517,722 -"YOR387C",187,115,48,17,33,309,167,181,301 -"YOR388C",6126,4692,3161,1540,238,9619,8558,8188,11176 -"YOR389W",967,1009,1035,1681,816,1125,1045,993,1571 -"YOR390W",52,57,69,89,78,30,26,26,49 -"YOR391C",394,295,170,34,10,428,309,373,682 -"YPL279C",12,17,16,20,25,9,5,7,7 -"YPL278C",65,39,39,25,5,74,58,80,104 -"YPL277C",476,404,264,170,73,621,540,512,776 -"YPL276W",927,716,457,194,25,1219,1055,1112,1390 -"YPL274W",1902,2339,2963,4771,2598,557,1292,1265,2216 -"YPL273W",489,557,629,1055,1758,177,395,365,540 -"YPL272C",130,136,113,77,234,103,75,86,156 -"YPL271W",2246,2074,1411,891,1473,4084,3614,3166,4027 -"YPL270W",1354,1317,1103,752,668,1045,1008,1033,1610 -"YPL269W",206,268,237,181,188,182,175,120,221 -"YPL268W",686,673,587,504,444,440,451,487,737 -"YPL267W",165,193,142,106,328,117,99,117,211 -"YPL266W",550,858,1170,2582,3314,111,354,335,628 -"YPL265W",515,771,864,658,2320,974,517,391,545 -"YPL264C",264,189,149,119,143,235,226,204,398 -"YPL263C",366,482,650,1316,2708,209,309,233,427 -"YPL262W",3462,3641,2872,1721,1674,6747,3892,3336,5024 -"YPL261C",52,51,36,23,41,51,41,38,40 -"YPL260W",1786,1799,1430,1067,1382,2016,1579,1559,2409 -"YPL259C",436,484,474,454,537,272,388,355,563 -"YPL258C",298,302,252,212,496,440,231,203,323 -"YNCP0001C",12,7,2,3,9,9,9,8,7 -"YPL257W",252,203,108,45,88,301,255,249,363 -"YPL256C",714,901,814,743,1202,262,144,287,633 -"YPL255W",170,199,148,153,248,179,157,157,209 -"YPL254W",604,690,626,698,954,272,504,454,764 -"YPL253C",308,305,269,258,298,391,338,258,389 -"YPL252C",290,332,436,704,651,409,276,252,334 -"YPL250C",857,663,410,442,111,320,562,595,1097 -"YPL249C-A",3469,3618,4063,6143,10493,1251,2548,2723,5155 -"YPL249C",676,715,608,320,271,492,518,444,763 -"YNCP0002W",23,21,25,21,42,21,24,18,37 -"YPL247C",827,639,347,112,191,761,590,670,1181 -"YPL246C",360,364,459,631,386,295,240,290,445 -"YPL245W",88,123,171,300,540,135,70,78,126 -"YPL244C",381,488,550,680,871,310,361,341,551 -"YPL243W",1998,2175,1996,2320,2696,1866,2042,1730,2537 -"YPL242C",1002,955,801,603,627,1209,2146,1357,1329 -"YPL241C",118,149,124,112,274,139,101,131,180 -"YPL240C",29371,22868,13614,3141,1521,27239,14812,18588,39267 -"YPL239W",891,957,1128,1880,1677,297,476,609,1248 -"YPL237W",1690,2041,2640,5105,6178,1263,1546,1480,2393 -"YPL236C",487,486,335,147,214,287,339,370,662 -"YPL235W",1211,1349,1346,1937,2349,907,1104,1039,1615 -"YPL234C",858,854,808,858,893,942,970,996,1637 -"YPL233W",228,297,304,389,265,209,168,188,331 -"YPL232W",1164,1165,1309,1645,1349,1039,1156,1354,1907 -"YPL231W",17225,17563,15483,14327,9210,10246,15620,12308,18395 -"YPL230W",1458,970,373,44,287,4133,1650,1517,1972 -"YPL229W",387,401,511,649,590,281,325,337,518 -"YPL228W",776,770,598,466,689,602,668,632,859 -"YPL227C",312,455,693,1311,696,250,330,282,450 -"YPL226W",2073,3225,5268,15511,5814,351,867,924,1720 -"YPL225W",2359,2225,1598,1424,1637,2178,1928,2136,3389 -"YPL224C",414,473,387,300,414,562,444,397,602 -"YPL223C",42336,31045,19876,4631,255,1674,5768,12502,48317 -"YPL222W",3237,2945,1861,412,249,1729,1758,2261,4488 -"YPL221W",1005,1365,2408,4684,2320,952,949,772,1135 -"YPL220W",975,1247,1196,2103,3299,423,646,811,1347 -"YPL219W",396,362,255,93,229,388,298,387,476 -"YPL218W",2096,2009,1724,1495,1826,2289,2237,2289,3367 -"YPL217C",1303,1785,2535,5263,4407,341,763,750,1367 -"YPL216W",787,831,627,605,629,550,474,462,881 -"YPL215W",557,590,494,462,712,1560,616,521,754 -"YPL214C",1429,1685,1689,2176,3995,1004,898,1133,1855 -"YPL213W",361,428,422,373,535,214,274,307,461 -"YPL212C",571,863,1529,3757,1931,136,387,371,697 -"YPL211W",363,566,948,1973,2230,66,240,224,457 -"YPL210C",1640,1832,1751,2416,2105,1283,1558,1399,1984 -"YPL209C",93,129,100,110,117,77,61,73,127 -"YPL208W",439,465,413,341,483,279,296,369,522 -"YPL207W",1699,2154,2217,3122,4868,640,1026,991,1779 -"YPL206C",1411,1466,1240,799,838,1651,1234,1317,2306 -"YPL204W",1242,1511,1804,2533,1880,868,907,961,1456 -"YPL203W",2072,1845,1051,144,189,2239,1660,1857,2813 -"YPL202C",393,459,773,1121,699,724,422,326,454 -"YPL201C",1632,1368,745,64,91,8941,3538,2439,2828 -"YPL200W",211,179,106,16,22,277,261,239,333 -"YPL199C",496,585,593,1013,1344,560,465,425,672 -"YPL198W",949,1125,1446,2831,3379,197,557,564,1107 -"YNCP0003W",9,9,16,22,20,3,5,4,17 -"YPL196W",869,836,444,185,264,1093,917,906,1533 -"YPL195W",1582,1680,1428,1435,1374,941,1023,1026,1692 -"YPL194W",411,459,345,233,195,230,262,254,431 -"YPL193W",931,924,951,1004,1087,636,761,656,1058 -"YPL192C",124,112,72,94,243,164,171,119,200 -"YPL191C",471,468,317,148,196,309,300,354,601 -"YPL190C",2318,2097,1699,1422,1471,1938,1999,1797,2886 -"YPL189C-A",463,347,293,176,352,1036,913,722,900 -"YPL189W",62,81,70,112,63,53,40,50,76 -"YPL188W",1254,1268,1133,1074,1110,1010,1140,1102,1660 -"YPL187W",32671,34939,32758,38640,61601,31597,19198,25333,35837 -"YPL186C",10566,8100,5269,1991,256,9329,7889,9307,16534 -"YPL184C",940,960,827,751,866,701,715,688,1083 -"YPL183W-A",341,292,293,276,366,958,397,347,467 -"YPL183C",607,872,1318,3273,2094,106,329,302,611 -"YPL181W",1569,1744,1824,2058,2549,1443,1417,1325,2153 -"YPL180W",852,923,761,610,643,502,619,598,1045 -"YPL179W",2729,2641,2197,2242,2800,1594,1927,1922,3046 -"YPL178W",642,676,667,721,945,738,810,707,1060 -"YPL177C",1824,2029,2516,3357,2365,762,1550,1532,2426 -"YPL176C",755,768,645,790,906,540,536,586,841 -"YPL175W",274,392,437,585,620,132,262,223,360 -"YPL174C",651,677,557,437,458,287,392,368,629 -"YPL173W",433,459,400,399,523,1762,470,394,587 -"YPL172C",253,309,267,241,337,1363,330,278,387 -"YPL171C",2521,2605,2015,992,168,868,802,1230,2947 -"YPL170W",1152,1251,891,310,301,877,1022,1052,1653 -"YPL169C",607,795,846,1167,1226,397,502,474,723 -"YPL168W",346,422,320,293,384,397,307,301,484 -"YPL167C",978,962,640,342,351,415,505,625,1045 -"YPL166W",367,301,179,32,47,328,284,287,455 -"YPL165C",604,530,330,57,117,507,508,487,850 -"YPL164C",378,413,325,188,187,474,361,351,561 -"YPL163C",359,418,368,321,704,380,200,192,352 -"YPL162C",504,553,468,304,234,262,342,415,698 -"YPL161C",694,711,516,368,490,519,535,537,818 -"YPL160W",3528,4427,5105,9844,8562,1167,2303,2052,3570 -"YPL159C",750,853,1137,1506,712,413,445,464,824 -"YPL158C",518,429,363,309,321,266,1000,1805,1281 -"YPL157W",343,357,435,577,524,108,291,379,460 -"YPL156C",924,946,544,117,1329,593,797,824,1308 -"YPL155C",200,248,329,342,291,316,275,199,300 -"YPL154C",7948,6528,4529,2309,1166,8668,7832,7618,12255 -"YPL153C",209,295,267,157,413,90,100,146,231 -"YPL152W",471,446,304,111,224,488,410,395,667 -"YPL151C",385,446,450,421,547,325,353,408,636 -"YPL150W",949,969,779,598,721,762,757,675,1098 -"YPL149W",478,591,534,474,380,395,408,472,794 -"YPL148C",336,356,295,184,235,265,335,326,549 -"YPL147W",5435,4512,2367,121,82,6334,5437,4903,7067 -"YPL146C",660,1151,1927,4307,3042,233,487,450,746 -"YPL145C",3238,3187,2695,2660,3311,1757,1995,2205,3522 -"YPL144W",104,125,107,128,248,93,118,100,150 -"YPL143W",3196,3562,3868,6396,10792,1037,2359,2581,4552 -"YPL141C",716,758,641,552,486,966,1604,945,898 -"YPL140C",650,566,544,580,638,602,475,499,811 -"YPL139C",601,679,667,649,801,599,617,500,749 -"YPL138C",505,541,542,346,427,367,406,396,703 -"YPL137C",975,1384,1845,2137,593,432,468,496,921 -"YPL135W",4442,3640,3054,1599,1825,5356,5862,5527,8948 -"YPL134C",1096,1115,1045,685,721,1651,1423,1801,2111 -"YPL133C",505,510,497,367,384,341,430,437,713 -"YPL132W",217,263,215,142,208,714,278,237,342 -"YPL131W",5341,6699,8846,16721,21122,1459,4044,3752,7432 -"YPL130W",34,34,33,19,9,5,10,14,29 -"YPL129W",872,897,819,925,1293,689,848,790,1295 -"YPL128C",335,435,563,804,602,332,346,248,327 -"YPL127C",885,931,783,534,399,2231,1120,865,1248 -"YPL126W",901,1351,2590,5862,3583,182,449,514,821 -"YPL125W",1326,1346,1055,951,1090,1230,1137,986,1463 -"YPL124W",126,133,95,65,123,156,111,102,154 -"YPL123C",1901,1597,878,145,73,1755,1484,1599,2580 -"YPL122C",380,503,445,535,553,217,276,284,490 -"YPL120W",564,547,407,255,375,419,406,432,714 -"YPL119C-A",296,255,166,12,40,144,139,171,297 -"YPL119C",1203,1046,620,76,136,597,686,771,1370 -"YPL118W",1046,1125,947,795,1202,3275,1210,1080,1407 -"YPL117C",3495,3702,4110,4974,3500,1327,2617,2843,4479 -"YPL116W",686,755,611,428,490,1099,834,574,832 -"YPL115C",626,732,743,761,773,458,371,389,564 -"YPL113C",1783,1512,897,81,156,1724,2075,2056,3018 -"YPL112C",750,1004,1038,1279,1941,624,666,600,922 -"YPL111W",268,241,234,224,1097,241,259,236,415 -"YPL110C",838,831,648,463,378,692,541,558,980 -"YPL109C",1552,1372,942,264,167,1358,1334,1295,1857 -"YPL108W",119,173,216,291,285,59,112,118,209 -"YPL107W",643,695,703,656,695,527,655,573,926 -"YPL106C",17026,16985,16409,20089,10834,7397,8029,9271,18452 -"YPL105C",1460,1703,1998,2944,2003,1159,1298,1163,1729 -"YPL104W",383,448,459,352,238,1481,414,293,538 -"YPL103C",231,256,271,312,385,427,223,181,293 -"YPL101W",596,676,705,788,866,363,495,517,782 -"YPL100W",831,782,532,265,393,698,665,694,1126 -"YPL099C",553,494,347,215,332,1003,588,545,775 -"YPL098C",460,439,400,288,389,1244,591,404,672 -"YPL097W",319,435,383,332,405,1471,380,293,375 -"YPL096C-A",75,84,69,78,70,90,78,75,168 -"YPL096W",652,624,513,256,306,506,526,523,911 -"YPL095C",441,462,442,236,202,325,362,362,599 -"YPL094C",1245,1415,1481,1878,1484,1319,1345,1393,1975 -"YPL093W",1754,2988,5504,13981,9137,156,771,883,1534 -"YPL092W",3334,2876,1943,803,274,1876,2492,2517,4762 -"YPL091W",1593,1714,1496,1373,1822,1582,1292,1322,2172 -"YPL090C",2001,2445,2623,4802,8299,608,1430,1638,2754 -"YPL089C",809,817,848,830,691,357,504,556,793 -"YPL088W",291,368,328,359,354,159,142,194,358 -"YPL087W",700,745,687,442,267,1622,874,781,1049 -"YPL086C",632,877,1100,2013,2267,188,445,441,688 -"YPL085W",1104,1279,1293,1342,981,651,820,727,1059 -"YPL084W",1331,1386,1035,646,787,912,795,838,1369 -"YPL083C",425,440,414,454,386,260,231,243,437 -"YPL082C",834,814,799,1223,1221,449,625,666,898 -"YPL081W",1854,2347,3579,7064,3515,375,1623,1404,2411 -"YPL080C",23,29,47,60,63,8,28,23,40 -"YPL079W",3308,3864,4053,6812,11319,1167,2628,2816,4842 -"YPL078C",4340,4255,3353,2607,3143,6877,5599,5335,7320 -"YPL077C",179,182,226,123,127,85,121,142,248 -"YPL076W",252,301,246,207,157,165,135,155,293 -"YPL075W",1372,1131,774,438,497,617,598,770,1371 -"YPL074W",757,897,714,792,896,596,629,666,1012 -"YPL072W",150,187,148,141,147,636,257,147,223 -"YPL071C",243,277,232,222,303,157,205,224,411 -"YPL070W",770,830,738,470,390,513,506,542,881 -"YPL069C",262,238,222,257,310,164,197,203,324 -"YPL068C",30,66,157,280,155,24,29,23,28 -"YPL067C",47,66,55,45,101,49,54,51,67 -"YPL066W",442,445,382,268,385,238,301,372,478 -"YPL065W",405,407,332,208,275,249,318,348,541 -"YPL064C",703,764,766,650,497,436,498,564,924 -"YPL063W",1078,1281,1371,1501,1457,1728,970,872,1367 -"YPL062W",2,5,5,4,3,5,8,3,7 -"YPL061W",14625,17246,18469,5582,5005,16887,14909,13261,19633 -"YPL060W",349,339,269,203,345,341,284,297,444 -"YPL060C-A",5,6,12,2,2,3,4,2,4 -"YPL059W",847,830,648,440,581,1892,866,844,1341 -"YPL058C",9241,13846,18033,24098,10364,6161,4861,3888,6846 -"YPL057C",1636,1496,1301,856,1788,1904,2230,2190,2664 -"YPL056C",113,94,68,32,125,118,136,119,168 -"YPL055C",508,541,579,453,563,306,442,410,636 -"YPL054W",3037,2464,1344,190,670,2195,2824,2838,4106 -"YPL053C",1171,1241,1194,1275,1536,924,1111,1189,1660 -"YPL052W",330,407,385,326,288,155,224,278,443 -"YPL051W",405,444,433,411,370,252,369,346,632 -"YPL050C",1392,1719,1794,2477,2882,1074,1274,1171,1826 -"YPL049C",812,823,830,901,971,678,634,678,1039 -"YPL048W",2729,2673,2295,2235,2123,2257,2001,2040,3694 -"YPL047W",177,189,194,219,219,106,156,147,222 -"YPL046C",147,193,168,152,158,114,133,164,232 -"YPL045W",721,840,789,726,512,478,532,533,873 -"YPL043W",1242,1819,2968,6879,5450,153,540,536,1054 -"YPL042C",371,426,579,580,379,297,369,378,522 -"YPL041C",87,87,61,65,105,77,76,79,127 -"YPL040C",328,369,335,334,285,960,299,247,393 -"YPL039W",312,356,345,381,372,273,304,252,417 -"YPL038W-A",6,9,4,10,14,11,9,8,12 -"YPL038W",179,262,385,567,304,180,184,152,287 -"YPL037C",3473,3572,3403,4314,5581,2502,3620,3800,6119 -"YPL036W",16188,13617,8822,2728,270,3451,2949,5871,15576 -"YPL034W",222,232,176,206,249,186,211,203,326 -"YPL033C",108,110,92,43,47,98,124,92,154 -"YPL032C",746,1034,1137,1648,1287,357,454,374,630 -"YPL031C",748,759,633,498,565,968,746,647,1116 -"YPL030W",307,488,715,1179,691,85,182,176,337 -"YPL029W",467,455,490,490,475,810,390,352,532 -"YPL028W",3353,3391,2933,1932,1817,3382,4111,3689,5975 -"YPL027W",90,85,78,26,42,70,78,86,137 -"YPL026C",874,1297,2836,1994,1468,258,645,575,776 -"YPL024W",638,606,691,830,734,783,935,785,1099 -"YPL023C",965,1022,1057,1236,1286,671,758,730,1203 -"YPL022W",1299,1457,1285,1286,1051,728,774,757,1373 -"YPL021W",3,2,1,1,3,4,3,2,6 -"YPL020C",790,791,724,662,625,391,498,558,850 -"YPL019C",995,922,782,856,1101,975,745,733,1219 -"YPL018W",417,337,246,119,138,505,369,311,529 -"YPL017C",628,509,325,155,194,774,527,583,862 -"YPL016W",936,633,463,417,972,1185,1362,981,1238 -"YPL015C",606,629,449,194,351,591,413,484,817 -"YPL014W",209,211,132,72,256,248,166,170,226 -"YPL013C",505,490,412,395,440,1763,655,574,824 -"YPL012W",1496,2179,3398,8509,6068,216,732,768,1290 -"YPL011C",561,602,526,470,516,364,505,532,770 -"YPL010W",1378,1295,996,890,987,1345,1290,1274,1843 -"YPL009C",1623,1850,1792,1908,1420,1085,1318,1271,2317 -"YPL008W",740,718,664,529,614,451,484,468,798 -"YPL007C",418,507,400,256,298,336,350,374,521 -"YPL006W",1984,1767,1367,635,427,1321,1094,1156,2035 -"YPL005W",304,320,279,203,254,281,247,239,398 -"YPL004C",20410,14868,8155,2039,792,26103,19192,17991,28827 -"YPL003W",568,413,188,58,205,960,689,610,924 -"YPL002C",452,542,408,297,424,356,282,389,619 -"YPL001W",557,561,520,563,692,343,406,397,605 -"YPR001W",4478,3929,2821,809,109,30243,11444,6767,8591 -"YPR002W",4746,4752,3896,1530,574,24325,9033,5520,7658 -"YPR003C",647,604,385,234,468,585,544,504,708 -"YPR004C",1336,1464,1422,1913,1944,2194,1378,1211,1666 -"YPR005C",587,629,376,142,307,639,393,401,713 -"YPR006C",4809,4009,2399,332,223,16801,8153,6040,8240 -"YPR007C",170,176,168,95,63,146,89,97,207 -"YPR008W",1765,1587,1534,884,967,1734,1796,1695,2580 -"YPR009W",207,290,504,838,815,247,240,213,273 -"YPR010C",1695,2919,4534,11755,8714,165,779,788,1462 -"YPR010C-A",2491,2200,1680,1034,1031,4287,3540,3113,4070 -"YPR011C",415,472,392,347,453,801,409,441,616 -"YPR013C",223,213,247,302,547,135,162,150,251 -"YPR014C",59,52,56,45,37,39,72,64,93 -"YPR015C",224,206,140,83,131,302,167,216,306 -"YPR016C",1396,1711,1981,3583,4719,757,1293,1344,2198 -"YPR017C",111,150,140,135,250,87,96,98,183 -"YPR018W",547,586,826,637,731,209,359,390,678 -"YPR019W",954,1051,883,839,1212,622,789,754,1099 -"YPR020W",782,1000,857,867,1420,1192,1093,851,1096 -"YPR021C",615,632,550,405,543,704,466,437,649 -"YPR022C",754,851,798,848,792,693,527,510,772 -"YPR023C",1502,1526,1235,820,1169,1386,1433,1367,2068 -"YPR024W",1434,1569,1545,1504,1629,2353,1683,1429,1918 -"YPR025C",722,570,362,296,542,1660,826,752,1100 -"YPR026W",2691,2282,1174,160,271,3027,2182,2116,3216 -"YPR027C",143,180,165,54,207,244,237,180,255 -"YPR028W",2285,2105,1501,866,587,2526,1908,2279,3467 -"YPR029C",1449,1353,1190,1062,1505,1046,1149,1137,1610 -"YPR030W",1533,1364,918,281,763,1176,1038,1188,1705 -"YPR031W",537,643,542,450,511,360,403,385,657 -"YPR032W",552,609,568,494,417,377,435,387,537 -"YPR033C",1265,1730,2032,3964,5020,1073,1167,1099,1568 -"YPR034W",607,697,824,1018,756,511,647,502,749 -"YPR035W",10313,12512,17949,23031,24416,1609,10623,8893,13851 -"YPR036W",3230,3286,3273,3615,2313,2072,2636,2899,4554 -"YPR036W-A",3952,3570,4691,879,5929,6912,7395,4435,6607 -"YPR037C",287,270,254,178,160,269,247,326,562 -"YPR038W",3,5,2,3,6,9,8,3,4 -"YPR040W",510,558,564,433,525,342,362,408,606 -"YPR041W",1732,2345,3175,5588,5277,890,1274,1297,2156 -"YPR042C",495,639,480,339,267,365,393,410,615 -"YPR043W",3106,3324,3319,5236,7925,869,2078,2249,4154 -"YPR045C",704,628,355,296,677,620,514,522,869 -"YPR046W",218,196,169,122,149,176,160,201,341 -"YPR047W",230,288,223,101,111,1561,269,240,308 -"YPR048W",551,620,771,1036,1015,170,304,307,516 -"YPR049C",1282,1273,972,487,559,541,664,817,1396 -"YPR051W",389,355,396,377,453,312,380,404,651 -"YPR052C",191,180,152,100,131,270,297,222,385 -"YPR053C",68,62,57,33,53,45,49,64,92 -"YPR054W",162,193,151,145,166,112,135,157,216 -"YPR055W",682,715,637,563,543,460,488,453,647 -"YPR056W",436,461,406,348,609,344,390,408,628 -"YPR057W",430,478,482,515,606,444,379,351,560 -"YPR058W",832,858,825,998,865,474,512,554,1035 -"YPR060C",113,250,404,979,845,67,127,106,120 -"YPR061C",231,235,304,215,137,228,258,245,399 -"YPR062W",421,515,859,1734,1502,433,535,583,722 -"YPR063C",477,494,542,646,661,570,473,481,792 -"YPR064W",16,11,11,8,6,6,14,14,25 -"YPR065W",1345,1611,3235,3332,1430,524,899,767,1189 -"YPR066W",152,158,140,69,48,213,118,129,217 -"YPR067W",260,273,266,126,196,420,228,216,336 -"YPR068C",188,260,217,200,215,236,173,197,272 -"YPR069C",1918,2173,2129,2939,3219,1289,1334,1440,2288 -"YPR070W",497,554,592,743,579,292,320,310,506 -"YPR071W",159,209,246,331,259,73,88,83,156 -"YPR072W",1035,1011,922,919,994,844,961,851,1368 -"YPR073C",431,509,654,902,704,663,468,444,671 -"YPR074C",2609,4650,7196,14485,10307,2083,2315,1798,2351 -"YPR075C",1467,1446,1290,848,1197,1305,1234,1314,2041 -"YPR078C",75,68,27,28,32,47,56,68,117 -"YPR079W",455,485,437,380,513,370,358,391,707 -"YPR080W",3086,4048,5639,10657,10916,1008,1895,1920,3654 -"YPR081C",760,693,523,245,198,533,454,453,839 -"YPR082C",419,394,333,298,281,343,374,434,593 -"YPR083W",1014,935,753,447,507,682,916,981,1456 -"YPR084W",392,431,367,340,443,317,308,335,499 -"YPR085C",419,468,423,467,419,198,266,272,444 -"YPR086W",1171,1268,1123,1306,1620,849,841,875,1456 -"YPR088C",1723,1782,1658,1827,2373,1402,1592,1525,2407 -"YPR089W",1117,1100,895,781,704,855,835,754,1244 -"YPR091C",788,745,547,298,337,870,701,686,1025 -"YNCP0013C",16,11,12,8,19,35,27,31,42 -"YNCP0014C",64,43,18,13,29,85,69,70,121 -"YNCP0015C",70,49,31,12,24,78,65,48,102 -"YPR093C",384,352,326,260,197,355,337,348,664 -"YPR094W",183,168,188,203,265,153,167,191,264 -"YPR095C",479,558,476,364,430,303,336,336,512 -"YPR096C",12,16,9,9,6,8,4,7,10 -"YPR097W",1864,1874,1534,1075,781,915,1086,1202,1991 -"YPR098C",1473,1299,851,406,175,1762,1360,1404,2214 -"YPR100W",69,80,64,49,84,281,97,111,141 -"YPR101W",361,345,329,284,410,291,331,341,509 -"YPR102C",1624,1876,2001,3724,6250,452,1018,1117,1911 -"YPR103W",3528,3306,2651,1855,1545,3405,4017,3943,5998 -"YPR104C",736,851,891,944,974,513,567,502,819 -"YPR105C",1061,1113,987,763,781,713,801,807,1250 -"YPR106W",384,351,235,151,268,277,262,279,463 -"YPR107C",335,363,289,241,316,284,319,320,468 -"YPR108W",3397,3412,2855,2275,1940,3444,3319,3097,4519 -"YPR109W",364,405,279,250,409,525,377,375,556 -"YPR110C",1004,1416,1931,3966,4296,162,605,597,1125 -"YPR111W",743,770,668,523,528,473,591,507,784 -"YPR112C",707,1086,1691,3721,3110,84,371,417,713 -"YPR113W",373,523,636,1306,1935,672,326,338,493 -"YPR114W",412,522,582,1012,926,479,383,328,517 -"YPR115W",1541,1541,1132,557,534,1344,1130,1103,1711 -"YPR116W",45,53,80,79,16,8,11,13,30 -"YPR117W",954,1044,918,723,651,570,603,590,967 -"YPR118W",1159,1407,1314,1519,1229,761,1128,1040,1486 -"YPR119W",137,147,104,108,151,438,664,308,227 -"YPR120C",264,283,236,184,428,162,187,236,406 -"YPR121W",352,349,293,261,299,312,276,264,430 -"YPR122W",1157,1179,991,1178,1270,1002,817,767,1235 -"YPR124W",189,237,288,362,346,361,172,165,293 -"YPR125W",730,1069,1783,2950,1113,466,540,532,815 -"YPR127W",3005,2671,1818,959,306,1147,730,1157,3392 -"YPR128C",1485,1396,1199,1105,1048,734,903,1076,1889 -"YPR129W",902,1004,899,803,836,906,903,727,1127 -"YPR131C",384,358,357,354,421,239,254,293,447 -"YPR132W",3543,3626,3681,5554,10411,1434,2855,3152,5675 -"YPR133C",1899,1984,1927,1891,1945,1171,1599,1673,2512 -"YPR133W-A",205,250,235,258,274,727,283,193,331 -"YPR134W",521,569,441,311,407,580,442,501,834 -"YPR135W",842,885,713,372,524,527,542,614,1079 -"YPR137W",591,922,1697,3753,2051,215,384,355,638 -"YNCP0019W",82,72,43,25,8,43,47,40,74 -"YPR138C",2588,2274,1587,1538,2356,1630,2047,1453,2520 -"YPR139C",553,671,684,793,605,366,448,500,793 -"YPR140W",627,724,702,646,604,1208,684,573,980 -"YPR141C",420,446,433,424,555,463,429,330,428 -"YPR143W",781,1054,1318,2418,3061,260,587,664,1036 -"YPR144C",360,576,1118,2211,1382,49,181,177,337 -"YPR145W",4055,5313,6899,14077,16750,741,2638,2245,4128 -"YPR145C-A",98,95,70,92,110,85,58,92,131 -"YPR147C",374,407,372,273,270,424,346,333,476 -"YPR148C",2743,2689,2144,1296,1090,2764,2371,2654,4219 -"YPR149W",41323,28085,14100,3208,859,54048,44101,40923,66810 -"YPR151C",2639,1917,984,86,94,6982,7182,4616,5354 -"YPR152C",246,281,353,443,231,154,220,225,398 -"YPR153W",85,120,129,143,94,37,40,38,80 -"YPR154W",1320,1173,1045,600,615,1001,910,799,1194 -"YPR155C",1466,1378,917,232,391,1841,1473,1318,1921 -"YPR156C",501,499,401,352,278,576,828,603,719 -"YPR157W",86,64,57,104,68,110,137,91,120 -"YPR158W",1174,980,548,78,171,768,783,942,1684 -"YPR158W-B",20,14,7,14,6,19,5,9,15 -"YPR159W",1046,1638,2209,4289,4445,599,870,737,1072 -"YPR160W",9015,6285,3226,733,175,25124,6862,9317,12504 -"YPR161C",625,732,778,938,963,357,562,507,807 -"YPR162C",372,413,383,442,439,208,199,256,401 -"YPR163C",3132,3740,4426,8747,11744,1505,2687,2387,3903 -"YPR164W",1167,1263,1151,823,297,491,609,678,1041 -"YPR165W",5069,4707,3593,3136,4010,6328,5034,4790,7574 -"YPR166C",248,252,195,181,259,963,274,264,355 -"YPR167C",876,1317,1712,3663,2065,277,554,577,995 -"YPR168W",270,322,288,338,148,106,199,203,311 -"YPR169W",1283,1605,1660,2602,2060,635,997,933,1705 -"YPR170W-B",669,679,569,614,896,898,872,839,1259 -"YPR171W",404,440,497,461,522,290,305,291,454 -"YPR172W",852,740,465,158,158,719,617,628,1095 -"YPR173C",1880,1848,1684,1654,2052,1531,1778,1794,2937 -"YPR174C",263,281,250,152,179,176,176,240,475 -"YPR175W",142,202,197,218,563,142,112,125,184 -"YPR176C",576,572,537,436,627,663,522,574,893 -"YPR178W",512,547,527,424,570,451,472,478,772 -"YPR179C",735,728,598,535,629,517,571,492,904 -"YPR180W",609,672,541,489,528,566,545,517,831 -"YPR181C",2305,2530,2400,2571,1976,2120,2106,1893,2732 -"YPR182W",465,365,301,168,213,859,897,733,1023 -"YPR183W",814,894,944,1127,1284,663,561,636,1209 -"YPR184W",2922,2308,1220,175,156,4390,2166,2372,3765 -"YPR185W",1044,934,655,307,295,947,886,819,1289 -"YPR186C",223,320,428,575,408,96,146,122,226 -"YPR187W",1153,1450,1758,3134,3794,524,1085,960,1483 -"YPR188C",552,566,527,510,545,512,522,472,798 -"YPR189W",972,1064,1044,1266,1023,586,656,620,951 -"YPR190C",423,672,1026,1904,1522,117,335,276,400 -"YPR191W",2083,2130,1861,1286,2188,3498,3289,2218,3104 -"YPR192W",938,876,532,115,179,553,688,654,1240 -"YPR193C",429,385,255,102,33,234,314,290,505 -"YPR194C",275,283,261,183,147,119,141,135,235 -"YPR195C",47,43,47,21,42,54,55,37,51 -"YPR196W",281,320,294,281,381,219,222,238,350 -"YPR198W",682,656,617,593,549,443,477,528,792 -"YPR199C",456,463,441,392,436,386,423,408,709 -"YPR200C",60,56,24,29,49,68,53,60,74 -"YPR201W",171,178,136,67,84,133,137,165,222 -"YPR202W",6,10,8,3,11,4,4,2,3 -"YPR204W",57,60,65,36,73,59,42,41,68 -"Q0020",39,24,27,19,34,52,74,43,83 -"Q0055",1,11,7,7,3,11,15,12,24 -"Q0050",3,6,2,2,7,4,17,7,12 -"Q0130",1,3,3,2,1,3,3,4,7 -"Q0158",156,148,92,98,149,195,313,188,425 diff --git a/test_data/YMC/samplesheet_RCvsOX.csv b/test_data/YMC/samplesheet_RCvsOX.csv deleted file mode 100644 index 9748bc2b..00000000 --- a/test_data/YMC/samplesheet_RCvsOX.csv +++ /dev/null @@ -1,10 +0,0 @@ -"sample","fase" -"Time.1","RC" -"Time.2","RC" -"Time.3","OX" -"Time.4","OX" -"Time.5","OX" -"Time.13","RC" -"Time.14","RC" -"Time.15","RC" -"Time.16","RC" From a2d382449296bd52bd2d1dee26f89d20ce2e0cc9 Mon Sep 17 00:00:00 2001 From: Cristina Araiz Date: Thu, 18 Jul 2024 15:47:56 +0200 Subject: [PATCH 031/154] solve remaining lint erros --- conf/crg.config | 2 +- subworkflows/local/experimental/main.nf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/crg.config b/conf/crg.config index 29d4366e..d1f6b419 100644 --- a/conf/crg.config +++ b/conf/crg.config @@ -18,7 +18,7 @@ process { cpus = { check_max( 2 , 'cpus' ) } memory = { check_max( 12.GB * task.attempt, 'memory' ) } time = { check_max( 4.h * task.attempt, 'time' ) } - } + } withLabel:process_medium{ queue = 'cn-el7,short-centos79' cpus = { check_max( 6 , 'cpus' ) } diff --git a/subworkflows/local/experimental/main.nf b/subworkflows/local/experimental/main.nf index 62d51241..6e811027 100644 --- a/subworkflows/local/experimental/main.nf +++ b/subworkflows/local/experimental/main.nf @@ -70,4 +70,4 @@ workflow EXPERIMENTAL { emit: output = ch_out -} \ No newline at end of file +} From b59f668d53fe48e477def7d0e392b39b4d4b9202 Mon Sep 17 00:00:00 2001 From: Cristina Araiz Date: Thu, 18 Jul 2024 15:54:12 +0200 Subject: [PATCH 032/154] update propr/grea with nf-core modules install --- modules/nf-core/propr/grea/main.nf | 4 ++-- modules/nf-core/propr/grea/templates/grea.R | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/nf-core/propr/grea/main.nf b/modules/nf-core/propr/grea/main.nf index 66cf3c05..d2e1ee6d 100644 --- a/modules/nf-core/propr/grea/main.nf +++ b/modules/nf-core/propr/grea/main.nf @@ -1,11 +1,11 @@ process PROPR_GREA { tag "$meta.id" - label 'process_high' + label 'process_single' conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/r-propr:5.0.4': - 'quay.io/biocontainers/r-propr:5.0.4' }" + 'biocontainers/r-propr:5.0.4' }" input: tuple val(meta), path(adj) diff --git a/modules/nf-core/propr/grea/templates/grea.R b/modules/nf-core/propr/grea/templates/grea.R index 6e1c6a00..2d568b70 100644 --- a/modules/nf-core/propr/grea/templates/grea.R +++ b/modules/nf-core/propr/grea/templates/grea.R @@ -122,8 +122,8 @@ add_missing <- function(adjacency_matrix, knowledge_matrix){ opt <- list( adj = '$adj', gmt = '$gmt', - prefix = ifelse('$task.ext.prefix' == 'null', '$meta.pathway_name', '$task.ext.prefix'), - permutation = 10, + prefix = ifelse('$task.ext.prefix' == 'null', '$meta.id', '$task.ext.prefix'), + permutation = 100, fixseed = TRUE, ncores = as.integer('$task.cpus') ) @@ -214,7 +214,7 @@ write.table( G, file = paste0(opt\$prefix, '.go.tsv'), col.names = TRUE, - row.names = TRUE, # False + row.names = TRUE, sep = '\\t', quote = FALSE From 45b776ec8903346be9cee588d049c5795e9c3b2f Mon Sep 17 00:00:00 2001 From: Cristina Araiz Date: Thu, 18 Jul 2024 16:34:09 +0200 Subject: [PATCH 033/154] modify propr main.nf to match nf-core repository --- modules/nf-core/propr/propr/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/nf-core/propr/propr/main.nf b/modules/nf-core/propr/propr/main.nf index 531e575c..111f6d58 100644 --- a/modules/nf-core/propr/propr/main.nf +++ b/modules/nf-core/propr/propr/main.nf @@ -5,7 +5,7 @@ process PROPR_PROPR { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/r-propr:5.0.3': - 'quay.io/biocontainers/r-propr:5.0.3' }" + 'biocontainers/r-propr:5.0.3' }" input: tuple val(meta), path(count) From d60f031d2389c19de37fa201d9b472f19e416276 Mon Sep 17 00:00:00 2001 From: Cristina Araiz Date: Thu, 18 Jul 2024 16:37:50 +0200 Subject: [PATCH 034/154] install propd with nf-core modules install --- modules/nf-core/propr/propd/main.nf | 2 +- modules/nf-core/propr/propd/meta.yml | 10 +++++++++- modules/nf-core/propr/propd/templates/propd.R | 10 +++++----- .../propr/propd/tests/main.nf.test.snap | 18 +++++++++--------- 4 files changed, 24 insertions(+), 16 deletions(-) diff --git a/modules/nf-core/propr/propd/main.nf b/modules/nf-core/propr/propd/main.nf index d7ada4ab..ba7727d0 100644 --- a/modules/nf-core/propr/propd/main.nf +++ b/modules/nf-core/propr/propd/main.nf @@ -5,7 +5,7 @@ process PROPR_PROPD { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/r-propr:5.0.3': - 'quay.io/biocontainers/r-propr:5.0.3' }" + 'biocontainers/r-propr:5.0.3' }" input: tuple val(meta), path(count) diff --git a/modules/nf-core/propr/propd/meta.yml b/modules/nf-core/propr/propd/meta.yml index 1c408d73..7dcb4625 100644 --- a/modules/nf-core/propr/propd/meta.yml +++ b/modules/nf-core/propr/propd/meta.yml @@ -52,8 +52,16 @@ output: pattern: "*.propd.tsv" - fdr: type: file - description: (optional) propr fdr table + description: (optional) propd fdr table pattern: "*.fdr.tsv" + - adj: + type: file + description: (optional) propd adj table + pattern: "*.adj.csv" + - warnings: + type: file + description: propd warnings + pattern: "*.warnings.txt" - session_info: type: file description: dump of R SessionInfo diff --git a/modules/nf-core/propr/propd/templates/propd.R b/modules/nf-core/propr/propd/templates/propd.R index 1bdae252..63dbed49 100644 --- a/modules/nf-core/propr/propd/templates/propd.R +++ b/modules/nf-core/propr/propd/templates/propd.R @@ -66,7 +66,7 @@ read_delim_flexible <- function(file, header = TRUE, row.names = 1, check.names #' Extract the values for a single metric and convert it into a genes x genes matrix. #' #' @param object propd object -one_metric_df <- function(object) { +one_metric_df <- function(object){ results <- getResults(object) #keep only the metric of interest one_metric <- cbind(results\$Partner, results\$Pair, results\$theta) @@ -138,7 +138,7 @@ convert_to_adjacency <- function(matrix, cutoff) { ################################################ opt <- list( - prefix = ifelse('$task.ext.prefix' == 'null','$meta.pathway_name', '$task.ext.prefix'), + prefix = ifelse('$task.ext.prefix' == 'null', '$meta.id', '$task.ext.prefix'), count = '$count', samplesheet = '$samplesheet', features_id_col = 'gene_id', # column name of feature ids @@ -147,9 +147,9 @@ opt <- list( metric = 'theta_d', # differential proportionality metric: theta_d, theta_e or theta_f alpha = NA, # alpha for boxcox transformation permutation = 0, # permutation cycles for computing FDR - cutoff_min = 0.05, # minimun threshold to test - cutoff_max = 0.95, # maximun threshold to test - cutoff_interval = 0.05, # interval between thresholds + cutoff_min = NA, # minimun threshold to test + cutoff_max = NA, # maximun threshold to test + cutoff_interval = NA, # interval between thresholds fixseed = FALSE, adjacency = FALSE, fdrVal = 0.05, diff --git a/modules/nf-core/propr/propd/tests/main.nf.test.snap b/modules/nf-core/propr/propd/tests/main.nf.test.snap index 58199b4b..e0291044 100644 --- a/modules/nf-core/propr/propd/tests/main.nf.test.snap +++ b/modules/nf-core/propr/propd/tests/main.nf.test.snap @@ -14,7 +14,7 @@ "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-04-16T11:55:35.703293" + "timestamp": "2024-05-23T13:10:06.778954" }, "Test propr/propd using theta_e and boxcox permutation - results": { "content": [ @@ -31,7 +31,7 @@ "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-04-16T11:59:33.28078" + "timestamp": "2024-05-23T13:13:35.158486" }, "Test propr/propd using theta_e permutation - results": { "content": [ @@ -48,7 +48,7 @@ "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-04-16T11:57:24.038188" + "timestamp": "2024-05-23T13:12:03.500722" }, "versions": { "content": [ @@ -60,7 +60,7 @@ "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-04-16T11:53:45.165637" + "timestamp": "2024-05-23T13:07:07.588326" }, " - results": { "content": [ @@ -77,7 +77,7 @@ "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-04-16T14:13:47.602525" + "timestamp": "2024-05-23T13:16:44.428551" }, " Test propr/propd using default boxcox permutation - results": { "content": [ @@ -94,7 +94,7 @@ "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-04-16T11:55:32.476341" + "timestamp": "2024-05-23T13:10:02.25738" }, "Test propr/propd using default permutation - results": { "content": [ @@ -111,7 +111,7 @@ "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-04-16T11:53:43.056295" + "timestamp": "2024-05-23T13:07:04.720183" }, "Test propr/propd with adjacency matrix - adj": { "content": [ @@ -120,7 +120,7 @@ { "id": "test" }, - "test.adj.csv:md5,f9d19255f9400e6c4daa01f86d74f017" + "test.adj.csv:md5,9da907136fba72b0e098c7fbacbeb837" ] ] ], @@ -128,6 +128,6 @@ "nf-test": "0.8.4", "nextflow": "23.10.1" }, - "timestamp": "2024-04-16T14:13:47.427246" + "timestamp": "2024-05-23T13:16:38.527389" } } \ No newline at end of file From 8b2535174b225e1fd0325403beeb29c9fcefbd20 Mon Sep 17 00:00:00 2001 From: Cristina Araiz Date: Thu, 18 Jul 2024 16:47:30 +0200 Subject: [PATCH 035/154] fix pre-commit errors in .json files --- assets/schema_tools.json | 2 +- nextflow_schema_coda.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/schema_tools.json b/assets/schema_tools.json index 4119c58e..1820b94e 100644 --- a/assets/schema_tools.json +++ b/assets/schema_tools.json @@ -46,7 +46,7 @@ "type": "string", "meta": ["args_enr_cor"] }, - "sel_method":{ + "sel_method": { "type": "string", "meta": ["sel_method"], "errorMessage": "choose filtervar or none" diff --git a/nextflow_schema_coda.json b/nextflow_schema_coda.json index 76b4f1dd..cba300f4 100644 --- a/nextflow_schema_coda.json +++ b/nextflow_schema_coda.json @@ -22,4 +22,4 @@ } } } -} \ No newline at end of file +} From fc123ec0b72b7ef13c8bc7c7b982dfaa3d29077f Mon Sep 17 00:00:00 2001 From: Cristina Araiz Date: Thu, 18 Jul 2024 16:52:17 +0200 Subject: [PATCH 036/154] install propr/propr with nf-core modules install --- modules.json | 2 +- modules/nf-core/propr/propr/templates/propr.R | 35 +------------------ 2 files changed, 2 insertions(+), 35 deletions(-) diff --git a/modules.json b/modules.json index d4e06ef3..c4aa0ba5 100644 --- a/modules.json +++ b/modules.json @@ -77,7 +77,7 @@ }, "propr/propr": { "branch": "master", - "git_sha": "c8b064f86eaa6c7ca89286bc12c0e517be0e6215", + "git_sha": "132fa6c9bd2515807f6a1cdec1ad7d03c817bcc9", "installed_by": ["modules"] }, "proteus/readproteingroups": { diff --git a/modules/nf-core/propr/propr/templates/propr.R b/modules/nf-core/propr/propr/templates/propr.R index 1f8c6769..a9dbd7bd 100644 --- a/modules/nf-core/propr/propr/templates/propr.R +++ b/modules/nf-core/propr/propr/templates/propr.R @@ -121,39 +121,6 @@ seqCutoff <- function(object){ #' @param metric Metric used to calculate the proportionality values. Options are 'cor', 'rho', 'phi', 'phs', 'vlr', 'pcor', 'pcor.shrink', 'pcor.bshrink' #' #' @return cutoff value. Proportionality values higher than this cutoff are considered significant. -# valCutoff <- function(object, metric, fdrVal = 0.05){ -# fdr_df <- object@fdr -# print(fdr_df) -# metric_up <- c("rho", "cor", "pcor", "pcor.shrink", "pcor.bshrink") -# if (prod(dim(fdr_df) == 0)){ -# warning("Please run updateCutoff on propr first") -# }else{ -# fdr_vals <- fdr_df\$FDR -# if (any(is.na(fdr_vals))){ -# stop("FDR not defined. This metric is not appropiate for the given dataset") -# } -# threshold <- any(fdr_vals <= fdrVal) -# if (metric %in% metric_up){ -# if (threshold){ -# fdr_threshold <- fdr_vals[which.max(fdr_vals <= fdrVal)] -# }else{ -# warning("FDR is higher than the specified threshold for all proportionality values. Using the lowest fdr instead") -# fdr_threshold <- fdr_vals[length(fdr_vals)] -# } -# }else{ -# if (threshold){ -# fdr_threshold <- fdr_vals[which.min(fdr_vals <= fdrVal) - 1] -# }else{ -# warning("FDR is higher than the specified threshold for all proportionality values. Using the lowest fdr instead") -# fdr_threshold <- fdr_vals[1] -# } -# } -# cutoff <- fdr_df\$cutoff[fdr_df\$FDR == fdr_threshold] -# } -# return(cutoff) -# } - - valCutoff <- function(object, metric, fdrVal = 0.05){ fdr_df <- object@fdr print(fdr_df) @@ -203,7 +170,7 @@ convert_to_adjacency <- function(matrix, cutoff, metric) { opt <- list( count = '$count', - prefix = ifelse('$task.ext.prefix' == 'null', '$meta.pathway_name', '$task.ext.prefix'), + prefix = ifelse('$task.ext.prefix' == 'null', '$meta.id', '$task.ext.prefix'), transformation = 'clr', reference = NA, alpha = NA, From e3fde5b52dff03ad65d75d6006ef2a6c3f990341 Mon Sep 17 00:00:00 2001 From: bjlang <> Date: Fri, 26 Jul 2024 11:13:35 +0200 Subject: [PATCH 037/154] small fixes to allow main_coda.nf to run --- assets/tools_samplesheet.csv | 7 +-- conf/modules.config | 50 +++++++++++++++++++ main_coda.nf | 6 +-- nextflow_schema.json | 10 ++++ subworkflows/local/correlation/main.nf | 2 +- subworkflows/local/differential/main.nf | 2 +- subworkflows/local/enrichment/main.nf | 6 +-- subworkflows/local/variable_selection/main.nf | 2 +- 8 files changed, 73 insertions(+), 12 deletions(-) diff --git a/assets/tools_samplesheet.csv b/assets/tools_samplesheet.csv index 1c16d64b..3ef3a7b5 100644 --- a/assets/tools_samplesheet.csv +++ b/assets/tools_samplesheet.csv @@ -1,6 +1,7 @@ pathway_name,diff_method,args_diff,enr_diff_method,args_enr_diff,cor_method,args_cor,enr_cor_method,args_enr_cor,sel_method,args_sel -diff_prop,propd, --adjacency true --permutation 100 --fixseed true, , ,,, , ,, -filtered_pcor,propd, --adjacency true --permutation 100 --fixseed true, , ,propr, --permutation 10 --adjacency true --cutoff_min 0.005 --cutoff_max 0.5 --cutoff_interval 0.01 --metric pcor.bshrink, , , filtervar, +diff_prop,propd,--group_col fase --adjacency true --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --permutation 100 --fixseed true, , ,,, , ,, +diff_prop_noperm,propd,--group_col fase --adjacency true --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --permutation 0 --fixseed true, , ,,, , ,, +filtered_pcor,propd,--group_col fase --adjacency true --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --permutation 100 --fixseed true, , ,propr, --permutation 10 --adjacency true --cutoff_min 0.005 --cutoff_max 0.5 --cutoff_interval 0.01 --metric pcor.bshrink, , , filtervar, prop,, , , ,propr, --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --fixseed true --metric rho --permutation 100 --adjacency true, , , , -diff_grea,propd,--group_col fase --adjacency true --permutation 10,grea, --permutation 10, , , , ,, +diff_grea,propd,--group_col fase --adjacency true --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --permutation 10 --fixseed true,grea, --permutation 10, , , , ,, deseq2,deseq2,,gsea,,,,,,, diff --git a/conf/modules.config b/conf/modules.config index 9313457d..453bd733 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -481,4 +481,54 @@ process { enabled: false ] } + + withName: "PROPR"{ + ext.args = { "${meta.args_cor}" == "null" ? '' : "${meta.args_cor}" } + publishDir = [ + path: { "${params.outdir}/correlation_analysis/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: "PROPD"{ + ext.args = { "${meta.args_diff}" == "null" ? '' : "${meta.args_diff}" } + publishDir = [ + path: { "${params.outdir}/differential_analysis/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: "FILTERVAR"{ + ext.args = { "${meta.args_cor}" == "null" ? '' : "${meta.args_cor}" } + publishDir = [ + path: { "${params.outdir}/variable_selection/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: "GREA_DIFF"{ + ext.args = { "${meta.args_enr_diff}" == "null" ? '' : "${meta.args_enr_diff}" } + publishDir = [ + path: { "${params.outdir}/enrichment_differential/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: "GREA_COR"{ + ext.args = { "${meta.args_enr_cor}" == "null" ? '' : "${meta.args_enr_cor}" } + publishDir = [ + path: { "${params.outdir}/enrichment_correlation/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: "MYGENE" { + ext.args = { [ + "--columname ${params.features_id_col}", + ].join(' ').trim() } + } } diff --git a/main_coda.nf b/main_coda.nf index ca9043bc..c35682f5 100644 --- a/main_coda.nf +++ b/main_coda.nf @@ -2,15 +2,15 @@ // include { PROPR_PROPD } from '../../../modules/nf-core/propr/propd/main' // include { PROPR_GREA } from '../../../modules/nf-core/propr/grea/main' // include { MYGENE } from '../../../modules/nf-core/mygene/main' -include { EXPERIMENTAL } from './subworkflows/experimental/main.nf' +include { EXPERIMENTAL } from './subworkflows/local/experimental/main.nf' include { fromSamplesheet } from 'plugin/nf-validation' // These are local files from my Bachelor Thesis project, I am creating the ch_samples_and_matrix // manually for testing but it should be be provided by the processing section of nf-core/differentialabundance -Counts_ch = Channel.fromPath("../YMC/counts_sin0.csv") +Counts_ch = Channel.fromPath(params.matrix) -Sample_ch = Channel.fromPath("../YMC/samplesheet_RCvsOX.csv") +Sample_ch = Channel.fromPath(params.input) .map{ it -> [[id: 'YMC'], it]} ch_samples_and_matrix = Sample_ch.combine(Counts_ch) diff --git a/nextflow_schema.json b/nextflow_schema.json index 4238ce23..54fc1b19 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -58,6 +58,16 @@ "default": "counts", "description": "Type of abundance measure used, platform-dependent", "fa_icon": "fas fa-keyboard" + }, + "tools": { + "type": "string", + "format": "file-path", + "exists": true, + "mimetype": "text/csv", + "schema": "assets/schema_tools.json", + "pattern": "^\\S+\\.(csv|tsv|yaml)$", + "description": "Path to comma-separated file containing samplesheet", + "help_text": "This file defines possible combinations of tools, which are to be run by the pipeline" } } }, diff --git a/subworkflows/local/correlation/main.nf b/subworkflows/local/correlation/main.nf index 5bcaa808..96a6b890 100644 --- a/subworkflows/local/correlation/main.nf +++ b/subworkflows/local/correlation/main.nf @@ -1,6 +1,6 @@ // include nf-core modules -include {PROPR_PROPR as PROPR} from "../../modules/nf-core/propr/propr/main.nf" +include {PROPR_PROPR as PROPR} from "../../../modules/nf-core/propr/propr/main.nf" workflow CORRELATION { diff --git a/subworkflows/local/differential/main.nf b/subworkflows/local/differential/main.nf index ccea968a..296fe0f2 100644 --- a/subworkflows/local/differential/main.nf +++ b/subworkflows/local/differential/main.nf @@ -1,5 +1,5 @@ // include modules -include {PROPR_PROPD as PROPD} from "../../modules/nf-core/propr/propd/main.nf" +include {PROPR_PROPD as PROPD} from "../../../modules/nf-core/propr/propd/main.nf" workflow DIFFERENTIAL { diff --git a/subworkflows/local/enrichment/main.nf b/subworkflows/local/enrichment/main.nf index b19f96fc..a559a41b 100644 --- a/subworkflows/local/enrichment/main.nf +++ b/subworkflows/local/enrichment/main.nf @@ -1,8 +1,8 @@ // include modules -include { PROPR_GREA as GREA_DIFF } from "../../modules/nf-core/propr/grea/main.nf" -include { PROPR_GREA as GREA_COR } from "../../modules/nf-core/propr/grea/main.nf" -include { MYGENE } from "../../modules/nf-core/mygene/main.nf" +include { PROPR_GREA as GREA_DIFF } from "../../../modules/nf-core/propr/grea/main.nf" +include { PROPR_GREA as GREA_COR } from "../../../modules/nf-core/propr/grea/main.nf" +include { MYGENE } from "../../../modules/nf-core/mygene/main.nf" workflow ENRICHMENT { diff --git a/subworkflows/local/variable_selection/main.nf b/subworkflows/local/variable_selection/main.nf index f914473c..71c8d6d9 100644 --- a/subworkflows/local/variable_selection/main.nf +++ b/subworkflows/local/variable_selection/main.nf @@ -1,5 +1,5 @@ // include modules -include { FILTERVAR } from "../../modules/local/filtervar/main.nf" +include { FILTERVAR } from "../../../modules/local/filtervar/main.nf" workflow VARIABLE_SELECTION { take: From d45c4aa0f268ee9178f8634689e21868063f13aa Mon Sep 17 00:00:00 2001 From: bjlang <> Date: Fri, 26 Jul 2024 15:57:01 +0200 Subject: [PATCH 038/154] Allow caching for -resume --- workflows/differentialabundance.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/differentialabundance.nf b/workflows/differentialabundance.nf index 020c0747..a7aae2bd 100644 --- a/workflows/differentialabundance.nf +++ b/workflows/differentialabundance.nf @@ -262,7 +262,7 @@ workflow DIFFERENTIALABUNDANCE { } ch_features = ch_features_matrix .map{ meta, matrix -> - matrix.copyTo(matrix_as_anno_filename) + matrix.mklink(options = ['overwrite':true], matrix_as_anno_filename) [ meta, file(matrix_as_anno_filename) ] } } From b8221e3977c056b40c376152f3fd9e3bc856d8b3 Mon Sep 17 00:00:00 2001 From: bjlang <> Date: Fri, 26 Jul 2024 15:57:01 +0200 Subject: [PATCH 039/154] Allow caching for -resume --- workflows/differentialabundance.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/differentialabundance.nf b/workflows/differentialabundance.nf index 1baacf50..8abdd458 100644 --- a/workflows/differentialabundance.nf +++ b/workflows/differentialabundance.nf @@ -261,7 +261,7 @@ workflow DIFFERENTIALABUNDANCE { } ch_features = ch_features_matrix .map{ meta, matrix -> - matrix.copyTo(matrix_as_anno_filename) + matrix.mklink(options = ['overwrite':true], matrix_as_anno_filename) [ meta, file(matrix_as_anno_filename) ] } } From 83b8fdc7d30b985b667511083555ea54092ac328 Mon Sep 17 00:00:00 2001 From: bjlang <> Date: Fri, 26 Jul 2024 16:26:13 +0200 Subject: [PATCH 040/154] Use recommended format for optional parameters --- workflows/differentialabundance.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/differentialabundance.nf b/workflows/differentialabundance.nf index 8abdd458..d4c01409 100644 --- a/workflows/differentialabundance.nf +++ b/workflows/differentialabundance.nf @@ -261,7 +261,7 @@ workflow DIFFERENTIALABUNDANCE { } ch_features = ch_features_matrix .map{ meta, matrix -> - matrix.mklink(options = ['overwrite':true], matrix_as_anno_filename) + matrix.mklink(matrix_as_anno_filename, overwrite:true) [ meta, file(matrix_as_anno_filename) ] } } From 20c6cc6f849f35a683e2c693387fa4db538eef6d Mon Sep 17 00:00:00 2001 From: bjlang <> Date: Fri, 26 Jul 2024 16:26:13 +0200 Subject: [PATCH 041/154] Use recommended format for optional parameters --- workflows/differentialabundance.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/differentialabundance.nf b/workflows/differentialabundance.nf index a7aae2bd..3145dc89 100644 --- a/workflows/differentialabundance.nf +++ b/workflows/differentialabundance.nf @@ -262,7 +262,7 @@ workflow DIFFERENTIALABUNDANCE { } ch_features = ch_features_matrix .map{ meta, matrix -> - matrix.mklink(options = ['overwrite':true], matrix_as_anno_filename) + matrix.mklink(matrix_as_anno_filename, overwrite:true) [ meta, file(matrix_as_anno_filename) ] } } From b719387223977bcc0a50733a7a1abf4b89fa3fa1 Mon Sep 17 00:00:00 2001 From: bjlang <> Date: Fri, 26 Jul 2024 17:47:12 +0200 Subject: [PATCH 042/154] Skip copying matrix if not necessary to allow resuming pipeline execution --- workflows/differentialabundance.nf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/workflows/differentialabundance.nf b/workflows/differentialabundance.nf index d4c01409..a58dd339 100644 --- a/workflows/differentialabundance.nf +++ b/workflows/differentialabundance.nf @@ -261,7 +261,8 @@ workflow DIFFERENTIALABUNDANCE { } ch_features = ch_features_matrix .map{ meta, matrix -> - matrix.mklink(matrix_as_anno_filename, overwrite:true) + matrix_copy = file(matrix_as_anno_filename) + matrix_copy.exists() && matrix.getText().md5().equals(matrix_copy.getText().md5()) ?: matrix.copyTo(matrix_as_anno_filename) [ meta, file(matrix_as_anno_filename) ] } } From 5a3727b465603cd87560562ce0e9d76d08ef92c1 Mon Sep 17 00:00:00 2001 From: bjlang <> Date: Fri, 26 Jul 2024 17:47:12 +0200 Subject: [PATCH 043/154] Skip copying matrix if not necessary to allow resuming pipeline execution --- workflows/differentialabundance.nf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/workflows/differentialabundance.nf b/workflows/differentialabundance.nf index 3145dc89..c1f9b5b9 100644 --- a/workflows/differentialabundance.nf +++ b/workflows/differentialabundance.nf @@ -262,7 +262,8 @@ workflow DIFFERENTIALABUNDANCE { } ch_features = ch_features_matrix .map{ meta, matrix -> - matrix.mklink(matrix_as_anno_filename, overwrite:true) + matrix_copy = file(matrix_as_anno_filename) + matrix_copy.exists() && matrix.getText().md5().equals(matrix_copy.getText().md5()) ?: matrix.copyTo(matrix_as_anno_filename) [ meta, file(matrix_as_anno_filename) ] } } From 0fbdcd65009dcaa28bbddc54b8e1ea8ee348df23 Mon Sep 17 00:00:00 2001 From: bjlang <> Date: Tue, 30 Jul 2024 11:19:24 +0200 Subject: [PATCH 044/154] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e98713bf..9ca545a0 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 - [[#280](https://github.com/nf-core/differentialabundance/pull/280)] - Bump shinyngs, fix contrasts passed to app creation ([@pinin4fjords](https://github.com/pinin4fjords), review by [@WackerO](https://github.com/WackerO)) - [[#274](https://github.com/nf-core/differentialabundance/pull/274)] - Fix pagination on samples table ([@pinin4fjords](https://github.com/pinin4fjords), review by [@WackerO](https://github.com/WackerO)) - [[#272](https://github.com/nf-core/differentialabundance/pull/272)] - Show >10 contrasts in report ([@pinin4fjords](https://github.com/pinin4fjords), review by [@WackerO](https://github.com/WackerO)) +- In order to improve resumability, create a copy of the matrix as an annotation file only if necessary. ### Changed From 124f21e43f6634342048d14a94c1f663b9496e7d Mon Sep 17 00:00:00 2001 From: bjlang <> Date: Tue, 30 Jul 2024 12:01:02 +0200 Subject: [PATCH 045/154] Keep original matrix file name in the annotation copy to improve resumability --- workflows/differentialabundance.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/differentialabundance.nf b/workflows/differentialabundance.nf index a58dd339..ea0dd0bb 100644 --- a/workflows/differentialabundance.nf +++ b/workflows/differentialabundance.nf @@ -253,7 +253,7 @@ workflow DIFFERENTIALABUNDANCE { // Otherwise we can just use the matrix input; save it to the workdir so that it does not // just appear wherever the user runs the pipeline - matrix_as_anno_filename = "${workflow.workDir}/matrix_as_anno.${matrix_file.getExtension()}" + matrix_as_anno_filename = "${workflow.workDir}/${matrix_file.getBaseName()}_as_anno.${matrix_file.getExtension()}" if (params.study_type == 'maxquant'){ ch_features_matrix = ch_in_norm } else { From 0e6b4fc3553f9a9dfa2fc415efebf913d2b59166 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Langer?= <61791748+bjlang@users.noreply.github.com> Date: Tue, 30 Jul 2024 15:11:25 +0200 Subject: [PATCH 046/154] Update CHANGELOG.md Co-authored-by: WackerO <43847497+WackerO@users.noreply.github.com> --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9ca545a0..85cd025b 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 - [[#280](https://github.com/nf-core/differentialabundance/pull/280)] - Bump shinyngs, fix contrasts passed to app creation ([@pinin4fjords](https://github.com/pinin4fjords), review by [@WackerO](https://github.com/WackerO)) - [[#274](https://github.com/nf-core/differentialabundance/pull/274)] - Fix pagination on samples table ([@pinin4fjords](https://github.com/pinin4fjords), review by [@WackerO](https://github.com/WackerO)) - [[#272](https://github.com/nf-core/differentialabundance/pull/272)] - Show >10 contrasts in report ([@pinin4fjords](https://github.com/pinin4fjords), review by [@WackerO](https://github.com/WackerO)) -- In order to improve resumability, create a copy of the matrix as an annotation file only if necessary. +- [[#282](https://github.com/nf-core/differentialabundance/pull/282)] - In order to improve resumability, create a copy of the matrix as an annotation file only if necessary; add original matrix file name to copy name ([@bjlang](https://github.com/bjlang), review by [@WackerO](https://github.com/WackerO)) ### Changed From 0a3927acbe4743c893529de9a983949febd03856 Mon Sep 17 00:00:00 2001 From: bjlang <> Date: Tue, 30 Jul 2024 12:01:02 +0200 Subject: [PATCH 047/154] Keep original matrix file name in the annotation copy to improve resumability --- workflows/differentialabundance.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/differentialabundance.nf b/workflows/differentialabundance.nf index c1f9b5b9..98e2772a 100644 --- a/workflows/differentialabundance.nf +++ b/workflows/differentialabundance.nf @@ -254,7 +254,7 @@ workflow DIFFERENTIALABUNDANCE { // Otherwise we can just use the matrix input; save it to the workdir so that it does not // just appear wherever the user runs the pipeline - matrix_as_anno_filename = "${workflow.workDir}/matrix_as_anno.${matrix_file.getExtension()}" + matrix_as_anno_filename = "${workflow.workDir}/${matrix_file.getBaseName()}_as_anno.${matrix_file.getExtension()}" if (params.study_type == 'maxquant'){ ch_features_matrix = ch_in_norm } else { From 05cfb3a0ed80420151b0770cc08885d14ea72e54 Mon Sep 17 00:00:00 2001 From: bjlang <> Date: Tue, 27 Aug 2024 13:38:03 +0200 Subject: [PATCH 048/154] Move main_coda logic into differentialabundance as experimental study type --- main_coda.nf | 40 -------------- nextflow.config | 4 ++ nextflow_coda.config | 55 ------------------- nextflow_schema.json | 21 ++++++- nextflow_schema_coda.json | 25 --------- subworkflows/local/correlation/main.nf | 20 +++---- subworkflows/local/differential/main.nf | 8 +-- subworkflows/local/enrichment/main.nf | 9 +-- subworkflows/local/experimental/main.nf | 15 ++--- subworkflows/local/variable_selection/main.nf | 16 ++---- workflows/differentialabundance.nf | 41 ++++++++++++-- 11 files changed, 82 insertions(+), 172 deletions(-) delete mode 100644 main_coda.nf delete mode 100644 nextflow_coda.config delete mode 100644 nextflow_schema_coda.json diff --git a/main_coda.nf b/main_coda.nf deleted file mode 100644 index c35682f5..00000000 --- a/main_coda.nf +++ /dev/null @@ -1,40 +0,0 @@ -// include { PROPR_PROPR } from '../../../modules/nf-core/propr/propr/main' -// include { PROPR_PROPD } from '../../../modules/nf-core/propr/propd/main' -// include { PROPR_GREA } from '../../../modules/nf-core/propr/grea/main' -// include { MYGENE } from '../../../modules/nf-core/mygene/main' -include { EXPERIMENTAL } from './subworkflows/local/experimental/main.nf' -include { fromSamplesheet } from 'plugin/nf-validation' - - -// These are local files from my Bachelor Thesis project, I am creating the ch_samples_and_matrix -// manually for testing but it should be be provided by the processing section of nf-core/differentialabundance -Counts_ch = Channel.fromPath(params.matrix) - -Sample_ch = Channel.fromPath(params.input) - .map{ it -> [[id: 'YMC'], it]} - -ch_samples_and_matrix = Sample_ch.combine(Counts_ch) - -// Convert the samplesheet.csv in a channel with the proper format -ch_tools = Channel.fromSamplesheet('tools') - - -// TO DO: This should be modified to run one path per default, not all -if (params.pathway == "all") { - ch_tools - .set{ ch_tools_single } -} else { - ch_tools - .filter{ - it[0]["pathway_name"] == params.pathway // TO DO: change pathway to path also in the tools_samplesheet file - } - //.view() - .set{ ch_tools_single } -} -ch_tools_single.view() - -workflow { - EXPERIMENTAL(ch_samples_and_matrix, ch_tools_single) - EXPERIMENTAL.out.output.view() -} - diff --git a/nextflow.config b/nextflow.config index 8ddd6b3e..967ab185 100644 --- a/nextflow.config +++ b/nextflow.config @@ -21,6 +21,10 @@ params { control_features = null sizefactors_from_controls = false + // Experimental analysis options + tools = null + pathway = null + // Reporting logo_file = "$projectDir/docs/images/nf-core-differentialabundance_logo_light.png" css_file = "$projectDir/assets/nf-core_style.css" diff --git a/nextflow_coda.config b/nextflow_coda.config deleted file mode 100644 index 23d475f4..00000000 --- a/nextflow_coda.config +++ /dev/null @@ -1,55 +0,0 @@ -//parametros generales, para el usuario (que se pueden arrancar poniendo los flags como el command line) - -params.tools = "./assets/tools_samplesheet.csv" -params.outdir = "../results_pipeline" -params.validationSkipDuplicateCheck = true -params.publish_dir_mode = 'copy' -params.pathway = 'all' -//params.maxRetries = 0 -includeConfig 'conf/modules.config' // now it should refer to modules_coda.config - - - -profiles { - debug { - dumpHashes = true - process.beforeScript = 'echo $HOSTNAME' - process.debug = true - cleanup = false - nextflow.enable.configProcessNamesValidation = true - } - crg { includeConfig "conf/crg.config" } -} - -// Function to ensure that resource requirements don't go beyond -// a maximum limit -def check_max(obj, type) { - if (type == 'memory') { - try { - if (obj.compareTo(params.max_memory as nextflow.util.MemoryUnit) == 1) - return params.max_memory as nextflow.util.MemoryUnit - else - return obj - } catch (all) { - println " ### ERROR ### Max memory '${params.max_memory}' is not valid! Using default value: $obj" - return obj - } - } else if (type == 'time') { - try { - if (obj.compareTo(params.max_time as nextflow.util.Duration) == 1) - return params.max_time as nextflow.util.Duration - else - return obj - } catch (all) { - println " ### ERROR ### Max time '${params.max_time}' is not valid! Using default value: $obj" - return obj - } - } else if (type == 'cpus') { - try { - return Math.min( obj, params.max_cpus as int ) - } catch (all) { - println " ### ERROR ### Max cpus '${params.max_cpus}' is not valid! Using default value: $obj" - return obj - } - } -} diff --git a/nextflow_schema.json b/nextflow_schema.json index 54fc1b19..f30bcaaa 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -24,7 +24,7 @@ "default": "rnaseq", "description": "A string identifying the technology used to produce the data", "help_text": "Currently 'rnaseq' or 'affy_array' may be specified.", - "enum": ["rnaseq", "affy_array", "maxquant", "geo_soft_file"], + "enum": ["rnaseq", "affy_array", "maxquant", "geo_soft_file", "experimental"], "fa_icon": "far fa-keyboard" }, "input": { @@ -58,7 +58,15 @@ "default": "counts", "description": "Type of abundance measure used, platform-dependent", "fa_icon": "fas fa-keyboard" - }, + } + } + }, + "experimental_analysis_options": { + "title": "Experimental analysis, including CoDa", + "type": "object", + "fa_icon": "fas fa-terminal", + "description": "Values required for experimental analysis", + "properties": { "tools": { "type": "string", "format": "file-path", @@ -68,6 +76,12 @@ "pattern": "^\\S+\\.(csv|tsv|yaml)$", "description": "Path to comma-separated file containing samplesheet", "help_text": "This file defines possible combinations of tools, which are to be run by the pipeline" + }, + "pathway": { + "type": "string", + "fa_icon": "fas fa-border-all", + "description": "(experimantal only): Choose a (list of) pathway from those predefined in the tool sheet", + "help_text": "Choose the a subset of pathways to run. Pathways are defined in the tool sheet." } } }, @@ -1298,6 +1312,9 @@ { "$ref": "#/definitions/input_output_options" }, + { + "$ref": "#/definitions/experimental_analysis_options" + }, { "$ref": "#/definitions/abundance_values" }, diff --git a/nextflow_schema_coda.json b/nextflow_schema_coda.json deleted file mode 100644 index cba300f4..00000000 --- a/nextflow_schema_coda.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema", - "title": "nf-core/testpipeline pipeline parameters", - "description": "this is a test", - "type": "object", - "definitions": { - "tools_options": { - "title": "Tools options", - "type": "object", - "description": "Define where the pipeline should find input data", - "required": ["tools"], - "properties": { - "tools": { - "type": "string", - "format": "file-path", - "mimetype": "text/csv", - "schema": "assets/schema_tools.json", - "pattern": "^\\S+\\.(csv|tsv|yaml)$", - "description": "Path to comma-separated file containing samplesheet", - "help_text": "this is just a test" - } - } - } - } -} diff --git a/subworkflows/local/correlation/main.nf b/subworkflows/local/correlation/main.nf index 96a6b890..b586f369 100644 --- a/subworkflows/local/correlation/main.nf +++ b/subworkflows/local/correlation/main.nf @@ -1,8 +1,8 @@ - -// include nf-core modules +// +// Perform correlation analysis +// include {PROPR_PROPR as PROPR} from "../../../modules/nf-core/propr/propr/main.nf" - workflow CORRELATION { take: ch_counts @@ -17,30 +17,24 @@ workflow CORRELATION { [ metacounts+metatools, counts ] } .branch { - propr: it[0]["cor_method"] == "propr" + propr: it[0]["cor_method"] == "propr" } .set { ch_counts_cor } - // Hacer un branch del channel para coger las counts normales cuando no hay variable selection - + // Create a branch of the channel to retrieve the normal counts when there is no variable selection. ch_counts_cor.propr .branch{ - no_sel: it[0]["sel_method"] == null - sel: it[0]["sel_method"] != null + no_sel: it[0]["sel_method"] == null + sel: it[0]["sel_method"] != null } .set { ch_counts_selection } - //ch_counts_selection.no_sel.view() - //ch_counts_filtered.view() - ch_propr = ch_counts_filtered.mix(ch_counts_selection.no_sel) - //ch_propr.view() PROPR(ch_propr) ch_matrix = PROPR.out.matrix ch_adjacency = PROPR.out.adj - emit: matrix = ch_matrix adjacency = ch_adjacency diff --git a/subworkflows/local/differential/main.nf b/subworkflows/local/differential/main.nf index 296fe0f2..57451cd2 100644 --- a/subworkflows/local/differential/main.nf +++ b/subworkflows/local/differential/main.nf @@ -1,7 +1,8 @@ -// include modules +// +// Perform differential analysis +// include {PROPR_PROPD as PROPD} from "../../../modules/nf-core/propr/propd/main.nf" - workflow DIFFERENTIAL { take: ch_counts @@ -15,9 +16,8 @@ workflow DIFFERENTIAL { metacounts, counts, meta -> [ metacounts+meta, counts ] } - //.view() .branch { - propd: it[0]["diff_method"] == "propd" + propd: it[0]["diff_method"] == "propd" deseq2: it[0]["diff_method"] == "deseq2" } .set { ch_counts_tools } diff --git a/subworkflows/local/enrichment/main.nf b/subworkflows/local/enrichment/main.nf index a559a41b..4f3ae992 100644 --- a/subworkflows/local/enrichment/main.nf +++ b/subworkflows/local/enrichment/main.nf @@ -1,19 +1,17 @@ -// include modules - +// +// Perform enrichment analysis +// include { PROPR_GREA as GREA_DIFF } from "../../../modules/nf-core/propr/grea/main.nf" include { PROPR_GREA as GREA_COR } from "../../../modules/nf-core/propr/grea/main.nf" include { MYGENE } from "../../../modules/nf-core/mygene/main.nf" - workflow ENRICHMENT { take: ch_diff_adjacency ch_cor_adjacency ch_counts - main: - MYGENE(ch_counts) ch_gmt = MYGENE.out.gmt @@ -39,7 +37,6 @@ workflow ENRICHMENT { GREA_COR(ch_cor_grea.grea, ch_gmt.collect()) ch_enriched_cor = GREA_COR.out.enrichedGO - emit: enriched_diff = ch_enriched_diff enriched_cor = ch_enriched_cor diff --git a/subworkflows/local/experimental/main.nf b/subworkflows/local/experimental/main.nf index 6e811027..e2b1dbbf 100644 --- a/subworkflows/local/experimental/main.nf +++ b/subworkflows/local/experimental/main.nf @@ -1,5 +1,6 @@ -// include subworkflows - +// +// Run experimental analysis +// include { CORRELATION } from '../correlation/main.nf' include { DIFFERENTIAL } from '../differential/main.nf' include { VARIABLE_SELECTION } from '../variable_selection/main.nf' @@ -13,7 +14,7 @@ workflow EXPERIMENTAL { main: - // Dividir el ch_samples_and_matrix en un channel de samplesheet y otro de matrix (PROPD los coge por separado) + // Split the ch_samples_and_matrix into one channel for the samplesheet and another for the matrix (PROPD takes them separately). ch_samples_and_matrix .map { meta, samplesheet, counts -> @@ -27,7 +28,6 @@ workflow EXPERIMENTAL { [ meta, counts ] } .set { ch_counts } - // ch_counts.view() ch_counts .combine(ch_tools) @@ -41,7 +41,6 @@ workflow EXPERIMENTAL { ch_out = Channel.empty() // Perform differential analysis - DIFFERENTIAL(ch_counts, ch_tools, ch_samplesheet.collect()) ch_diff_results = DIFFERENTIAL.out.results ch_diff_adjacency = DIFFERENTIAL.out.adjacency @@ -49,17 +48,12 @@ workflow EXPERIMENTAL { // Perform variable selection ch_counts_filtered = VARIABLE_SELECTION(ch_diff_adjacency, ch_counts) - //VARIABLE_SELECTION.out.count.view() - // Perform correlation analysis CORRELATION(ch_counts, ch_tools, ch_counts_filtered) ch_matrix = CORRELATION.out.matrix ch_cor_adjacency = CORRELATION.out.adjacency ch_out.mix(ch_matrix) - //ch_diff_adjacency.view() - //ch_cor_adjacency.view() - // Perform enrichment analysis ENRICHMENT(ch_diff_adjacency, ch_cor_adjacency, ch_counts) ch_enriched_cor = ENRICHMENT.out.enriched_cor @@ -67,7 +61,6 @@ workflow EXPERIMENTAL { ch_out.mix(ch_enriched_diff, ch_enriched_cor) - emit: output = ch_out } diff --git a/subworkflows/local/variable_selection/main.nf b/subworkflows/local/variable_selection/main.nf index 71c8d6d9..22b35527 100644 --- a/subworkflows/local/variable_selection/main.nf +++ b/subworkflows/local/variable_selection/main.nf @@ -1,11 +1,12 @@ -// include modules +// +// Perform variable selection +// include { FILTERVAR } from "../../../modules/local/filtervar/main.nf" workflow VARIABLE_SELECTION { take: - ch_adj//meta_tools, adj - ch_counts //meta_id, counts - + ch_adj //meta_tools, adj + ch_counts //meta_id, counts main: ch_counts @@ -14,26 +15,19 @@ workflow VARIABLE_SELECTION { [counts] } .combine(ch_adj) - //.view() .map{ counts, meta, adj -> [ meta, counts, adj] } - //.view() .branch { filtervar: it[0]["sel_method"] == "filtervar" deseqfilter: it[0]["sel_method"] == "deseqfilter" } .set { ch_counts_adj_sel } - //ch_counts_adj_sel.nofilter.view() - - FILTERVAR(ch_counts_adj_sel.filtervar) ch_counts_cor = FILTERVAR.out.count - //ch_counts_cor.view() - emit: count = ch_counts_cor diff --git a/workflows/differentialabundance.nf b/workflows/differentialabundance.nf index 98e2772a..7a76c530 100644 --- a/workflows/differentialabundance.nf +++ b/workflows/differentialabundance.nf @@ -46,7 +46,7 @@ if (params.study_type == 'affy_array'){ // If this is not microarray data or maxquant output, and this an RNA-seq dataset, // then assume we're reading from a matrix - if (params.study_type == "rnaseq" && params.matrix) { + if (params.study_type in ["rnaseq", "experimental"] && params.matrix) { matrix_file = file(params.matrix, checkIfExists: true) ch_in_raw = Channel.of([ exp_meta, matrix_file]) } else { @@ -98,7 +98,9 @@ citations_file = file(params.citations_file, checkIfExists: true) */ include { TABULAR_TO_GSEA_CHIP } from '../modules/local/tabular_to_gsea_chip' -include { FILTER_DIFFTABLE } from '../modules/local/filter_difftable' +include { FILTER_DIFFTABLE } from '../modules/local/filter_difftable' +include { EXPERIMENTAL } from '../subworkflows/local/experimental/main.nf' + /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -132,6 +134,8 @@ include { GEOQUERY_GETGEO } from '../modules/n include { ZIP as MAKE_REPORT_BUNDLE } from '../modules/nf-core/zip/main' include { softwareVersionsToYAML } from '../subworkflows/nf-core/utils_nfcore_pipeline' +include { fromSamplesheet } from 'plugin/nf-validation' + /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RUN MAIN WORKFLOW @@ -304,7 +308,7 @@ workflow DIFFERENTIALABUNDANCE { ch_norm = VALIDATOR.out.assays } - if(params.study_type != 'rnaseq') { + if(!params.study_type in ['rnaseq', 'experimental']) { ch_matrix_for_differential = ch_norm } else{ @@ -355,8 +359,35 @@ workflow DIFFERENTIALABUNDANCE { ch_processed_matrices = ch_norm .map{ it.tail() } .first() - } - else{ + } else if (params.study_type == 'experimental') { + + ch_samples_and_matrix = ch_input.combine(ch_in_raw.map{it[1]}) + ch_samples_and_matrix.view() + + // Convert the samplesheet.csv in a channel with the proper format + ch_tools = Channel.fromSamplesheet('tools') + + // TO DO: This should be modified to run one path per default, not all + if (params.pathway == "all") { + ch_tools + .set{ ch_tools_single } + } else { + ch_tools + .filter{ + it[0]["pathway_name"] == params.pathway // TO DO: change pathway to path also in the tools_samplesheet file + } + .set{ ch_tools_single } + } + ch_tools_single.view() + + EXPERIMENTAL(ch_samples_and_matrix, ch_tools_single) + EXPERIMENTAL.out.output.view() + + ch_norm = Channel.empty() + ch_differential = Channel.empty() + ch_processed_matrices = Channel.empty() + ch_model = Channel.empty() + } else { DESEQ2_NORM ( ch_contrasts.first(), From b21894065d2adccdf6f47e31724cba6f934149c7 Mon Sep 17 00:00:00 2001 From: bjlang <> Date: Tue, 27 Aug 2024 14:53:28 +0200 Subject: [PATCH 049/154] Do not put not not in the not wrong place! --- workflows/differentialabundance.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workflows/differentialabundance.nf b/workflows/differentialabundance.nf index 7a76c530..b846dd46 100644 --- a/workflows/differentialabundance.nf +++ b/workflows/differentialabundance.nf @@ -43,7 +43,7 @@ if (params.study_type == 'affy_array'){ error("Query GSE not specified or features metadata columns not specified") } } else { - // If this is not microarray data or maxquant output, and this an RNA-seq dataset, + // If this is not microarray data or maxquant output, and this an RNA-seq dataset or experimental analysis, // then assume we're reading from a matrix if (params.study_type in ["rnaseq", "experimental"] && params.matrix) { @@ -308,7 +308,7 @@ workflow DIFFERENTIALABUNDANCE { ch_norm = VALIDATOR.out.assays } - if(!params.study_type in ['rnaseq', 'experimental']) { + if(params.study_type !in ['rnaseq', 'experimental']) { ch_matrix_for_differential = ch_norm } else{ From 04abe2599aed5d759b556d4e431f1cc22e5f6dcc Mon Sep 17 00:00:00 2001 From: bjlang <> Date: Tue, 3 Sep 2024 18:01:29 +0200 Subject: [PATCH 050/154] - use validated input for experimental workflow - use contrast file information for differential analysis with PropD --- assets/tools_samplesheet.csv | 10 ++--- conf/modules_coda.config | 45 ------------------- subworkflows/local/differential/main.nf | 9 ++-- subworkflows/local/experimental/main.nf | 60 ++++++++++++------------- workflows/differentialabundance.nf | 11 +++-- 5 files changed, 44 insertions(+), 91 deletions(-) delete mode 100644 conf/modules_coda.config diff --git a/assets/tools_samplesheet.csv b/assets/tools_samplesheet.csv index 3ef3a7b5..7f3e41c9 100644 --- a/assets/tools_samplesheet.csv +++ b/assets/tools_samplesheet.csv @@ -1,7 +1,7 @@ pathway_name,diff_method,args_diff,enr_diff_method,args_enr_diff,cor_method,args_cor,enr_cor_method,args_enr_cor,sel_method,args_sel -diff_prop,propd,--group_col fase --adjacency true --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --permutation 100 --fixseed true, , ,,, , ,, -diff_prop_noperm,propd,--group_col fase --adjacency true --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --permutation 0 --fixseed true, , ,,, , ,, -filtered_pcor,propd,--group_col fase --adjacency true --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --permutation 100 --fixseed true, , ,propr, --permutation 10 --adjacency true --cutoff_min 0.005 --cutoff_max 0.5 --cutoff_interval 0.01 --metric pcor.bshrink, , , filtervar, -prop,, , , ,propr, --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --fixseed true --metric rho --permutation 100 --adjacency true, , , , -diff_grea,propd,--group_col fase --adjacency true --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --permutation 10 --fixseed true,grea, --permutation 10, , , , ,, +diff_prop,propd,--adjacency true --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --permutation 100 --fixseed true,,,,,,,, +diff_prop_noperm,propd,--adjacency true --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --permutation 0 --fixseed true,,,,,,,, +filtered_pcor,propd,--adjacency true --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --permutation 100 --fixseed true,,,propr,--permutation 10 --adjacency true --cutoff_min 0.005 --cutoff_max 0.5 --cutoff_interval 0.01 --metric pcor.bshrink,,,filtervar, +prop,,,,,propr,--cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --fixseed true --metric rho --permutation 100 --adjacency true,,,, +diff_grea,propd,--adjacency true --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --permutation 10 --fixseed true,grea,--permutation 10,,,,,, deseq2,deseq2,,gsea,,,,,,, diff --git a/conf/modules_coda.config b/conf/modules_coda.config deleted file mode 100644 index 44d272e4..00000000 --- a/conf/modules_coda.config +++ /dev/null @@ -1,45 +0,0 @@ -process { - withName: "PROPR"{ - ext.args = { "${meta.args_cor}" == "null" ? '' : "${meta.args_cor}" } - publishDir = [ - path: { "${params.outdir}/correlation_analysis/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - withName: "PROPD"{ - ext.args = { "${meta.args_diff}" == "null" ? '' : "${meta.args_diff}" } - publishDir = [ - path: { "${params.outdir}/differential_analysis/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: "FILTERVAR"{ - ext.args = { "${meta.args_cor}" == "null" ? '' : "${meta.args_cor}" } - publishDir = [ - path: { "${params.outdir}/variable_selection/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: "GREA_DIFF"{ - ext.args = { "${meta.args_enr_diff}" == "null" ? '' : "${meta.args_enr_diff}" } - publishDir = [ - path: { "${params.outdir}/enrichment_differential/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: "GREA_COR"{ - ext.args = { "${meta.args_enr_cor}" == "null" ? '' : "${meta.args_enr_cor}" } - publishDir = [ - path: { "${params.outdir}/enrichment_correlation/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } -} diff --git a/subworkflows/local/differential/main.nf b/subworkflows/local/differential/main.nf index 57451cd2..cb5d5238 100644 --- a/subworkflows/local/differential/main.nf +++ b/subworkflows/local/differential/main.nf @@ -5,6 +5,7 @@ include {PROPR_PROPD as PROPD} from "../../../modules/nf-core/propr/propd/main.n workflow DIFFERENTIAL { take: + ch_contrasts // [meta, contrast_variable, reference, target] ch_counts ch_tools ch_samplesheet @@ -12,16 +13,18 @@ workflow DIFFERENTIAL { main: ch_counts .combine(ch_tools) + .combine(ch_contrasts) .map { - metacounts, counts, meta -> - [ metacounts+meta, counts ] + meta_counts, counts, tools, meta_contrast, contrast_variable, reference, target -> + def meta = meta_counts.clone() + tools.clone() + meta.args_diff = meta.args_diff + " --group_col $contrast_variable" + [ meta, counts ] } .branch { propd: it[0]["diff_method"] == "propd" deseq2: it[0]["diff_method"] == "deseq2" } .set { ch_counts_tools } - PROPD(ch_counts_tools.propd, ch_samplesheet) ch_results = PROPD.out.results ch_adjacency = PROPD.out.adj diff --git a/subworkflows/local/experimental/main.nf b/subworkflows/local/experimental/main.nf index e2b1dbbf..15dbd129 100644 --- a/subworkflows/local/experimental/main.nf +++ b/subworkflows/local/experimental/main.nf @@ -9,58 +9,54 @@ include { ENRICHMENT } from '../enrichment/main.nf' workflow EXPERIMENTAL { take: - ch_samples_and_matrix // [meta, samplesheet, matrix] que viene de differentialabundance + ch_contrasts + ch_samplesheet + ch_counts ch_tools main: - // Split the ch_samples_and_matrix into one channel for the samplesheet and another for the matrix (PROPD takes them separately). - ch_samples_and_matrix - .map { - meta, samplesheet, counts -> - [ meta, samplesheet ] - } - .set { ch_samplesheet } - - ch_samples_and_matrix - .map { - meta, samplesheet, counts -> - [ meta, counts ] - } - .set { ch_counts } - - ch_counts - .combine(ch_tools) - .map { - metacounts, counts, metatools -> - [ metacounts+metatools, counts ] - } - .set { ch_counts_tools } - - // Perform CODA analysis - ch_out = Channel.empty() // Perform differential analysis - DIFFERENTIAL(ch_counts, ch_tools, ch_samplesheet.collect()) + DIFFERENTIAL( + ch_contrasts, + ch_counts, + ch_tools, + ch_samplesheet.collect() + ) ch_diff_results = DIFFERENTIAL.out.results ch_diff_adjacency = DIFFERENTIAL.out.adjacency + ch_diff_results.view{"diff: " + it} + ch_diff_adjacency.view{"adj: " + it} // Perform variable selection ch_counts_filtered = VARIABLE_SELECTION(ch_diff_adjacency, ch_counts) // Perform correlation analysis - CORRELATION(ch_counts, ch_tools, ch_counts_filtered) + CORRELATION( + ch_counts, + ch_tools, + ch_counts_filtered + ) ch_matrix = CORRELATION.out.matrix ch_cor_adjacency = CORRELATION.out.adjacency ch_out.mix(ch_matrix) // Perform enrichment analysis - ENRICHMENT(ch_diff_adjacency, ch_cor_adjacency, ch_counts) + ENRICHMENT( + ch_diff_adjacency, + ch_cor_adjacency, + ch_counts + ) ch_enriched_cor = ENRICHMENT.out.enriched_cor ch_enriched_diff = ENRICHMENT.out.enriched_diff - ch_out.mix(ch_enriched_diff, ch_enriched_cor) - emit: - output = ch_out + diff_res = ch_diff_results + diff_adj = ch_diff_adjacency + counts_cor = VARIABLE_SELECTION.out.counts_cor + corr_matrix = ch_matrix + corr_adj = ch_cor_adjacency + enriched_cor = ch_enriched_cor + enriched_cor = ch_enriched_diff } diff --git a/workflows/differentialabundance.nf b/workflows/differentialabundance.nf index 7e6c2c09..ae90409d 100644 --- a/workflows/differentialabundance.nf +++ b/workflows/differentialabundance.nf @@ -360,9 +360,6 @@ workflow DIFFERENTIALABUNDANCE { .first() } else if (params.study_type == 'experimental') { - ch_samples_and_matrix = ch_input.combine(ch_in_raw.map{it[1]}) - ch_samples_and_matrix.view() - // Convert the samplesheet.csv in a channel with the proper format ch_tools = Channel.fromSamplesheet('tools') @@ -377,10 +374,12 @@ workflow DIFFERENTIALABUNDANCE { } .set{ ch_tools_single } } - ch_tools_single.view() - EXPERIMENTAL(ch_samples_and_matrix, ch_tools_single) - EXPERIMENTAL.out.output.view() + EXPERIMENTAL( + ch_contrasts, + VALIDATOR.out.sample_meta, + CUSTOM_MATRIXFILTER.out.filtered, + ch_tools_single) ch_norm = Channel.empty() ch_differential = Channel.empty() From 3254d25589ad80e83614186c81265ade7cd85b64 Mon Sep 17 00:00:00 2001 From: bjlang <> Date: Tue, 3 Sep 2024 19:04:47 +0200 Subject: [PATCH 051/154] small fix --- subworkflows/local/experimental/main.nf | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/subworkflows/local/experimental/main.nf b/subworkflows/local/experimental/main.nf index 15dbd129..eb308440 100644 --- a/subworkflows/local/experimental/main.nf +++ b/subworkflows/local/experimental/main.nf @@ -40,7 +40,6 @@ workflow EXPERIMENTAL { ) ch_matrix = CORRELATION.out.matrix ch_cor_adjacency = CORRELATION.out.adjacency - ch_out.mix(ch_matrix) // Perform enrichment analysis ENRICHMENT( @@ -54,7 +53,7 @@ workflow EXPERIMENTAL { emit: diff_res = ch_diff_results diff_adj = ch_diff_adjacency - counts_cor = VARIABLE_SELECTION.out.counts_cor + var_count = ch_counts_filtered corr_matrix = ch_matrix corr_adj = ch_cor_adjacency enriched_cor = ch_enriched_cor From 8fcc24cd17b06bc9fb7be2cb9914cda96f966d5f Mon Sep 17 00:00:00 2001 From: bjlang <> Date: Fri, 6 Sep 2024 18:58:22 +0200 Subject: [PATCH 052/154] Add CoDA/experimental branch to CI tests --- .github/workflows/ci.yml | 1 + assets/tools_samplesheet.csv | 3 +- conf/test_experimental.config | 46 +++++++++++++++++++++++++ nextflow.config | 1 + nextflow_schema.json | 1 + subworkflows/local/differential/main.nf | 39 ++++++++++++++++----- subworkflows/local/experimental/main.nf | 7 ++-- workflows/differentialabundance.nf | 6 ++-- 8 files changed, 86 insertions(+), 18 deletions(-) create mode 100644 conf/test_experimental.config diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f499c09c..6f911019 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -32,6 +32,7 @@ jobs: - "test_affy" - "test_maxquant" - "test_soft" + - "test_experimental" steps: - name: Check out pipeline code uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4 diff --git a/assets/tools_samplesheet.csv b/assets/tools_samplesheet.csv index 7f3e41c9..afce8a3e 100644 --- a/assets/tools_samplesheet.csv +++ b/assets/tools_samplesheet.csv @@ -1,7 +1,6 @@ pathway_name,diff_method,args_diff,enr_diff_method,args_enr_diff,cor_method,args_cor,enr_cor_method,args_enr_cor,sel_method,args_sel diff_prop,propd,--adjacency true --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --permutation 100 --fixseed true,,,,,,,, -diff_prop_noperm,propd,--adjacency true --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --permutation 0 --fixseed true,,,,,,,, +diff_prop_noperm,propd,--cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --permutation 0 --fixseed true,,,,,,,, filtered_pcor,propd,--adjacency true --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --permutation 100 --fixseed true,,,propr,--permutation 10 --adjacency true --cutoff_min 0.005 --cutoff_max 0.5 --cutoff_interval 0.01 --metric pcor.bshrink,,,filtervar, prop,,,,,propr,--cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --fixseed true --metric rho --permutation 100 --adjacency true,,,, diff_grea,propd,--adjacency true --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --permutation 10 --fixseed true,grea,--permutation 10,,,,,, -deseq2,deseq2,,gsea,,,,,,, diff --git a/conf/test_experimental.config b/conf/test_experimental.config new file mode 100644 index 00000000..932fddac --- /dev/null +++ b/conf/test_experimental.config @@ -0,0 +1,46 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Nextflow config file for running minimal tests without a GTF +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Defines input files and everything required to run a fast and simple + pipeline test of the CoDA experimental mode. + + Use as follows: + nextflow run nf-core/differentialabundance -profile test_nogtf, --outdir + +---------------------------------------------------------------------------------------- +*/ + +includeConfig 'rnaseq.config' + +params { + study_name = 'SRP254919' + config_profile_name = 'Test profile' + 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/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.samplesheet.csv' + matrix = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv' + contrasts = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.contrasts.csv' + tools = "$projectDir/assets/tools_samplesheet.csv" + pathway = "diff_prop,diff_prop_noperm,filtered_pcor,prop" + + //Features + features_metadata_cols = 'gene_id,gene_name' + + // Observations + observations_id_col = 'sample' + observations_name_col = 'sample' + + // Apply a higher filter to check that the filtering works + filtering_min_abundance=10 + + // Exploratory + exploratory_main_variable = 'contrasts' +} diff --git a/nextflow.config b/nextflow.config index ad395526..2cff4b2a 100644 --- a/nextflow.config +++ b/nextflow.config @@ -356,6 +356,7 @@ profiles { test_affy { includeConfig 'conf/test_affy.config' } test_maxquant { includeConfig 'conf/test_maxquant.config' } test_soft {includeConfig 'conf/test_soft.config' } + test_experimental {includeConfig 'conf/test_experimental.config' } } // Set default registry for Apptainer, Docker, Podman and Singularity independent of -profile diff --git a/nextflow_schema.json b/nextflow_schema.json index 7e752d47..8c0d3ea0 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -79,6 +79,7 @@ }, "pathway": { "type": "string", + "default": "diff_prop", "fa_icon": "fas fa-border-all", "description": "(experimantal only): Choose a (list of) pathway from those predefined in the tool sheet", "help_text": "Choose the a subset of pathways to run. Pathways are defined in the tool sheet." diff --git a/subworkflows/local/differential/main.nf b/subworkflows/local/differential/main.nf index cb5d5238..7e8669d0 100644 --- a/subworkflows/local/differential/main.nf +++ b/subworkflows/local/differential/main.nf @@ -1,36 +1,59 @@ // // Perform differential analysis // -include {PROPR_PROPD as PROPD} from "../../../modules/nf-core/propr/propd/main.nf" +include { PROPR_PROPD as PROPD } from "../../../modules/nf-core/propr/propd/main.nf" +include { DESEQ2_DIFFERENTIAL } from '../../../modules/nf-core/deseq2/differential/main' + workflow DIFFERENTIAL { take: ch_contrasts // [meta, contrast_variable, reference, target] + ch_samplesheet ch_counts ch_tools - ch_samplesheet main: ch_counts + .join(ch_samplesheet) + .first() .combine(ch_tools) .combine(ch_contrasts) .map { - meta_counts, counts, tools, meta_contrast, contrast_variable, reference, target -> + meta_counts, counts, samplesheet, tools, meta_contrast, contrast_variable, reference, target -> def meta = meta_counts.clone() + tools.clone() - meta.args_diff = meta.args_diff + " --group_col $contrast_variable" - [ meta, counts ] + meta.args_diff = (meta.args_diff ?: "") + " --group_col $contrast_variable" + [ meta, samplesheet, counts ] } + .unique() .branch { propd: it[0]["diff_method"] == "propd" + return [it[0], it[2]] deseq2: it[0]["diff_method"] == "deseq2" } .set { ch_counts_tools } - PROPD(ch_counts_tools.propd, ch_samplesheet) - ch_results = PROPD.out.results + + PROPD( + ch_counts_tools.propd, + ch_samplesheet.first() + ) + ch_results = PROPD.out.results ch_adjacency = PROPD.out.adj + // ToDo: In order to use deseq2 the downstream processes need to be updated to process the output correctly + // if (params.transcript_length_matrix) { ch_transcript_lengths = Channel.of([ exp_meta, file(params.transcript_length_matrix, checkIfExists: true)]).first() } else { ch_transcript_lengths = [[],[]] } + // if (params.control_features) { ch_control_features = Channel.of([ exp_meta, file(params.control_features, checkIfExists: true)]).first() } else { ch_control_features = [[],[]] } + + // DESEQ2_DIFFERENTIAL ( + // ch_contrasts, + // ch_counts_tools.deseq2, + // ch_control_features, + // ch_transcript_lengths + // ) + // ch_results = ch_results + // .mix(DESEQ2_DIFFERENTIAL.out.results) + emit: - results = ch_results + results = ch_results adjacency = ch_adjacency } diff --git a/subworkflows/local/experimental/main.nf b/subworkflows/local/experimental/main.nf index eb308440..c0235a13 100644 --- a/subworkflows/local/experimental/main.nf +++ b/subworkflows/local/experimental/main.nf @@ -16,18 +16,15 @@ workflow EXPERIMENTAL { main: - // Perform differential analysis DIFFERENTIAL( ch_contrasts, + ch_samplesheet, ch_counts, - ch_tools, - ch_samplesheet.collect() + ch_tools ) ch_diff_results = DIFFERENTIAL.out.results ch_diff_adjacency = DIFFERENTIAL.out.adjacency - ch_diff_results.view{"diff: " + it} - ch_diff_adjacency.view{"adj: " + it} // Perform variable selection ch_counts_filtered = VARIABLE_SELECTION(ch_diff_adjacency, ch_counts) diff --git a/workflows/differentialabundance.nf b/workflows/differentialabundance.nf index ae90409d..fb98cfc8 100644 --- a/workflows/differentialabundance.nf +++ b/workflows/differentialabundance.nf @@ -363,14 +363,13 @@ workflow DIFFERENTIALABUNDANCE { // Convert the samplesheet.csv in a channel with the proper format ch_tools = Channel.fromSamplesheet('tools') - // TO DO: This should be modified to run one path per default, not all if (params.pathway == "all") { ch_tools .set{ ch_tools_single } } else { ch_tools .filter{ - it[0]["pathway_name"] == params.pathway // TO DO: change pathway to path also in the tools_samplesheet file + it[0]["pathway_name"] in params.pathway.tokenize(',') } .set{ ch_tools_single } } @@ -379,7 +378,8 @@ workflow DIFFERENTIALABUNDANCE { ch_contrasts, VALIDATOR.out.sample_meta, CUSTOM_MATRIXFILTER.out.filtered, - ch_tools_single) + ch_tools_single + ) ch_norm = Channel.empty() ch_differential = Channel.empty() From 9532cfbf0180be01296aa1bacd4c3ba8c59c568d Mon Sep 17 00:00:00 2001 From: bjlang <> Date: Fri, 6 Sep 2024 19:04:56 +0200 Subject: [PATCH 053/154] fix linting --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 2cff4b2a..fed04ecd 100644 --- a/nextflow.config +++ b/nextflow.config @@ -23,7 +23,7 @@ params { // Experimental analysis options tools = null - pathway = null + pathway = 'diff_prop' // Reporting logo_file = "$projectDir/docs/images/nf-core-differentialabundance_logo_light.png" From 318706ae35e65ce36c3549799f8a1b7f565cdeef Mon Sep 17 00:00:00 2001 From: bjlang <> Date: Fri, 6 Sep 2024 19:37:41 +0200 Subject: [PATCH 054/154] fix testing parameters --- conf/test_experimental.config | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/conf/test_experimental.config b/conf/test_experimental.config index 932fddac..ece7d66b 100644 --- a/conf/test_experimental.config +++ b/conf/test_experimental.config @@ -11,10 +11,9 @@ ---------------------------------------------------------------------------------------- */ -includeConfig 'rnaseq.config' - params { study_name = 'SRP254919' + study_type = 'experimental' config_profile_name = 'Test profile' config_profile_description = 'Minimal test dataset to check pipeline function' From b71b83e5670b26fae958f47eadd3c92e675dae49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Langer?= <61791748+bjlang@users.noreply.github.com> Date: Fri, 13 Sep 2024 15:53:15 +0200 Subject: [PATCH 055/154] Delete conf/crg.config --- conf/crg.config | 41 ----------------------------------------- 1 file changed, 41 deletions(-) delete mode 100644 conf/crg.config diff --git a/conf/crg.config b/conf/crg.config deleted file mode 100644 index d1f6b419..00000000 --- a/conf/crg.config +++ /dev/null @@ -1,41 +0,0 @@ -params { - config_profile_name = 'CRG profile' - config_profile_description = 'Configuration to run on CRG cluster' - - max_cpus = 64 - max_memory = 100.GB - max_time = 48.h -} - - -process { - executor = 'crg' - //maxRetries = params.max_retries - //errorStrategy = params.err_start - - withLabel:process_low { - queue = 'cn-el7,short-centos79' - cpus = { check_max( 2 , 'cpus' ) } - memory = { check_max( 12.GB * task.attempt, 'memory' ) } - time = { check_max( 4.h * task.attempt, 'time' ) } - } - withLabel:process_medium{ - queue = 'cn-el7,short-centos79' - cpus = { check_max( 6 , 'cpus' ) } - memory = { check_max( 36.GB * task.attempt, 'memory' ) } - time = { check_max( 8.h * task.attempt, 'time' ) } - } - withLabel:process_high { - queue = 'cn-el7,long-centos79' - cpus = { check_max( 12 , 'cpus' ) } - memory = { check_max( 56.GB * task.attempt, 'memory' ) } - time = { check_max( 12.h * task.attempt, 'time' ) } - - } -} - - -singularity { - enabled = true - cacheDir = 'singularity_cache' -} From 4a41e661e424cad7714b60a660c36bea284d619e Mon Sep 17 00:00:00 2001 From: bjlang <> Date: Fri, 20 Sep 2024 18:43:24 +0200 Subject: [PATCH 056/154] minor code restructuring --- subworkflows/local/differential/main.nf | 35 ++++++++++++++++--------- workflows/differentialabundance.nf | 6 ++--- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/subworkflows/local/differential/main.nf b/subworkflows/local/differential/main.nf index 7e8669d0..65988020 100644 --- a/subworkflows/local/differential/main.nf +++ b/subworkflows/local/differential/main.nf @@ -13,39 +13,48 @@ workflow DIFFERENTIAL { ch_tools main: + ch_tools + .branch { + propd: it[0]["diff_method"] == "propd" + deseq2: it[0]["diff_method"] == "deseq2" + } + .set { ch_tools_single } + + + // Perform differential analysis with PROPD ch_counts - .join(ch_samplesheet) - .first() - .combine(ch_tools) + .combine(ch_tools_single.propd) .combine(ch_contrasts) .map { - meta_counts, counts, samplesheet, tools, meta_contrast, contrast_variable, reference, target -> + meta_counts, counts, tools, meta_contrast, contrast_variable, reference, target -> def meta = meta_counts.clone() + tools.clone() meta.args_diff = (meta.args_diff ?: "") + " --group_col $contrast_variable" - [ meta, samplesheet, counts ] + [ meta, counts ] } .unique() - .branch { - propd: it[0]["diff_method"] == "propd" - return [it[0], it[2]] - deseq2: it[0]["diff_method"] == "deseq2" - } - .set { ch_counts_tools } + .set { ch_counts_propd } PROPD( - ch_counts_tools.propd, + ch_counts_propd, ch_samplesheet.first() ) ch_results = PROPD.out.results ch_adjacency = PROPD.out.adj + // Perform differential analysis with DESeq2 // ToDo: In order to use deseq2 the downstream processes need to be updated to process the output correctly // if (params.transcript_length_matrix) { ch_transcript_lengths = Channel.of([ exp_meta, file(params.transcript_length_matrix, checkIfExists: true)]).first() } else { ch_transcript_lengths = [[],[]] } // if (params.control_features) { ch_control_features = Channel.of([ exp_meta, file(params.control_features, checkIfExists: true)]).first() } else { ch_control_features = [[],[]] } + // ch_samplesheet + // .join(ch_counts) + // .first() + // .combine(ch_tools_single.deseq2) + // .set { ch_counts_deseq2 } + // DESEQ2_DIFFERENTIAL ( // ch_contrasts, - // ch_counts_tools.deseq2, + // ch_counts_deseq2, // ch_control_features, // ch_transcript_lengths // ) diff --git a/workflows/differentialabundance.nf b/workflows/differentialabundance.nf index fb98cfc8..cec4f659 100644 --- a/workflows/differentialabundance.nf +++ b/workflows/differentialabundance.nf @@ -365,20 +365,20 @@ workflow DIFFERENTIALABUNDANCE { if (params.pathway == "all") { ch_tools - .set{ ch_tools_single } + .set{ ch_tools_filtered } } else { ch_tools .filter{ it[0]["pathway_name"] in params.pathway.tokenize(',') } - .set{ ch_tools_single } + .set{ ch_tools_filtered } } EXPERIMENTAL( ch_contrasts, VALIDATOR.out.sample_meta, CUSTOM_MATRIXFILTER.out.filtered, - ch_tools_single + ch_tools_filtered ) ch_norm = Channel.empty() From a6c2b3ddaec3d8fa106e6f50b10de48bf55905c4 Mon Sep 17 00:00:00 2001 From: bjlang <> Date: Tue, 1 Oct 2024 16:30:48 +0200 Subject: [PATCH 057/154] Store output of different pathways in different folders --- conf/modules.config | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 5d987f51..03c81235 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -485,15 +485,16 @@ process { withName: "PROPR"{ ext.args = { "${meta.args_cor}" == "null" ? '' : "${meta.args_cor}" } publishDir = [ - path: { "${params.outdir}/correlation_analysis/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, + path: { "${params.outdir}/correlation_analysis/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}_of_pathway_${meta.pathway_name}" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } withName: "PROPD"{ + ext.when = { meta.diff_method == "propd" } ext.args = { "${meta.args_diff}" == "null" ? '' : "${meta.args_diff}" } publishDir = [ - path: { "${params.outdir}/differential_analysis/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, + path: { "${params.outdir}/differential_analysis/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}_of_pathway_${meta.pathway_name}" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -502,7 +503,7 @@ process { withName: "FILTERVAR"{ ext.args = { "${meta.args_cor}" == "null" ? '' : "${meta.args_cor}" } publishDir = [ - path: { "${params.outdir}/variable_selection/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, + path: { "${params.outdir}/variable_selection/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}_of_pathway_${meta.pathway_name}" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -511,7 +512,7 @@ process { withName: "GREA_DIFF"{ ext.args = { "${meta.args_enr_diff}" == "null" ? '' : "${meta.args_enr_diff}" } publishDir = [ - path: { "${params.outdir}/enrichment_differential/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, + path: { "${params.outdir}/enrichment_differential/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}_of_pathway_${meta.pathway_name}" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -520,7 +521,7 @@ process { withName: "GREA_COR"{ ext.args = { "${meta.args_enr_cor}" == "null" ? '' : "${meta.args_enr_cor}" } publishDir = [ - path: { "${params.outdir}/enrichment_correlation/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, + path: { "${params.outdir}/enrichment_correlation/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}_of_pathway_${meta.pathway_name}" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] From a0ef41b9475c79cde4a90edb79d00bc7bf6ab029 Mon Sep 17 00:00:00 2001 From: suzannejin Date: Wed, 2 Oct 2024 12:22:36 +0200 Subject: [PATCH 058/154] within differential subworkflow, initialize results channels at the beginning. Then the results from each process can be mixed accordingly --- subworkflows/local/differential/main.nf | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/subworkflows/local/differential/main.nf b/subworkflows/local/differential/main.nf index 65988020..bcbf42ab 100644 --- a/subworkflows/local/differential/main.nf +++ b/subworkflows/local/differential/main.nf @@ -13,6 +13,13 @@ workflow DIFFERENTIAL { ch_tools main: + + // initialize empty results channels + ch_results = Channel.empty() + ch_adjacency = Channel.empty() + + + // branch tools to select the correct differential analysis method ch_tools .branch { propd: it[0]["diff_method"] == "propd" @@ -21,14 +28,17 @@ workflow DIFFERENTIAL { .set { ch_tools_single } - // Perform differential analysis with PROPD + // ---------------------------------------------------- + // Perform differential analysis with propd + // ---------------------------------------------------- + ch_counts .combine(ch_tools_single.propd) .combine(ch_contrasts) .map { meta_counts, counts, tools, meta_contrast, contrast_variable, reference, target -> def meta = meta_counts.clone() + tools.clone() - meta.args_diff = (meta.args_diff ?: "") + " --group_col $contrast_variable" + meta.args_diff = (meta.args_diff ?: "") + " --group_col $contrast_variable" // TODO parse the toolsheet with the ext.arg from modules.config at the beginning of the experimental workflow [ meta, counts ] } .unique() @@ -38,10 +48,13 @@ workflow DIFFERENTIAL { ch_counts_propd, ch_samplesheet.first() ) - ch_results = PROPD.out.results - ch_adjacency = PROPD.out.adj + ch_results = ch_results.mix(PROPD.out.results) + ch_adjacency = ch_adjacency.mix(PROPD.out.adj) + // ---------------------------------------------------- // Perform differential analysis with DESeq2 + // ---------------------------------------------------- + // ToDo: In order to use deseq2 the downstream processes need to be updated to process the output correctly // if (params.transcript_length_matrix) { ch_transcript_lengths = Channel.of([ exp_meta, file(params.transcript_length_matrix, checkIfExists: true)]).first() } else { ch_transcript_lengths = [[],[]] } // if (params.control_features) { ch_control_features = Channel.of([ exp_meta, file(params.control_features, checkIfExists: true)]).first() } else { ch_control_features = [[],[]] } From ca6fb975f5fd8899bc0fe10acb3c6cf5db034870 Mon Sep 17 00:00:00 2001 From: suzannejin Date: Wed, 2 Oct 2024 12:26:59 +0200 Subject: [PATCH 059/154] formatting --- subworkflows/local/differential/main.nf | 3 --- 1 file changed, 3 deletions(-) diff --git a/subworkflows/local/differential/main.nf b/subworkflows/local/differential/main.nf index bcbf42ab..f212f8b3 100644 --- a/subworkflows/local/differential/main.nf +++ b/subworkflows/local/differential/main.nf @@ -18,7 +18,6 @@ workflow DIFFERENTIAL { ch_results = Channel.empty() ch_adjacency = Channel.empty() - // branch tools to select the correct differential analysis method ch_tools .branch { @@ -27,7 +26,6 @@ workflow DIFFERENTIAL { } .set { ch_tools_single } - // ---------------------------------------------------- // Perform differential analysis with propd // ---------------------------------------------------- @@ -77,5 +75,4 @@ workflow DIFFERENTIAL { emit: results = ch_results adjacency = ch_adjacency - } From 328aacde97228341e67af64bb7ed50c81308870e Mon Sep 17 00:00:00 2001 From: suzannejin Date: Wed, 2 Oct 2024 12:45:01 +0200 Subject: [PATCH 060/154] removed the variable selection block between diff and corr blocks. --- subworkflows/local/correlation/main.nf | 22 +++++++------- subworkflows/local/differential/main.nf | 1 - subworkflows/local/experimental/main.nf | 38 +++++++++++++------------ 3 files changed, 30 insertions(+), 31 deletions(-) diff --git a/subworkflows/local/correlation/main.nf b/subworkflows/local/correlation/main.nf index b586f369..a19287ae 100644 --- a/subworkflows/local/correlation/main.nf +++ b/subworkflows/local/correlation/main.nf @@ -7,9 +7,14 @@ workflow CORRELATION { take: ch_counts ch_tools - ch_counts_filtered main: + + // initialize empty results channels + ch_results = Channel.empty() + ch_adjacency = Channel.empty() + + // branch tools to select the correct correlation analysis method ch_counts .combine(ch_tools) .map { @@ -21,22 +26,15 @@ workflow CORRELATION { } .set { ch_counts_cor } - // Create a branch of the channel to retrieve the normal counts when there is no variable selection. - ch_counts_cor.propr - .branch{ - no_sel: it[0]["sel_method"] == null - sel: it[0]["sel_method"] != null - } - .set { ch_counts_selection } + // ---------------------------------------------------- + // Perform correlation analysis with propr + // ---------------------------------------------------- - ch_propr = ch_counts_filtered.mix(ch_counts_selection.no_sel) - - PROPR(ch_propr) + PROPR(ch_counts_cor.propr) ch_matrix = PROPR.out.matrix ch_adjacency = PROPR.out.adj emit: matrix = ch_matrix adjacency = ch_adjacency - } diff --git a/subworkflows/local/differential/main.nf b/subworkflows/local/differential/main.nf index f212f8b3..3e08e3ac 100644 --- a/subworkflows/local/differential/main.nf +++ b/subworkflows/local/differential/main.nf @@ -4,7 +4,6 @@ include { PROPR_PROPD as PROPD } from "../../../modules/nf-core/propr/propd/main.nf" include { DESEQ2_DIFFERENTIAL } from '../../../modules/nf-core/deseq2/differential/main' - workflow DIFFERENTIAL { take: ch_contrasts // [meta, contrast_variable, reference, target] diff --git a/subworkflows/local/experimental/main.nf b/subworkflows/local/experimental/main.nf index c0235a13..3e2b2077 100644 --- a/subworkflows/local/experimental/main.nf +++ b/subworkflows/local/experimental/main.nf @@ -3,10 +3,8 @@ // include { CORRELATION } from '../correlation/main.nf' include { DIFFERENTIAL } from '../differential/main.nf' -include { VARIABLE_SELECTION } from '../variable_selection/main.nf' include { ENRICHMENT } from '../enrichment/main.nf' - workflow EXPERIMENTAL { take: ch_contrasts @@ -14,9 +12,12 @@ workflow EXPERIMENTAL { ch_counts ch_tools - main: - // Perform differential analysis + + // ---------------------------------------------------- + // DIFFERENTIAL ANALYSIS BLOCK + // ---------------------------------------------------- + DIFFERENTIAL( ch_contrasts, ch_samplesheet, @@ -26,33 +27,34 @@ workflow EXPERIMENTAL { ch_diff_results = DIFFERENTIAL.out.results ch_diff_adjacency = DIFFERENTIAL.out.adjacency - // Perform variable selection - ch_counts_filtered = VARIABLE_SELECTION(ch_diff_adjacency, ch_counts) + // ---------------------------------------------------- + // CORRELATION ANALYSIS BLOCK + // ---------------------------------------------------- - // Perform correlation analysis CORRELATION( ch_counts, - ch_tools, - ch_counts_filtered + ch_tools ) - ch_matrix = CORRELATION.out.matrix - ch_cor_adjacency = CORRELATION.out.adjacency + ch_corr_matrix = CORRELATION.out.matrix + ch_corr_adjacency = CORRELATION.out.adjacency + + // ---------------------------------------------------- + // FUNCTIONAL ENRICHMENT BLOCK + // ---------------------------------------------------- - // Perform enrichment analysis ENRICHMENT( ch_diff_adjacency, - ch_cor_adjacency, + ch_corr_adjacency, ch_counts ) ch_enriched_cor = ENRICHMENT.out.enriched_cor ch_enriched_diff = ENRICHMENT.out.enriched_diff emit: - diff_res = ch_diff_results - diff_adj = ch_diff_adjacency - var_count = ch_counts_filtered - corr_matrix = ch_matrix - corr_adj = ch_cor_adjacency + diff_res = ch_diff_results + diff_adj = ch_diff_adjacency + corr_matrix = ch_corr_matrix + corr_adj = ch_corr_adjacency enriched_cor = ch_enriched_cor enriched_cor = ch_enriched_diff } From f4c4d2f62005a7075e6c395acc3dacf1733ff5a6 Mon Sep 17 00:00:00 2001 From: suzannejin Date: Wed, 2 Oct 2024 12:54:48 +0200 Subject: [PATCH 061/154] updated toolsheet to the current experimental workflow status --- assets/tools_samplesheet.csv | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/assets/tools_samplesheet.csv b/assets/tools_samplesheet.csv index afce8a3e..c5ef3831 100644 --- a/assets/tools_samplesheet.csv +++ b/assets/tools_samplesheet.csv @@ -1,6 +1,6 @@ -pathway_name,diff_method,args_diff,enr_diff_method,args_enr_diff,cor_method,args_cor,enr_cor_method,args_enr_cor,sel_method,args_sel -diff_prop,propd,--adjacency true --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --permutation 100 --fixseed true,,,,,,,, -diff_prop_noperm,propd,--cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --permutation 0 --fixseed true,,,,,,,, -filtered_pcor,propd,--adjacency true --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --permutation 100 --fixseed true,,,propr,--permutation 10 --adjacency true --cutoff_min 0.005 --cutoff_max 0.5 --cutoff_interval 0.01 --metric pcor.bshrink,,,filtervar, -prop,,,,,propr,--cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --fixseed true --metric rho --permutation 100 --adjacency true,,,, -diff_grea,propd,--adjacency true --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --permutation 10 --fixseed true,grea,--permutation 10,,,,,, +pathway_name,diff_method,args_diff,cor_method,args_cor,enr_method,args_enr +propd,propd,--adjacency true --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --permutation 10,,,, +propd_noperm,propd,--cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --permutation 0,,,, +pcorbshrink,,,propr,--permutation 10 --adjacency true --cutoff_min 0.005 --cutoff_max 0.5 --cutoff_interval 0.01 --metric pcor.bshrink,, +propr,,,propr,--cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --metric rho --permutation 10 --adjacency true,, +propd_grea,propd,--adjacency true --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --permutation 10,,,grea,--permutation 10 From 3160a09bc5fcc61be43c54f33d427b1574943d5b Mon Sep 17 00:00:00 2001 From: suzannejin Date: Wed, 2 Oct 2024 14:14:14 +0200 Subject: [PATCH 062/154] formatting --- subworkflows/local/experimental/main.nf | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/subworkflows/local/experimental/main.nf b/subworkflows/local/experimental/main.nf index 3e2b2077..b2a6397b 100644 --- a/subworkflows/local/experimental/main.nf +++ b/subworkflows/local/experimental/main.nf @@ -50,6 +50,13 @@ workflow EXPERIMENTAL { ch_enriched_cor = ENRICHMENT.out.enriched_cor ch_enriched_diff = ENRICHMENT.out.enriched_diff + // ---------------------------------------------------- + // VISUALIZATION BLOCK + // ---------------------------------------------------- + + // TODO: add visualization stuff here + + // do we need to emit anything? emit: diff_res = ch_diff_results diff_adj = ch_diff_adjacency From c9b9482f64cc413e32ba096787bda3688987f042 Mon Sep 17 00:00:00 2001 From: suzannejin Date: Wed, 2 Oct 2024 15:04:27 +0200 Subject: [PATCH 063/154] remove trailing spaces --- subworkflows/local/differential/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/differential/main.nf b/subworkflows/local/differential/main.nf index 3e08e3ac..4422a6b9 100644 --- a/subworkflows/local/differential/main.nf +++ b/subworkflows/local/differential/main.nf @@ -51,7 +51,7 @@ workflow DIFFERENTIAL { // ---------------------------------------------------- // Perform differential analysis with DESeq2 // ---------------------------------------------------- - + // ToDo: In order to use deseq2 the downstream processes need to be updated to process the output correctly // if (params.transcript_length_matrix) { ch_transcript_lengths = Channel.of([ exp_meta, file(params.transcript_length_matrix, checkIfExists: true)]).first() } else { ch_transcript_lengths = [[],[]] } // if (params.control_features) { ch_control_features = Channel.of([ exp_meta, file(params.control_features, checkIfExists: true)]).first() } else { ch_control_features = [[],[]] } From fc95675effe05a86e180911f3eab83738d1f3990 Mon Sep 17 00:00:00 2001 From: suzannejin Date: Wed, 2 Oct 2024 17:29:03 +0200 Subject: [PATCH 064/154] updated schema_tools.json --- assets/schema_tools.json | 32 +++++++------------------------- 1 file changed, 7 insertions(+), 25 deletions(-) diff --git a/assets/schema_tools.json b/assets/schema_tools.json index 1820b94e..70e258f1 100644 --- a/assets/schema_tools.json +++ b/assets/schema_tools.json @@ -12,48 +12,30 @@ }, "diff_method": { "type": "string", - "errorMessage": "choose propd, DESeq2 or none", + "errorMessage": "choose a differential analysis method (eg. deseq2, propd, limme, etc) or none", "meta": ["diff_method"] }, "args_diff": { "type": "string", "meta": ["args_diff"] }, - "enr_diff_method": { - "type": "string", - "meta": ["enr_diff_method"], - "errorMessage": "choose grea, gsea or none" - }, - "args_enr_diff": { - "type": "string", - "meta": ["args_enr_diff"] - }, "cor_method": { "type": "string", "meta": ["cor_method"], - "errorMessage": "choose correlation,proportionality, partial correlation or none" + "errorMessage": "choose a correlation method (eg. propr) or none" }, "args_cor": { "type": "string", "meta": ["args_cor"] }, - "enr_cor_method": { - "type": "string", - "meta": ["enr_cor_method"], - "errorMessage": "choose grea or none" - }, - "args_enr_cor": { - "type": "string", - "meta": ["args_enr_cor"] - }, - "sel_method": { + "enr_method": { "type": "string", - "meta": ["sel_method"], - "errorMessage": "choose filtervar or none" + "meta": ["enr_method"], + "errorMessage": "choose a functional enrichment analysis method (eg. gsea, grea, gprofiler, etc) or none" }, - "args_sel": { + "args_enr": { "type": "string", - "meta": ["args_sel"] + "meta": ["args_enr"] } }, "required": [] From 7bc6ee8531d0138eef0de217ad85ad717ac4dac5 Mon Sep 17 00:00:00 2001 From: suzannejin Date: Wed, 2 Oct 2024 17:29:48 +0200 Subject: [PATCH 065/154] remove filtervar related modules and subworkflows. --- modules/local/filtervar/main.nf | 23 -- modules/local/filtervar/templates/filtervar.R | 275 ------------------ subworkflows/local/correlation/main.nf | 23 +- subworkflows/local/differential/main.nf | 7 +- subworkflows/local/enrichment/main.nf | 51 ++-- subworkflows/local/experimental/main.nf | 48 ++- subworkflows/local/variable_selection/main.nf | 34 --- 7 files changed, 68 insertions(+), 393 deletions(-) delete mode 100644 modules/local/filtervar/main.nf delete mode 100644 modules/local/filtervar/templates/filtervar.R delete mode 100644 subworkflows/local/variable_selection/main.nf diff --git a/modules/local/filtervar/main.nf b/modules/local/filtervar/main.nf deleted file mode 100644 index 5d9c39c8..00000000 --- a/modules/local/filtervar/main.nf +++ /dev/null @@ -1,23 +0,0 @@ -process FILTERVAR { - tag "$meta.id" - label 'process_single' - - conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/r-propr:5.0.3': - 'quay.io/biocontainers/r-propr:5.0.3' }" - - input: - tuple val(meta), path(count), path(adj_matrix) - - output: - tuple val(meta), path("*.count_filtered.tsv"), emit: count - path "*.R_sessionInfo.log", emit: session_info - path "versions.yml", emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - template 'filtervar.R' -} diff --git a/modules/local/filtervar/templates/filtervar.R b/modules/local/filtervar/templates/filtervar.R deleted file mode 100644 index 7b662626..00000000 --- a/modules/local/filtervar/templates/filtervar.R +++ /dev/null @@ -1,275 +0,0 @@ - - -#!/usr/bin/env Rscript - - -################################################ -################################################ -## Functions ## -################################################ -################################################ - -#' Parse out options from a string without recourse to optparse -#' -#' @param x Long-form argument list like --opt1 val1 --opt2 val2 -#' -#' @return named list of options and values similar to optparse - -parse_args <- function(x){ - args_list <- unlist(strsplit(x, ' ?--')[[1]])[-1] - args_vals <- lapply(args_list, function(x) scan(text=x, what='character', quiet = TRUE)) - - # Ensure the option vectors are length 2 (key/ value) to catch empty ones - args_vals <- lapply(args_vals, function(z){ length(z) <- 2; z}) - - parsed_args <- structure(lapply(args_vals, function(x) x[2]), names = lapply(args_vals, function(x) x[1])) - parsed_args[! is.na(parsed_args)] -} - -#' Flexibly read CSV or TSV files -#' -#' @param file Input file -#' @param header Boolean. TRUE if first row is header. False without header. -#' @param row.names The first column is used as row names by default. -#' Otherwise, give another number. Or use NULL when no row.names are present. -#' -#' @return output Data frame -read_delim_flexible <- function(file, header = TRUE, row.names = 1, check.names = TRUE){ - - ext <- tolower(tail(strsplit(basename(file), split = "\\\\.")[[1]], 1)) - - if (ext == "tsv" || ext == "txt") { - separator <- "\\t" - } else if (ext == "csv") { - separator <- "," - } else { - stop(paste("Unknown separator for", ext)) - } - - mat <- read.delim( - file, - sep = separator, - header = header, - row.names = row.names, - check.names = check.names - ) - - if ( (row.names == 'gene_id') & ('gene_name' %in% colnames(mat)) ){ - mat <- mat[, -which(colnames(mat) == 'gene_name')] - } else if ( (row.names == 'gene_name') & ('gene_id' %in% colnames(mat)) ){ - mat <- mat[, -which(colnames(mat) == 'gene_id')] - } - - return(mat) -} - -read_delim_flexible2 <- function(file, header = TRUE){ - - ext <- tolower(tail(strsplit(basename(file), split = "\\\\.")[[1]], 1)) - - if (ext == "tsv" || ext == "txt") { - separator <- "\\t" - } else if (ext == "csv") { - separator <- "," - } else { - stop(paste("Unknown separator for", ext)) - } - - mat <- read.delim( - file, - sep = separator, - header = header - ) - return(mat) -} - - - -################################################ -################################################ -## Parse arguments ## -################################################ -################################################ - -opt <- list( - count = '$count', - prefix = ifelse('$task.ext.prefix' == 'null', '$meta.pathway_name', '$task.ext.prefix'), - transformation = 'clr', - reference = NA, - alpha = NA, - metric = 'pcor.bshrink', - permutation = 0, - cutoff_min = NA, - cutoff_max = NA, - cutoff_interval = NA, - ncores = as.integer('$task.cpus'), - features_id_col = 'gene_id', - fixseed = FALSE, - adjacency = FALSE, - fdrVal = 0.05, - adj_matrix = '$adj_matrix', - filterVar = 'yes' -) -opt_types <- list( - count = 'character', - prefix = 'character', - transformation = 'character', - reference = 'character', - alpha = 'numeric', - metric = 'character', - permutation = 'numeric', - cutoff_min = 'numeric', - cutoff_max = 'numeric', - cutoff_interval = 'numeric', - ncores = 'numeric', - features_id_col = 'character', - fixseed = 'logical', - adjacency = 'logical', - fdrVal = 'numeric', - adj_matrix = 'character', - filterVar = 'character' -) - - -# Apply parameter overrides -args_opt <- parse_args('$task.ext.args') - -for ( ao in names(args_opt)){ - if (! ao %in% names(opt)){ - stop(paste("Invalid option:", ao)) - } else { - - # Preserve classes from defaults where possible - if (! is.null(opt[[ao]])){ - args_opt[[ao]] <- as(args_opt[[ao]], opt_types[[ao]]) - } - # set NA - if (args_opt[[ao]] %in% c('NA', NA, 'null')){ - args_opt[[ao]] <- NA - } - opt[[ao]] <- args_opt[[ao]] - } -} - -# Check if required parameters have been provided -required_opts <- c('count') -missing <- required_opts[unlist(lapply(opt[required_opts], is.null)) | ! required_opts %in% names(opt)] -if (length(missing) > 0){ - stop(paste("Missing required options:", paste(missing, collapse=', '))) -} - -################################################ -################################################ -## Perform variable selection ## -################################################ -################################################ - -# read matrix -A <- read_delim_flexible( - opt\$adj_matrix, - header = TRUE, - row.names = 1, - check.names = TRUE -) - -count <- read_delim_flexible2( - opt\$count, - header = TRUE -) - -### Determine most differentially proportional genes - -# Set diagonal in A to 0 -diag(A) <- 0 - -# Sum values in adjacency and add as an extra column -per_gene_connection <- rowSums(A) - -A\$per_gene <- per_gene_connection - -A <- A[order(A\$per_gene, decreasing = TRUE),] - -# Define selection criteria - -max_gene_number <- ncol(count)*10 # 10x samples for technical reasons (pcor) - -#Calculate connection threshold -total_connections <- sum(per_gene_connection)/2 # 2 because the matrix is symmetric -possible_connections <- nrow(count)*(nrow(count)-1)/2 - -percentage_expected <- total_connections/possible_connections -connection_threshold <- percentage_expected * nrow(count) - -# Filter count matrix according to selected genes - -col_genes <- which(names(count) == opt\$features_id_col) - -if (opt\$filterVar == 'yes'){ - # select only differentially proportional genes - top_genes <- rownames(A[which(A\$per_gene > connection_threshold),]) - count_filtered <- count[count[,col_genes] %in% top_genes,] - warning("non differentially proportional genes were removed before correlation analysis") - -} else if (max_gene_number < nrow(count) & opt\$metric== 'pcor.bshrink'){ - # select the maximum number of genes to perform partial correlation - top_genes <- rownames(A[1:gene_number,]) - count_filtered <- count[count[,col_genes] %in% top_genes,] - warning("some genes were removed to perform partial correlation") - -}else{ - # no genes were removed - count_filtered <- count - warning("No genes were removed") -} - - -################################################ -################################################ -## Generate outputs ## -################################################ -################################################ - -write.table( - count_filtered, - file = paste0(opt\$prefix, '.count_filtered.tsv'), - col.names = TRUE, - row.names = FALSE, - sep = '\t', - quote = FALSE -) - -################################################ -################################################ -## WARNINGS ## -################################################ -################################################ - -sink(paste0(opt\$prefix, ".warnings.log")) -print(warnings()) -sink() - -################################################ -################################################ -## R SESSION INFO ## -################################################ -################################################ - -sink(paste0(opt\$prefix, ".R_sessionInfo.log")) -print(sessionInfo()) -sink() - -################################################ -################################################ -## VERSIONS FILE ## -################################################ -################################################ - -propr.version <- as.character(packageVersion('propr')) - -writeLines( - c( - '"${task.process}":', - paste(' r-propr:', propr.version) - ), -'versions.yml') - diff --git a/subworkflows/local/correlation/main.nf b/subworkflows/local/correlation/main.nf index a19287ae..1f7e5e18 100644 --- a/subworkflows/local/correlation/main.nf +++ b/subworkflows/local/correlation/main.nf @@ -5,8 +5,8 @@ include {PROPR_PROPR as PROPR} from "../../../modules/nf-core/propr/propr/main.n workflow CORRELATION { take: - ch_counts ch_tools + ch_counts main: @@ -15,25 +15,30 @@ workflow CORRELATION { ch_adjacency = Channel.empty() // branch tools to select the correct correlation analysis method - ch_counts - .combine(ch_tools) - .map { - metacounts, counts, metatools -> - [ metacounts+metatools, counts ] - } + ch_tools .branch { propr: it[0]["cor_method"] == "propr" } - .set { ch_counts_cor } + .set { ch_tools_single } // ---------------------------------------------------- // Perform correlation analysis with propr // ---------------------------------------------------- - PROPR(ch_counts_cor.propr) + ch_counts + .combine(ch_tools_single.propr) + .map { + metacounts, counts, metatools -> + [ metacounts+metatools, counts ] + } + .set { ch_counts_propr } + + PROPR(ch_counts_propr) ch_matrix = PROPR.out.matrix ch_adjacency = PROPR.out.adj + // TODO: divide propr module into cor, propr, pcor, pcorbshrink, etc. + emit: matrix = ch_matrix adjacency = ch_adjacency diff --git a/subworkflows/local/differential/main.nf b/subworkflows/local/differential/main.nf index 4422a6b9..39476eac 100644 --- a/subworkflows/local/differential/main.nf +++ b/subworkflows/local/differential/main.nf @@ -6,10 +6,10 @@ include { DESEQ2_DIFFERENTIAL } from '../../../modules/nf-core/deseq2/different workflow DIFFERENTIAL { take: - ch_contrasts // [meta, contrast_variable, reference, target] - ch_samplesheet - ch_counts ch_tools + ch_counts + ch_samplesheet + ch_contrasts // [meta, contrast_variable, reference, target] main: @@ -74,4 +74,5 @@ workflow DIFFERENTIAL { emit: results = ch_results adjacency = ch_adjacency + // TODO add filtered results channel } diff --git a/subworkflows/local/enrichment/main.nf b/subworkflows/local/enrichment/main.nf index 4f3ae992..20256343 100644 --- a/subworkflows/local/enrichment/main.nf +++ b/subworkflows/local/enrichment/main.nf @@ -1,43 +1,46 @@ // // Perform enrichment analysis // -include { PROPR_GREA as GREA_DIFF } from "../../../modules/nf-core/propr/grea/main.nf" -include { PROPR_GREA as GREA_COR } from "../../../modules/nf-core/propr/grea/main.nf" include { MYGENE } from "../../../modules/nf-core/mygene/main.nf" +include { PROPR_GREA as GREA } from "../../../modules/nf-core/propr/grea/main.nf" workflow ENRICHMENT { take: - ch_diff_adjacency - ch_cor_adjacency ch_counts + ch_results + ch_adjacency + // TODO: add ch_gm when provided by user, etc. main: - MYGENE(ch_counts) - ch_gmt = MYGENE.out.gmt + // initialize empty results channels + ch_enriched = Channel.empty() + + // ---------------------------------------------------- + // Perform enrichment analysis with GREA + // ---------------------------------------------------- - ch_diff_adjacency - .branch { - grea: it[0]["enr_diff_method"] == "grea" - gsea: it[0]["enr_diff_method"] == "gsea" - } - .set { ch_diff_grea } + // construct the gene set selection + // TODO this should be optional, only run when there is no gene set data provided by user + MYGENE(ch_counts) + ch_gmt = MYGENE.out.gmt - GREA_DIFF(ch_diff_grea.grea, ch_gmt.collect()) - ch_enriched_diff = GREA_DIFF.out.enrichedGO + // GREA method needs adjacency matrix as input + ch_adjacency + .filter { it[0]["enr_method"] == "grea" } + .set { ch_adjacency_grea } - ch_cor_adjacency - .branch { - grea: it[0]["enr_cor_method"] == "grea" } - .set { ch_cor_grea } + // run GREA + GREA(ch_adjacency_grea, ch_gmt.collect()) + ch_enriched = ch_enriched.mix(GREA.out.enrichedGO) - ch_cor_grea.grea.view() - ch_diff_grea.grea.view() + // ---------------------------------------------------- + // Perform enrichment analysis with GSEA + // ---------------------------------------------------- - GREA_COR(ch_cor_grea.grea, ch_gmt.collect()) - ch_enriched_cor = GREA_COR.out.enrichedGO + // todo: add gsea here + // then we need to add the corresponding input channels to this subworkflow emit: - enriched_diff = ch_enriched_diff - enriched_cor = ch_enriched_cor + enriched = ch_enriched } diff --git a/subworkflows/local/experimental/main.nf b/subworkflows/local/experimental/main.nf index b2a6397b..7cc968a3 100644 --- a/subworkflows/local/experimental/main.nf +++ b/subworkflows/local/experimental/main.nf @@ -1,8 +1,8 @@ // // Run experimental analysis // -include { CORRELATION } from '../correlation/main.nf' include { DIFFERENTIAL } from '../differential/main.nf' +include { CORRELATION } from '../correlation/main.nf' include { ENRICHMENT } from '../enrichment/main.nf' workflow EXPERIMENTAL { @@ -14,54 +14,52 @@ workflow EXPERIMENTAL { main: + ch_tools.view() + + // initialize empty results channels + ch_results = Channel.empty() // differential results - it should be a table + ch_adjacency = Channel.empty() // adjacency matrix showing the connections between the genes, with values 1|0 + ch_matrix = Channel.empty() // correlation matrix + ch_enriched = Channel.empty() // output table from enrichment analysis + // ---------------------------------------------------- // DIFFERENTIAL ANALYSIS BLOCK // ---------------------------------------------------- DIFFERENTIAL( - ch_contrasts, - ch_samplesheet, + ch_tools, ch_counts, - ch_tools + ch_samplesheet, + ch_contrasts ) - ch_diff_results = DIFFERENTIAL.out.results - ch_diff_adjacency = DIFFERENTIAL.out.adjacency + ch_results = ch_results.mix(DIFFERENTIAL.out.results) + ch_adjacency = ch_adjacency.mix(DIFFERENTIAL.out.adjacency) // ---------------------------------------------------- // CORRELATION ANALYSIS BLOCK // ---------------------------------------------------- CORRELATION( - ch_counts, - ch_tools + ch_tools, + ch_counts ) - ch_corr_matrix = CORRELATION.out.matrix - ch_corr_adjacency = CORRELATION.out.adjacency + ch_matrix = ch_matrix.mix(CORRELATION.out.matrix) + ch_adjacency = ch_adjacency.mix(CORRELATION.out.adjacency) // ---------------------------------------------------- // FUNCTIONAL ENRICHMENT BLOCK // ---------------------------------------------------- ENRICHMENT( - ch_diff_adjacency, - ch_corr_adjacency, - ch_counts + ch_counts, + ch_results, + ch_adjacency ) - ch_enriched_cor = ENRICHMENT.out.enriched_cor - ch_enriched_diff = ENRICHMENT.out.enriched_diff + ch_enriched = ch_enriched.mix(ENRICHMENT.out.enriched) // ---------------------------------------------------- // VISUALIZATION BLOCK // ---------------------------------------------------- - // TODO: add visualization stuff here - - // do we need to emit anything? - emit: - diff_res = ch_diff_results - diff_adj = ch_diff_adjacency - corr_matrix = ch_corr_matrix - corr_adj = ch_corr_adjacency - enriched_cor = ch_enriched_cor - enriched_cor = ch_enriched_diff + // TODO: call visualization stuff here } diff --git a/subworkflows/local/variable_selection/main.nf b/subworkflows/local/variable_selection/main.nf deleted file mode 100644 index 22b35527..00000000 --- a/subworkflows/local/variable_selection/main.nf +++ /dev/null @@ -1,34 +0,0 @@ -// -// Perform variable selection -// -include { FILTERVAR } from "../../../modules/local/filtervar/main.nf" - -workflow VARIABLE_SELECTION { - take: - ch_adj //meta_tools, adj - ch_counts //meta_id, counts - - main: - ch_counts - .map { - metacounts, counts -> - [counts] - } - .combine(ch_adj) - .map{ - counts, meta, adj -> - [ meta, counts, adj] - } - .branch { - filtervar: it[0]["sel_method"] == "filtervar" - deseqfilter: it[0]["sel_method"] == "deseqfilter" - } - .set { ch_counts_adj_sel } - - FILTERVAR(ch_counts_adj_sel.filtervar) - - ch_counts_cor = FILTERVAR.out.count - - emit: - count = ch_counts_cor -} From 283385a1351007bdca08ae8ca168fee9782be5a0 Mon Sep 17 00:00:00 2001 From: suzannejin Date: Thu, 3 Oct 2024 11:57:32 +0200 Subject: [PATCH 066/154] updated modules.config with the correct nomenclature for grea --- conf/modules.config | 24 +++--------------------- 1 file changed, 3 insertions(+), 21 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 5d987f51..a0ce2938 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -499,33 +499,15 @@ process { ] } - withName: "FILTERVAR"{ - ext.args = { "${meta.args_cor}" == "null" ? '' : "${meta.args_cor}" } - publishDir = [ - path: { "${params.outdir}/variable_selection/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: "GREA_DIFF"{ - ext.args = { "${meta.args_enr_diff}" == "null" ? '' : "${meta.args_enr_diff}" } + withName: "GREA"{ + ext.args = { "${meta.args_enr}" == "null" ? '' : "${meta.args_enr}" } publishDir = [ path: { "${params.outdir}/enrichment_differential/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - - withName: "GREA_COR"{ - ext.args = { "${meta.args_enr_cor}" == "null" ? '' : "${meta.args_enr_cor}" } - publishDir = [ - path: { "${params.outdir}/enrichment_correlation/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - + withName: "MYGENE" { ext.args = { [ "--columname ${params.features_id_col}", From aac7085fe3e958fb0b4e95894bbe924299fd5a06 Mon Sep 17 00:00:00 2001 From: suzannejin Date: Mon, 7 Oct 2024 19:23:38 +0200 Subject: [PATCH 067/154] added new version propd --- assets/tools_samplesheet.csv | 6 +- modules.json | 107 +++-- modules/local/propr/propd/main.nf | 33 ++ modules/local/propr/propd/templates/propd.R | 382 ++++++++++++++++++ modules/nf-core/propr/propd/environment.yml | 7 - modules/nf-core/propr/propd/main.nf | 28 -- modules/nf-core/propr/propd/meta.yml | 76 ---- modules/nf-core/propr/propd/templates/propd.R | 372 ----------------- .../propr/propd/tests/adjacency.config | 3 - .../propr/propd/tests/boxcox_theta_e.config | 4 - .../propr/propd/tests/default_boxcox.config | 4 - .../propd/tests/default_permutation.config | 4 - .../nf-core/propr/propd/tests/main.nf.test | 154 ------- .../propr/propd/tests/main.nf.test.snap | 133 ------ modules/nf-core/propr/propd/tests/tags.yml | 2 - .../nf-core/propr/propd/tests/theta_e.config | 4 - subworkflows/local/differential/main.nf | 23 +- subworkflows/local/enrichment/main.nf | 22 +- subworkflows/local/experimental/main.nf | 20 +- 19 files changed, 538 insertions(+), 846 deletions(-) create mode 100644 modules/local/propr/propd/main.nf create mode 100644 modules/local/propr/propd/templates/propd.R delete mode 100644 modules/nf-core/propr/propd/environment.yml delete mode 100644 modules/nf-core/propr/propd/main.nf delete mode 100644 modules/nf-core/propr/propd/meta.yml delete mode 100644 modules/nf-core/propr/propd/templates/propd.R delete mode 100644 modules/nf-core/propr/propd/tests/adjacency.config delete mode 100755 modules/nf-core/propr/propd/tests/boxcox_theta_e.config delete mode 100755 modules/nf-core/propr/propd/tests/default_boxcox.config delete mode 100755 modules/nf-core/propr/propd/tests/default_permutation.config delete mode 100755 modules/nf-core/propr/propd/tests/main.nf.test delete mode 100644 modules/nf-core/propr/propd/tests/main.nf.test.snap delete mode 100755 modules/nf-core/propr/propd/tests/tags.yml delete mode 100755 modules/nf-core/propr/propd/tests/theta_e.config diff --git a/assets/tools_samplesheet.csv b/assets/tools_samplesheet.csv index c5ef3831..a2c2230e 100644 --- a/assets/tools_samplesheet.csv +++ b/assets/tools_samplesheet.csv @@ -1,6 +1,6 @@ pathway_name,diff_method,args_diff,cor_method,args_cor,enr_method,args_enr -propd,propd,--adjacency true --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --permutation 10,,,, -propd_noperm,propd,--cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --permutation 0,,,, +propd,propd,,,,, +propd_fdr,propd,--permutation 100,,,, pcorbshrink,,,propr,--permutation 10 --adjacency true --cutoff_min 0.005 --cutoff_max 0.5 --cutoff_interval 0.01 --metric pcor.bshrink,, propr,,,propr,--cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --metric rho --permutation 10 --adjacency true,, -propd_grea,propd,--adjacency true --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --permutation 10,,,grea,--permutation 10 +propd_grea,propd,,,,grea,--permutation 10 diff --git a/modules.json b/modules.json index e2481610..95ee8c26 100644 --- a/modules.json +++ b/modules.json @@ -8,117 +8,156 @@ "affy/justrma": { "branch": "master", "git_sha": "02a65e8871e06bac203dec16985fa3de648c99b6", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "atlasgeneannotationmanipulation/gtf2featureannotation": { "branch": "master", "git_sha": "04bc484c987b523ea5420ed6bbc1fdc6d8aef751", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "custom/matrixfilter": { "branch": "master", "git_sha": "285a50500f9e02578d90b3ce6382ea3c30216acd", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "custom/tabulartogseacls": { "branch": "master", "git_sha": "b7ebe95761cd389603f9cc0e0dc384c0f663815a", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "custom/tabulartogseagct": { "branch": "master", "git_sha": "516189e968feb4ebdd9921806988b4c12b4ac2dc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "deseq2/differential": { "branch": "master", "git_sha": "9326d73af3fbe2ee90d9ce0a737461a727c5118e", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "geoquery/getgeo": { "branch": "master", "git_sha": "516189e968feb4ebdd9921806988b4c12b4ac2dc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gprofiler2/gost": { "branch": "master", "git_sha": "c75e76bff35e2ee5305ebe89b513637b38e79d1d", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gsea/gsea": { "branch": "master", "git_sha": "7aa7ced253469386f0645133ec3e838098dbe67c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gunzip": { "branch": "master", "git_sha": "516189e968feb4ebdd9921806988b4c12b4ac2dc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "limma/differential": { "branch": "master", "git_sha": "9326d73af3fbe2ee90d9ce0a737461a727c5118e", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "mygene": { "branch": "master", "git_sha": "82024cf6325d2ee194e7f056d841ecad2f6856e9", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "propr/grea": { "branch": "master", "git_sha": "71b1180a5a3de6398eb0eb4d55424cbda36f52d8", - "installed_by": ["modules"] - }, - "propr/propd": { - "branch": "master", - "git_sha": "08b360512467e8e7079f995bb7c981a7c204d00f", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "propr/propr": { "branch": "master", "git_sha": "132fa6c9bd2515807f6a1cdec1ad7d03c817bcc9", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "proteus/readproteingroups": { "branch": "master", "git_sha": "a069b29783583c219c1f23ed3dcf64a5aee1340b", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "rmarkdownnotebook": { "branch": "master", "git_sha": "516189e968feb4ebdd9921806988b4c12b4ac2dc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "shinyngs/app": { "branch": "master", "git_sha": "91fc36585a50f9bae98cb5b3dff36ce64c83a6b4", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "shinyngs/staticdifferential": { "branch": "master", "git_sha": "91fc36585a50f9bae98cb5b3dff36ce64c83a6b4", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "shinyngs/staticexploratory": { "branch": "master", "git_sha": "91fc36585a50f9bae98cb5b3dff36ce64c83a6b4", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "shinyngs/validatefomcomponents": { "branch": "master", "git_sha": "91fc36585a50f9bae98cb5b3dff36ce64c83a6b4", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "untar": { "branch": "master", "git_sha": "516189e968feb4ebdd9921806988b4c12b4ac2dc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "zip": { "branch": "master", "git_sha": "516189e968feb4ebdd9921806988b4c12b4ac2dc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] } } }, @@ -127,20 +166,26 @@ "utils_nextflow_pipeline": { "branch": "master", "git_sha": "5caf7640a9ef1d18d765d55339be751bb0969dfa", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nfcore_pipeline": { "branch": "master", "git_sha": "92de218a329bfc9a9033116eb5f65fd270e72ba3", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nfvalidation_plugin": { "branch": "master", "git_sha": "5caf7640a9ef1d18d765d55339be751bb0969dfa", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] } } } } } -} +} \ No newline at end of file diff --git a/modules/local/propr/propd/main.nf b/modules/local/propr/propd/main.nf new file mode 100644 index 00000000..4f18943a --- /dev/null +++ b/modules/local/propr/propd/main.nf @@ -0,0 +1,33 @@ +process PROPR_PROPD { + 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/r-propr:5.0.3': + // 'biocontainers/r-propr:5.0.3' }" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mulled-v2-401a215d4024df776a98d90a352048199e342a3d:5ba9bbf6cd4f4f98983526673c223d2e7d829b36-0': + 'biocontainers/mulled-v2-401a215d4024df776a98d90a352048199e342a3d:5ba9bbf6cd4f4f98983526673c223d2e7d829b36-0' }" + + input: + tuple val(meta), path(count) + tuple val(meta2), path(samplesheet) + + output: + tuple val(meta), path("*.propd.rds") , emit: rds + tuple val(meta), path("*.propd.results.tsv") , emit: results + tuple val(meta), path("*.propd.results_filtered.tsv"), emit: results_filtered + tuple val(meta), path("*.propd.adjacency.csv") , emit: adjacency + tuple val(meta), path("*.propd.hub_genes.tsv") , emit: hub_genes + tuple val(meta), path("*.propd.fdr.tsv") , emit: fdr , optional: true + path "*.warnings.log" , emit: warnings + path "*.R_sessionInfo.log" , emit: session_info + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + template 'propd.R' +} \ No newline at end of file diff --git a/modules/local/propr/propd/templates/propd.R b/modules/local/propr/propd/templates/propd.R new file mode 100644 index 00000000..6b523299 --- /dev/null +++ b/modules/local/propr/propd/templates/propd.R @@ -0,0 +1,382 @@ +#!/usr/bin/env Rscript + + +################################################ +################################################ +## Functions ## +################################################ +################################################ + +#' Parse out options from a string without recourse to optparse +#' +#' @param x Long-form argument list like --opt1 val1 --opt2 val2 +#' +#' @return named list of options and values similar to optparse +parse_args <- function(x){ + args_list <- unlist(strsplit(x, ' ?--')[[1]])[-1] + args_vals <- lapply(args_list, function(x) scan(text=x, what='character', quiet = TRUE)) + + # Ensure the option vectors are length 2 (key/ value) to catch empty ones + args_vals <- lapply(args_vals, function(z){ length(z) <- 2; z}) + + parsed_args <- structure(lapply(args_vals, function(x) x[2]), names = lapply(args_vals, function(x) x[1])) + parsed_args[! is.na(parsed_args)] +} + +#' Flexibly read CSV or TSV files +#' +#' @param file Input file +#' @param header Boolean. TRUE if first row is header. False without header. +#' @param row.names The first column is used as row names by default. +#' Otherwise, give another number. Or use NULL when no row.names are present. +#' +#' @return output Data frame +read_delim_flexible <- function(file, header = TRUE, row.names = 1, check.names = TRUE){ + + ext <- tolower(tail(strsplit(basename(file), split = "\\\\.")[[1]], 1)) + + if (ext == "tsv" || ext == "txt") { + separator <- "\\t" + } else if (ext == "csv") { + separator <- "," + } else { + stop(paste("Unknown separator for", ext)) + } + + mat <- read.delim( + file, + sep = separator, + header = header, + row.names = row.names, + check.names = check.names + ) +} + +#' Get hub genes from adjacency matrix +#' +#' Here hub genes are those that have a degree higher than the expected degree. +# The expected degree is the number of connections that each gene would have +#' if the connections were distributed uniformly. In other words, the average +#' degree by node. +#' +#' @param adj Adjacency matrix +#' +#' @return data frame with hub genes +get_hub_genes_from_adjacency <- function(adj){ + + # get the expected degree + degree_per_gene <- rowSums(adj) + total_degree <- sum(degree_per_gene) + n_nodes <- sum(degree_per_gene > 0) + expected_degree <- total_degree / n_nodes + + # get hub genes + hub_genes = degree_per_gene[degree_per_gene > expected_degree] + hub_genes = data.frame( + 'feature' = names(hub_genes), + 'degree' = as.numeric(hub_genes) + ) + names(hub_genes) <- c(opt\$features_id_col, 'degree') + hub_genes <- hub_genes[order(hub_genes\$degree, decreasing=TRUE),] + + return(hub_genes) +} + +################################################ +################################################ +## Parse arguments ## +################################################ +################################################ + +# Set defaults and classes + +opt <- list( + prefix = ifelse('$task.ext.prefix' == 'null', '$meta.id', '$task.ext.prefix'), + count = '$count', + samplesheet = '$samplesheet', + features_id_col = 'gene_id', # column name of feature ids + obs_id_col = 'sample', # column name of observation ids + group_col = 'treatment', # column name of grouping variable + alpha = NA, # alpha for boxcox transformation + moderated = TRUE, # use moderated theta + fdr = 0.05, # FDR threshold + permutation = 0, # if permutation > 0, use permutation test to compute FDR + number_of_cutoffs = 100, # number of cutoffs for permutation test + seed = NA, # seed for reproducibility + ncores = as.integer('$task.cpus') +) +opt_types <- list( + prefix = 'character', + count = 'character', + samplesheet = 'character', + features_id_col = 'character', + obs_id_col = 'character', + group_col = 'character', + alpha = 'numeric', + moderated = 'logical', + fdr = 'numeric', + permutation = 'numeric', + number_of_cutoffs = 'numeric', + seed = 'numeric', + ncores = 'numeric' +) + +# Apply parameter overrides + +args_opt <- parse_args('$task.ext.args') +for ( ao in names(args_opt)){ + if (! ao %in% names(opt)){ + stop(paste("Invalid option:", ao)) + } else { + + # Preserve classes from defaults where possible + args_opt[[ao]] <- as(args_opt[[ao]], opt_types[[ao]]) + + # handle NA, and avoid errors when NA is provided by user as character + if (args_opt[[ao]] %in% c('NA', NA)) args_opt[[ao]] <- NA + + # replace values + opt[[ao]] <- args_opt[[ao]] + } +} + +# Check if required parameters have been provided + +required_opts <- c('count','samplesheet') +missing <- required_opts[unlist(lapply(opt[required_opts], is.null)) | ! required_opts %in% names(opt)] +if (length(missing) > 0){ + stop(paste("Missing required options:", paste(missing, collapse=', '))) +} + +# Check file inputs are valid + +for (file_input in c('count','samplesheet')){ + if (is.null(opt[[file_input]])) { + stop(paste("Please provide", file_input), call. = FALSE) + } + if (! file.exists(opt[[file_input]])){ + stop(paste0('Value of ', file_input, ': ', opt[[file_input]], ' is not a valid file')) + } +} + +print(opt) + +################################################ +################################################ +## Finish loading libraries ## +################################################ +################################################ + +library(propr) + +################################################ +################################################ +## Perform differential proportionality ## +################################################ +################################################ + +# set seed when required + +if (!is.na(opt\$seed)) set.seed(opt\$seed) + +# read matrix + +mat <- read_delim_flexible( + opt\$count, + header = TRUE, + row.names = opt\$features_id_col, + check.names = FALSE +) +mat <- t(mat) # transpose matrix to have features (genes) as columns + +# parse group +# this creates a vector referring to the group id for each observation +# TODO one can parse the 'group_col' from the contrast file information as the other modules + +samplesheet <- read_delim_flexible( + opt\$samplesheet, + header = TRUE, + row.names = NULL, + check.names = FALSE +) +tmp <- samplesheet[[opt\$group_col]] +names(tmp) <- samplesheet[[opt\$obs_id_col]] +group <- as.vector(tmp[rownames(mat)]) +if (length(group) != nrow(mat)) stop('Error when parsing group') + +# compute differential proportionality + +pd <- propd( + mat, + group = group, + alpha = opt\$alpha, + weighted = FALSE, + p = opt\$permutation +) + +if (opt\$permutation == 0) { + + # update FDR-adjusted p-values + + pd <- updateF( + pd, + moderated = opt\$moderated + ) + if (opt\$moderated) pd <- setActive(pd, what='theta_mod') + + # get adjacency matrix + + adj <- getAdjacencyFstat( + pd, + pval=opt\$fdr, + fdr_adjusted=TRUE + ) + + # get hub genes + + hub_genes <- get_hub_genes_from_adjacency(adj) + + # get significant results and classify pairs + + results <- getSignificantResultsFstat( + pd, + pval=opt\$fdr, + fdr_adjusted=TRUE + ) + results <- results[,c("Partner", "Pair", "theta")] + results\$class <- "red" + results\$class[which(results\$Pair %in% hub_genes\$gene | results\$Partner %in% hub_genes\$gene)] <- "yellow" + results\$class[which(results\$Pair %in% hub_genes\$gene & results\$Partner %in% hub_genes\$gene)] <- "green" + +} else { + + # update FDR values using permutation tests + + pd <- updateCutoffs( + pd, + number_of_cutoffs = 100, + ncores = opt\$ncores + ) + + # TODO take top pairs when no cutoff has FDR below desired threshold + # get adjacency matrix + + adj <- getAdjacencyFDR( + pd, + fdr=opt\$fdr, + window_size=1 + ) + + # get hub genes + + hub_genes <- get_hub_genes_from_adjacency(adj) + + # get significant results and classify pairs + + results <- getSignificantResultsFDR( + pd, + fdr=opt\$fdr, + window_size=1 + ) + results <- results[,c("Partner", "Pair", "theta")] + results\$class <- "red" + results\$class[which(results\$Pair %in% hub_genes\$gene | results\$Partner %in% hub_genes\$gene)] <- "yellow" + results\$class[which(results\$Pair %in% hub_genes\$gene & results\$Partner %in% hub_genes\$gene)] <- "green" +} + +################################################ +################################################ +## Generate outputs ## +################################################ +################################################ + +saveRDS( + pd, + file = paste0(opt\$prefix, '.propd.rds') +) + +write.table( + getResults(pd), + file = paste0(opt\$prefix, '.propd.results.tsv'), + col.names = TRUE, + row.names = FALSE, + sep = '\\t', + quote = FALSE +) + +write.table( + results, + file = paste0(opt\$prefix, '.propd.results_filtered.tsv'), + col.names = TRUE, + row.names = FALSE, + sep = '\\t', + quote = FALSE +) + +write.table( + adj, + file = paste0(opt\$prefix, '.propd.adjacency.csv'), + col.names = TRUE, + row.names = TRUE, + sep = ',', + quote = FALSE +) + +write.table( + hub_genes, + file = paste0(opt\$prefix, '.propd.hub_genes.tsv'), + col.names = TRUE, + row.names = FALSE, + sep = '\\t', + quote = FALSE +) + +if (opt\$permutation > 0) { + write.table( + pd@fdr, + file = paste0(opt\$prefix, '.propd.fdr.tsv'), + col.names = TRUE, + sep = '\\t', + quote = FALSE + ) +} + +################################################ +################################################ +## WARNINGS ## +################################################ +################################################ + +sink(paste0(opt\$prefix, ".warnings.log")) +print(warnings()) +sink() + +################################################ +################################################ +## R SESSION INFO ## +################################################ +################################################ + +sink(paste0(opt\$prefix, ".R_sessionInfo.log")) +print(sessionInfo()) +sink() + +################################################ +################################################ +## VERSIONS FILE ## +################################################ +################################################ + +propr.version <- as.character(packageVersion('propr')) + +writeLines( + c( + '"${task.process}":', + paste(' r-propr:', propr.version) + ), +'versions.yml') + +################################################ +################################################ +################################################ +################################################ \ No newline at end of file diff --git a/modules/nf-core/propr/propd/environment.yml b/modules/nf-core/propr/propd/environment.yml deleted file mode 100644 index 058f30a0..00000000 --- a/modules/nf-core/propr/propd/environment.yml +++ /dev/null @@ -1,7 +0,0 @@ -name: propr_propd -channels: - - conda-forge - - bioconda - - defaults -dependencies: - - conda-forge::r-propr=5.0.3 diff --git a/modules/nf-core/propr/propd/main.nf b/modules/nf-core/propr/propd/main.nf deleted file mode 100644 index ba7727d0..00000000 --- a/modules/nf-core/propr/propd/main.nf +++ /dev/null @@ -1,28 +0,0 @@ -process PROPR_PROPD { - 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/r-propr:5.0.3': - 'biocontainers/r-propr:5.0.3' }" - - input: - tuple val(meta), path(count) - tuple val(meta2), path(samplesheet) - - output: - tuple val(meta), path("*.propd.rds"), emit: propd - tuple val(meta), path("*.propd.tsv"), emit: results - tuple val(meta), path("*.fdr.tsv") , emit: fdr , optional:true - tuple val(meta), path("*.adj.csv"), emit: adj , optional:true - path "*.warnings.log", emit: warnings - path "*.R_sessionInfo.log" , emit: session_info - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - template 'propd.R' -} diff --git a/modules/nf-core/propr/propd/meta.yml b/modules/nf-core/propr/propd/meta.yml deleted file mode 100644 index 7dcb4625..00000000 --- a/modules/nf-core/propr/propd/meta.yml +++ /dev/null @@ -1,76 +0,0 @@ -name: "propr_propd" -description: Perform differential proportionality analysis -keywords: - - differential - - proportionality - - logratio - - expression - - propr -tools: - - "propr": - description: "Logratio methods for omics data" - homepage: "https://github.com/tpq/propr" - documentation: "https://rdrr.io/cran/propr/man/propr.html" - tool_dev_url: "https://github.com/tpq/propr" - doi: "10.1038/s41598-017-16520-0" - licence: ["GPL-2"] -input: - - meta: - type: map - description: | - Groovy Map containing additional information. - This can be used at the workflow level to pass optional parameters to the module. - [id: 'test', ...] - - count: - type: file - description: | - Count matrix, where rows = variables or genes, columns = samples or cells. - This matrix should not contain zeros. One should plug this module after another one that handles the zeros. - pattern: "*.{csv,tsv}" - - meta2: - type: map - description: | - Groovy map containing study-wide metadata related to the sample sheet and matrix - - samplesheet: - type: file - description: | - CSV or TSV format sample sheet with sample metadata -output: - - meta: - type: map - description: | - Groovy Map containing additional information. - This can be used at the workflow level to pass optional parameters to the module. - [id: 'test', ...] - - propd: - type: file - description: R propd object - pattern: "*.propd.rds" - - results: - type: file - description: Results table - pattern: "*.propd.tsv" - - fdr: - type: file - description: (optional) propd fdr table - pattern: "*.fdr.tsv" - - adj: - type: file - description: (optional) propd adj table - pattern: "*.adj.csv" - - warnings: - type: file - description: propd warnings - pattern: "*.warnings.txt" - - session_info: - type: file - description: dump of R SessionInfo - pattern: "*.R_sessionInfo.log" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" -authors: - - "@suzannejin" -maintainers: - - "@suzannejin" diff --git a/modules/nf-core/propr/propd/templates/propd.R b/modules/nf-core/propr/propd/templates/propd.R deleted file mode 100644 index 63dbed49..00000000 --- a/modules/nf-core/propr/propd/templates/propd.R +++ /dev/null @@ -1,372 +0,0 @@ -#!/usr/bin/env Rscript - - -################################################ -################################################ -## Functions ## -################################################ -################################################ - -#' Parse out options from a string without recourse to optparse -#' -#' @param x Long-form argument list like --opt1 val1 --opt2 val2 -#' -#' @return named list of options and values similar to optparse - -parse_args <- function(x){ - args_list <- unlist(strsplit(x, ' ?--')[[1]])[-1] - args_vals <- lapply(args_list, function(x) scan(text=x, what='character', quiet = TRUE)) - - # Ensure the option vectors are length 2 (key/ value) to catch empty ones - args_vals <- lapply(args_vals, function(z){ length(z) <- 2; z}) - - parsed_args <- structure(lapply(args_vals, function(x) x[2]), names = lapply(args_vals, function(x) x[1])) - parsed_args[! is.na(parsed_args)] -} - -#' Flexibly read CSV or TSV files -#' -#' @param file Input file -#' @param header Boolean. TRUE if first row is header. False without header. -#' @param row.names The first column is used as row names by default. -#' Otherwise, give another number. Or use NULL when no row.names are present. -#' -#' @return output Data frame -read_delim_flexible <- function(file, header = TRUE, row.names = 1, check.names = TRUE){ - - ext <- tolower(tail(strsplit(basename(file), split = "\\\\.")[[1]], 1)) - - if (ext == "tsv" || ext == "txt") { - separator <- "\\t" - } else if (ext == "csv") { - separator <- "," - } else { - stop(paste("Unknown separator for", ext)) - } - - mat <- read.delim( - file, - sep = separator, - header = header, - row.names = row.names, - check.names = check.names - ) - - if (!is.null(row.names)){ - if ( (row.names == 'gene_id') & ('gene_name' %in% colnames(mat)) ){ - mat <- mat[, -which(colnames(mat) == 'gene_name')] - } else if ( (row.names == 'gene_name') & ('gene_id' %in% colnames(mat)) ){ - mat <- mat[, -which(colnames(mat) == 'gene_id')] - } - } - - return(mat) -} - -#' Extract the values for a single metric and convert it into a genes x genes matrix. -#' -#' @param object propd object -one_metric_df <- function(object){ - results <- getResults(object) - #keep only the metric of interest - one_metric <- cbind(results\$Partner, results\$Pair, results\$theta) - colnames(one_metric) <- c("Partner", "Pair", "theta") - one_metric <- as.data.frame(one_metric) - - # Extract the unique gene names - gene_names <- sort(unique(c(one_metric\$Partner, one_metric\$Pair))) - # Initialize a square matrix with NA - square_matrix <- matrix(NA, nrow = length(gene_names), ncol = length(gene_names)) - rownames(square_matrix) <- gene_names - colnames(square_matrix) <- gene_names - - # Use the `match` function to get the row and column indices - row_indices <- match(one_metric\$Partner, gene_names) - col_indices <- match(one_metric\$Pair, gene_names) - # Use these indices to populate the matrix - square_matrix[cbind(row_indices, col_indices)] <- one_metric[["theta"]] - # Populate the reverse pairs to ensure symmetry - square_matrix[cbind(col_indices, row_indices)] <- one_metric[["theta"]] - return(square_matrix) -} - -#' Extract the differential proportionality cutoff for a specified FDR value. -#' Gene pairs with a value higher than the extracted cutoff will be considered significantly differentially proportional. -#' -#' @param object propd object. Output from propd function. updateCutoffs function should be applied to the object previous to valCutoff. -#' @param fdrVal FDR value to extract the cutoff for. Per default 0.05. -#' -#' @return cutoff value. Differential proportionality values lower than this cutoff are considered significant. -valCutoff <- function(object, fdrVal = 0.05){ - fdr_df <- object@fdr - if (prod(dim(fdr_df) == 0)){ - warning("Please run updateCutoff on propd first") - }else{ - fdr_vals <- fdr_df\$FDR - if (any(!is.na(fdr_vals))){ # Si hay algun valor de FDR correcto - threshold <- any(fdr_vals <= fdrVal) - if (threshold){ - fdr_threshold <- fdr_vals[which.min(fdr_vals <= fdrVal) - 1] - }else{ - warning("FDR is higher than the specified threshold for all proportionality values. Using the lowest fdr instead") - fdr_threshold <- fdr_vals[1] - } - }else{ - stop("No true counts in the given interval. FDR values are not defined") - geterrmessage() - } - } - cutoff <- fdr_df\$cutoff[fdr_df\$FDR == fdr_threshold] - return(cutoff) -} - -#' Convert a proportionality matrix to an adjacency matrix based on a threshold. -#' -#' @param matrix proportionality matrix. Can be extracted from propr object with getMatrix(). -#' @param cutoff Significant proportionality value extracted from valCutoff function. -#' -#' @return Adjacency matrix. Gene pairs with a proportionality value lower than the threshold will have 1, otherwise 0. -convert_to_adjacency <- function(matrix, cutoff) { - adjacency <- ifelse(matrix < cutoff, 1, 0) - return(adjacency) -} - -################################################ -################################################ -## Parse arguments ## -################################################ -################################################ - -opt <- list( - prefix = ifelse('$task.ext.prefix' == 'null', '$meta.id', '$task.ext.prefix'), - count = '$count', - samplesheet = '$samplesheet', - features_id_col = 'gene_id', # column name of feature ids - obs_id_col = 'sample', # column name of observation ids - group_col = 'treatment', # column name of grouping variable - metric = 'theta_d', # differential proportionality metric: theta_d, theta_e or theta_f - alpha = NA, # alpha for boxcox transformation - permutation = 0, # permutation cycles for computing FDR - cutoff_min = NA, # minimun threshold to test - cutoff_max = NA, # maximun threshold to test - cutoff_interval = NA, # interval between thresholds - fixseed = FALSE, - adjacency = FALSE, - fdrVal = 0.05, - ncores = as.integer('$task.cpus') -) -opt_types <- list( - prefix = 'character', - count = 'character', - samplesheet = 'character', - features_id_col = 'character', - obs_id_col = 'character', - group_col = 'character', - metric = 'character', - alpha = 'numeric', - permutation = 'numeric', - cutoff_min = 'numeric', - cutoff_max = 'numeric', - cutoff_interval = 'numeric', - fixseed = 'logical', - adjacency = 'logical', - fdrVal = 'numeric', - ncores = 'numeric' -) - -# Apply parameter overrides -args_opt <- parse_args('$task.ext.args') -for ( ao in names(args_opt)){ - if (! ao %in% names(opt)){ - stop(paste("Invalid option:", ao)) - } else { - - # Preserve classes from defaults where possible - if (! is.null(opt[[ao]])){ - args_opt[[ao]] <- as(args_opt[[ao]], opt_types[[ao]]) - } - # set NA - if (args_opt[[ao]] %in% c('NA', NA, 'null')){ - args_opt[[ao]] <- NA - } - opt[[ao]] <- args_opt[[ao]] - } -} - -# Check if required parameters have been provided -required_opts <- c('count','samplesheet') -missing <- required_opts[unlist(lapply(opt[required_opts], is.null)) | ! required_opts %in% names(opt)] -if (length(missing) > 0){ - stop(paste("Missing required options:", paste(missing, collapse=', '))) -} - -# Check file inputs are valid -for (file_input in c('count','samplesheet')){ - if (is.null(opt[[file_input]])) { - stop(paste("Please provide", file_input), call. = FALSE) - } - if (! file.exists(opt[[file_input]])){ - stop(paste0('Value of ', file_input, ': ', opt[[file_input]], ' is not a valid file')) - } -} - -# check parameters -if (! opt\$metric %in% c('theta_d', 'theta_e', 'theta_f')) stop('Please provide a valid differential proportionality metric') - -################################################ -################################################ -## Finish loading libraries ## -################################################ -################################################ - -library(propr) - -################################################ -################################################ -## Perform differential proportionality ## -################################################ -################################################ - -# read matrix -mat <- read_delim_flexible( - opt\$count, - header = TRUE, - row.names = opt\$features_id_col, - check.names = FALSE -) -mat <- t(mat) - -# check zeros -# log transformation should be applied on non-zero data -# otherwise Inf values are generated -if (any(mat == 0)) print("Zeros will be replaced by minimun value before logratio analysis") - -# parse group -# this creates a vector referring to the group id for each observation -samplesheet <- read_delim_flexible( - opt\$samplesheet, - header = TRUE, - row.names = NULL, - check.names = FALSE -) -tmp <- samplesheet[[opt\$group_col]] -names(tmp) <- samplesheet[[opt\$obs_id_col]] -group <- as.vector(tmp[rownames(mat)]) -if (length(group) != nrow(mat)) stop('Error when parsing group') - -# perform differential proportionality -pd <- propd( - mat, - group = group, - alpha = opt\$alpha, - weighted = FALSE, - p = opt\$permutation, - fixseed = opt\$fixseed -) - -if (opt\$metric == 'theta_d'){ - pd <- setDisjointed(pd) -} else if (opt\$metric == 'theta_e'){ - pd <- setEmergent(pd) -} else if (opt\$metric == 'theta_f'){ - pd <- setActive(pd, what = "theta_f") -} - -# update FDR by permutation, if required -if (opt\$permutation > 0) { - cutoff <- seq( - opt\$cutoff_min, - opt\$cutoff_max, - opt\$cutoff_interval - ) - pd <- updateCutoffs(pd, cutoff=cutoff, ncores=opt\$ncores) - if (opt\$metric == 'theta_d') pd <- updateF(pd) -} - -# Extract adjacency matrix if required -if (opt\$adjacency == TRUE) { - matrix <- one_metric_df(pd) - cutoff <- valCutoff(pd, opt\$fdrVal) - adj <- convert_to_adjacency(matrix, cutoff) -} - -################################################ -################################################ -## Generate outputs ## -################################################ -################################################ - -saveRDS( - pd, - file = paste0(opt\$prefix, '.propd.rds') -) - -write.table( - getResults(pd), - file = paste0(opt\$prefix, '.propd.tsv'), - col.names = TRUE, - row.names = FALSE, - sep = '\\t', - quote = FALSE -) - -if (opt\$permutation > 0) { - write.table( - pd@fdr, - file = paste0(opt\$prefix, '.fdr.tsv'), - col.names = TRUE, - sep = '\\t', - quote = FALSE - ) -} - -if (opt\$adjacency == TRUE) { - write.table( - adj, - file = paste0(opt\$prefix, '.adj.csv'), - col.names = TRUE, - row.names = TRUE, - sep = ',', - quote = FALSE - ) -} - -################################################ -################################################ -## WARNINGS ## -################################################ -################################################ - -sink(paste0(opt\$prefix, ".warnings.log")) -print(warnings()) -sink() - -################################################ -################################################ -## R SESSION INFO ## -################################################ -################################################ - -sink(paste0(opt\$prefix, ".R_sessionInfo.log")) -print(sessionInfo()) -sink() - -################################################ -################################################ -## VERSIONS FILE ## -################################################ -################################################ - -propr.version <- as.character(packageVersion('propr')) - -writeLines( - c( - '"${task.process}":', - paste(' r-propr:', propr.version) - ), -'versions.yml') - -################################################ -################################################ -################################################ -################################################ diff --git a/modules/nf-core/propr/propd/tests/adjacency.config b/modules/nf-core/propr/propd/tests/adjacency.config deleted file mode 100644 index 072a4d75..00000000 --- a/modules/nf-core/propr/propd/tests/adjacency.config +++ /dev/null @@ -1,3 +0,0 @@ -process { - ext.args = {"--permutation 10 --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.1 --fixseed true --adjacency true"} -} \ No newline at end of file diff --git a/modules/nf-core/propr/propd/tests/boxcox_theta_e.config b/modules/nf-core/propr/propd/tests/boxcox_theta_e.config deleted file mode 100755 index 40c0548d..00000000 --- a/modules/nf-core/propr/propd/tests/boxcox_theta_e.config +++ /dev/null @@ -1,4 +0,0 @@ -process { - ext.args = {"--metric theta_e --alpha 0.2 --permutation 10 --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --fixseed true"} - ext.prefix = {"test+theta_e+0.2"} -} \ No newline at end of file diff --git a/modules/nf-core/propr/propd/tests/default_boxcox.config b/modules/nf-core/propr/propd/tests/default_boxcox.config deleted file mode 100755 index 831002d9..00000000 --- a/modules/nf-core/propr/propd/tests/default_boxcox.config +++ /dev/null @@ -1,4 +0,0 @@ -process { - ext.args = {"--alpha 0.2 --permutation 10 --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --fixseed true"} - ext.prefix = {"test+theta_d+0.2"} -} \ No newline at end of file diff --git a/modules/nf-core/propr/propd/tests/default_permutation.config b/modules/nf-core/propr/propd/tests/default_permutation.config deleted file mode 100755 index e89c239f..00000000 --- a/modules/nf-core/propr/propd/tests/default_permutation.config +++ /dev/null @@ -1,4 +0,0 @@ -process { - ext.args = {"--permutation 10 --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --fixseed true"} - ext.prefix = {"test+theta_d+NA"} -} \ No newline at end of file diff --git a/modules/nf-core/propr/propd/tests/main.nf.test b/modules/nf-core/propr/propd/tests/main.nf.test deleted file mode 100755 index 9fcaf93a..00000000 --- a/modules/nf-core/propr/propd/tests/main.nf.test +++ /dev/null @@ -1,154 +0,0 @@ -nextflow_process { - - name "Test Process PROPR_PROPD" - script "../main.nf" - process "PROPR_PROPD" - - tag "modules" - tag "modules_nfcore" - tag "propr" - tag "propr/propd" - - test("Test propr/propd using default permutation") { - - tag "default" - config "./default_permutation.config" - - when { - process { - """ - input[0] = [ - [ id:'test' ], - file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv") - ] - input[1] = [ - [ id: 'test'], - file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.samplesheet.csv") - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out.results).match("Test propr/propd using default permutation - results") }, - { assert snapshot(process.out.versions).match("versions") } - ) - } - } - - test("Test propr/propd using default boxcox permutation") { - - tag "default_boxcox" - config "./default_boxcox.config" - - when { - process { - """ - input[0] = [ - [ id:'test' ], - file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv") - ] - input[1] = [ - [ id: 'test'], - file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.samplesheet.csv") - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out.results).match(" Test propr/propd using default boxcox permutation - results") }, - { assert snapshot(process.out.fdr).match(" Test propr/propd using default boxcox permutation - fdr") } - ) - } - } - - test("Test propr/propd using theta_e permutation") { - - tag "theta_e" - config "./theta_e.config" - - when { - process { - """ - input[0] = [ - [ id:'test' ], - file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv") - ] - input[1] = [ - [ id: 'test'], - file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.samplesheet.csv") - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out.results).match("Test propr/propd using theta_e permutation - results") } - ) - } - } - - test("Test propr/propd using theta_e and boxcox permutation") { - - tag "boxcox_theta_e" - config "./boxcox_theta_e.config" - - when { - process { - """ - input[0] = [ - [ id:'test' ], - file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv") - ] - input[1] = [ - [ id: 'test'], - file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.samplesheet.csv") - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out.results).match("Test propr/propd using theta_e and boxcox permutation - results") } - ) - } - } - - test("Test propr/propd with adjacency matrix") { - - tag "adjacency" - config "./adjacency.config" - - when { - process { - """ - input[0] = [ - [ id:'test' ], - file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv") - ] - input[1] = [ - [ id: 'test'], - file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.samplesheet.csv") - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out.adj).match("Test propr/propd with adjacency matrix - adj") }, - { assert snapshot(process.out.results).match(" - results") } - ) - } - } -} \ No newline at end of file diff --git a/modules/nf-core/propr/propd/tests/main.nf.test.snap b/modules/nf-core/propr/propd/tests/main.nf.test.snap deleted file mode 100644 index e0291044..00000000 --- a/modules/nf-core/propr/propd/tests/main.nf.test.snap +++ /dev/null @@ -1,133 +0,0 @@ -{ - " Test propr/propd using default boxcox permutation - fdr": { - "content": [ - [ - [ - { - "id": "test" - }, - "test+theta_d+0.2.fdr.tsv:md5,17e1c382e5f8275e2858a86e98c1aa6c" - ] - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-05-23T13:10:06.778954" - }, - "Test propr/propd using theta_e and boxcox permutation - results": { - "content": [ - [ - [ - { - "id": "test" - }, - "test+theta_e+0.2.propd.tsv:md5,d56fcc7c8ae0b0853ea9ca6ac6484a08" - ] - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-05-23T13:13:35.158486" - }, - "Test propr/propd using theta_e permutation - results": { - "content": [ - [ - [ - { - "id": "test" - }, - "test+theta_e+NA.propd.tsv:md5,c190d80c11ba99a0303a8dd5ab8ed76f" - ] - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-05-23T13:12:03.500722" - }, - "versions": { - "content": [ - [ - "versions.yml:md5,b41d17751970fc8bcf4f8e0326d239e2" - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-05-23T13:07:07.588326" - }, - " - results": { - "content": [ - [ - [ - { - "id": "test" - }, - "test.propd.tsv:md5,34fda117492faf9a60f5807f56c4be68" - ] - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-05-23T13:16:44.428551" - }, - " Test propr/propd using default boxcox permutation - results": { - "content": [ - [ - [ - { - "id": "test" - }, - "test+theta_d+0.2.propd.tsv:md5,f1886c538e6aeed1bbac4c8c1ef0c930" - ] - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-05-23T13:10:02.25738" - }, - "Test propr/propd using default permutation - results": { - "content": [ - [ - [ - { - "id": "test" - }, - "test+theta_d+NA.propd.tsv:md5,34fda117492faf9a60f5807f56c4be68" - ] - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-05-23T13:07:04.720183" - }, - "Test propr/propd with adjacency matrix - adj": { - "content": [ - [ - [ - { - "id": "test" - }, - "test.adj.csv:md5,9da907136fba72b0e098c7fbacbeb837" - ] - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-05-23T13:16:38.527389" - } -} \ No newline at end of file diff --git a/modules/nf-core/propr/propd/tests/tags.yml b/modules/nf-core/propr/propd/tests/tags.yml deleted file mode 100755 index ba65ca0a..00000000 --- a/modules/nf-core/propr/propd/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -propr/propd: - - "modules/nf-core/propr/propd/**" diff --git a/modules/nf-core/propr/propd/tests/theta_e.config b/modules/nf-core/propr/propd/tests/theta_e.config deleted file mode 100755 index 37c0dd5a..00000000 --- a/modules/nf-core/propr/propd/tests/theta_e.config +++ /dev/null @@ -1,4 +0,0 @@ -process { - ext.args = {"--metric theta_e --permutation 10 --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --fixseed true"} - ext.prefix = {"test+theta_e+NA"} -} \ No newline at end of file diff --git a/subworkflows/local/differential/main.nf b/subworkflows/local/differential/main.nf index 39476eac..f1f718ff 100644 --- a/subworkflows/local/differential/main.nf +++ b/subworkflows/local/differential/main.nf @@ -1,7 +1,7 @@ // // Perform differential analysis // -include { PROPR_PROPD as PROPD } from "../../../modules/nf-core/propr/propd/main.nf" +include { PROPR_PROPD as PROPD } from "../../../modules/local/propr/propd/main.nf" include { DESEQ2_DIFFERENTIAL } from '../../../modules/nf-core/deseq2/differential/main' workflow DIFFERENTIAL { @@ -14,8 +14,11 @@ workflow DIFFERENTIAL { main: // initialize empty results channels - ch_results = Channel.empty() - ch_adjacency = Channel.empty() + ch_results_pairwise = Channel.empty() + ch_results_pairwise_filtered = Channel.empty() + ch_results_genewise = Channel.empty() + ch_results_genewise_filtered = Channel.empty() + ch_adjacency = Channel.empty() // branch tools to select the correct differential analysis method ch_tools @@ -45,8 +48,10 @@ workflow DIFFERENTIAL { ch_counts_propd, ch_samplesheet.first() ) - ch_results = ch_results.mix(PROPD.out.results) - ch_adjacency = ch_adjacency.mix(PROPD.out.adj) + ch_results_pairwise = ch_results_pairwise.mix(PROPD.out.results) + ch_results_pairwise_filtered = ch_results_pairwise_filtered.mix(PROPD.out.results_filtered) + ch_results_genewise_filtered = ch_results_genewise_filtered.mix(PROPD.out.hub_genes) + ch_adjacency = ch_adjacency.mix(PROPD.out.adjacency) // ---------------------------------------------------- // Perform differential analysis with DESeq2 @@ -72,7 +77,9 @@ workflow DIFFERENTIAL { // .mix(DESEQ2_DIFFERENTIAL.out.results) emit: - results = ch_results - adjacency = ch_adjacency - // TODO add filtered results channel + results_pairwise = ch_results_pairwise + results_pairwise_filtered = ch_results_pairwise_filtered + results_genewise = ch_results_genewise + results_genewise_filtered = ch_results_genewise_filtered + adjacency = ch_adjacency } diff --git a/subworkflows/local/enrichment/main.nf b/subworkflows/local/enrichment/main.nf index 20256343..0f4325e1 100644 --- a/subworkflows/local/enrichment/main.nf +++ b/subworkflows/local/enrichment/main.nf @@ -7,7 +7,8 @@ include { PROPR_GREA as GREA } from "../../../modules/nf-core/propr/grea/main.nf workflow ENRICHMENT { take: ch_counts - ch_results + ch_results_genewise + ch_results_genewise_filtered ch_adjacency // TODO: add ch_gm when provided by user, etc. @@ -17,20 +18,22 @@ workflow ENRICHMENT { ch_enriched = Channel.empty() // ---------------------------------------------------- - // Perform enrichment analysis with GREA + // Construct gene set database // ---------------------------------------------------- - // construct the gene set selection // TODO this should be optional, only run when there is no gene set data provided by user - MYGENE(ch_counts) + + MYGENE(ch_counts.take(1)) // only one data is provided to this pipeline ch_gmt = MYGENE.out.gmt - // GREA method needs adjacency matrix as input + // ---------------------------------------------------- + // Perform enrichment analysis with GREA + // ---------------------------------------------------- + ch_adjacency .filter { it[0]["enr_method"] == "grea" } .set { ch_adjacency_grea } - // run GREA GREA(ch_adjacency_grea, ch_gmt.collect()) ch_enriched = ch_enriched.mix(GREA.out.enrichedGO) @@ -39,7 +42,12 @@ workflow ENRICHMENT { // ---------------------------------------------------- // todo: add gsea here - // then we need to add the corresponding input channels to this subworkflow + + // ---------------------------------------------------- + // Perform enrichment analysis with gprofiler2 + // ---------------------------------------------------- + + // todo: add gprofiler2 here emit: enriched = ch_enriched diff --git a/subworkflows/local/experimental/main.nf b/subworkflows/local/experimental/main.nf index 7cc968a3..3487bede 100644 --- a/subworkflows/local/experimental/main.nf +++ b/subworkflows/local/experimental/main.nf @@ -14,13 +14,17 @@ workflow EXPERIMENTAL { main: + // TODO add a printing function to pretty print what are the pathways (tools, arguments) to run ch_tools.view() // initialize empty results channels - ch_results = Channel.empty() // differential results - it should be a table - ch_adjacency = Channel.empty() // adjacency matrix showing the connections between the genes, with values 1|0 - ch_matrix = Channel.empty() // correlation matrix - ch_enriched = Channel.empty() // output table from enrichment analysis + ch_results_pairwise = Channel.empty() // differential results for pairwise analysis - it should be a table + ch_results_pairwise_filtered = Channel.empty() // differential results for pairwise analysis - filtered - it should be a table + ch_results_genewise = Channel.empty() // differential results for genewise analysis - it should be a table + ch_results_genewise_filtered = Channel.empty() // differential results for genewise analysis - filtered - it should be a table + ch_adjacency = Channel.empty() // adjacency matrix showing the connections between the genes, with values 1|0 + ch_matrix = Channel.empty() // correlation matrix + ch_enriched = Channel.empty() // output table from enrichment analysis // ---------------------------------------------------- // DIFFERENTIAL ANALYSIS BLOCK @@ -32,7 +36,10 @@ workflow EXPERIMENTAL { ch_samplesheet, ch_contrasts ) - ch_results = ch_results.mix(DIFFERENTIAL.out.results) + ch_results_pairwise = ch_results_pairwise.mix(DIFFERENTIAL.out.results_pairwise) + ch_results_pairwise_filtered = ch_results_pairwise_filtered.mix(DIFFERENTIAL.out.results_pairwise_filtered) + ch_results_genewise = ch_results_genewise.mix(DIFFERENTIAL.out.results_genewise) + ch_results_genewise_filtered = ch_results_genewise_filtered.mix(DIFFERENTIAL.out.results_genewise_filtered) ch_adjacency = ch_adjacency.mix(DIFFERENTIAL.out.adjacency) // ---------------------------------------------------- @@ -52,7 +59,8 @@ workflow EXPERIMENTAL { ENRICHMENT( ch_counts, - ch_results, + ch_results_genewise, + ch_results_genewise_filtered, ch_adjacency ) ch_enriched = ch_enriched.mix(ENRICHMENT.out.enriched) From ecfc1847d73f9659c2fb50719503c09a44074424 Mon Sep 17 00:00:00 2001 From: suzannejin Date: Tue, 8 Oct 2024 11:31:37 +0200 Subject: [PATCH 068/154] remove old container comment --- modules/local/propr/propd/main.nf | 3 --- 1 file changed, 3 deletions(-) diff --git a/modules/local/propr/propd/main.nf b/modules/local/propr/propd/main.nf index 4f18943a..989f20cb 100644 --- a/modules/local/propr/propd/main.nf +++ b/modules/local/propr/propd/main.nf @@ -3,9 +3,6 @@ process PROPR_PROPD { label 'process_medium' conda "${moduleDir}/environment.yml" - // container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - // 'https://depot.galaxyproject.org/singularity/r-propr:5.0.3': - // 'biocontainers/r-propr:5.0.3' }" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/mulled-v2-401a215d4024df776a98d90a352048199e342a3d:5ba9bbf6cd4f4f98983526673c223d2e7d829b36-0': 'biocontainers/mulled-v2-401a215d4024df776a98d90a352048199e342a3d:5ba9bbf6cd4f4f98983526673c223d2e7d829b36-0' }" From 6885bfd6efe2ef40c915c88f5cd7368f7ae99e48 Mon Sep 17 00:00:00 2001 From: suzannejin Date: Tue, 8 Oct 2024 11:55:28 +0200 Subject: [PATCH 069/154] added comment to propd.R --- conf/test_experimental.config | 2 +- modules/local/propr/propd/templates/propd.R | 34 ++++++++++++++++----- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/conf/test_experimental.config b/conf/test_experimental.config index ece7d66b..4996c1b6 100644 --- a/conf/test_experimental.config +++ b/conf/test_experimental.config @@ -28,7 +28,7 @@ params { matrix = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv' contrasts = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.contrasts.csv' tools = "$projectDir/assets/tools_samplesheet.csv" - pathway = "diff_prop,diff_prop_noperm,filtered_pcor,prop" + pathway = "propd" //Features features_metadata_cols = 'gene_id,gene_name' diff --git a/modules/local/propr/propd/templates/propd.R b/modules/local/propr/propd/templates/propd.R index 6b523299..a3cb8802 100644 --- a/modules/local/propr/propd/templates/propd.R +++ b/modules/local/propr/propd/templates/propd.R @@ -55,7 +55,7 @@ read_delim_flexible <- function(file, header = TRUE, row.names = 1, check.names #' Get hub genes from adjacency matrix #' #' Here hub genes are those that have a degree higher than the expected degree. -# The expected degree is the number of connections that each gene would have +#' The expected degree is the number of connections that each gene would have #' if the connections were distributed uniformly. In other words, the average #' degree by node. #' @@ -159,6 +159,7 @@ for (file_input in c('count','samplesheet')){ } } +# TODO maybe add a function to pretty print the arguments? print(opt) ################################################ @@ -177,7 +178,10 @@ library(propr) # set seed when required -if (!is.na(opt\$seed)) set.seed(opt\$seed) +if (!is.na(opt\$seed)) { + warning('Setting seed ', opt\$seed, ' for reproducibility') + set.seed(opt\$seed) +} # read matrix @@ -190,8 +194,10 @@ mat <- read_delim_flexible( mat <- t(mat) # transpose matrix to have features (genes) as columns # parse group -# this creates a vector referring to the group id for each observation -# TODO one can parse the 'group_col' from the contrast file information as the other modules +# This creates a vector referring to the group id for each observation. +# The vector should have 2+ different groups, so that differential proportionality will +# be computed to compare the variances between and within groups. TODO one can parse the +# 'group_col' from the contrast file information as the other modules samplesheet <- read_delim_flexible( opt\$samplesheet, @@ -214,8 +220,13 @@ pd <- propd( p = opt\$permutation ) +# use F-stat FDR-adjusted p-values to get significant pairs, if permutation == 0 +# otherwise, get FDR values using permutation tests (more computationally expensive but likely more conservative FDRs) + if (opt\$permutation == 0) { + warning('FDR-adjusted p-values are used to get significant pairs.') + # update FDR-adjusted p-values pd <- updateF( @@ -236,7 +247,7 @@ if (opt\$permutation == 0) { hub_genes <- get_hub_genes_from_adjacency(adj) - # get significant results and classify pairs + # get significant pairs and classify them into red/yellow/green pairs results <- getSignificantResultsFstat( pd, @@ -250,6 +261,8 @@ if (opt\$permutation == 0) { } else { + warning('Permutation tests are used to compute FDR values.') + # update FDR values using permutation tests pd <- updateCutoffs( @@ -258,7 +271,14 @@ if (opt\$permutation == 0) { ncores = opt\$ncores ) - # TODO take top pairs when no cutoff has FDR below desired threshold + # TODO take top n pairs when no cutoff has FDR below desired threshold + cutoff <- getCutoffFDR( + pd, + fdr=opt\$fdr, + window_size=1 + ) + if (!cutoff) stop('No cutoff has FDR below desired threshold') + # get adjacency matrix adj <- getAdjacencyFDR( @@ -271,7 +291,7 @@ if (opt\$permutation == 0) { hub_genes <- get_hub_genes_from_adjacency(adj) - # get significant results and classify pairs + # get significant pairs and classify them into red/yellow/green pairs results <- getSignificantResultsFDR( pd, From b7a27747be9d2d2301d1c983c628f01d2653d34e Mon Sep 17 00:00:00 2001 From: suzannejin Date: Tue, 8 Oct 2024 12:09:28 +0200 Subject: [PATCH 070/154] trim trailing spaces --- conf/modules.config | 2 +- modules/local/propr/propd/main.nf | 2 +- modules/local/propr/propd/templates/propd.R | 16 ++++++++-------- subworkflows/local/enrichment/main.nf | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index a0ce2938..baeda848 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -507,7 +507,7 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - + withName: "MYGENE" { ext.args = { [ "--columname ${params.features_id_col}", diff --git a/modules/local/propr/propd/main.nf b/modules/local/propr/propd/main.nf index 989f20cb..1a9cfaf2 100644 --- a/modules/local/propr/propd/main.nf +++ b/modules/local/propr/propd/main.nf @@ -27,4 +27,4 @@ process PROPR_PROPD { script: template 'propd.R' -} \ No newline at end of file +} diff --git a/modules/local/propr/propd/templates/propd.R b/modules/local/propr/propd/templates/propd.R index a3cb8802..93d43c4c 100644 --- a/modules/local/propr/propd/templates/propd.R +++ b/modules/local/propr/propd/templates/propd.R @@ -53,14 +53,14 @@ read_delim_flexible <- function(file, header = TRUE, row.names = 1, check.names } #' Get hub genes from adjacency matrix -#' +#' #' Here hub genes are those that have a degree higher than the expected degree. #' The expected degree is the number of connections that each gene would have -#' if the connections were distributed uniformly. In other words, the average +#' if the connections were distributed uniformly. In other words, the average #' degree by node. -#' +#' #' @param adj Adjacency matrix -#' +#' #' @return data frame with hub genes get_hub_genes_from_adjacency <- function(adj){ @@ -195,8 +195,8 @@ mat <- t(mat) # transpose matrix to have features (genes) as columns # parse group # This creates a vector referring to the group id for each observation. -# The vector should have 2+ different groups, so that differential proportionality will -# be computed to compare the variances between and within groups. TODO one can parse the +# The vector should have 2+ different groups, so that differential proportionality will +# be computed to compare the variances between and within groups. TODO one can parse the # 'group_col' from the contrast file information as the other modules samplesheet <- read_delim_flexible( @@ -273,7 +273,7 @@ if (opt\$permutation == 0) { # TODO take top n pairs when no cutoff has FDR below desired threshold cutoff <- getCutoffFDR( - pd, + pd, fdr=opt\$fdr, window_size=1 ) @@ -399,4 +399,4 @@ writeLines( ################################################ ################################################ ################################################ -################################################ \ No newline at end of file +################################################ diff --git a/subworkflows/local/enrichment/main.nf b/subworkflows/local/enrichment/main.nf index 0f4325e1..f0fe670d 100644 --- a/subworkflows/local/enrichment/main.nf +++ b/subworkflows/local/enrichment/main.nf @@ -22,7 +22,7 @@ workflow ENRICHMENT { // ---------------------------------------------------- // TODO this should be optional, only run when there is no gene set data provided by user - + MYGENE(ch_counts.take(1)) // only one data is provided to this pipeline ch_gmt = MYGENE.out.gmt From 8c75e558958879749145589a60f3b5a308b88354 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Tue, 8 Oct 2024 10:16:08 +0000 Subject: [PATCH 071/154] [automated] Fix code linting --- modules.json | 102 +++++++++++++-------------------------------------- 1 file changed, 26 insertions(+), 76 deletions(-) diff --git a/modules.json b/modules.json index 95ee8c26..cdf98b53 100644 --- a/modules.json +++ b/modules.json @@ -8,156 +8,112 @@ "affy/justrma": { "branch": "master", "git_sha": "02a65e8871e06bac203dec16985fa3de648c99b6", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "atlasgeneannotationmanipulation/gtf2featureannotation": { "branch": "master", "git_sha": "04bc484c987b523ea5420ed6bbc1fdc6d8aef751", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "custom/matrixfilter": { "branch": "master", "git_sha": "285a50500f9e02578d90b3ce6382ea3c30216acd", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "custom/tabulartogseacls": { "branch": "master", "git_sha": "b7ebe95761cd389603f9cc0e0dc384c0f663815a", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "custom/tabulartogseagct": { "branch": "master", "git_sha": "516189e968feb4ebdd9921806988b4c12b4ac2dc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "deseq2/differential": { "branch": "master", "git_sha": "9326d73af3fbe2ee90d9ce0a737461a727c5118e", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "geoquery/getgeo": { "branch": "master", "git_sha": "516189e968feb4ebdd9921806988b4c12b4ac2dc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gprofiler2/gost": { "branch": "master", "git_sha": "c75e76bff35e2ee5305ebe89b513637b38e79d1d", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gsea/gsea": { "branch": "master", "git_sha": "7aa7ced253469386f0645133ec3e838098dbe67c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gunzip": { "branch": "master", "git_sha": "516189e968feb4ebdd9921806988b4c12b4ac2dc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "limma/differential": { "branch": "master", "git_sha": "9326d73af3fbe2ee90d9ce0a737461a727c5118e", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "mygene": { "branch": "master", "git_sha": "82024cf6325d2ee194e7f056d841ecad2f6856e9", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "propr/grea": { "branch": "master", "git_sha": "71b1180a5a3de6398eb0eb4d55424cbda36f52d8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "propr/propr": { "branch": "master", "git_sha": "132fa6c9bd2515807f6a1cdec1ad7d03c817bcc9", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "proteus/readproteingroups": { "branch": "master", "git_sha": "a069b29783583c219c1f23ed3dcf64a5aee1340b", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "rmarkdownnotebook": { "branch": "master", "git_sha": "516189e968feb4ebdd9921806988b4c12b4ac2dc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "shinyngs/app": { "branch": "master", "git_sha": "91fc36585a50f9bae98cb5b3dff36ce64c83a6b4", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "shinyngs/staticdifferential": { "branch": "master", "git_sha": "91fc36585a50f9bae98cb5b3dff36ce64c83a6b4", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "shinyngs/staticexploratory": { "branch": "master", "git_sha": "91fc36585a50f9bae98cb5b3dff36ce64c83a6b4", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "shinyngs/validatefomcomponents": { "branch": "master", "git_sha": "91fc36585a50f9bae98cb5b3dff36ce64c83a6b4", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "untar": { "branch": "master", "git_sha": "516189e968feb4ebdd9921806988b4c12b4ac2dc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "zip": { "branch": "master", "git_sha": "516189e968feb4ebdd9921806988b4c12b4ac2dc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] } } }, @@ -166,26 +122,20 @@ "utils_nextflow_pipeline": { "branch": "master", "git_sha": "5caf7640a9ef1d18d765d55339be751bb0969dfa", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nfcore_pipeline": { "branch": "master", "git_sha": "92de218a329bfc9a9033116eb5f65fd270e72ba3", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nfvalidation_plugin": { "branch": "master", "git_sha": "5caf7640a9ef1d18d765d55339be751bb0969dfa", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] } } } } } -} \ No newline at end of file +} From c36e237b003e2e0618021d23fd625a027d106c61 Mon Sep 17 00:00:00 2001 From: suzannejin Date: Tue, 8 Oct 2024 12:17:49 +0200 Subject: [PATCH 072/154] prettier modules.json --- modules.json | 102 +++++++++++++-------------------------------------- 1 file changed, 26 insertions(+), 76 deletions(-) diff --git a/modules.json b/modules.json index 95ee8c26..cdf98b53 100644 --- a/modules.json +++ b/modules.json @@ -8,156 +8,112 @@ "affy/justrma": { "branch": "master", "git_sha": "02a65e8871e06bac203dec16985fa3de648c99b6", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "atlasgeneannotationmanipulation/gtf2featureannotation": { "branch": "master", "git_sha": "04bc484c987b523ea5420ed6bbc1fdc6d8aef751", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "custom/matrixfilter": { "branch": "master", "git_sha": "285a50500f9e02578d90b3ce6382ea3c30216acd", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "custom/tabulartogseacls": { "branch": "master", "git_sha": "b7ebe95761cd389603f9cc0e0dc384c0f663815a", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "custom/tabulartogseagct": { "branch": "master", "git_sha": "516189e968feb4ebdd9921806988b4c12b4ac2dc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "deseq2/differential": { "branch": "master", "git_sha": "9326d73af3fbe2ee90d9ce0a737461a727c5118e", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "geoquery/getgeo": { "branch": "master", "git_sha": "516189e968feb4ebdd9921806988b4c12b4ac2dc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gprofiler2/gost": { "branch": "master", "git_sha": "c75e76bff35e2ee5305ebe89b513637b38e79d1d", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gsea/gsea": { "branch": "master", "git_sha": "7aa7ced253469386f0645133ec3e838098dbe67c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gunzip": { "branch": "master", "git_sha": "516189e968feb4ebdd9921806988b4c12b4ac2dc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "limma/differential": { "branch": "master", "git_sha": "9326d73af3fbe2ee90d9ce0a737461a727c5118e", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "mygene": { "branch": "master", "git_sha": "82024cf6325d2ee194e7f056d841ecad2f6856e9", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "propr/grea": { "branch": "master", "git_sha": "71b1180a5a3de6398eb0eb4d55424cbda36f52d8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "propr/propr": { "branch": "master", "git_sha": "132fa6c9bd2515807f6a1cdec1ad7d03c817bcc9", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "proteus/readproteingroups": { "branch": "master", "git_sha": "a069b29783583c219c1f23ed3dcf64a5aee1340b", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "rmarkdownnotebook": { "branch": "master", "git_sha": "516189e968feb4ebdd9921806988b4c12b4ac2dc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "shinyngs/app": { "branch": "master", "git_sha": "91fc36585a50f9bae98cb5b3dff36ce64c83a6b4", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "shinyngs/staticdifferential": { "branch": "master", "git_sha": "91fc36585a50f9bae98cb5b3dff36ce64c83a6b4", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "shinyngs/staticexploratory": { "branch": "master", "git_sha": "91fc36585a50f9bae98cb5b3dff36ce64c83a6b4", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "shinyngs/validatefomcomponents": { "branch": "master", "git_sha": "91fc36585a50f9bae98cb5b3dff36ce64c83a6b4", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "untar": { "branch": "master", "git_sha": "516189e968feb4ebdd9921806988b4c12b4ac2dc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "zip": { "branch": "master", "git_sha": "516189e968feb4ebdd9921806988b4c12b4ac2dc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] } } }, @@ -166,26 +122,20 @@ "utils_nextflow_pipeline": { "branch": "master", "git_sha": "5caf7640a9ef1d18d765d55339be751bb0969dfa", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nfcore_pipeline": { "branch": "master", "git_sha": "92de218a329bfc9a9033116eb5f65fd270e72ba3", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nfvalidation_plugin": { "branch": "master", "git_sha": "5caf7640a9ef1d18d765d55339be751bb0969dfa", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] } } } } } -} \ No newline at end of file +} From 1731b3d49bdb4d6dda672d9d517245bcd13130af Mon Sep 17 00:00:00 2001 From: suzannejin Date: Tue, 8 Oct 2024 12:20:41 +0200 Subject: [PATCH 073/154] add more tests to experimental --- conf/test_experimental.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/test_experimental.config b/conf/test_experimental.config index 4996c1b6..df0f2e0a 100644 --- a/conf/test_experimental.config +++ b/conf/test_experimental.config @@ -28,7 +28,7 @@ params { matrix = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv' contrasts = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.contrasts.csv' tools = "$projectDir/assets/tools_samplesheet.csv" - pathway = "propd" + pathway = "propd,propr,pcorbshrink" //Features features_metadata_cols = 'gene_id,gene_name' From 36868e11ff1fd34b6047ced8ba66e5ceef6ccc4c Mon Sep 17 00:00:00 2001 From: suzannejin Date: Tue, 8 Oct 2024 12:29:12 +0200 Subject: [PATCH 074/154] modify propd.R to not erroring when no FDR cutoff is found --- modules/local/propr/propd/main.nf | 6 +- modules/local/propr/propd/templates/propd.R | 110 +++++++++++--------- 2 files changed, 62 insertions(+), 54 deletions(-) diff --git a/modules/local/propr/propd/main.nf b/modules/local/propr/propd/main.nf index 1a9cfaf2..ff7b6050 100644 --- a/modules/local/propr/propd/main.nf +++ b/modules/local/propr/propd/main.nf @@ -14,9 +14,9 @@ process PROPR_PROPD { output: tuple val(meta), path("*.propd.rds") , emit: rds tuple val(meta), path("*.propd.results.tsv") , emit: results - tuple val(meta), path("*.propd.results_filtered.tsv"), emit: results_filtered - tuple val(meta), path("*.propd.adjacency.csv") , emit: adjacency - tuple val(meta), path("*.propd.hub_genes.tsv") , emit: hub_genes + tuple val(meta), path("*.propd.results_filtered.tsv"), emit: results_filtered, optional: true + tuple val(meta), path("*.propd.adjacency.csv") , emit: adjacency , optional: true + tuple val(meta), path("*.propd.hub_genes.tsv") , emit: hub_genes , optional: true tuple val(meta), path("*.propd.fdr.tsv") , emit: fdr , optional: true path "*.warnings.log" , emit: warnings path "*.R_sessionInfo.log" , emit: session_info diff --git a/modules/local/propr/propd/templates/propd.R b/modules/local/propr/propd/templates/propd.R index 93d43c4c..35fdab55 100644 --- a/modules/local/propr/propd/templates/propd.R +++ b/modules/local/propr/propd/templates/propd.R @@ -271,37 +271,48 @@ if (opt\$permutation == 0) { ncores = opt\$ncores ) + # get cutoff + # this is the cutoff used to get the significant pairs and ensemble of adjacency matrix # TODO take top n pairs when no cutoff has FDR below desired threshold + cutoff <- getCutoffFDR( pd, fdr=opt\$fdr, window_size=1 ) - if (!cutoff) stop('No cutoff has FDR below desired threshold') - # get adjacency matrix + if (cutoff) { - adj <- getAdjacencyFDR( - pd, - fdr=opt\$fdr, - window_size=1 - ) + # get adjacency matrix - # get hub genes + adj <- getAdjacencyFDR( + pd, + fdr=opt\$fdr, + window_size=1 + ) - hub_genes <- get_hub_genes_from_adjacency(adj) + # get hub genes - # get significant pairs and classify them into red/yellow/green pairs + hub_genes <- get_hub_genes_from_adjacency(adj) - results <- getSignificantResultsFDR( - pd, - fdr=opt\$fdr, - window_size=1 - ) - results <- results[,c("Partner", "Pair", "theta")] - results\$class <- "red" - results\$class[which(results\$Pair %in% hub_genes\$gene | results\$Partner %in% hub_genes\$gene)] <- "yellow" - results\$class[which(results\$Pair %in% hub_genes\$gene & results\$Partner %in% hub_genes\$gene)] <- "green" + # get significant pairs and classify them into red/yellow/green pairs + + results <- getSignificantResultsFDR( + pd, + fdr=opt\$fdr, + window_size=1 + ) + results <- results[,c("Partner", "Pair", "theta")] + results\$class <- "red" + results\$class[which(results\$Pair %in% hub_genes\$gene | results\$Partner %in% hub_genes\$gene)] <- "yellow" + results\$class[which(results\$Pair %in% hub_genes\$gene & results\$Partner %in% hub_genes\$gene)] <- "green" + + } else { + warning('No pairs have FDR below desired threshold.') + adj <- NULL + hub_genes <- NULL + results <- NULL + } } ################################################ @@ -314,7 +325,6 @@ saveRDS( pd, file = paste0(opt\$prefix, '.propd.rds') ) - write.table( getResults(pd), file = paste0(opt\$prefix, '.propd.results.tsv'), @@ -323,42 +333,40 @@ write.table( sep = '\\t', quote = FALSE ) - -write.table( - results, - file = paste0(opt\$prefix, '.propd.results_filtered.tsv'), - col.names = TRUE, - row.names = FALSE, - sep = '\\t', - quote = FALSE -) - -write.table( - adj, - file = paste0(opt\$prefix, '.propd.adjacency.csv'), - col.names = TRUE, - row.names = TRUE, - sep = ',', - quote = FALSE -) - -write.table( - hub_genes, - file = paste0(opt\$prefix, '.propd.hub_genes.tsv'), - col.names = TRUE, - row.names = FALSE, - sep = '\\t', - quote = FALSE -) - -if (opt\$permutation > 0) { +if (!is.null(adj)) { write.table( - pd@fdr, - file = paste0(opt\$prefix, '.propd.fdr.tsv'), + results, + file = paste0(opt\$prefix, '.propd.results_filtered.tsv'), col.names = TRUE, + row.names = FALSE, sep = '\\t', quote = FALSE ) + write.table( + adj, + file = paste0(opt\$prefix, '.propd.adjacency.csv'), + col.names = TRUE, + row.names = TRUE, + sep = ',', + quote = FALSE + ) + write.table( + hub_genes, + file = paste0(opt\$prefix, '.propd.hub_genes.tsv'), + col.names = TRUE, + row.names = FALSE, + sep = '\\t', + quote = FALSE + ) + if (opt\$permutation > 0) { + write.table( + pd@fdr, + file = paste0(opt\$prefix, '.propd.fdr.tsv'), + col.names = TRUE, + sep = '\\t', + quote = FALSE + ) + } } ################################################ From c5ddf6402256129d67d0bfee9719c64f023e55bc Mon Sep 17 00:00:00 2001 From: suzannejin Date: Tue, 8 Oct 2024 12:30:15 +0200 Subject: [PATCH 075/154] add comment --- modules/local/propr/propd/templates/propd.R | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/local/propr/propd/templates/propd.R b/modules/local/propr/propd/templates/propd.R index 35fdab55..fef83c17 100644 --- a/modules/local/propr/propd/templates/propd.R +++ b/modules/local/propr/propd/templates/propd.R @@ -273,7 +273,6 @@ if (opt\$permutation == 0) { # get cutoff # this is the cutoff used to get the significant pairs and ensemble of adjacency matrix - # TODO take top n pairs when no cutoff has FDR below desired threshold cutoff <- getCutoffFDR( pd, @@ -308,6 +307,8 @@ if (opt\$permutation == 0) { results\$class[which(results\$Pair %in% hub_genes\$gene & results\$Partner %in% hub_genes\$gene)] <- "green" } else { + # TODO take top n pairs when no cutoff has FDR below desired threshold + # For the moment, we just print a warning and set adj, hub_genes and results to NULL warning('No pairs have FDR below desired threshold.') adj <- NULL hub_genes <- NULL From c1b8817bee6bbce7fb8c5ae2987c75a69fc10891 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Tue, 8 Oct 2024 12:29:57 +0000 Subject: [PATCH 076/154] Template update for nf-core/tools version 3.0.0 --- .editorconfig | 4 + .github/CONTRIBUTING.md | 10 +- .github/PULL_REQUEST_TEMPLATE.md | 2 +- .github/workflows/awsfulltest.yml | 23 +- .github/workflows/ci.yml | 17 +- .github/workflows/download_pipeline.yml | 53 ++- .github/workflows/linting.yml | 23 +- .github/workflows/linting_comment.yml | 2 +- .github/workflows/release-announcements.yml | 2 +- .../workflows/template_version_comment.yml | 43 ++ .gitpod.yml | 7 +- .nf-core.yml | 22 +- .pre-commit-config.yaml | 2 +- .prettierignore | 1 + CHANGELOG.md | 2 +- CITATIONS.md | 4 +- README.md | 5 +- assets/multiqc_config.yml | 6 +- assets/schema_input.json | 2 +- conf/base.config | 34 +- conf/igenomes_ignored.config | 9 + conf/modules.config | 1 - conf/test.config | 13 +- 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/output.md | 11 +- docs/usage.md | 12 +- main.nf | 10 +- modules.json | 12 +- modules/nf-core/fastqc/environment.yml | 2 - modules/nf-core/fastqc/main.nf | 5 +- modules/nf-core/fastqc/meta.yml | 57 +-- modules/nf-core/fastqc/tests/main.nf.test | 225 ++++++++--- .../nf-core/fastqc/tests/main.nf.test.snap | 370 ++++++++++++++++-- modules/nf-core/multiqc/environment.yml | 4 +- modules/nf-core/multiqc/main.nf | 14 +- modules/nf-core/multiqc/meta.yml | 78 ++-- modules/nf-core/multiqc/tests/main.nf.test | 8 + .../nf-core/multiqc/tests/main.nf.test.snap | 20 +- modules/nf-core/multiqc/tests/nextflow.config | 5 + nextflow.config | 148 ++++--- nextflow_schema.json | 85 +--- .../main.nf | 56 +-- .../nf-core/utils_nextflow_pipeline/main.nf | 24 +- .../tests/nextflow.config | 2 +- .../nf-core/utils_nfcore_pipeline/main.nf | 45 ++- .../nf-core/utils_nfschema_plugin/main.nf | 46 +++ .../nf-core/utils_nfschema_plugin/meta.yml | 35 ++ .../utils_nfschema_plugin/tests/main.nf.test | 117 ++++++ .../tests/nextflow.config | 8 + .../tests/nextflow_schema.json | 8 +- .../nf-core/utils_nfvalidation_plugin/main.nf | 62 --- .../utils_nfvalidation_plugin/meta.yml | 44 --- .../tests/main.nf.test | 200 ---------- .../utils_nfvalidation_plugin/tests/tags.yml | 2 - workflows/differentialabundance.nf | 23 +- 57 files changed, 1213 insertions(+), 812 deletions(-) create mode 100644 .github/workflows/template_version_comment.yml create mode 100644 conf/igenomes_ignored.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 create mode 100644 modules/nf-core/multiqc/tests/nextflow.config create mode 100644 subworkflows/nf-core/utils_nfschema_plugin/main.nf create mode 100644 subworkflows/nf-core/utils_nfschema_plugin/meta.yml create mode 100644 subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test create mode 100644 subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config rename subworkflows/nf-core/{utils_nfvalidation_plugin => utils_nfschema_plugin}/tests/nextflow_schema.json (95%) delete mode 100644 subworkflows/nf-core/utils_nfvalidation_plugin/main.nf delete mode 100644 subworkflows/nf-core/utils_nfvalidation_plugin/meta.yml delete mode 100644 subworkflows/nf-core/utils_nfvalidation_plugin/tests/main.nf.test delete mode 100644 subworkflows/nf-core/utils_nfvalidation_plugin/tests/tags.yml diff --git a/.editorconfig b/.editorconfig index 72dda289..e1058815 100644 --- a/.editorconfig +++ b/.editorconfig @@ -11,6 +11,7 @@ indent_style = space [*.{md,yml,yaml,html,css,scss,js}] indent_size = 2 + # These files are edited and tested upstream in nf-core/modules [/modules/nf-core/**] charset = unset @@ -25,9 +26,12 @@ insert_final_newline = unset trim_trailing_whitespace = unset indent_style = unset + + [/assets/email*] indent_size = unset + # ignore python and markdown [*.{py,md}] indent_style = unset diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index f5305291..0afc1872 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -19,7 +19,7 @@ If you'd like to write some code for nf-core/differentialabundance, the standard 1. Check that there isn't already an issue about your idea in the [nf-core/differentialabundance issues](https://github.com/nf-core/differentialabundance/issues) to avoid duplicating work. If there isn't one already, please create one so that others know you're working on this 2. [Fork](https://help.github.com/en/github/getting-started-with-github/fork-a-repo) the [nf-core/differentialabundance repository](https://github.com/nf-core/differentialabundance) to your GitHub account 3. Make the necessary changes / additions within your forked repository following [Pipeline conventions](#pipeline-contribution-conventions) -4. Use `nf-core schema build` and add any new parameters to the pipeline JSON schema (requires [nf-core tools](https://github.com/nf-core/tools) >= 1.10). +4. Use `nf-core pipelines schema build` and add any new parameters to the pipeline JSON schema (requires [nf-core tools](https://github.com/nf-core/tools) >= 1.10). 5. Submit a Pull Request against the `dev` branch and wait for the code to be reviewed and merged If you're not used to this workflow with git, you can start with some [docs from GitHub](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests) or even their [excellent `git` resources](https://try.github.io/). @@ -40,7 +40,7 @@ There are typically two types of tests that run: ### Lint tests `nf-core` has a [set of guidelines](https://nf-co.re/developers/guidelines) which all pipelines must adhere to. -To enforce these and ensure that all pipelines stay in sync, we have developed a helper tool which runs checks on the pipeline code. This is in the [nf-core/tools repository](https://github.com/nf-core/tools) and once installed can be run locally with the `nf-core lint ` command. +To enforce these and ensure that all pipelines stay in sync, we have developed a helper tool which runs checks on the pipeline code. This is in the [nf-core/tools repository](https://github.com/nf-core/tools) and once installed can be run locally with the `nf-core pipelines lint ` command. If any failures or warnings are encountered, please follow the listed URL for more documentation. @@ -75,7 +75,7 @@ If you wish to contribute a new step, please use the following coding standards: 2. Write the process block (see below). 3. Define the output channel if needed (see below). 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). +5. Add any new parameters to `nextflow_schema.json` with help text (via the `nf-core pipelines 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`. @@ -86,7 +86,7 @@ If you wish to contribute a new step, please use the following coding standards: Parameters should be initialised / defined with default values in `nextflow.config` under the `params` scope. -Once there, use `nf-core schema build` to add to `nextflow_schema.json`. +Once there, use `nf-core pipelines schema build` to add to `nextflow_schema.json`. ### Default processes resource requirements @@ -103,7 +103,7 @@ Please use the following naming schemes, to make it easy to understand what is g ### 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]` +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 pipelines bump-version --nextflow . [min-nf-version]` ### Images and figures diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 89778df2..37e30a84 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -17,7 +17,7 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/diff - [ ] If you've fixed a bug or added code that should be tested, add tests! - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/differentialabundance/tree/master/.github/CONTRIBUTING.md) - [ ] If necessary, also make a PR on the nf-core/differentialabundance _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. -- [ ] Make sure your code lints (`nf-core lint`). +- [ ] Make sure your code lints (`nf-core pipelines lint`). - [ ] Ensure the test suite passes (`nextflow run . -profile test,docker --outdir `). - [ ] Check for unexpected warnings in debug mode (`nextflow run . -profile debug,test,docker --outdir `). - [ ] Usage Documentation in `docs/usage.md` is updated. diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index 8b09e66e..12f56d56 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -1,18 +1,33 @@ name: nf-core AWS full size tests -# This workflow is triggered on published releases. +# This workflow is triggered on PRs opened against the master branch. # 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] + pull_request: + branches: + - master workflow_dispatch: + pull_request_review: + types: [submitted] + jobs: run-platform: name: Run AWS full tests - if: github.repository == 'nf-core/differentialabundance' + if: github.repository == 'nf-core/differentialabundance' && github.event.review.state == 'approved' runs-on: ubuntu-latest steps: + - uses: octokit/request-action@v2.x + id: check_approvals + with: + route: GET /repos/${{ github.repository }}/pulls/${{ github.event.review.number }}/reviews + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - id: test_variables + run: | + JSON_RESPONSE='${{ steps.check_approvals.outputs.data }}' + CURRENT_APPROVALS_COUNT=$(echo $JSON_RESPONSE | jq -c '[.[] | select(.state | contains("APPROVED")) ] | length') + test $CURRENT_APPROVALS_COUNT -ge 2 || exit 1 # At least 2 approvals are required - name: Launch workflow via Seqera Platform uses: seqeralabs/action-tower-launch@v2 # TODO nf-core: You can customise AWS full pipeline tests as required diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0f3f3490..856cce8e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,6 +7,7 @@ on: pull_request: release: types: [published] + workflow_dispatch: env: NXF_ANSI_LOG: false @@ -24,7 +25,7 @@ jobs: strategy: matrix: NXF_VER: - - "23.04.0" + - "24.04.2" - "latest-everything" steps: - name: Check out pipeline code @@ -38,9 +39,21 @@ jobs: - name: Disk space cleanup uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 - - name: Run pipeline with test data + - name: Run pipeline with test data (docker) # 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 --outdir ./results + + - name: Run pipeline with test data (singularity) + # TODO nf-core: You can customise CI pipeline run tests as required + run: | + nextflow run ${GITHUB_WORKSPACE} -profile test,singularity --outdir ./results + if: "${{ github.base_ref == 'master' }}" + + - name: Run pipeline with test data (conda) + # TODO nf-core: You can customise CI pipeline run tests as required + run: | + nextflow run ${GITHUB_WORKSPACE} -profile test,conda --outdir ./results + if: "${{ github.base_ref == 'master' }}" diff --git a/.github/workflows/download_pipeline.yml b/.github/workflows/download_pipeline.yml index 2d20d644..713dc3e7 100644 --- a/.github/workflows/download_pipeline.yml +++ b/.github/workflows/download_pipeline.yml @@ -1,4 +1,4 @@ -name: Test successful pipeline download with 'nf-core download' +name: Test successful pipeline download with 'nf-core pipelines download' # Run the workflow when: # - dispatched manually @@ -8,7 +8,7 @@ on: workflow_dispatch: inputs: testbranch: - description: "The specific branch you wish to utilize for the test execution of nf-core download." + description: "The specific branch you wish to utilize for the test execution of nf-core pipelines download." required: true default: "dev" pull_request: @@ -39,9 +39,11 @@ jobs: with: python-version: "3.12" architecture: "x64" - - uses: eWaterCycle/setup-singularity@931d4e31109e875b13309ae1d07c70ca8fbc8537 # v7 + + - name: Setup Apptainer + uses: eWaterCycle/setup-apptainer@4bb22c52d4f63406c49e94c804632975787312b3 # v2.0.0 with: - singularity-version: 3.8.3 + apptainer-version: 1.3.4 - name: Install dependencies run: | @@ -54,33 +56,64 @@ jobs: echo "REPOTITLE_LOWERCASE=$(basename ${GITHUB_REPOSITORY,,})" >> ${GITHUB_ENV} echo "REPO_BRANCH=${{ github.event.inputs.testbranch || 'dev' }}" >> ${GITHUB_ENV} + - name: Make a cache directory for the container images + run: | + mkdir -p ./singularity_container_images + - name: Download the pipeline env: - NXF_SINGULARITY_CACHEDIR: ./ + NXF_SINGULARITY_CACHEDIR: ./singularity_container_images run: | - nf-core download ${{ env.REPO_LOWERCASE }} \ + nf-core pipelines download ${{ env.REPO_LOWERCASE }} \ --revision ${{ env.REPO_BRANCH }} \ --outdir ./${{ env.REPOTITLE_LOWERCASE }} \ --compress "none" \ --container-system 'singularity' \ - --container-library "quay.io" -l "docker.io" -l "ghcr.io" \ + --container-library "quay.io" -l "docker.io" -l "community.wave.seqera.io" \ --container-cache-utilisation 'amend' \ - --download-configuration + --download-configuration 'yes' - name: Inspect download run: tree ./${{ env.REPOTITLE_LOWERCASE }} + - name: Count the downloaded number of container images + id: count_initial + run: | + image_count=$(ls -1 ./singularity_container_images | wc -l | xargs) + echo "Initial container image count: $image_count" + echo "IMAGE_COUNT_INITIAL=$image_count" >> ${GITHUB_ENV} + - name: Run the downloaded pipeline (stub) id: stub_run_pipeline continue-on-error: true env: - NXF_SINGULARITY_CACHEDIR: ./ + NXF_SINGULARITY_CACHEDIR: ./singularity_container_images NXF_SINGULARITY_HOME_MOUNT: true run: nextflow run ./${{ env.REPOTITLE_LOWERCASE }}/$( sed 's/\W/_/g' <<< ${{ env.REPO_BRANCH }}) -stub -profile test,singularity --outdir ./results - name: Run the downloaded pipeline (stub run not supported) id: run_pipeline if: ${{ job.steps.stub_run_pipeline.status == failure() }} env: - NXF_SINGULARITY_CACHEDIR: ./ + NXF_SINGULARITY_CACHEDIR: ./singularity_container_images NXF_SINGULARITY_HOME_MOUNT: true run: nextflow run ./${{ env.REPOTITLE_LOWERCASE }}/$( sed 's/\W/_/g' <<< ${{ env.REPO_BRANCH }}) -profile test,singularity --outdir ./results + + - name: Count the downloaded number of container images + id: count_afterwards + run: | + image_count=$(ls -1 ./singularity_container_images | wc -l | xargs) + echo "Post-pipeline run container image count: $image_count" + echo "IMAGE_COUNT_AFTER=$image_count" >> ${GITHUB_ENV} + + - name: Compare container image counts + run: | + if [ "${{ env.IMAGE_COUNT_INITIAL }}" -ne "${{ env.IMAGE_COUNT_AFTER }}" ]; then + initial_count=${{ env.IMAGE_COUNT_INITIAL }} + final_count=${{ env.IMAGE_COUNT_AFTER }} + difference=$((final_count - initial_count)) + echo "$difference additional container images were \n downloaded at runtime . The pipeline has no support for offline runs!" + tree ./singularity_container_images + exit 1 + else + echo "The pipeline can be downloaded successfully!" + fi diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 1fcafe88..b882838a 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -1,6 +1,6 @@ name: nf-core linting # This workflow is triggered on pushes and PRs to the repository. -# It runs the `nf-core lint` and markdown lint tests to ensure +# It runs the `nf-core pipelines lint` and markdown lint tests to ensure # that the code meets the nf-core guidelines. on: push: @@ -41,17 +41,32 @@ jobs: python-version: "3.12" architecture: "x64" + - name: read .nf-core.yml + uses: pietrobolcato/action-read-yaml@1.0.0 + id: read_yml + with: + config: ${{ github.workspace }}/.nf-core.yaml + - name: Install dependencies run: | python -m pip install --upgrade pip - pip install nf-core + pip install nf-core==${{ steps.read_yml.outputs['nf_core_version'] }} + + - name: Run nf-core pipelines lint + if: ${{ github.base_ref != 'master' }} + env: + GITHUB_COMMENTS_URL: ${{ github.event.pull_request.comments_url }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_PR_COMMIT: ${{ github.event.pull_request.head.sha }} + run: nf-core -l lint_log.txt pipelines lint --dir ${GITHUB_WORKSPACE} --markdown lint_results.md - - name: Run nf-core lint + - name: Run nf-core pipelines lint --release + if: ${{ github.base_ref == 'master' }} env: GITHUB_COMMENTS_URL: ${{ github.event.pull_request.comments_url }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_PR_COMMIT: ${{ github.event.pull_request.head.sha }} - run: nf-core -l lint_log.txt lint --dir ${GITHUB_WORKSPACE} --markdown lint_results.md + run: nf-core -l lint_log.txt pipelines lint --release --dir ${GITHUB_WORKSPACE} --markdown lint_results.md - name: Save PR number if: ${{ always() }} diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 40acc23f..42e519bf 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Download lint results - uses: dawidd6/action-download-artifact@09f2f74827fd3a8607589e5ad7f9398816f540fe # v3 + uses: dawidd6/action-download-artifact@bf251b5aa9c2f7eeb574a96ee720e24f801b7c11 # v6 with: workflow: linting.yml workflow_conclusion: completed diff --git a/.github/workflows/release-announcements.yml b/.github/workflows/release-announcements.yml index 03ecfcf7..c6ba35df 100644 --- a/.github/workflows/release-announcements.yml +++ b/.github/workflows/release-announcements.yml @@ -12,7 +12,7 @@ jobs: - name: get topics and convert to hashtags id: get_topics run: | - echo "topics=$(curl -s https://nf-co.re/pipelines.json | jq -r '.remote_workflows[] | select(.full_name == "${{ github.repository }}") | .topics[]' | awk '{print "#"$0}' | tr '\n' ' ')" >> $GITHUB_OUTPUT + echo "topics=$(curl -s https://nf-co.re/pipelines.json | jq -r '.remote_workflows[] | select(.full_name == "${{ github.repository }}") | .topics[]' | awk '{print "#"$0}' | tr '\n' ' ')" | sed 's/-//g' >> $GITHUB_OUTPUT - uses: rzr/fediverse-action@master with: diff --git a/.github/workflows/template_version_comment.yml b/.github/workflows/template_version_comment.yml new file mode 100644 index 00000000..9dea41f0 --- /dev/null +++ b/.github/workflows/template_version_comment.yml @@ -0,0 +1,43 @@ +name: nf-core template version comment +# This workflow is triggered on PRs to check if the pipeline template version matches the latest nf-core version. +# It posts a comment to the PR, even if it comes from a fork. + +on: pull_request_target + +jobs: + template_version: + runs-on: ubuntu-latest + steps: + - name: Check out pipeline code + uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4 + + - name: Read template version from .nf-core.yml + uses: pietrobolcato/action-read-yaml@1.0.0 + id: read_yml + with: + config: ${{ github.workspace }}/.nf-core.yml + + - name: Install nf-core + run: | + python -m pip install --upgrade pip + pip install nf-core==${{ steps.read_yml.outputs['nf_core_version'] }} + + - name: Check nf-core outdated + id: nf_core_outdated + run: pip list --outdated | grep nf-core + + - name: Post nf-core template version comment + uses: mshick/add-pr-comment@b8f338c590a895d50bcbfa6c5859251edc8952fc # v2 + if: | + ${{ steps.nf_core_outdated.outputs.stdout }} =~ 'nf-core' + with: + repo-token: ${{ secrets.NF_CORE_BOT_AUTH_TOKEN }} + allow-repeats: false + message: | + ## :warning: Newer version of the nf-core template is available. + + Your pipeline is using an old version of the nf-core template: ${{ steps.read_yml.outputs['nf_core_version'] }}. + Please update your pipeline to the latest version. + + For more documentation on how to update your pipeline, please see the [nf-core documentation](https://github.com/nf-core/tools?tab=readme-ov-file#sync-a-pipeline-with-the-template) and [Synchronisation documentation](https://nf-co.re/docs/contributing/sync). + # diff --git a/.gitpod.yml b/.gitpod.yml index 105a1821..46118637 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -4,17 +4,14 @@ tasks: command: | pre-commit install --install-hooks nextflow self-update - - name: unset JAVA_TOOL_OPTIONS - command: | - unset JAVA_TOOL_OPTIONS vscode: extensions: # based on nf-core.nf-core-extensionpack - - esbenp.prettier-vscode # Markdown/CommonMark linting and style checking for Visual Studio Code + #- esbenp.prettier-vscode # Markdown/CommonMark linting and style checking for Visual Studio Code - EditorConfig.EditorConfig # override user/workspace settings with settings found in .editorconfig files - Gruntfuggly.todo-tree # Display TODO and FIXME in a tree view in the activity bar - mechatroner.rainbow-csv # Highlight columns in csv files in different colors - # - nextflow.nextflow # Nextflow syntax highlighting + - nextflow.nextflow # Nextflow syntax highlighting - oderwat.indent-rainbow # Highlight indentation level - streetsidesoftware.code-spell-checker # Spelling checker for source code - charliermarsh.ruff # Code linter Ruff diff --git a/.nf-core.yml b/.nf-core.yml index e0b85a77..52ebfa42 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,2 +1,22 @@ +bump_version: null +lint: + nextflow_config: + - config_defaults: + - params.logo_file + - params.css_file + - params.citations_file + - params.report_file +nf_core_version: 3.0.0 +org_path: null repository_type: pipeline -nf_core_version: "2.14.1" +template: + author: Oskar Wacker, Jonathan Manning + description: Differential abundance analysis + force: false + is_nfcore: true + name: differentialabundance + org: nf-core + outdir: . + skip_features: null + version: 1.6.0dev +update: null diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 4dc0f1dc..9e9f0e1c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -7,7 +7,7 @@ repos: - prettier@3.2.5 - repo: https://github.com/editorconfig-checker/editorconfig-checker.python - rev: "2.7.3" + rev: "3.0.3" hooks: - id: editorconfig-checker alias: ec diff --git a/.prettierignore b/.prettierignore index 437d763d..610e5069 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,3 +1,4 @@ + email_template.html adaptivecard.json slackreport.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 27e90f51..d0218bb6 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). -## v1.5.0 - [date] +## v1.6.0dev - [date] Initial release of nf-core/differentialabundance, created with the [nf-core](https://nf-co.re/) template. diff --git a/CITATIONS.md b/CITATIONS.md index 98a59307..aaa718a6 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -12,11 +12,11 @@ - [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) - > Andrews, S. (2010). FastQC: A Quality Control Tool for High Throughput Sequence Data [Online]. +> Andrews, S. (2010). FastQC: A Quality Control Tool for High Throughput Sequence Data [Online]. - [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. +> 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. ## Software packaging/containerisation tools diff --git a/README.md b/README.md index d09ab926..b217052a 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ [![GitHub Actions Linting Status](https://github.com/nf-core/differentialabundance/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/differentialabundance/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/differentialabundance/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) [![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/) +[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A524.04.2-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/) [![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/) @@ -67,8 +67,7 @@ nextflow run nf-core/differentialabundance \ ``` > [!WARNING] -> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; -> see [docs](https://nf-co.re/usage/configuration#custom-configuration-files). +> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files). For more details and further functionality, please refer to the [usage documentation](https://nf-co.re/differentialabundance/usage) and the [parameter documentation](https://nf-co.re/differentialabundance/parameters). diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index b85f6704..3c2228d0 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -1,9 +1,7 @@ report_comment: > - - This report has been generated by the nf-core/differentialabundance + This report has been generated by the nf-core/differentialabundance analysis pipeline. For information about how to interpret these results, please see the - documentation. - + documentation. report_section_order: "nf-core-differentialabundance-methods-description": order: -1000 diff --git a/assets/schema_input.json b/assets/schema_input.json index 51ce86d5..78d70bb7 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/draft-07/schema", + "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://raw.githubusercontent.com/nf-core/differentialabundance/master/assets/schema_input.json", "title": "nf-core/differentialabundance pipeline - params.input schema", "description": "Schema for the file provided with params.input", diff --git a/conf/base.config b/conf/base.config index a63db502..6bc72b3c 100644 --- a/conf/base.config +++ b/conf/base.config @@ -11,9 +11,9 @@ 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' ) } + cpus = { 1 * task.attempt } + memory = { 6.GB * task.attempt } + time = { 4.h * task.attempt } errorStrategy = { task.exitStatus in ((130..145) + 104) ? 'retry' : 'finish' } maxRetries = 1 @@ -27,30 +27,30 @@ process { // TODO nf-core: Customise requirements for specific processes. // See https://www.nextflow.io/docs/latest/config.html#config-process-selectors withLabel:process_single { - cpus = { check_max( 1 , 'cpus' ) } - memory = { check_max( 6.GB * task.attempt, 'memory' ) } - time = { check_max( 4.h * task.attempt, 'time' ) } + cpus = { 1 } + memory = { 6.GB * task.attempt } + time = { 4.h * task.attempt } } withLabel:process_low { - cpus = { check_max( 2 * task.attempt, 'cpus' ) } - memory = { check_max( 12.GB * task.attempt, 'memory' ) } - time = { check_max( 4.h * task.attempt, 'time' ) } + cpus = { 2 * task.attempt } + memory = { 12.GB * task.attempt } + time = { 4.h * task.attempt } } withLabel:process_medium { - cpus = { check_max( 6 * task.attempt, 'cpus' ) } - memory = { check_max( 36.GB * task.attempt, 'memory' ) } - time = { check_max( 8.h * task.attempt, 'time' ) } + cpus = { 6 * task.attempt } + memory = { 36.GB * task.attempt } + time = { 8.h * task.attempt } } withLabel:process_high { - cpus = { check_max( 12 * task.attempt, 'cpus' ) } - memory = { check_max( 72.GB * task.attempt, 'memory' ) } - time = { check_max( 16.h * task.attempt, 'time' ) } + cpus = { 12 * task.attempt } + memory = { 72.GB * task.attempt } + time = { 16.h * task.attempt } } withLabel:process_long { - time = { check_max( 20.h * task.attempt, 'time' ) } + time = { 20.h * task.attempt } } withLabel:process_high_memory { - memory = { check_max( 200.GB * task.attempt, 'memory' ) } + memory = { 200.GB * task.attempt } } withLabel:error_ignore { errorStrategy = 'ignore' diff --git a/conf/igenomes_ignored.config b/conf/igenomes_ignored.config new file mode 100644 index 00000000..b4034d82 --- /dev/null +++ b/conf/igenomes_ignored.config @@ -0,0 +1,9 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Nextflow config file for iGenomes paths +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Empty genomes dictionary to use when igenomes is ignored. +---------------------------------------------------------------------------------------- +*/ + +params.genomes = [:] diff --git a/conf/modules.config b/conf/modules.config index d203d2b6..d266a387 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -21,7 +21,6 @@ process { withName: FASTQC { ext.args = '--quiet' } - withName: 'MULTIQC' { ext.args = { params.multiqc_title ? "--title \"$params.multiqc_title\"" : '' } publishDir = [ diff --git a/conf/test.config b/conf/test.config index ea55c6c3..de73768f 100644 --- a/conf/test.config +++ b/conf/test.config @@ -10,15 +10,18 @@ ---------------------------------------------------------------------------------------- */ +process { + resourceLimits = [ + cpus: 4, + memory: '15.GB', + time: '1.h' + ] +} + params { config_profile_name = 'Test profile' 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 // 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 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 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 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/output.md b/docs/output.md index afe90b5c..3f817bd4 100644 --- a/docs/output.md +++ b/docs/output.md @@ -14,6 +14,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d - [FastQC](#fastqc) - Raw read QC - [MultiQC](#multiqc) - Aggregate report describing results and QC from the whole pipeline + - [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution ### FastQC @@ -29,16 +30,6 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d [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) - -:::note -The FastQC plots displayed in the MultiQC report shows _untrimmed_ reads. They may contain adapter sequence and potentially regions with low quality. -::: - ### MultiQC
    diff --git a/docs/usage.md b/docs/usage.md index 55beaabc..a727d27b 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -85,9 +85,9 @@ The above pipeline run specified with a params file in yaml format: nextflow run nf-core/differentialabundance -profile docker -params-file params.yaml ``` -with `params.yaml` containing: +with: -```yaml +```yaml title="params.yaml" input: './samplesheet.csv' outdir: './results/' genome: 'GRCh37' @@ -199,14 +199,6 @@ See the main [Nextflow documentation](https://www.nextflow.io/docs/latest/config If you have any questions or issues please send us a message on [Slack](https://nf-co.re/join/slack) on the [`#configs` channel](https://nfcore.slack.com/channels/configs). -## Azure Resource Requests - -To be used with the `azurebatch` profile by specifying the `-profile azurebatch`. -We recommend providing a compute `params.vm_type` of `Standard_D16_v3` VMs by default but these options can be changed if required. - -Note that the choice of VM size depends on your quota and the overall workload during the analysis. -For a thorough list, please refer the [Azure Sizes for virtual machines in Azure](https://docs.microsoft.com/en-us/azure/virtual-machines/sizes). - ## Running in the background Nextflow handles job submissions and supervises the running jobs. The Nextflow process must run until the pipeline is finished. diff --git a/main.nf b/main.nf index 1802782c..c0353d9d 100644 --- a/main.nf +++ b/main.nf @@ -9,8 +9,6 @@ ---------------------------------------------------------------------------------------- */ -nextflow.enable.dsl = 2 - /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ IMPORT FUNCTIONS / MODULES / SUBWORKFLOWS / WORKFLOWS @@ -20,7 +18,6 @@ nextflow.enable.dsl = 2 include { DIFFERENTIALABUNDANCE } from './workflows/differentialabundance' include { PIPELINE_INITIALISATION } from './subworkflows/local/utils_nfcore_differentialabundance_pipeline' include { PIPELINE_COMPLETION } from './subworkflows/local/utils_nfcore_differentialabundance_pipeline' - include { getGenomeAttribute } from './subworkflows/local/utils_nfcore_differentialabundance_pipeline' /* @@ -56,10 +53,8 @@ workflow NFCORE_DIFFERENTIALABUNDANCE { DIFFERENTIALABUNDANCE ( samplesheet ) - emit: multiqc_report = DIFFERENTIALABUNDANCE.out.multiqc_report // channel: /path/to/multiqc_report.html - } /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -70,27 +65,24 @@ workflow NFCORE_DIFFERENTIALABUNDANCE { workflow { main: - // // SUBWORKFLOW: Run initialisation tasks // PIPELINE_INITIALISATION ( params.version, - params.help, params.validate_params, params.monochrome_logs, args, params.outdir, params.input ) - + // // WORKFLOW: Run main workflow // NFCORE_DIFFERENTIALABUNDANCE ( PIPELINE_INITIALISATION.out.samplesheet ) - // // SUBWORKFLOW: Run completion tasks // diff --git a/modules.json b/modules.json index 3e976078..da2bf281 100644 --- a/modules.json +++ b/modules.json @@ -7,12 +7,12 @@ "nf-core": { "fastqc": { "branch": "master", - "git_sha": "285a50500f9e02578d90b3ce6382ea3c30216acd", + "git_sha": "666652151335353eef2fcd58880bcef5bc2928e1", "installed_by": ["modules"] }, "multiqc": { "branch": "master", - "git_sha": "b7ebe95761cd389603f9cc0e0dc384c0f663815a", + "git_sha": "666652151335353eef2fcd58880bcef5bc2928e1", "installed_by": ["modules"] } } @@ -21,17 +21,17 @@ "nf-core": { "utils_nextflow_pipeline": { "branch": "master", - "git_sha": "5caf7640a9ef1d18d765d55339be751bb0969dfa", + "git_sha": "d20fb2a9cc3e2835e9d067d1046a63252eb17352", "installed_by": ["subworkflows"] }, "utils_nfcore_pipeline": { "branch": "master", - "git_sha": "92de218a329bfc9a9033116eb5f65fd270e72ba3", + "git_sha": "2fdce49d30c0254f76bc0f13c55c17455c1251ab", "installed_by": ["subworkflows"] }, - "utils_nfvalidation_plugin": { + "utils_nfschema_plugin": { "branch": "master", - "git_sha": "5caf7640a9ef1d18d765d55339be751bb0969dfa", + "git_sha": "bbd5a41f4535a8defafe6080e00ea74c45f4f96c", "installed_by": ["subworkflows"] } } diff --git a/modules/nf-core/fastqc/environment.yml b/modules/nf-core/fastqc/environment.yml index 1787b38a..691d4c76 100644 --- a/modules/nf-core/fastqc/environment.yml +++ b/modules/nf-core/fastqc/environment.yml @@ -1,7 +1,5 @@ -name: fastqc channels: - conda-forge - bioconda - - defaults dependencies: - bioconda::fastqc=0.12.1 diff --git a/modules/nf-core/fastqc/main.nf b/modules/nf-core/fastqc/main.nf index d79f1c86..d8989f48 100644 --- a/modules/nf-core/fastqc/main.nf +++ b/modules/nf-core/fastqc/main.nf @@ -26,7 +26,10 @@ process FASTQC { def rename_to = old_new_pairs*.join(' ').join(' ') def renamed_files = old_new_pairs.collect{ old_name, new_name -> new_name }.join(' ') - def memory_in_mb = MemoryUnit.of("${task.memory}").toUnit('MB') + // The total amount of allocated RAM by FastQC is equal to the number of threads defined (--threads) time the amount of RAM defined (--memory) + // https://github.com/s-andrews/FastQC/blob/1faeea0412093224d7f6a07f777fad60a5650795/fastqc#L211-L222 + // Dividing the task.memory by task.cpu allows to stick to requested amount of RAM in the label + def memory_in_mb = MemoryUnit.of("${task.memory}").toUnit('MB') / task.cpus // FastQC memory value allowed range (100 - 10000) def fastqc_memory = memory_in_mb > 10000 ? 10000 : (memory_in_mb < 100 ? 100 : memory_in_mb) diff --git a/modules/nf-core/fastqc/meta.yml b/modules/nf-core/fastqc/meta.yml index ee5507e0..4827da7a 100644 --- a/modules/nf-core/fastqc/meta.yml +++ b/modules/nf-core/fastqc/meta.yml @@ -16,35 +16,44 @@ tools: homepage: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/ documentation: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/ licence: ["GPL-2.0-only"] + identifier: biotools:fastqc 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. + - - 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}" + - 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}" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.zip": + type: file + description: FastQC report archive + pattern: "*_{fastqc.zip}" - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - "@drpatelh" - "@grst" diff --git a/modules/nf-core/fastqc/tests/main.nf.test b/modules/nf-core/fastqc/tests/main.nf.test index 70edae4d..e9d79a07 100644 --- a/modules/nf-core/fastqc/tests/main.nf.test +++ b/modules/nf-core/fastqc/tests/main.nf.test @@ -23,17 +23,14 @@ nextflow_process { then { assertAll ( - { assert process.success }, - - // NOTE The report contains the date inside it, which means that the md5sum is stable per day, but not longer than that. So you can't md5sum it. - // looks like this:
    Mon 2 Oct 2023
    test.gz
    - // https://github.com/nf-core/modules/pull/3903#issuecomment-1743620039 - - { assert process.out.html[0][1] ==~ ".*/test_fastqc.html" }, - { assert process.out.zip[0][1] ==~ ".*/test_fastqc.zip" }, - { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, - - { assert snapshot(process.out.versions).match("fastqc_versions_single") } + { assert process.success }, + // NOTE The report contains the date inside it, which means that the md5sum is stable per day, but not longer than that. So you can't md5sum it. + // looks like this:
    Mon 2 Oct 2023
    test.gz
    + // https://github.com/nf-core/modules/pull/3903#issuecomment-1743620039 + { assert process.out.html[0][1] ==~ ".*/test_fastqc.html" }, + { assert process.out.zip[0][1] ==~ ".*/test_fastqc.zip" }, + { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, + { assert snapshot(process.out.versions).match() } ) } } @@ -54,16 +51,14 @@ nextflow_process { then { assertAll ( - { assert process.success }, - - { assert process.out.html[0][1][0] ==~ ".*/test_1_fastqc.html" }, - { assert process.out.html[0][1][1] ==~ ".*/test_2_fastqc.html" }, - { assert process.out.zip[0][1][0] ==~ ".*/test_1_fastqc.zip" }, - { assert process.out.zip[0][1][1] ==~ ".*/test_2_fastqc.zip" }, - { assert path(process.out.html[0][1][0]).text.contains("File typeConventional base calls") }, - { assert path(process.out.html[0][1][1]).text.contains("File typeConventional base calls") }, - - { assert snapshot(process.out.versions).match("fastqc_versions_paired") } + { assert process.success }, + { assert process.out.html[0][1][0] ==~ ".*/test_1_fastqc.html" }, + { assert process.out.html[0][1][1] ==~ ".*/test_2_fastqc.html" }, + { assert process.out.zip[0][1][0] ==~ ".*/test_1_fastqc.zip" }, + { assert process.out.zip[0][1][1] ==~ ".*/test_2_fastqc.zip" }, + { assert path(process.out.html[0][1][0]).text.contains("File typeConventional base calls") }, + { assert path(process.out.html[0][1][1]).text.contains("File typeConventional base calls") }, + { assert snapshot(process.out.versions).match() } ) } } @@ -83,13 +78,11 @@ nextflow_process { then { assertAll ( - { assert process.success }, - - { assert process.out.html[0][1] ==~ ".*/test_fastqc.html" }, - { assert process.out.zip[0][1] ==~ ".*/test_fastqc.zip" }, - { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, - - { assert snapshot(process.out.versions).match("fastqc_versions_interleaved") } + { assert process.success }, + { assert process.out.html[0][1] ==~ ".*/test_fastqc.html" }, + { assert process.out.zip[0][1] ==~ ".*/test_fastqc.zip" }, + { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, + { assert snapshot(process.out.versions).match() } ) } } @@ -109,13 +102,11 @@ nextflow_process { then { assertAll ( - { assert process.success }, - - { assert process.out.html[0][1] ==~ ".*/test_fastqc.html" }, - { assert process.out.zip[0][1] ==~ ".*/test_fastqc.zip" }, - { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, - - { assert snapshot(process.out.versions).match("fastqc_versions_bam") } + { assert process.success }, + { assert process.out.html[0][1] ==~ ".*/test_fastqc.html" }, + { assert process.out.zip[0][1] ==~ ".*/test_fastqc.zip" }, + { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, + { assert snapshot(process.out.versions).match() } ) } } @@ -138,22 +129,20 @@ nextflow_process { then { assertAll ( - { assert process.success }, - - { assert process.out.html[0][1][0] ==~ ".*/test_1_fastqc.html" }, - { assert process.out.html[0][1][1] ==~ ".*/test_2_fastqc.html" }, - { assert process.out.html[0][1][2] ==~ ".*/test_3_fastqc.html" }, - { assert process.out.html[0][1][3] ==~ ".*/test_4_fastqc.html" }, - { assert process.out.zip[0][1][0] ==~ ".*/test_1_fastqc.zip" }, - { assert process.out.zip[0][1][1] ==~ ".*/test_2_fastqc.zip" }, - { assert process.out.zip[0][1][2] ==~ ".*/test_3_fastqc.zip" }, - { assert process.out.zip[0][1][3] ==~ ".*/test_4_fastqc.zip" }, - { assert path(process.out.html[0][1][0]).text.contains("File typeConventional base calls") }, - { assert path(process.out.html[0][1][1]).text.contains("File typeConventional base calls") }, - { assert path(process.out.html[0][1][2]).text.contains("File typeConventional base calls") }, - { assert path(process.out.html[0][1][3]).text.contains("File typeConventional base calls") }, - - { assert snapshot(process.out.versions).match("fastqc_versions_multiple") } + { assert process.success }, + { assert process.out.html[0][1][0] ==~ ".*/test_1_fastqc.html" }, + { assert process.out.html[0][1][1] ==~ ".*/test_2_fastqc.html" }, + { assert process.out.html[0][1][2] ==~ ".*/test_3_fastqc.html" }, + { assert process.out.html[0][1][3] ==~ ".*/test_4_fastqc.html" }, + { assert process.out.zip[0][1][0] ==~ ".*/test_1_fastqc.zip" }, + { assert process.out.zip[0][1][1] ==~ ".*/test_2_fastqc.zip" }, + { assert process.out.zip[0][1][2] ==~ ".*/test_3_fastqc.zip" }, + { assert process.out.zip[0][1][3] ==~ ".*/test_4_fastqc.zip" }, + { assert path(process.out.html[0][1][0]).text.contains("File typeConventional base calls") }, + { assert path(process.out.html[0][1][1]).text.contains("File typeConventional base calls") }, + { assert path(process.out.html[0][1][2]).text.contains("File typeConventional base calls") }, + { assert path(process.out.html[0][1][3]).text.contains("File typeConventional base calls") }, + { assert snapshot(process.out.versions).match() } ) } } @@ -173,21 +162,18 @@ nextflow_process { then { assertAll ( - { assert process.success }, - - { assert process.out.html[0][1] ==~ ".*/mysample_fastqc.html" }, - { assert process.out.zip[0][1] ==~ ".*/mysample_fastqc.zip" }, - { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, - - { assert snapshot(process.out.versions).match("fastqc_versions_custom_prefix") } + { assert process.success }, + { assert process.out.html[0][1] ==~ ".*/mysample_fastqc.html" }, + { assert process.out.zip[0][1] ==~ ".*/mysample_fastqc.zip" }, + { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, + { assert snapshot(process.out.versions).match() } ) } } test("sarscov2 single-end [fastq] - stub") { - options "-stub" - + options "-stub" when { process { """ @@ -201,12 +187,123 @@ nextflow_process { then { assertAll ( - { assert process.success }, - { assert snapshot(process.out.html.collect { file(it[1]).getName() } + - process.out.zip.collect { file(it[1]).getName() } + - process.out.versions ).match("fastqc_stub") } + { assert process.success }, + { assert snapshot(process.out).match() } ) } } + test("sarscov2 paired-end [fastq] - stub") { + + options "-stub" + when { + process { + """ + input[0] = Channel.of([ + [id: 'test', single_end: false], // meta map + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) ] + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 interleaved [fastq] - stub") { + + options "-stub" + when { + process { + """ + input[0] = Channel.of([ + [id: 'test', single_end: false], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_interleaved.fastq.gz', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 paired-end [bam] - stub") { + + options "-stub" + when { + process { + """ + input[0] = Channel.of([ + [id: 'test', single_end: false], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 multiple [fastq] - stub") { + + options "-stub" + when { + process { + """ + input[0] = Channel.of([ + [id: 'test', single_end: false], // meta map + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test2_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test2_2.fastq.gz', checkIfExists: true) ] + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 custom_prefix - stub") { + + options "-stub" + when { + process { + """ + input[0] = Channel.of([ + [ id:'mysample', single_end:true ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } } diff --git a/modules/nf-core/fastqc/tests/main.nf.test.snap b/modules/nf-core/fastqc/tests/main.nf.test.snap index 86f7c311..d5db3092 100644 --- a/modules/nf-core/fastqc/tests/main.nf.test.snap +++ b/modules/nf-core/fastqc/tests/main.nf.test.snap @@ -1,88 +1,392 @@ { - "fastqc_versions_interleaved": { + "sarscov2 custom_prefix": { "content": [ [ "versions.yml:md5,e1cc25ca8af856014824abd842e93978" ] ], "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nf-test": "0.9.0", + "nextflow": "24.04.3" }, - "timestamp": "2024-01-31T17:40:07.293713" + "timestamp": "2024-07-22T11:02:16.374038" }, - "fastqc_stub": { + "sarscov2 single-end [fastq] - stub": { "content": [ - [ - "test.html", - "test.zip", - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": true + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + ], + "html": [ + [ + { + "id": "test", + "single_end": true + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + ], + "zip": [ + [ + { + "id": "test", + "single_end": true + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T11:02:24.993809" + }, + "sarscov2 custom_prefix - stub": { + "content": [ + { + "0": [ + [ + { + "id": "mysample", + "single_end": true + }, + "mysample.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "mysample", + "single_end": true + }, + "mysample.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + ], + "html": [ + [ + { + "id": "mysample", + "single_end": true + }, + "mysample.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + ], + "zip": [ + [ + { + "id": "mysample", + "single_end": true + }, + "mysample.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } ], "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nf-test": "0.9.0", + "nextflow": "24.04.3" }, - "timestamp": "2024-01-31T17:31:01.425198" + "timestamp": "2024-07-22T11:03:10.93942" }, - "fastqc_versions_multiple": { + "sarscov2 interleaved [fastq]": { "content": [ [ "versions.yml:md5,e1cc25ca8af856014824abd842e93978" ] ], "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nf-test": "0.9.0", + "nextflow": "24.04.3" }, - "timestamp": "2024-01-31T17:40:55.797907" + "timestamp": "2024-07-22T11:01:42.355718" }, - "fastqc_versions_bam": { + "sarscov2 paired-end [bam]": { "content": [ [ "versions.yml:md5,e1cc25ca8af856014824abd842e93978" ] ], "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nf-test": "0.9.0", + "nextflow": "24.04.3" }, - "timestamp": "2024-01-31T17:40:26.795862" + "timestamp": "2024-07-22T11:01:53.276274" }, - "fastqc_versions_single": { + "sarscov2 multiple [fastq]": { "content": [ [ "versions.yml:md5,e1cc25ca8af856014824abd842e93978" ] ], "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nf-test": "0.9.0", + "nextflow": "24.04.3" }, - "timestamp": "2024-01-31T17:39:27.043675" + "timestamp": "2024-07-22T11:02:05.527626" }, - "fastqc_versions_paired": { + "sarscov2 paired-end [fastq]": { "content": [ [ "versions.yml:md5,e1cc25ca8af856014824abd842e93978" ] ], "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T11:01:31.188871" + }, + "sarscov2 paired-end [fastq] - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + ], + "html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + ], + "zip": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T11:02:34.273566" + }, + "sarscov2 multiple [fastq] - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + ], + "html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + ], + "zip": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" }, - "timestamp": "2024-01-31T17:39:47.584191" + "timestamp": "2024-07-22T11:03:02.304411" }, - "fastqc_versions_custom_prefix": { + "sarscov2 single-end [fastq]": { "content": [ [ "versions.yml:md5,e1cc25ca8af856014824abd842e93978" ] ], "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T11:01:19.095607" + }, + "sarscov2 interleaved [fastq] - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + ], + "html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + ], + "zip": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-07-22T11:02:44.640184" + }, + "sarscov2 paired-end [bam] - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + ], + "html": [ + [ + { + "id": "test", + "single_end": false + }, + "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + ], + "zip": [ + [ + { + "id": "test", + "single_end": false + }, + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" }, - "timestamp": "2024-01-31T17:41:14.576531" + "timestamp": "2024-07-22T11:02:53.550742" } } \ No newline at end of file diff --git a/modules/nf-core/multiqc/environment.yml b/modules/nf-core/multiqc/environment.yml index ca39fb67..f1cd99b0 100644 --- a/modules/nf-core/multiqc/environment.yml +++ b/modules/nf-core/multiqc/environment.yml @@ -1,7 +1,5 @@ -name: multiqc channels: - conda-forge - bioconda - - defaults dependencies: - - bioconda::multiqc=1.21 + - bioconda::multiqc=1.24.1 diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index 47ac352f..b9ccebdb 100644 --- a/modules/nf-core/multiqc/main.nf +++ b/modules/nf-core/multiqc/main.nf @@ -3,14 +3,16 @@ process MULTIQC { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.21--pyhdfd78af_0' : - 'biocontainers/multiqc:1.21--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.25--pyhdfd78af_0' : + 'biocontainers/multiqc:1.25--pyhdfd78af_0' }" input: path multiqc_files, stageAs: "?/*" path(multiqc_config) path(extra_multiqc_config) path(multiqc_logo) + path(replace_names) + path(sample_names) output: path "*multiqc_report.html", emit: report @@ -23,16 +25,22 @@ process MULTIQC { script: def args = task.ext.args ?: '' + def prefix = task.ext.prefix ? "--filename ${task.ext.prefix}.html" : '' def config = multiqc_config ? "--config $multiqc_config" : '' def extra_config = extra_multiqc_config ? "--config $extra_multiqc_config" : '' - def logo = multiqc_logo ? /--cl-config 'custom_logo: "${multiqc_logo}"'/ : '' + def logo = multiqc_logo ? "--cl-config 'custom_logo: \"${multiqc_logo}\"'" : '' + def replace = replace_names ? "--replace-names ${replace_names}" : '' + def samples = sample_names ? "--sample-names ${sample_names}" : '' """ multiqc \\ --force \\ $args \\ $config \\ + $prefix \\ $extra_config \\ $logo \\ + $replace \\ + $samples \\ . cat <<-END_VERSIONS > versions.yml diff --git a/modules/nf-core/multiqc/meta.yml b/modules/nf-core/multiqc/meta.yml index 45a9bc35..b16c1879 100644 --- a/modules/nf-core/multiqc/meta.yml +++ b/modules/nf-core/multiqc/meta.yml @@ -1,5 +1,6 @@ name: multiqc -description: Aggregate results from bioinformatics analyses across many samples into a single report +description: Aggregate results from bioinformatics analyses across many samples into + a single report keywords: - QC - bioinformatics tools @@ -12,40 +13,59 @@ tools: homepage: https://multiqc.info/ documentation: https://multiqc.info/docs/ licence: ["GPL-3.0-or-later"] + identifier: biotools:multiqc input: - - multiqc_files: - type: file - description: | - List of reports / files recognised by MultiQC, for example the html and zip output of FastQC - - multiqc_config: - type: file - description: Optional config yml for MultiQC - pattern: "*.{yml,yaml}" - - extra_multiqc_config: - type: file - description: Second optional config yml for MultiQC. Will override common sections in multiqc_config. - pattern: "*.{yml,yaml}" - - multiqc_logo: - type: file - description: Optional logo file for MultiQC - pattern: "*.{png}" + - - multiqc_files: + type: file + description: | + List of reports / files recognised by MultiQC, for example the html and zip output of FastQC + - - multiqc_config: + type: file + description: Optional config yml for MultiQC + pattern: "*.{yml,yaml}" + - - extra_multiqc_config: + type: file + description: Second optional config yml for MultiQC. Will override common sections + in multiqc_config. + pattern: "*.{yml,yaml}" + - - multiqc_logo: + type: file + description: Optional logo file for MultiQC + pattern: "*.{png}" + - - replace_names: + type: file + description: | + Optional two-column sample renaming file. First column a set of + patterns, second column a set of corresponding replacements. Passed via + MultiQC's `--replace-names` option. + pattern: "*.{tsv}" + - - sample_names: + type: file + description: | + Optional TSV file with headers, passed to the MultiQC --sample_names + argument. + pattern: "*.{tsv}" output: - report: - type: file - description: MultiQC report file - pattern: "multiqc_report.html" + - "*multiqc_report.html": + type: file + description: MultiQC report file + pattern: "multiqc_report.html" - data: - type: directory - description: MultiQC data dir - pattern: "multiqc_data" + - "*_data": + type: directory + description: MultiQC data dir + pattern: "multiqc_data" - plots: - type: file - description: Plots created by MultiQC - pattern: "*_data" + - "*_plots": + type: file + description: Plots created by MultiQC + pattern: "*_data" - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - "@abhi18av" - "@bunop" diff --git a/modules/nf-core/multiqc/tests/main.nf.test b/modules/nf-core/multiqc/tests/main.nf.test index f1c4242e..33316a7d 100644 --- a/modules/nf-core/multiqc/tests/main.nf.test +++ b/modules/nf-core/multiqc/tests/main.nf.test @@ -8,6 +8,8 @@ nextflow_process { tag "modules_nfcore" tag "multiqc" + config "./nextflow.config" + test("sarscov2 single-end [fastqc]") { when { @@ -17,6 +19,8 @@ nextflow_process { input[1] = [] input[2] = [] input[3] = [] + input[4] = [] + input[5] = [] """ } } @@ -41,6 +45,8 @@ nextflow_process { input[1] = Channel.of(file("https://github.com/nf-core/tools/raw/dev/nf_core/pipeline-template/assets/multiqc_config.yml", checkIfExists: true)) input[2] = [] input[3] = [] + input[4] = [] + input[5] = [] """ } } @@ -66,6 +72,8 @@ nextflow_process { input[1] = [] input[2] = [] input[3] = [] + input[4] = [] + input[5] = [] """ } } diff --git a/modules/nf-core/multiqc/tests/main.nf.test.snap b/modules/nf-core/multiqc/tests/main.nf.test.snap index bfebd802..b779e469 100644 --- a/modules/nf-core/multiqc/tests/main.nf.test.snap +++ b/modules/nf-core/multiqc/tests/main.nf.test.snap @@ -2,14 +2,14 @@ "multiqc_versions_single": { "content": [ [ - "versions.yml:md5,21f35ee29416b9b3073c28733efe4b7d" + "versions.yml:md5,8c8724363a5efe0c6f43ab34faa57efd" ] ], "meta": { "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nextflow": "24.04.2" }, - "timestamp": "2024-02-29T08:48:55.657331" + "timestamp": "2024-07-10T12:41:34.562023" }, "multiqc_stub": { "content": [ @@ -17,25 +17,25 @@ "multiqc_report.html", "multiqc_data", "multiqc_plots", - "versions.yml:md5,21f35ee29416b9b3073c28733efe4b7d" + "versions.yml:md5,8c8724363a5efe0c6f43ab34faa57efd" ] ], "meta": { "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nextflow": "24.04.2" }, - "timestamp": "2024-02-29T08:49:49.071937" + "timestamp": "2024-07-10T11:27:11.933869532" }, "multiqc_versions_config": { "content": [ [ - "versions.yml:md5,21f35ee29416b9b3073c28733efe4b7d" + "versions.yml:md5,8c8724363a5efe0c6f43ab34faa57efd" ] ], "meta": { "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nextflow": "24.04.2" }, - "timestamp": "2024-02-29T08:49:25.457567" + "timestamp": "2024-07-10T11:26:56.709849369" } -} \ No newline at end of file +} diff --git a/modules/nf-core/multiqc/tests/nextflow.config b/modules/nf-core/multiqc/tests/nextflow.config new file mode 100644 index 00000000..c537a6a3 --- /dev/null +++ b/modules/nf-core/multiqc/tests/nextflow.config @@ -0,0 +1,5 @@ +process { + withName: 'MULTIQC' { + ext.prefix = null + } +} diff --git a/nextflow.config b/nextflow.config index 862544ff..4a30d3a3 100644 --- a/nextflow.config +++ b/nextflow.config @@ -16,7 +16,6 @@ params { genome = null igenomes_base = 's3://ngi-igenomes/igenomes/' igenomes_ignore = false - // MultiQC options multiqc_config = null multiqc_title = null @@ -33,48 +32,26 @@ params { monochrome_logs = false hook_url = null help = false + help_full = false + show_hidden = false version = false pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/' - // Config options config_profile_name = null config_profile_description = null + custom_config_version = 'master' custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" config_profile_contact = null config_profile_url = null - - // Max resource options - // Defaults only, expecting to be overwritten - max_memory = '128.GB' - max_cpus = 16 - max_time = '240.h' - // Schema validation default options - validationFailUnrecognisedParams = false - validationLenientMode = false - validationSchemaIgnoreParams = 'genomes,igenomes_base' - validationShowHiddenParams = false - validate_params = true - + validate_params = true + } // Load base.config by default for all pipelines includeConfig 'conf/base.config' -// Load nf-core custom profiles from different Institutions -try { - includeConfig "${params.custom_config_base}/nfcore_custom.config" -} catch (Exception e) { - System.err.println("WARNING: Could not load nf-core/config profiles: ${params.custom_config_base}/nfcore_custom.config") -} - -// Load nf-core/differentialabundance custom profiles from different institutions. -try { - includeConfig "${params.custom_config_base}/pipeline/differentialabundance.config" -} catch (Exception e) { - System.err.println("WARNING: Could not load nf-core/config/differentialabundance profiles: ${params.custom_config_base}/pipeline/differentialabundance.config") -} profiles { debug { dumpHashes = true @@ -89,7 +66,7 @@ profiles { podman.enabled = false shifter.enabled = false charliecloud.enabled = false - conda.channels = ['conda-forge', 'bioconda', 'defaults'] + conda.channels = ['conda-forge', 'bioconda'] apptainer.enabled = false } mamba { @@ -178,25 +155,23 @@ profiles { test_full { includeConfig 'conf/test_full.config' } } -// Set default registry for Apptainer, Docker, Podman and Singularity independent of -profile -// Will not be used unless Apptainer / Docker / Podman / Singularity are enabled -// Set to your registry if you have a mirror of containers -apptainer.registry = 'quay.io' -docker.registry = 'quay.io' -podman.registry = 'quay.io' -singularity.registry = 'quay.io' +// Load nf-core custom profiles from different Institutions +includeConfig !System.getenv('NXF_OFFLINE') && params.custom_config_base ? "${params.custom_config_base}/nfcore_custom.config" : "/dev/null" -// Nextflow plugins -plugins { - id 'nf-validation@1.1.3' // Validation of pipeline parameters and creation of an input channel from a sample sheet -} +// Load nf-core/differentialabundance custom profiles from different institutions. +// TODO nf-core: Optionally, you can add a pipeline-specific nf-core config at https://github.com/nf-core/configs +// includeConfig !System.getenv('NXF_OFFLINE') && params.custom_config_base ? "${params.custom_config_base}/pipeline/differentialabundance.config" : "/dev/null" +// Set default registry for Apptainer, Docker, Podman, Charliecloud and Singularity independent of -profile +// Will not be used unless Apptainer / Docker / Podman / Charliecloud / Singularity are enabled +// Set to your registry if you have a mirror of containers +apptainer.registry = 'quay.io' +docker.registry = 'quay.io' +podman.registry = 'quay.io' +singularity.registry = 'quay.io' +charliecloud.registry = 'quay.io' // Load igenomes.config if required -if (!params.igenomes_ignore) { - includeConfig 'conf/igenomes.config' -} else { - params.genomes = [:] -} +includeConfig !params.igenomes_ignore ? 'conf/igenomes.config' : 'conf/igenomes_ignored.config' // 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. @@ -208,8 +183,15 @@ env { JULIA_DEPOT_PATH = "/usr/local/share/julia" } -// Capture exit codes from upstream processes when piping -process.shell = ['/bin/bash', '-euo', 'pipefail'] +// Set bash options +process.shell = """\ +bash + +set -e # Exit if a tool returns a non-zero status/exit code +set -u # Treat unset variables and parameters as an error +set -o pipefail # Returns the status of the last command to exit with a non-zero status or zero if all successfully execute +set -C # No clobber - prevent output redirection from overwriting files. +""" // Disable process selector warnings by default. Use debug profile to enable warnings. nextflow.enable.configProcessNamesValidation = false @@ -238,43 +220,47 @@ manifest { homePage = 'https://github.com/nf-core/differentialabundance' description = """Differential abundance analysis""" mainScript = 'main.nf' - nextflowVersion = '!>=23.04.0' - version = '1.5.0' + nextflowVersion = '!>=24.04.2' + version = '1.6.0dev' doi = '' } -// Load modules.config for DSL2 module specific options -includeConfig 'conf/modules.config' +// Nextflow plugins +plugins { + id 'nf-schema@2.1.1' // Validation of pipeline parameters and creation of an input channel from a sample sheet +} + +validation { + defaultIgnoreParams = ["genomes"] + help { + enabled = true + command = "nextflow run $manifest.name -profile --input samplesheet.csv --outdir " + fullParameter = "help_full" + showHiddenParameter = "show_hidden" + beforeText = """ +-\033[2m----------------------------------------------------\033[0m- + \033[0;32m,--.\033[0;30m/\033[0;32m,-.\033[0m +\033[0;34m ___ __ __ __ ___ \033[0;32m/,-._.--~\'\033[0m +\033[0;34m |\\ | |__ __ / ` / \\ |__) |__ \033[0;33m} {\033[0m +\033[0;34m | \\| | \\__, \\__/ | \\ |___ \033[0;32m\\`-._,-`-,\033[0m + \033[0;32m`._,._,\'\033[0m +\033[0;35m ${manifest.name} ${manifest.version}\033[0m +-\033[2m----------------------------------------------------\033[0m- +""" + afterText = """${manifest.doi ? "* The pipeline\n" : ""}${manifest.doi.tokenize(",").collect { " https://doi.org/${it.trim().replace('https://doi.org/','')}"}.join("\n")}${manifest.doi ? "\n" : ""} +* The nf-core framework + https://doi.org/10.1038/s41587-020-0439-x -// Function to ensure that resource requirements don't go beyond -// a maximum limit -def check_max(obj, type) { - if (type == 'memory') { - try { - if (obj.compareTo(params.max_memory as nextflow.util.MemoryUnit) == 1) - return params.max_memory as nextflow.util.MemoryUnit - else - return obj - } catch (all) { - println " ### ERROR ### Max memory '${params.max_memory}' is not valid! Using default value: $obj" - return obj - } - } else if (type == 'time') { - try { - if (obj.compareTo(params.max_time as nextflow.util.Duration) == 1) - return params.max_time as nextflow.util.Duration - else - return obj - } catch (all) { - println " ### ERROR ### Max time '${params.max_time}' is not valid! Using default value: $obj" - return obj - } - } else if (type == 'cpus') { - try { - return Math.min( obj, params.max_cpus as int ) - } catch (all) { - println " ### ERROR ### Max cpus '${params.max_cpus}' is not valid! Using default value: $obj" - return obj - } +* Software dependencies + https://github.com/${manifest.name}/blob/master/CITATIONS.md +""" + } + summary { + beforeText = validation.help.beforeText + afterText = validation.help.afterText } } + +// Load modules.config for DSL2 module specific options +includeConfig 'conf/modules.config' + diff --git a/nextflow_schema.json b/nextflow_schema.json index ae89f23d..5886be23 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -1,10 +1,10 @@ { - "$schema": "http://json-schema.org/draft-07/schema", + "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://raw.githubusercontent.com/nf-core/differentialabundance/master/nextflow_schema.json", "title": "nf-core/differentialabundance pipeline parameters", "description": "Differential abundance analysis", "type": "object", - "definitions": { + "$defs": { "input_output_options": { "title": "Input/output options", "type": "object", @@ -71,6 +71,14 @@ "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`." + }, + "igenomes_base": { + "type": "string", + "format": "directory-path", + "description": "The base path to the igenomes reference files", + "fa_icon": "fas fa-ban", + "hidden": true, + "default": "s3://ngi-igenomes/igenomes/" } } }, @@ -122,41 +130,6 @@ } } }, - "max_job_request_options": { - "title": "Max job request options", - "type": "object", - "fa_icon": "fab fa-acquisitions-incorporated", - "description": "Set the top limit for requested resources for any single job.", - "help_text": "If you are running on a smaller system, a pipeline step requesting more resources than are available may cause the Nextflow to stop the run with an error. These options allow you to cap the maximum resources requested by any single job so that the pipeline will run on your system.\n\nNote that you can not _increase_ the resources requested by any job using these options. For that you will need your own configuration file. See [the nf-core website](https://nf-co.re/usage/configuration) for details.", - "properties": { - "max_cpus": { - "type": "integer", - "description": "Maximum number of CPUs that can be requested for any single job.", - "default": 16, - "fa_icon": "fas fa-microchip", - "hidden": true, - "help_text": "Use to set an upper-limit for the CPU requirement for each process. Should be an integer e.g. `--max_cpus 1`" - }, - "max_memory": { - "type": "string", - "description": "Maximum amount of memory that can be requested for any single job.", - "default": "128.GB", - "fa_icon": "fas fa-memory", - "pattern": "^\\d+(\\.\\d+)?\\.?\\s*(K|M|G|T)?B$", - "hidden": true, - "help_text": "Use to set an upper-limit for the memory requirement for each process. Should be a string in the format integer-unit e.g. `--max_memory '8.GB'`" - }, - "max_time": { - "type": "string", - "description": "Maximum amount of time that can be requested for any single job.", - "default": "240.h", - "fa_icon": "far fa-clock", - "pattern": "^(\\d+\\.?\\s*(s|m|h|d|day)\\s*)+$", - "hidden": true, - "help_text": "Use to set an upper-limit for the time requirement for each process. Should be a string in the format integer-unit e.g. `--max_time '2.h'`" - } - } - }, "generic_options": { "title": "Generic options", "type": "object", @@ -164,12 +137,6 @@ "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.", @@ -245,27 +212,6 @@ "fa_icon": "fas fa-check-square", "hidden": true }, - "validationShowHiddenParams": { - "type": "boolean", - "fa_icon": "far fa-eye-slash", - "description": "Show all params when using `--help`", - "hidden": true, - "help_text": "By default, parameters set as _hidden_ in the schema are not shown on the command line when a user runs with `--help`. Specifying this option will tell the pipeline to show all parameters." - }, - "validationFailUnrecognisedParams": { - "type": "boolean", - "fa_icon": "far fa-check-circle", - "description": "Validation of parameters fails when an unrecognised parameter is found.", - "hidden": true, - "help_text": "By default, when an unrecognised parameter is found, it returns a warinig." - }, - "validationLenientMode": { - "type": "boolean", - "fa_icon": "far fa-check-circle", - "description": "Validation of parameters in lenient more.", - "hidden": true, - "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)." - }, "pipelines_testdata_base_path": { "type": "string", "fa_icon": "far fa-check-circle", @@ -278,19 +224,16 @@ }, "allOf": [ { - "$ref": "#/definitions/input_output_options" - }, - { - "$ref": "#/definitions/reference_genome_options" + "$ref": "#/$defs/input_output_options" }, { - "$ref": "#/definitions/institutional_config_options" + "$ref": "#/$defs/reference_genome_options" }, { - "$ref": "#/definitions/max_job_request_options" + "$ref": "#/$defs/institutional_config_options" }, { - "$ref": "#/definitions/generic_options" + "$ref": "#/$defs/generic_options" } ] } diff --git a/subworkflows/local/utils_nfcore_differentialabundance_pipeline/main.nf b/subworkflows/local/utils_nfcore_differentialabundance_pipeline/main.nf index 8bf1f22b..ac616e5b 100644 --- a/subworkflows/local/utils_nfcore_differentialabundance_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_differentialabundance_pipeline/main.nf @@ -8,17 +8,14 @@ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -include { UTILS_NFVALIDATION_PLUGIN } from '../../nf-core/utils_nfvalidation_plugin' -include { paramsSummaryMap } from 'plugin/nf-validation' -include { fromSamplesheet } from 'plugin/nf-validation' -include { UTILS_NEXTFLOW_PIPELINE } from '../../nf-core/utils_nextflow_pipeline' +include { UTILS_NFSCHEMA_PLUGIN } from '../../nf-core/utils_nfschema_plugin' +include { paramsSummaryMap } from 'plugin/nf-schema' +include { samplesheetToList } from 'plugin/nf-schema' 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' +include { UTILS_NEXTFLOW_PIPELINE } from '../../nf-core/utils_nextflow_pipeline' /* ======================================================================================== @@ -30,7 +27,6 @@ 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 nextflow_cli_args // array: List of positional nextflow CLI args @@ -51,20 +47,16 @@ workflow PIPELINE_INITIALISATION { workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1 ) + // // Validate parameters and generate parameter summary to stdout // - pre_help_text = nfCoreLogo(monochrome_logs) - post_help_text = '\n' + workflowCitation() + '\n' + dashedLine(monochrome_logs) - def String workflow_command = "nextflow run ${workflow.manifest.name} -profile --input samplesheet.csv --outdir " - UTILS_NFVALIDATION_PLUGIN ( - help, - workflow_command, - pre_help_text, - post_help_text, + UTILS_NFSCHEMA_PLUGIN ( + workflow, validate_params, - "nextflow_schema.json" + null ) + // // Check config provided to the pipeline @@ -80,8 +72,9 @@ workflow PIPELINE_INITIALISATION { // // Create channel from input file provided through params.input // + Channel - .fromSamplesheet("input") + .fromList(samplesheetToList(params.input, "${projectDir}/assets/schema_input.json")) .map { meta, fastq_1, fastq_2 -> if (!fastq_2) { @@ -91,8 +84,8 @@ workflow PIPELINE_INITIALISATION { } } .groupTuple() - .map { - validateInputSamplesheet(it) + .map { samplesheet -> + validateInputSamplesheet(samplesheet) } .map { meta, fastqs -> @@ -117,13 +110,13 @@ workflow PIPELINE_COMPLETION { 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 multiqc_report // string: Path to MultiQC report main: - summary_params = paramsSummaryMap(workflow, parameters_schema: "nextflow_schema.json") // @@ -131,11 +124,18 @@ workflow PIPELINE_COMPLETION { // workflow.onComplete { if (email || email_on_fail) { - completionEmail(summary_params, email, email_on_fail, plaintext_email, outdir, monochrome_logs, multiqc_report.toList()) + completionEmail( + summary_params, + email, + email_on_fail, + plaintext_email, + outdir, + monochrome_logs, + multiqc_report.toList() + ) } completionSummary(monochrome_logs) - if (hook_url) { imNotification(summary_params, hook_url) } @@ -165,7 +165,7 @@ def validateInputSamplesheet(input) { def (metas, fastqs) = input[1..2] // Check that multiple runs of the same sample are of the same datatype i.e. single-end / paired-end - def endedness_ok = metas.collect{ it.single_end }.unique().size == 1 + def endedness_ok = metas.collect{ meta -> meta.single_end }.unique().size == 1 if (!endedness_ok) { error("Please check input samplesheet -> Multiple runs of a sample must be of the same datatype i.e. single-end or paired-end: ${metas[0].id}") } @@ -197,7 +197,6 @@ def genomeExistsError() { error(error_string) } } - // // Generate methods description for MultiQC // @@ -239,8 +238,10 @@ def methodsDescriptionText(mqc_methods_yaml) { // Removing `https://doi.org/` to handle pipelines using DOIs vs DOI resolvers // Removing ` ` since the manifest.doi is a string and not a proper list def temp_doi_ref = "" - String[] manifest_doi = meta.manifest_map.doi.tokenize(",") - for (String doi_ref: manifest_doi) temp_doi_ref += "(doi:
    ${doi_ref.replace("https://doi.org/", "").replace(" ", "")}), " + def manifest_doi = meta.manifest_map.doi.tokenize(",") + manifest_doi.each { doi_ref -> + temp_doi_ref += "(doi: ${doi_ref.replace("https://doi.org/", "").replace(" ", "")}), " + } meta["doi_text"] = temp_doi_ref.substring(0, temp_doi_ref.length() - 2) } else meta["doi_text"] = "" meta["nodoi_text"] = meta.manifest_map.doi ? "" : "
  • If available, make sure to update the text to include the Zenodo DOI of version of the pipeline used.
  • " @@ -261,3 +262,4 @@ def methodsDescriptionText(mqc_methods_yaml) { return description_html.toString() } + diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/main.nf b/subworkflows/nf-core/utils_nextflow_pipeline/main.nf index ac31f28f..28e32b20 100644 --- a/subworkflows/nf-core/utils_nextflow_pipeline/main.nf +++ b/subworkflows/nf-core/utils_nextflow_pipeline/main.nf @@ -2,10 +2,6 @@ // Subworkflow with functionality that may be useful for any Nextflow pipeline // -import org.yaml.snakeyaml.Yaml -import groovy.json.JsonOutput -import nextflow.extension.FilesEx - /* ======================================================================================== SUBWORKFLOW DEFINITION @@ -58,7 +54,7 @@ workflow UTILS_NEXTFLOW_PIPELINE { // Generate version string // def getWorkflowVersion() { - String version_string = "" + def version_string = "" as String if (workflow.manifest.version) { def prefix_v = workflow.manifest.version[0] != 'v' ? 'v' : '' version_string += "${prefix_v}${workflow.manifest.version}" @@ -79,10 +75,10 @@ def dumpParametersToJSON(outdir) { def timestamp = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss') def filename = "params_${timestamp}.json" def temp_pf = new File(workflow.launchDir.toString(), ".${filename}") - def jsonStr = JsonOutput.toJson(params) - temp_pf.text = JsonOutput.prettyPrint(jsonStr) + def jsonStr = groovy.json.JsonOutput.toJson(params) + temp_pf.text = groovy.json.JsonOutput.prettyPrint(jsonStr) - FilesEx.copyTo(temp_pf.toPath(), "${outdir}/pipeline_info/params_${timestamp}.json") + nextflow.extension.FilesEx.copyTo(temp_pf.toPath(), "${outdir}/pipeline_info/params_${timestamp}.json") temp_pf.delete() } @@ -90,7 +86,7 @@ def dumpParametersToJSON(outdir) { // When running with -profile conda, warn if channels have not been set-up appropriately // def checkCondaChannels() { - Yaml parser = new Yaml() + def parser = new org.yaml.snakeyaml.Yaml() def channels = [] try { def config = parser.load("conda config --show channels".execute().text) @@ -102,14 +98,16 @@ def checkCondaChannels() { // 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 required_channels_in_order = ['conda-forge', 'bioconda'] 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])) + + required_channels_in_order.eachWithIndex { channel, index -> + if (index < required_channels_in_order.size() - 1) { + channel_priority_violation |= !(channels.indexOf(channel) < channels.indexOf(required_channels_in_order[index+1])) + } } if (channels_missing | channel_priority_violation) { diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config b/subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config index d0a926bf..a09572e5 100644 --- a/subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config +++ b/subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config @@ -3,7 +3,7 @@ manifest { author = """nf-core""" homePage = 'https://127.0.0.1' description = """Dummy pipeline""" - nextflowVersion = '!>=23.04.0' + nextflowVersion = '!>=23.04.0' version = '9.9.9' doi = 'https://doi.org/10.5281/zenodo.5070524' } diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf index 14558c39..cbd8495b 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf +++ b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf @@ -2,9 +2,6 @@ // Subworkflow with utility functions specific to the nf-core pipeline template // -import org.yaml.snakeyaml.Yaml -import nextflow.extension.FilesEx - /* ======================================================================================== SUBWORKFLOW DEFINITION @@ -34,7 +31,7 @@ workflow UTILS_NFCORE_PIPELINE { // Warn if a -profile or Nextflow config has not been provided to run the pipeline // def checkConfigProvided() { - valid_config = true + def valid_config = true as Boolean 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" + @@ -66,11 +63,13 @@ def checkProfileProvided(nextflow_cli_args) { // def workflowCitation() { def temp_doi_ref = "" - String[] manifest_doi = workflow.manifest.doi.tokenize(",") + def manifest_doi = workflow.manifest.doi.tokenize(",") // Using a loop to handle multiple DOIs // Removing `https://doi.org/` to handle pipelines using DOIs vs DOI resolvers // Removing ` ` since the manifest.doi is a string and not a proper list - for (String doi_ref: manifest_doi) temp_doi_ref += " https://doi.org/${doi_ref.replace('https://doi.org/', '').replace(' ', '')}\n" + manifest_doi.each { doi_ref -> + temp_doi_ref += " https://doi.org/${doi_ref.replace('https://doi.org/', '').replace(' ', '')}\n" + } return "If you use ${workflow.manifest.name} for your analysis please cite:\n\n" + "* The pipeline\n" + temp_doi_ref + "\n" + @@ -84,7 +83,7 @@ def workflowCitation() { // Generate workflow version string // def getWorkflowVersion() { - String version_string = "" + def version_string = "" as String if (workflow.manifest.version) { def prefix_v = workflow.manifest.version[0] != 'v' ? 'v' : '' version_string += "${prefix_v}${workflow.manifest.version}" @@ -102,8 +101,8 @@ def getWorkflowVersion() { // Get software versions for pipeline // def processVersionsFromYAML(yaml_file) { - Yaml yaml = new Yaml() - versions = yaml.load(yaml_file).collectEntries { k, v -> [ k.tokenize(':')[-1], v ] } + def yaml = new org.yaml.snakeyaml.Yaml() + def versions = yaml.load(yaml_file).collectEntries { k, v -> [ k.tokenize(':')[-1], v ] } return yaml.dumpAsMap(versions).trim() } @@ -124,7 +123,7 @@ def workflowVersionToYAML() { def softwareVersionsToYAML(ch_versions) { return ch_versions .unique() - .map { processVersionsFromYAML(it) } + .map { version -> processVersionsFromYAML(version) } .unique() .mix(Channel.of(workflowVersionToYAML())) } @@ -134,19 +133,19 @@ def softwareVersionsToYAML(ch_versions) { // def paramsSummaryMultiqc(summary_params) { def summary_section = '' - for (group in summary_params.keySet()) { + summary_params.keySet().each { group -> 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()) { + group_params.keySet().sort().each { param -> summary_section += "
    $param
    ${group_params.get(param) ?: 'N/A'}
    \n" } summary_section += "
    \n" } } - String yaml_file_text = "id: '${workflow.manifest.name.replace('/','-')}-summary'\n" + def yaml_file_text = "id: '${workflow.manifest.name.replace('/','-')}-summary'\n" as String 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" @@ -161,7 +160,7 @@ def paramsSummaryMultiqc(summary_params) { // nf-core logo // def nfCoreLogo(monochrome_logs=true) { - Map colors = logColours(monochrome_logs) + def colors = logColours(monochrome_logs) as Map String.format( """\n ${dashedLine(monochrome_logs)} @@ -180,7 +179,7 @@ def nfCoreLogo(monochrome_logs=true) { // Return dashed line // def dashedLine(monochrome_logs=true) { - Map colors = logColours(monochrome_logs) + def colors = logColours(monochrome_logs) as Map return "-${colors.dim}----------------------------------------------------${colors.reset}-" } @@ -188,7 +187,7 @@ def dashedLine(monochrome_logs=true) { // ANSII colours used for terminal logging // def logColours(monochrome_logs=true) { - Map colorcodes = [:] + def colorcodes = [:] as Map // Reset / Meta colorcodes['reset'] = monochrome_logs ? '' : "\033[0m" @@ -287,7 +286,7 @@ def completionEmail(summary_params, email, email_on_fail, plaintext_email, outdi } def summary = [:] - for (group in summary_params.keySet()) { + summary_params.keySet().sort().each { group -> summary << summary_params[group] } @@ -344,10 +343,10 @@ def completionEmail(summary_params, email, email_on_fail, plaintext_email, outdi def sendmail_html = sendmail_template.toString() // Send the HTML e-mail - Map colors = logColours(monochrome_logs) + def colors = logColours(monochrome_logs) as Map if (email_address) { try { - if (plaintext_email) { throw GroovyException('Send plaintext e-mail, not HTML') } + if (plaintext_email) { throw new org.codehaus.groovy.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 } @@ -364,13 +363,13 @@ def completionEmail(summary_params, email, email_on_fail, plaintext_email, outdi // Write summary e-mail HTML to a file def output_hf = new File(workflow.launchDir.toString(), ".pipeline_report.html") output_hf.withWriter { w -> w << email_html } - FilesEx.copyTo(output_hf.toPath(), "${outdir}/pipeline_info/pipeline_report.html"); + nextflow.extension.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"); + nextflow.extension.FilesEx.copyTo(output_tf.toPath(), "${outdir}/pipeline_info/pipeline_report.txt"); output_tf.delete() } @@ -378,7 +377,7 @@ def completionEmail(summary_params, email, email_on_fail, plaintext_email, outdi // Print pipeline summary on completion // def completionSummary(monochrome_logs=true) { - Map colors = logColours(monochrome_logs) + def colors = logColours(monochrome_logs) as Map if (workflow.success) { if (workflow.stats.ignoredCount == 0) { log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Pipeline completed successfully${colors.reset}-" @@ -395,7 +394,7 @@ def completionSummary(monochrome_logs=true) { // def imNotification(summary_params, hook_url) { def summary = [:] - for (group in summary_params.keySet()) { + summary_params.keySet().sort().each { group -> summary << summary_params[group] } diff --git a/subworkflows/nf-core/utils_nfschema_plugin/main.nf b/subworkflows/nf-core/utils_nfschema_plugin/main.nf new file mode 100644 index 00000000..4994303e --- /dev/null +++ b/subworkflows/nf-core/utils_nfschema_plugin/main.nf @@ -0,0 +1,46 @@ +// +// Subworkflow that uses the nf-schema plugin to validate parameters and render the parameter summary +// + +include { paramsSummaryLog } from 'plugin/nf-schema' +include { validateParameters } from 'plugin/nf-schema' + +workflow UTILS_NFSCHEMA_PLUGIN { + + take: + input_workflow // workflow: the workflow object used by nf-schema to get metadata from the workflow + validate_params // boolean: validate the parameters + parameters_schema // string: path to the parameters JSON schema. + // this has to be the same as the schema given to `validation.parametersSchema` + // when this input is empty it will automatically use the configured schema or + // "${projectDir}/nextflow_schema.json" as default. This input should not be empty + // for meta pipelines + + main: + + // + // Print parameter summary to stdout. This will display the parameters + // that differ from the default given in the JSON schema + // + if(parameters_schema) { + log.info paramsSummaryLog(input_workflow, parameters_schema:parameters_schema) + } else { + log.info paramsSummaryLog(input_workflow) + } + + // + // Validate the parameters using nextflow_schema.json or the schema + // given via the validation.parametersSchema configuration option + // + if(validate_params) { + if(parameters_schema) { + validateParameters(parameters_schema:parameters_schema) + } else { + validateParameters() + } + } + + emit: + dummy_emit = true +} + diff --git a/subworkflows/nf-core/utils_nfschema_plugin/meta.yml b/subworkflows/nf-core/utils_nfschema_plugin/meta.yml new file mode 100644 index 00000000..f7d9f028 --- /dev/null +++ b/subworkflows/nf-core/utils_nfschema_plugin/meta.yml @@ -0,0 +1,35 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/subworkflows/yaml-schema.json +name: "utils_nfschema_plugin" +description: Run nf-schema to validate parameters and create a summary of changed parameters +keywords: + - validation + - JSON schema + - plugin + - parameters + - summary +components: [] +input: + - input_workflow: + type: object + description: | + The workflow object of the used pipeline. + This object contains meta data used to create the params summary log + - validate_params: + type: boolean + description: Validate the parameters and error if invalid. + - parameters_schema: + type: string + description: | + Path to the parameters JSON schema. + This has to be the same as the schema given to the `validation.parametersSchema` config + option. When this input is empty it will automatically use the configured schema or + "${projectDir}/nextflow_schema.json" as default. The schema should not be given in this way + for meta pipelines. +output: + - dummy_emit: + type: boolean + description: Dummy emit to make nf-core subworkflows lint happy +authors: + - "@nvnieuwk" +maintainers: + - "@nvnieuwk" diff --git a/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test b/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test new file mode 100644 index 00000000..842dc432 --- /dev/null +++ b/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test @@ -0,0 +1,117 @@ +nextflow_workflow { + + name "Test Subworkflow UTILS_NFSCHEMA_PLUGIN" + script "../main.nf" + workflow "UTILS_NFSCHEMA_PLUGIN" + + tag "subworkflows" + tag "subworkflows_nfcore" + tag "subworkflows/utils_nfschema_plugin" + tag "plugin/nf-schema" + + config "./nextflow.config" + + test("Should run nothing") { + + when { + + params { + test_data = '' + } + + workflow { + """ + validate_params = false + input[0] = workflow + input[1] = validate_params + input[2] = "" + """ + } + } + + then { + assertAll( + { assert workflow.success } + ) + } + } + + test("Should validate params") { + + when { + + params { + test_data = '' + outdir = 1 + } + + workflow { + """ + validate_params = true + input[0] = workflow + input[1] = validate_params + input[2] = "" + """ + } + } + + then { + assertAll( + { assert workflow.failed }, + { assert workflow.stdout.any { it.contains('ERROR ~ Validation of pipeline parameters failed!') } } + ) + } + } + + test("Should run nothing - custom schema") { + + when { + + params { + test_data = '' + } + + workflow { + """ + validate_params = false + input[0] = workflow + input[1] = validate_params + input[2] = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" + """ + } + } + + then { + assertAll( + { assert workflow.success } + ) + } + } + + test("Should validate params - custom schema") { + + when { + + params { + test_data = '' + outdir = 1 + } + + workflow { + """ + validate_params = true + input[0] = workflow + input[1] = validate_params + input[2] = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" + """ + } + } + + then { + assertAll( + { assert workflow.failed }, + { assert workflow.stdout.any { it.contains('ERROR ~ Validation of pipeline parameters failed!') } } + ) + } + } +} diff --git a/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config new file mode 100644 index 00000000..0907ac58 --- /dev/null +++ b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config @@ -0,0 +1,8 @@ +plugins { + id "nf-schema@2.1.0" +} + +validation { + parametersSchema = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" + monochromeLogs = true +} \ No newline at end of file diff --git a/subworkflows/nf-core/utils_nfvalidation_plugin/tests/nextflow_schema.json b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json similarity index 95% rename from subworkflows/nf-core/utils_nfvalidation_plugin/tests/nextflow_schema.json rename to subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json index 7626c1c9..331e0d2f 100644 --- a/subworkflows/nf-core/utils_nfvalidation_plugin/tests/nextflow_schema.json +++ b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json @@ -1,10 +1,10 @@ { - "$schema": "http://json-schema.org/draft-07/schema", + "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://raw.githubusercontent.com/./master/nextflow_schema.json", "title": ". pipeline parameters", "description": "", "type": "object", - "definitions": { + "$defs": { "input_output_options": { "title": "Input/output options", "type": "object", @@ -87,10 +87,10 @@ }, "allOf": [ { - "$ref": "#/definitions/input_output_options" + "$ref": "#/$defs/input_output_options" }, { - "$ref": "#/definitions/generic_options" + "$ref": "#/$defs/generic_options" } ] } diff --git a/subworkflows/nf-core/utils_nfvalidation_plugin/main.nf b/subworkflows/nf-core/utils_nfvalidation_plugin/main.nf deleted file mode 100644 index 2585b65d..00000000 --- a/subworkflows/nf-core/utils_nfvalidation_plugin/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 } from 'plugin/nf-validation' -include { paramsSummaryLog } from 'plugin/nf-validation' -include { validateParameters } from 'plugin/nf-validation' - -/* -======================================================================================== - SUBWORKFLOW DEFINITION -======================================================================================== -*/ - -workflow UTILS_NFVALIDATION_PLUGIN { - - take: - print_help // boolean: print help - 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 // boolean: 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) - } - - emit: - dummy_emit = true -} diff --git a/subworkflows/nf-core/utils_nfvalidation_plugin/meta.yml b/subworkflows/nf-core/utils_nfvalidation_plugin/meta.yml deleted file mode 100644 index 3d4a6b04..00000000 --- a/subworkflows/nf-core/utils_nfvalidation_plugin/meta.yml +++ /dev/null @@ -1,44 +0,0 @@ -# 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: - - dummy_emit: - type: boolean - description: | - Dummy emit to make nf-core subworkflows lint happy -authors: - - "@adamrtalbot" -maintainers: - - "@adamrtalbot" - - "@maxulysse" diff --git a/subworkflows/nf-core/utils_nfvalidation_plugin/tests/main.nf.test b/subworkflows/nf-core/utils_nfvalidation_plugin/tests/main.nf.test deleted file mode 100644 index 5784a33f..00000000 --- a/subworkflows/nf-core/utils_nfvalidation_plugin/tests/main.nf.test +++ /dev/null @@ -1,200 +0,0 @@ -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 { - assertAll( - { 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 { - assertAll( - { assert workflow.success }, - { assert workflow.exitStatus == 0 }, - { assert workflow.stdout.any { it.contains('Input/output options') } }, - { 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 { - assertAll( - { 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') } } - ) - } - } - - 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 { - assertAll( - { 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('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 { - assertAll( - { 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/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/workflows/differentialabundance.nf b/workflows/differentialabundance.nf index 29dec88a..7941ab61 100644 --- a/workflows/differentialabundance.nf +++ b/workflows/differentialabundance.nf @@ -3,10 +3,9 @@ IMPORT MODULES / SUBWORKFLOWS / FUNCTIONS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ - include { FASTQC } from '../modules/nf-core/fastqc/main' include { MULTIQC } from '../modules/nf-core/multiqc/main' -include { paramsSummaryMap } from 'plugin/nf-validation' +include { paramsSummaryMap } from 'plugin/nf-schema' include { paramsSummaryMultiqc } from '../subworkflows/nf-core/utils_nfcore_pipeline' include { softwareVersionsToYAML } from '../subworkflows/nf-core/utils_nfcore_pipeline' include { methodsDescriptionText } from '../subworkflows/local/utils_nfcore_differentialabundance_pipeline' @@ -21,12 +20,10 @@ workflow DIFFERENTIALABUNDANCE { take: ch_samplesheet // channel: samplesheet read in from --input - main: ch_versions = Channel.empty() ch_multiqc_files = Channel.empty() - // // MODULE: Run FastQC // @@ -42,11 +39,12 @@ workflow DIFFERENTIALABUNDANCE { softwareVersionsToYAML(ch_versions) .collectFile( storeDir: "${params.outdir}/pipeline_info", - name: 'nf_core_pipeline_software_mqc_versions.yml', + name: 'nf_core_' + 'pipeline_software_' + 'mqc_' + 'versions.yml', sort: true, newLine: true ).set { ch_collated_versions } + // // MODULE: MultiQC // @@ -59,18 +57,19 @@ workflow DIFFERENTIALABUNDANCE { Channel.fromPath(params.multiqc_logo, checkIfExists: true) : Channel.empty() + summary_params = paramsSummaryMap( workflow, parameters_schema: "nextflow_schema.json") ch_workflow_summary = Channel.value(paramsSummaryMultiqc(summary_params)) - + ch_multiqc_files = ch_multiqc_files.mix( + ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) + ch_multiqc_custom_methods_description = params.multiqc_methods_description ? file(params.multiqc_methods_description, checkIfExists: true) : file("$projectDir/assets/methods_description_template.yml", checkIfExists: true) ch_methods_description = Channel.value( methodsDescriptionText(ch_multiqc_custom_methods_description)) - ch_multiqc_files = ch_multiqc_files.mix( - ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) ch_multiqc_files = ch_multiqc_files.mix(ch_collated_versions) ch_multiqc_files = ch_multiqc_files.mix( ch_methods_description.collectFile( @@ -83,12 +82,14 @@ workflow DIFFERENTIALABUNDANCE { ch_multiqc_files.collect(), ch_multiqc_config.toList(), ch_multiqc_custom_config.toList(), - ch_multiqc_logo.toList() + ch_multiqc_logo.toList(), + [], + [] ) - emit: - multiqc_report = MULTIQC.out.report.toList() // channel: /path/to/multiqc_report.html + emit:multiqc_report = MULTIQC.out.report.toList() // channel: /path/to/multiqc_report.html versions = ch_versions // channel: [ path(versions.yml) ] + } /* From c74c341c9885fc7508ba594ade651abca14d13b0 Mon Sep 17 00:00:00 2001 From: suzannejin Date: Tue, 8 Oct 2024 14:37:33 +0200 Subject: [PATCH 077/154] test_experimental also run propd_fdr --- conf/test_experimental.config | 2 +- modules/local/propr/propd/main.nf | 1 + modules/local/propr/propd/templates/propd.R | 89 ++++++++++++++------- 3 files changed, 63 insertions(+), 29 deletions(-) diff --git a/conf/test_experimental.config b/conf/test_experimental.config index df0f2e0a..e5d43fa8 100644 --- a/conf/test_experimental.config +++ b/conf/test_experimental.config @@ -28,7 +28,7 @@ params { matrix = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv' contrasts = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.contrasts.csv' tools = "$projectDir/assets/tools_samplesheet.csv" - pathway = "propd,propr,pcorbshrink" + pathway = "propd,propd_fdr,propr,pcorbshrink" //Features features_metadata_cols = 'gene_id,gene_name' diff --git a/modules/local/propr/propd/main.nf b/modules/local/propr/propd/main.nf index ff7b6050..cbc0c735 100644 --- a/modules/local/propr/propd/main.nf +++ b/modules/local/propr/propd/main.nf @@ -16,6 +16,7 @@ process PROPR_PROPD { tuple val(meta), path("*.propd.results.tsv") , emit: results tuple val(meta), path("*.propd.results_filtered.tsv"), emit: results_filtered, optional: true tuple val(meta), path("*.propd.adjacency.csv") , emit: adjacency , optional: true + tuple val(meta), path("*.propd.connectivity.tsv") , emit: connectivity , optional: true tuple val(meta), path("*.propd.hub_genes.tsv") , emit: hub_genes , optional: true tuple val(meta), path("*.propd.fdr.tsv") , emit: fdr , optional: true path "*.warnings.log" , emit: warnings diff --git a/modules/local/propr/propd/templates/propd.R b/modules/local/propr/propd/templates/propd.R index fef83c17..ef38b3e5 100644 --- a/modules/local/propr/propd/templates/propd.R +++ b/modules/local/propr/propd/templates/propd.R @@ -1,6 +1,5 @@ #!/usr/bin/env Rscript - ################################################ ################################################ ## Functions ## @@ -52,32 +51,52 @@ read_delim_flexible <- function(file, header = TRUE, row.names = 1, check.names ) } -#' Get hub genes from adjacency matrix +#' Get connectivity of genes from adjacency matrix +#' +#' The connectivity of a gene is the number of connections it has with other genes. +#' In other words, the degree of a gene. +#' +#' @param adj Adjacency matrix +#' +#' @return data frame with sorted degree per gene +get_connectivity <- function(adj){ + + # calculate degree per gene + diag(adj) <- 0 + connectivity <- rowSums(adj) + + # create data frame + connectivity <- data.frame( + 'feature' = rownames(adj), + 'degree' = connectivity + ) + names(connectivity) <- c(opt\$features_id_col, 'degree') + + # sort by degree + connectivity <- connectivity[order(connectivity\$degree, decreasing=TRUE),] + + return(connectivity) +} + +#' Determine hub genes based on connectivity #' #' Here hub genes are those that have a degree higher than the expected degree. #' The expected degree is the number of connections that each gene would have #' if the connections were distributed uniformly. In other words, the average #' degree by node. #' -#' @param adj Adjacency matrix +#' @param connectivity Data frame with connectivity #' -#' @return data frame with hub genes -get_hub_genes_from_adjacency <- function(adj){ +#' @return filtered connectivity data frame with hub genes +get_hub_genes <- function(connectivity){ # get the expected degree - degree_per_gene <- rowSums(adj) - total_degree <- sum(degree_per_gene) - n_nodes <- sum(degree_per_gene > 0) + total_degree <- sum(connectivity\$degree) + n_nodes <- sum(connectivity > 0) expected_degree <- total_degree / n_nodes # get hub genes - hub_genes = degree_per_gene[degree_per_gene > expected_degree] - hub_genes = data.frame( - 'feature' = names(hub_genes), - 'degree' = as.numeric(hub_genes) - ) - names(hub_genes) <- c(opt\$features_id_col, 'degree') - hub_genes <- hub_genes[order(hub_genes\$degree, decreasing=TRUE),] + hub_genes <- connectivity[which(connectivity\$degree > expected_degree),] return(hub_genes) } @@ -243,9 +262,10 @@ if (opt\$permutation == 0) { fdr_adjusted=TRUE ) - # get hub genes + # calculate gene connectivity and get hub genes - hub_genes <- get_hub_genes_from_adjacency(adj) + connectivity <- get_connectivity(adj) + hub_genes <- get_hub_genes(connectivity) # get significant pairs and classify them into red/yellow/green pairs @@ -290,9 +310,10 @@ if (opt\$permutation == 0) { window_size=1 ) - # get hub genes + # calculate gene connectivity and get hub genes - hub_genes <- get_hub_genes_from_adjacency(adj) + connectivity <- get_connectivity(adj) + hub_genes <- get_hub_genes(connectivity) # get significant pairs and classify them into red/yellow/green pairs @@ -311,6 +332,7 @@ if (opt\$permutation == 0) { # For the moment, we just print a warning and set adj, hub_genes and results to NULL warning('No pairs have FDR below desired threshold.') adj <- NULL + connectivity <- NULL hub_genes <- NULL results <- NULL } @@ -326,6 +348,7 @@ saveRDS( pd, file = paste0(opt\$prefix, '.propd.rds') ) + write.table( getResults(pd), file = paste0(opt\$prefix, '.propd.results.tsv'), @@ -334,6 +357,7 @@ write.table( sep = '\\t', quote = FALSE ) + if (!is.null(adj)) { write.table( results, @@ -351,6 +375,14 @@ if (!is.null(adj)) { sep = ',', quote = FALSE ) + write.table( + connectivity, + file = paste0(opt\$prefix, '.propd.connectivity.tsv'), + col.names = TRUE, + row.names = FALSE, + sep = '\\t', + quote = FALSE + ) write.table( hub_genes, file = paste0(opt\$prefix, '.propd.hub_genes.tsv'), @@ -359,15 +391,16 @@ if (!is.null(adj)) { sep = '\\t', quote = FALSE ) - if (opt\$permutation > 0) { - write.table( - pd@fdr, - file = paste0(opt\$prefix, '.propd.fdr.tsv'), - col.names = TRUE, - sep = '\\t', - quote = FALSE - ) - } +} + +if (opt\$permutation > 0) { + write.table( + pd@fdr, + file = paste0(opt\$prefix, '.propd.fdr.tsv'), + col.names = TRUE, + sep = '\\t', + quote = FALSE + ) } ################################################ From 879b8a758c3ba57e477e418c86f230f189998ba1 Mon Sep 17 00:00:00 2001 From: suzannejin Date: Tue, 8 Oct 2024 14:39:29 +0200 Subject: [PATCH 078/154] also get ch_results_genewise from propd --- subworkflows/local/differential/main.nf | 1 + 1 file changed, 1 insertion(+) diff --git a/subworkflows/local/differential/main.nf b/subworkflows/local/differential/main.nf index f1f718ff..e3f40ba3 100644 --- a/subworkflows/local/differential/main.nf +++ b/subworkflows/local/differential/main.nf @@ -50,6 +50,7 @@ workflow DIFFERENTIAL { ) ch_results_pairwise = ch_results_pairwise.mix(PROPD.out.results) ch_results_pairwise_filtered = ch_results_pairwise_filtered.mix(PROPD.out.results_filtered) + ch_results_genewise = ch_results_genewise.mix(PROPD.out.connectivity) ch_results_genewise_filtered = ch_results_genewise_filtered.mix(PROPD.out.hub_genes) ch_adjacency = ch_adjacency.mix(PROPD.out.adjacency) From 1696e1ccedfb5441ff2d961d48e56fd4a1f50c2b Mon Sep 17 00:00:00 2001 From: suzannejin Date: Tue, 8 Oct 2024 16:04:18 +0200 Subject: [PATCH 079/154] added local module propr/propr --- assets/tools_samplesheet.csv | 5 +- conf/test_experimental.config | 10 +- modules.json | 5 - modules/local/propr/propd/templates/propd.R | 13 +- modules/local/propr/propr/main.nf | 27 ++ modules/local/propr/propr/templates/propr.R | 318 +++++++++++++ modules/nf-core/propr/propr/environment.yml | 7 - modules/nf-core/propr/propr/main.nf | 27 -- modules/nf-core/propr/propr/meta.yml | 76 ---- modules/nf-core/propr/propr/templates/propr.R | 419 ------------------ .../propr/propr/tests/adjacency.config | 3 - .../propr/propr/tests/adjacency_pcor.config | 3 - .../propr/propr/tests/adjacency_phs.config | 3 - .../propr/propr/tests/adjacency_rho.config | 3 - .../propr/propr/tests/alr_pcorbshrink.config | 3 - .../nf-core/propr/propr/tests/clr_pcor.config | 3 - .../propr/propr/tests/clr_pcorbshrink.config | 3 - .../nf-core/propr/propr/tests/clr_rho.config | 3 - .../propr/propr/tests/clr_rho_alpha.config | 3 - .../nf-core/propr/propr/tests/main.nf.test | 240 ---------- .../propr/propr/tests/main.nf.test.snap | 354 --------------- modules/nf-core/propr/propr/tests/tags.yml | 2 - subworkflows/local/correlation/main.nf | 8 +- 23 files changed, 369 insertions(+), 1169 deletions(-) create mode 100644 modules/local/propr/propr/main.nf create mode 100644 modules/local/propr/propr/templates/propr.R delete mode 100644 modules/nf-core/propr/propr/environment.yml delete mode 100644 modules/nf-core/propr/propr/main.nf delete mode 100644 modules/nf-core/propr/propr/meta.yml delete mode 100644 modules/nf-core/propr/propr/templates/propr.R delete mode 100644 modules/nf-core/propr/propr/tests/adjacency.config delete mode 100644 modules/nf-core/propr/propr/tests/adjacency_pcor.config delete mode 100644 modules/nf-core/propr/propr/tests/adjacency_phs.config delete mode 100644 modules/nf-core/propr/propr/tests/adjacency_rho.config delete mode 100644 modules/nf-core/propr/propr/tests/alr_pcorbshrink.config delete mode 100644 modules/nf-core/propr/propr/tests/clr_pcor.config delete mode 100644 modules/nf-core/propr/propr/tests/clr_pcorbshrink.config delete mode 100644 modules/nf-core/propr/propr/tests/clr_rho.config delete mode 100644 modules/nf-core/propr/propr/tests/clr_rho_alpha.config delete mode 100644 modules/nf-core/propr/propr/tests/main.nf.test delete mode 100644 modules/nf-core/propr/propr/tests/main.nf.test.snap delete mode 100644 modules/nf-core/propr/propr/tests/tags.yml diff --git a/assets/tools_samplesheet.csv b/assets/tools_samplesheet.csv index a2c2230e..12b2f592 100644 --- a/assets/tools_samplesheet.csv +++ b/assets/tools_samplesheet.csv @@ -1,6 +1,7 @@ pathway_name,diff_method,args_diff,cor_method,args_cor,enr_method,args_enr propd,propd,,,,, propd_fdr,propd,--permutation 100,,,, -pcorbshrink,,,propr,--permutation 10 --adjacency true --cutoff_min 0.005 --cutoff_max 0.5 --cutoff_interval 0.01 --metric pcor.bshrink,, -propr,,,propr,--cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05 --metric rho --permutation 10 --adjacency true,, +pcorbshrink,,,propr,--metric pcor.bshrink,, +propr,,,propr,--metric rho,, +cor,,,propr,--metric cor,, propd_grea,propd,,,,grea,--permutation 10 diff --git a/conf/test_experimental.config b/conf/test_experimental.config index e5d43fa8..f4aeaa11 100644 --- a/conf/test_experimental.config +++ b/conf/test_experimental.config @@ -28,18 +28,18 @@ params { matrix = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv' contrasts = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.contrasts.csv' tools = "$projectDir/assets/tools_samplesheet.csv" - pathway = "propd,propd_fdr,propr,pcorbshrink" + pathway = "propd,propd_fdr,propr,pcorbshrink,cor" //Features features_metadata_cols = 'gene_id,gene_name' // Observations - observations_id_col = 'sample' - observations_name_col = 'sample' + observations_id_col = 'sample' + observations_name_col = 'sample' // Apply a higher filter to check that the filtering works - filtering_min_abundance=10 + filtering_min_abundance = 10 // Exploratory - exploratory_main_variable = 'contrasts' + exploratory_main_variable = 'contrasts' } diff --git a/modules.json b/modules.json index cdf98b53..9dc121da 100644 --- a/modules.json +++ b/modules.json @@ -70,11 +70,6 @@ "git_sha": "71b1180a5a3de6398eb0eb4d55424cbda36f52d8", "installed_by": ["modules"] }, - "propr/propr": { - "branch": "master", - "git_sha": "132fa6c9bd2515807f6a1cdec1ad7d03c817bcc9", - "installed_by": ["modules"] - }, "proteus/readproteingroups": { "branch": "master", "git_sha": "a069b29783583c219c1f23ed3dcf64a5aee1340b", diff --git a/modules/local/propr/propd/templates/propd.R b/modules/local/propr/propd/templates/propd.R index ef38b3e5..a4939034 100644 --- a/modules/local/propr/propd/templates/propd.R +++ b/modules/local/propr/propd/templates/propd.R @@ -111,19 +111,30 @@ get_hub_genes <- function(connectivity){ opt <- list( prefix = ifelse('$task.ext.prefix' == 'null', '$meta.id', '$task.ext.prefix'), + + # input count matrix count = '$count', - samplesheet = '$samplesheet', features_id_col = 'gene_id', # column name of feature ids + + # comparison groups + samplesheet = '$samplesheet', obs_id_col = 'sample', # column name of observation ids group_col = 'treatment', # column name of grouping variable + + # parameters for computing differential proportionality alpha = NA, # alpha for boxcox transformation moderated = TRUE, # use moderated theta + + # parameters for getting the significant differentially proportional pairs fdr = 0.05, # FDR threshold permutation = 0, # if permutation > 0, use permutation test to compute FDR number_of_cutoffs = 100, # number of cutoffs for permutation test + + # other parameters seed = NA, # seed for reproducibility ncores = as.integer('$task.cpus') ) + opt_types <- list( prefix = 'character', count = 'character', diff --git a/modules/local/propr/propr/main.nf b/modules/local/propr/propr/main.nf new file mode 100644 index 00000000..dd5360ee --- /dev/null +++ b/modules/local/propr/propr/main.nf @@ -0,0 +1,27 @@ +process PROPR_PROPR { + 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/mulled-v2-401a215d4024df776a98d90a352048199e342a3d:5ba9bbf6cd4f4f98983526673c223d2e7d829b36-0': + 'biocontainers/mulled-v2-401a215d4024df776a98d90a352048199e342a3d:5ba9bbf6cd4f4f98983526673c223d2e7d829b36-0' }" + + input: + tuple val(meta), path(count) + + output: + tuple val(meta), path("*.propr.rds") , emit: propr + tuple val(meta), path("*.propr.matrix.csv") , emit: matrix + tuple val(meta), path("*.propr.fdr.tsv") , emit: fdr , optional:true + tuple val(meta), path("*.propr.adjacency.csv"), emit: adjacency , optional:true + path "*.warnings.log" , emit: warnings + path "*.R_sessionInfo.log" , emit: session_info + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + template 'propr.R' +} diff --git a/modules/local/propr/propr/templates/propr.R b/modules/local/propr/propr/templates/propr.R new file mode 100644 index 00000000..f355bab9 --- /dev/null +++ b/modules/local/propr/propr/templates/propr.R @@ -0,0 +1,318 @@ +#!/usr/bin/env Rscript + +################################################ +################################################ +## Functions ## +################################################ +################################################ + +#' Parse out options from a string without recourse to optparse +#' +#' @param x Long-form argument list like --opt1 val1 --opt2 val2 +#' +#' @return named list of options and values similar to optparse + +parse_args <- function(x){ + args_list <- unlist(strsplit(x, ' ?--')[[1]])[-1] + args_vals <- lapply(args_list, function(x) scan(text=x, what='character', quiet = TRUE)) + + # Ensure the option vectors are length 2 (key/ value) to catch empty ones + args_vals <- lapply(args_vals, function(z){ length(z) <- 2; z}) + + parsed_args <- structure(lapply(args_vals, function(x) x[2]), names = lapply(args_vals, function(x) x[1])) + parsed_args[! is.na(parsed_args)] +} + +#' Flexibly read CSV or TSV files +#' +#' @param file Input file +#' @param header Boolean. TRUE if first row is header. False without header. +#' @param row.names The first column is used as row names by default. +#' Otherwise, give another number. Or use NULL when no row.names are present. +#' +#' @return output Data frame +read_delim_flexible <- function(file, header = TRUE, row.names = 1, check.names = TRUE){ + + ext <- tolower(tail(strsplit(basename(file), split = "\\\\.")[[1]], 1)) + + if (ext == "tsv" || ext == "txt") { + separator <- "\\t" + } else if (ext == "csv") { + separator <- "," + } else { + stop(paste("Unknown separator for", ext)) + } + + mat <- read.delim( + file, + sep = separator, + header = header, + row.names = row.names, + check.names = check.names + ) + + return(mat) +} + +################################################ +################################################ +## Parse arguments ## +################################################ +################################################ + +# Set defaults and classes + +opt <- list( + prefix = ifelse('$task.ext.prefix' == 'null', '$meta.id', '$task.ext.prefix'), + + # input count matrix + count = '$count', + features_id_col = 'gene_id', # column name for features (genes) + + # parameters for computing correlation coefficients + metric = 'rho', # correlation metric: rho, phi, phs, cor, vlr, pcor, pcor.shrink, pcor.bshrink + ivar = 'clr', # transformation: clr, alr, or the name(s) or index(es) of the variable(s) to be used as reference(s) + alpha = NA, # alpha value for Box-Cox transformation + + # parameters for getting the significant coefficients + fdr = 0.05, # FDR threshold + tails = "right", # FDR tail: right or both + permutation = 100, # number of permutations + number_of_cutoffs = 100, # number of cutoffs for which compute the FDRs + + # other parameters + seed = NA, # seed for reproducibility + ncores = as.integer('$task.cpus') +) + +opt_types <- list( + prefix = 'character', + count = 'character', + features_id_col = 'character', + metric = 'character', + ivar = 'character', + alpha = 'numeric', + fdr = 'numeric', + tails = 'character', + permutation = 'numeric', + number_of_cutoffs = 'numeric', + seed = 'numeric', + ncores = 'numeric' +) + +# Apply parameter overrides + +args_opt <- parse_args('$task.ext.args') + +for ( ao in names(args_opt)){ + if (! ao %in% names(opt)){ + stop(paste("Invalid option:", ao)) + } else { + + # Preserve classes from defaults + args_opt[[ao]] <- as(args_opt[[ao]], opt_types[[ao]]) + + # handle NA, and avoid errors when NA is provided by user as character + if (args_opt[[ao]] %in% c('NA', NA)) args_opt[[ao]] <- NA + + # replace values + opt[[ao]] <- args_opt[[ao]] + } +} + +# Check if required parameters have been provided + +required_opts <- c('count') # only count data is strictly required, other parameters have defaults +missing <- required_opts[unlist(lapply(opt[required_opts], is.null)) | ! required_opts %in% names(opt)] +if (length(missing) > 0){ + stop(paste("Missing required options:", paste(missing, collapse=', '))) +} + +# Check file inputs are valid + +for (file_input in c('count')){ + if (is.null(opt[[file_input]])) { + stop(paste("Please provide", file_input), call. = FALSE) + } + if (! file.exists(opt[[file_input]])){ + stop(paste0('Value of ', file_input, ': ', opt[[file_input]], ' is not a valid file')) + } +} + +# check parameters + +if (!opt\$metric %in% c('rho', 'phi', 'phs', 'cor', 'vlr', 'pcor', 'pcor.shrink', 'pcor.bshrink')) { + stop('Please make sure you provided the correct metric') +} + +if (opt\$metric == 'pcor.bshrink'){ + if (!is.na(opt\$alpha)) stop('Box-cox transformation is not implemented for pcor.bshrink yet.') + if (!opt\$ivar %in% c('clr', 'alr')) stop('Please make sure you provided the correct transformation: clr or alr') + +} else { + if (is.na(opt\$ivar)) warning('Warning: No transformation is required by user. We assume the input count data was already properly transformed.') +} + +# TODO maybe add a function to pretty print the arguments? +print(opt) + + +################################################ +################################################ +## Finish loading libraries ## +################################################ +################################################ + +library(propr) + +################################################ +################################################ +## Perform correlation analysis ## +################################################ +################################################ + +# set seed when required + +if (!is.na(opt\$seed)) { + warning('Setting seed ', opt\$seed, ' for reproducibility') + set.seed(opt\$seed) +} + +# load count matrix + +mat <- read_delim_flexible( + opt\$count, + header = TRUE, + row.names = opt\$features_id_col, + check.names = FALSE +) +mat <- t(mat) # transpose matrix to have features (genes) as columns + +# Compute correlation coefficients + +pr <- propr( + mat, + metric = opt\$metric, + ivar = opt\$ivar, + alpha = opt\$alpha, + p = opt\$permutation +) + +if (opt\$permutation > 0) { + + # update FDRs for each coefficient cutoff + + pr <- updateCutoffs( + pr, + number_of_cutoffs=opt\$number_of_cutoffs, + tails=opt\$tails, + ncores=opt\$ncores + ) + + # get cutoff at given FDR threshold + + cutoff <- getCutoffFDR( + pr, + fdr=opt\$fdr, + window_size=1 + ) + + if (cutoff) { + + # get adjacency matrix with the significant edges + + adj <- getAdjacencyFDR( + pr, + fdr=opt\$fdr, + window_size=1 + ) + + } else { + # TODO take top n pairs when no cutoff has FDR below desired threshold + # For the moment, we just print a warning and set adj to NULL + warning('No significant results found at FDR threshold ', opt\$fdr) + adj <- NULL + } +} + +################################################ +################################################ +## Generate outputs ## +################################################ +################################################ + +saveRDS( + pro, + file = paste0(opt\$prefix, '.propr.rds') +) + +write.table( + round(pro@matrix, 8), # round matrix decimals to avoid floating point inconsistencies + file = paste0(opt\$prefix, '.propr.matrix.csv'), + col.names = TRUE, + row.names = TRUE, + sep = ',', + quote = FALSE +) + +if (!is.null(adj)) { + write.table( + adj, + file = paste0(opt\$prefix, '.propr.adjacency.csv'), + col.names = TRUE, + row.names = FALSE, + sep = '\t', + quote = FALSE + ) +} + +if (opt\$permutation > 0) { + write.table( + pro@fdr, + file = paste0(opt\$prefix, '.propr.fdr.tsv'), + col.names = TRUE, + row.names = FALSE, + sep = '\t', + quote = FALSE + ) +} + +################################################ +################################################ +## WARNINGS ## +################################################ +################################################ + +sink(paste0(opt\$prefix, ".warnings.log")) +print(warnings()) +sink() + +################################################ +################################################ +## R SESSION INFO ## +################################################ +################################################ + +sink(paste0(opt\$prefix, ".R_sessionInfo.log")) +print(sessionInfo()) +sink() + +################################################ +################################################ +## VERSIONS FILE ## +################################################ +################################################ + +propr.version <- as.character(packageVersion('propr')) + +writeLines( + c( + '"${task.process}":', + paste(' r-propr:', propr.version) + ), +'versions.yml') + +################################################ +################################################ +################################################ +################################################ diff --git a/modules/nf-core/propr/propr/environment.yml b/modules/nf-core/propr/propr/environment.yml deleted file mode 100644 index cb163068..00000000 --- a/modules/nf-core/propr/propr/environment.yml +++ /dev/null @@ -1,7 +0,0 @@ -name: propr_propr -channels: - - conda-forge - - bioconda - - defaults -dependencies: - - conda-forge::r-propr=5.0.3 diff --git a/modules/nf-core/propr/propr/main.nf b/modules/nf-core/propr/propr/main.nf deleted file mode 100644 index 111f6d58..00000000 --- a/modules/nf-core/propr/propr/main.nf +++ /dev/null @@ -1,27 +0,0 @@ -process PROPR_PROPR { - 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/r-propr:5.0.3': - 'biocontainers/r-propr:5.0.3' }" - - input: - tuple val(meta), path(count) - - output: - tuple val(meta), path("*.propr.rds"), emit: propr - tuple val(meta), path("*.propr.tsv"), emit: matrix - tuple val(meta), path("*.fdr.tsv"), emit: fdr , optional:true - tuple val(meta), path("*.adj.csv"), emit: adj , optional:true - path "*.warnings.log", emit: warnings - path "*.R_sessionInfo.log", emit: session_info - path "versions.yml", emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - template 'propr.R' -} diff --git a/modules/nf-core/propr/propr/meta.yml b/modules/nf-core/propr/propr/meta.yml deleted file mode 100644 index c2c9a11d..00000000 --- a/modules/nf-core/propr/propr/meta.yml +++ /dev/null @@ -1,76 +0,0 @@ -name: "propr_propr" -description: | - Perform logratio-based correlation analysis -> get proportionality & basis shrinkage partial correlation coefficients. - One can also compute standard correlation coefficients, if required. -keywords: - - coexpression - - correlation - - proportionality - - logratio - - propr - - corpcor - -tools: - - "propr": - description: "Logratio methods for omics data" - homepage: "https://github.com/tpq/propr" - documentation: "https://rdrr.io/cran/propr/man/propr.html" - tool_dev_url: "https://github.com/tpq/propr" - doi: "10.1038/s41598-017-16520-0" - licence: ["GPL-2"] - - "corpcor": - description: "Efficient Estimation of Covariance and (Partial) Correlation" - homepage: "https://cran.r-project.org/web/packages/corpcor/index.html" - documentation: "https://cran.r-project.org/web/packages/corpcor/corpcor.pdf" - doi: "10.2202/1544-6115.1175" - licence: ["GPL >=3"] - -input: - - meta: - type: map - description: | - Groovy Map containing sample information. - This can be used at the workflow level to pass optional parameters to the module. - [id: 'test', ...] - - count: - type: file - description: | - Count matrix, where rows = variables or genes, columns = samples or cells. - This matrix should not contain zeros. Otherwise, they will be replaced by the minimun number. - It is recommended to handle the zeros beforehand with the method of preference. - pattern: "*.{csv,tsv}" - -output: - - meta: - type: map - description: | - Groovy Map containing sample information. - This can be used at the workflow level to pass optional parameters to the module. - [id: 'test', ...] - - propr: - type: file - description: R propr object - pattern: "*.propr.rds" - - matrix: - type: file - description: Coefficient matrix - pattern: "*.propr.tsv" - - fdr: - type: file - description: (optional) propr fdr table - pattern: "*.fdr.tsv" - - adj: - type: file - description: (optional) propr adjacency table - pattern: "*.adj.csv" - - session_info: - type: file - description: dump of R SessionInfo - pattern: "*.R_sessionInfo.log" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - -authors: - - "@suzannejin" diff --git a/modules/nf-core/propr/propr/templates/propr.R b/modules/nf-core/propr/propr/templates/propr.R deleted file mode 100644 index a9dbd7bd..00000000 --- a/modules/nf-core/propr/propr/templates/propr.R +++ /dev/null @@ -1,419 +0,0 @@ -#!/usr/bin/env Rscript - - -################################################ -################################################ -## Functions ## -################################################ -################################################ - -#' Parse out options from a string without recourse to optparse -#' -#' @param x Long-form argument list like --opt1 val1 --opt2 val2 -#' -#' @return named list of options and values similar to optparse - -parse_args <- function(x){ - args_list <- unlist(strsplit(x, ' ?--')[[1]])[-1] - args_vals <- lapply(args_list, function(x) scan(text=x, what='character', quiet = TRUE)) - - # Ensure the option vectors are length 2 (key/ value) to catch empty ones - args_vals <- lapply(args_vals, function(z){ length(z) <- 2; z}) - - parsed_args <- structure(lapply(args_vals, function(x) x[2]), names = lapply(args_vals, function(x) x[1])) - parsed_args[! is.na(parsed_args)] -} - -#' Flexibly read CSV or TSV files -#' -#' @param file Input file -#' @param header Boolean. TRUE if first row is header. False without header. -#' @param row.names The first column is used as row names by default. -#' Otherwise, give another number. Or use NULL when no row.names are present. -#' -#' @return output Data frame -read_delim_flexible <- function(file, header = TRUE, row.names = 1, check.names = TRUE){ - - ext <- tolower(tail(strsplit(basename(file), split = "\\\\.")[[1]], 1)) - - if (ext == "tsv" || ext == "txt") { - separator <- "\\t" - } else if (ext == "csv") { - separator <- "," - } else { - stop(paste("Unknown separator for", ext)) - } - - mat <- read.delim( - file, - sep = separator, - header = header, - row.names = row.names, - check.names = check.names - ) - - if ( (row.names == 'gene_id') & ('gene_name' %in% colnames(mat)) ){ - mat <- mat[, -which(colnames(mat) == 'gene_name')] - } else if ( (row.names == 'gene_name') & ('gene_id' %in% colnames(mat)) ){ - mat <- mat[, -which(colnames(mat) == 'gene_id')] - } - - return(mat) -} - -#' Check if a variable can be numeric or not -#' -#' @param x Input variable -#' @return True if it can be numeric, False otherwise -can_be_numeric <- function(x) { - stopifnot(is.atomic(x) || is.list(x)) # check if x is a vector - numNAs <- sum(is.na(x)) - numNAs_new <- suppressWarnings(sum(is.na(as.numeric(x)))) - return(numNAs_new == numNAs) -} - -#' Set the proper reference gene index. -#' This should be used for alr transformation only. -#' -#' @param ivar Reference variable given by user. -#' If it is 'null', then set the last column as reference (default). -#' Otherwise, it should refer to either gene name or gene index. -#' If the gene name is given, find its index. -#' @param mat Data matrix, with genes as columns -#' -#' @return The reference gene index -set_reference <- function(ivar, mat){ - if (is.na(ivar)){ - ivar <- ncol(mat) - } else { - isnumeric <- can_be_numeric(ivar) - if (!isnumeric){ - genes <- colnames(mat) - ivar <- which(genes == ivar) - } - ivar <- as.integer(ivar) - } - return(ivar) -} - -#' Set the appropiate range for the sequence of cutoffs used in updateCutoffs. -#' Adjusts the interval to the different metrics. -#' -#' @param object propr object. Output from propr function. -#' -#' @return sequence of cutoff values. -seqCutoff <- function(object){ - matrix <- getMatrix(object) - matrix[matrix <= 0] <- NA - diag(matrix) <- NA - min_cutoff <- round(min(matrix, na.rm = TRUE),3) - max_cutoff <- round(max(matrix, na.rm = TRUE),3) - step_cutoff <- (max_cutoff - min_cutoff)/ 20 - seq_cutoff <- seq(min_cutoff, max_cutoff, step_cutoff) - return(seq_cutoff) -} - -#' Extract the proportionality cutoff for a specified FDR value. -#' Gene pairs with a proportionality value higher than the extracted cutoff will be considered significantly proportional. -#' -#' @param object propr object. Output from propr function. updateCutoffs function should be applied to the object previous to valCutoff. -#' @param fdrVal FDR value to extract the cutoff for. Per default 0.05 -#' @param metric Metric used to calculate the proportionality values. Options are 'cor', 'rho', 'phi', 'phs', 'vlr', 'pcor', 'pcor.shrink', 'pcor.bshrink' -#' -#' @return cutoff value. Proportionality values higher than this cutoff are considered significant. -valCutoff <- function(object, metric, fdrVal = 0.05){ - fdr_df <- object@fdr - print(fdr_df) - # metric_up <- c("rho", "cor", "pcor", "pcor.shrink", "pcor.bshrink") - - if (prod(dim(fdr_df) == 0)){ - warning("Please run updateCutoff on propr first") - }else{ - fdr_vals <- fdr_df\$FDR - if(any(!is.na(fdr_vals))){ # if there is some defined value, continue, else out of range - if(any(fdr_vals <= fdrVal)){ # if there is some value that is belowe the FDR threshold, - fdr_threshold <- fdr_vals[which.max(fdr_vals <= fdrVal)] #choose the highest FDR that is lower than the threshold, else choose the lowest - }else{ - warning("FDR is higher than the specified threshold for all proportionality values. Using the lowest fdr instead") - fdr_threshold <- min(fdr_vals, na.rm = TRUE) - } - cutoff <- fdr_df\$cutoff[which(fdr_df\$FDR == fdr_threshold)] #select the corresponding cutoff value for the FDR - print(cutoff) - }else{ - stop("FDR not defined. This metric is not appropiate for the given dataset") - } - return(cutoff) - } -} - - -#' Convert a proportionality matrix to an adjacency matrix based on a threshold. -#' -#' @param matrix proportionality matrix. Can be extracted from propr object with getMatrix(). -#' @param cutoff Significant proportionality value extracted from valCutoff function. -#' -#' @return Adjacency matrix. Gene pairs with a proportionality value higher than the threshold will have 1, otherwise 0. -convert_to_adjacency <- function(matrix, cutoff, metric) { - if (metric == 'cor' || metric == 'rho' || metric == 'pcor' || metric == 'pcor.shrink' || metric == 'pcor.bshrink'){ - adjacency <- ifelse(matrix > cutoff, 1, 0) - } else { - adjacency <- ifelse(matrix < cutoff, 1, 0) - } - return(adjacency) -} - -################################################ -################################################ -## Parse arguments ## -################################################ -################################################ - -opt <- list( - count = '$count', - prefix = ifelse('$task.ext.prefix' == 'null', '$meta.id', '$task.ext.prefix'), - transformation = 'clr', - reference = NA, - alpha = NA, - metric = 'pcor.bshrink', - permutation = 0, - cutoff_min = NA, - cutoff_max = NA, - cutoff_interval = NA, - ncores = as.integer('$task.cpus'), - features_id_col = 'gene_id', - fixseed = FALSE, - adjacency = FALSE, - fdrVal = 0.05 -) -opt_types <- list( - count = 'character', - prefix = 'character', - transformation = 'character', - reference = 'character', - alpha = 'numeric', - metric = 'character', - permutation = 'numeric', - cutoff_min = 'numeric', - cutoff_max = 'numeric', - cutoff_interval = 'numeric', - ncores = 'numeric', - features_id_col = 'character', - fixseed = 'logical', - adjacency = 'logical', - fdrVal = 'numeric' -) - -# Apply parameter overrides -args_opt <- parse_args('$task.ext.args') - -for ( ao in names(args_opt)){ - if (! ao %in% names(opt)){ - stop(paste("Invalid option:", ao)) - } else { - - # Preserve classes from defaults where possible - if (! is.null(opt[[ao]])){ - args_opt[[ao]] <- as(args_opt[[ao]], opt_types[[ao]]) - } - # set NA - if (args_opt[[ao]] %in% c('NA', NA, 'null')){ - args_opt[[ao]] <- NA - } - opt[[ao]] <- args_opt[[ao]] - } -} - -# Check if required parameters have been provided -required_opts <- c('count') -missing <- required_opts[unlist(lapply(opt[required_opts], is.null)) | ! required_opts %in% names(opt)] -if (length(missing) > 0){ - stop(paste("Missing required options:", paste(missing, collapse=', '))) -} - -# Check file inputs are valid -for (file_input in c('count')){ - if (is.null(opt[[file_input]])) { - stop(paste("Please provide", file_input), call. = FALSE) - } - if (! file.exists(opt[[file_input]])){ - stop(paste0('Value of ', file_input, ': ', opt[[file_input]], ' is not a valid file')) - } -} - -# check parameters -if (!opt\$metric %in% c('rho', 'phi', 'phs', 'cor', 'vlr', 'pcor', 'pcor.shrink', 'pcor.bshrink')) { - stop('Please make sure you provided the correct metric') -} -if (opt\$metric == 'pcor.bshrink'){ - if (!is.na(opt\$alpha)) stop('Box-cox transformation is not implemented for pcor.bshrink yet.') - if (!opt\$transformation %in% c('clr', 'alr')) stop('Please make sure you provided the correct transformation: clr or alr') -} else { - if (!opt\$transformation %in% c('clr', 'alr', NA)) stop('Please make sure you provided the correct transformation: clr or alr. Or set NA if you dont want to transform the data.') - if (is.na(opt\$transformation)) print('Warning: No transformation is required by user. We assume the input count data was already properly transformed.') -} - -################################################ -################################################ -## Finish loading libraries ## -################################################ -################################################ - -library(corpcor) -library(propr) - -################################################ -################################################ -## Perform correlation analysis ## -################################################ -################################################ - -# read matrix -mat <- read_delim_flexible( - opt\$count, - header = TRUE, - row.names = opt\$features_id_col, - check.names = FALSE -) -mat <- t(mat) - -# check zeros -# log transformation should be applied on non-zero data -# otherwise Inf values are generated -if (any(mat == 0)) print("Warning: Zeros will be replaced by minimun value before logratio analysis") - -# set logratio transformation parameter -> ivar -# if alr, set the index of the reference gene as ivar -# if clr or NA, set same ivar -if (opt\$metric == 'pcor.bshrink'){ - opt\$ivar <- opt\$transformation -}else{ - if (opt\$transformation == 'alr'){ - opt\$ivar <- set_reference(opt\$reference, mat) - gene_name <- colnames(mat)[opt\$ivar] - } else { - opt\$ivar <- opt\$transformation - } -} - -# Compute correlation coefficients -pro <- propr( - mat, - metric = opt\$metric, - ivar = opt\$ivar, - alpha = opt\$alpha, - p = opt\$permutation, - fixseed = opt\$fixseed -) - -# update FDR by permutation, if required - -if (opt\$permutation > 0) { - cutoff <- seq( - opt\$cutoff_min, - opt\$cutoff_max, - opt\$cutoff_interval - ) - if (is.na(opt\$cutoff_min) || is.na(opt\$cutoff_max) || is.na(opt\$cutoff_interval)) { - warning("cutoff values were not provided. Using the default cutoff values.") - cutoff <- seqCutoff(pro) - } - m <- getMatrix(pro) - diag(m) <- NA - print((opt\$cutoff_max - opt\$cutoff_min)/2 + opt\$cutoff_min) - print(max(m, na.rm = TRUE)) - if ((opt\$cutoff_max - opt\$cutoff_min)/2 + opt\$cutoff_min > max(m, na.rm = TRUE)) { - warning("The provided cutoff values are out of range. Using the default cutoff values.") - cutoff <- seqCutoff(pro) - } - pro <- updateCutoffs(pro, cutoff=cutoff, ncores=opt\$ncores) -} - -# calculate cutoff and adjacency matrix, if required - -if (opt\$adjacency == TRUE) { - cutoff <- valCutoff(pro, opt\$metric, opt\$fdrVal) - matrix <- getMatrix(pro) - adj <- convert_to_adjacency(matrix, cutoff, opt\$metric) -} - -################################################ -################################################ -## Generate outputs ## -################################################ -################################################ - -saveRDS( - pro, - file = paste0(opt\$prefix, '.propr.rds') -) - -write.table( - round(pro@matrix, 8), # round matrix decimals to avoid floating point inconsistencies - file = paste0(opt\$prefix, '.propr.tsv'), - col.names = TRUE, - row.names = TRUE, - sep = '\t', - quote = FALSE -) - -if (opt\$permutation > 0) { - write.table( - pro@fdr, - file = paste0(opt\$prefix, '.fdr.tsv'), - col.names = TRUE, - row.names = FALSE, - sep = '\t', - quote = FALSE - ) -} - -if (opt\$adjacency == TRUE) { - write.table( - adj, - file = paste0(opt\$prefix, '.adj.csv'), - col.names = TRUE, - row.names = TRUE, - sep = ',', - quote = FALSE - ) -} - -################################################ -################################################ -## WARNINGS ## -################################################ -################################################ - -sink(paste0(opt\$prefix, ".warnings.log")) -print(warnings()) -sink() - -################################################ -################################################ -## R SESSION INFO ## -################################################ -################################################ - -sink(paste0(opt\$prefix, ".R_sessionInfo.log")) -print(sessionInfo()) -sink() - -################################################ -################################################ -## VERSIONS FILE ## -################################################ -################################################ - -propr.version <- as.character(packageVersion('propr')) - -writeLines( - c( - '"${task.process}":', - paste(' r-propr:', propr.version) - ), -'versions.yml') - -################################################ -################################################ -################################################ -################################################ diff --git a/modules/nf-core/propr/propr/tests/adjacency.config b/modules/nf-core/propr/propr/tests/adjacency.config deleted file mode 100644 index cc0b3894..00000000 --- a/modules/nf-core/propr/propr/tests/adjacency.config +++ /dev/null @@ -1,3 +0,0 @@ -process { - ext.args = {"--metric rho --permutation 10 --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.1 --fixseed true --adjacency true"} -} diff --git a/modules/nf-core/propr/propr/tests/adjacency_pcor.config b/modules/nf-core/propr/propr/tests/adjacency_pcor.config deleted file mode 100644 index 0dda6b73..00000000 --- a/modules/nf-core/propr/propr/tests/adjacency_pcor.config +++ /dev/null @@ -1,3 +0,0 @@ -process { - ext.args = {"--metric pcor.bshrink --permutation 10 --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.1 --fixseed true --adjacency true"} -} \ No newline at end of file diff --git a/modules/nf-core/propr/propr/tests/adjacency_phs.config b/modules/nf-core/propr/propr/tests/adjacency_phs.config deleted file mode 100644 index 923570b4..00000000 --- a/modules/nf-core/propr/propr/tests/adjacency_phs.config +++ /dev/null @@ -1,3 +0,0 @@ -process { - ext.args = {"--metric phs --permutation 10 --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.1 --fixseed true --adjacency true"} -} \ No newline at end of file diff --git a/modules/nf-core/propr/propr/tests/adjacency_rho.config b/modules/nf-core/propr/propr/tests/adjacency_rho.config deleted file mode 100644 index cc0b3894..00000000 --- a/modules/nf-core/propr/propr/tests/adjacency_rho.config +++ /dev/null @@ -1,3 +0,0 @@ -process { - ext.args = {"--metric rho --permutation 10 --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.1 --fixseed true --adjacency true"} -} diff --git a/modules/nf-core/propr/propr/tests/alr_pcorbshrink.config b/modules/nf-core/propr/propr/tests/alr_pcorbshrink.config deleted file mode 100644 index c0c3b211..00000000 --- a/modules/nf-core/propr/propr/tests/alr_pcorbshrink.config +++ /dev/null @@ -1,3 +0,0 @@ -process { - ext.args = {"--transformation alr --metric pcor.bshrink --permutation 10 --cutoff_min 0.001 --cutoff_max 0.01 --cutoff_interval 0.001 --fixseed true"} -} \ No newline at end of file diff --git a/modules/nf-core/propr/propr/tests/clr_pcor.config b/modules/nf-core/propr/propr/tests/clr_pcor.config deleted file mode 100644 index 2e6d1b19..00000000 --- a/modules/nf-core/propr/propr/tests/clr_pcor.config +++ /dev/null @@ -1,3 +0,0 @@ -process { - ext.args = {"--transformation clr --metric pcor --permutation 10 --cutoff_min 0.001 --cutoff_max 0.01 --cutoff_interval 0.001 --fixseed true"} -} \ No newline at end of file diff --git a/modules/nf-core/propr/propr/tests/clr_pcorbshrink.config b/modules/nf-core/propr/propr/tests/clr_pcorbshrink.config deleted file mode 100644 index 435440c8..00000000 --- a/modules/nf-core/propr/propr/tests/clr_pcorbshrink.config +++ /dev/null @@ -1,3 +0,0 @@ -process { - ext.args = {"--transformation clr --metric pcor.bshrink --permutation 10 --cutoff_min 0.001 --cutoff_max 0.01 --cutoff_interval 0.001 --fixseed true"} -} \ No newline at end of file diff --git a/modules/nf-core/propr/propr/tests/clr_rho.config b/modules/nf-core/propr/propr/tests/clr_rho.config deleted file mode 100644 index 6b32ac27..00000000 --- a/modules/nf-core/propr/propr/tests/clr_rho.config +++ /dev/null @@ -1,3 +0,0 @@ -process { - ext.args = {"--transformation clr --metric rho --permutation 10 --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.1 --fixseed true"} -} \ No newline at end of file diff --git a/modules/nf-core/propr/propr/tests/clr_rho_alpha.config b/modules/nf-core/propr/propr/tests/clr_rho_alpha.config deleted file mode 100644 index 7f151a80..00000000 --- a/modules/nf-core/propr/propr/tests/clr_rho_alpha.config +++ /dev/null @@ -1,3 +0,0 @@ -process { - ext.args = {"--transformation alr --alpha 0.2 --metric rho --permutation 10 --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.1 --fixseed true"} -} \ No newline at end of file diff --git a/modules/nf-core/propr/propr/tests/main.nf.test b/modules/nf-core/propr/propr/tests/main.nf.test deleted file mode 100644 index e262d2cf..00000000 --- a/modules/nf-core/propr/propr/tests/main.nf.test +++ /dev/null @@ -1,240 +0,0 @@ -nextflow_process { - - name "Test Process PROPR_PROPR" - script "../main.nf" - process "PROPR_PROPR" - - tag "modules" - tag "modules_nfcore" - tag "propr" - tag "propr/propr" - - test("Test propr/propr using default options") { - - tag "default" - - when { - process { - """ - input[0] = [ - [ id:'test' ], - //file(params.test_data['mus_musculus']['genome']['rnaseq_matrix'], checkIfExists: true) - file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv") - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out.matrix).match("Test propr/propr using default options - matrix") }, - { assert snapshot(process.out.versions).match("versions") } - ) - } - } - - test("Test propr/propr while running clr+pcor.bshrink explicitly") { - - tag "clr_pcorbshrink" - config "./clr_pcorbshrink.config" - - when { - process { - """ - input[0] = [ - [ id:'test' ], - file(params.test_data['mus_musculus']['genome']['rnaseq_matrix'], checkIfExists: true) - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out.matrix).match("Test propr/propr while running clr+pcor.bshrink explicitly - matrix")}, - { assert snapshot(process.out.fdr).match("Test propr/propr while running clr+pcor.bshrink explicitly - fdr")} - ) - } - } - - test("Test propr/propr while running alr+pcor.bshrink") { - - tag "alr_pcorbshrink" - config "./alr_pcorbshrink.config" - - when { - process { - """ - input[0] = [ - [ id:'test' ], - file(params.test_data['mus_musculus']['genome']['rnaseq_matrix'], checkIfExists: true) - ] - """ - } - } - - then { - // TODO also check that the first columns are the same as the above processes - assertAll( - { assert process.success }, - { assert snapshot(process.out.matrix).match("Test propr/propr while running alr+pcor.bshrink - matrix") }, - { assert snapshot(process.out.fdr).match("Test propr/propr while running alr+pcor.bshrink - fdr") } - ) - } - } - - test("Test propr/propr while running clr+rho") { - - tag "clr_rho" - config "./clr_rho.config" - - when { - process { - """ - input[0] = [ - [ id:'test' ], - file(params.test_data['mus_musculus']['genome']['rnaseq_matrix'], checkIfExists: true) - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out.matrix).match("Test propr/propr while running clr+rho - matrix") }, - { assert snapshot(process.out.fdr).match("Test propr/propr while running clr+rho - fdr") } - ) - } - } - - test("Test propr/propr while running clr+pcor") { - - tag "clr_pcor" - config "./clr_pcor.config" - - when { - process { - """ - input[0] = [ - [ id:'test' ], - file(params.test_data['mus_musculus']['genome']['rnaseq_matrix'], checkIfExists: true) - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out.matrix).match("Test propr/propr while running clr+pcor - matrix") }, - { assert snapshot(process.out.fdr).match("Test propr/propr while running clr+pcor - fdr") } - ) - } - } - - test("Test propr/propr while running clr+rho with boxcox transformation") { - - tag "clr_rho_alpha" - config "./clr_rho_alpha.config" - - when { - process { - """ - input[0] = [ - [ id:'test' ], - file(params.test_data['mus_musculus']['genome']['rnaseq_matrix'], checkIfExists: true) - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out.matrix).match("Test propr/propr while running clr+rho with boxcox transformation - matrix") }, - { assert snapshot(process.out.fdr).match("Test propr/propr while running clr+rho with boxcox transformation - fdr") } - ) - } - } - - test("Test propr/propr calculating adjacency_matrix for rho") { - - tag "adjacency_rho" - config "./adjacency_rho.config" - - when { - process { - """ - input[0] = [ - [ id:'test' ], - file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv") - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out.matrix).match("Test propr/propr calculating adjacency_matrix for rho - matrix") }, - { assert snapshot(process.out.fdr).match("Test propr/propr calculating adjacency_matrix for rho - fdr") }, - { assert snapshot(process.out.adj).match("Test propr/propr calculating adjacency_matrix for rho - adj") } - ) - } - } - - test("Test propr/propr calculating adjacency_matrix for phs") { - - tag "adjacency_phs" - config "./adjacency_phs.config" - - when { - process { - """ - input[0] = [ - [ id:'test' ], - file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv") - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out.matrix).match("Test propr/propr calculating adjacency_matrix for phs - matrix") }, - { assert snapshot(process.out.fdr).match("Test propr/propr calculating adjacency_matrix for phs - fdr") }, - { assert snapshot(process.out.adj).match("Test propr/propr calculating adjacency_matrix for phs - adj") } - ) - } - } - - test("Test propr/propr calculating adjacency_matrix for pcor") { - - tag "adjacency_pcor" - config "./adjacency_pcor.config" - - when { - process { - """ - input[0] = [ - [ id:'test' ], - file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv") - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out.matrix).match("Test propr/propr calculating adjacency_matrix for pcor - matrix") }, - { assert snapshot(process.out.fdr).match("Test propr/propr calculating adjacency_matrix for pcor - fdr") }, - { assert snapshot(process.out.adj).match("Test propr/propr calculating adjacency_matrix for pcor - adj") } - ) - } - } -} diff --git a/modules/nf-core/propr/propr/tests/main.nf.test.snap b/modules/nf-core/propr/propr/tests/main.nf.test.snap deleted file mode 100644 index cde969bc..00000000 --- a/modules/nf-core/propr/propr/tests/main.nf.test.snap +++ /dev/null @@ -1,354 +0,0 @@ -{ - "Test propr/propr while running clr+pcor - fdr": { - "content": [ - [ - [ - { - "id": "test" - }, - "test.fdr.tsv:md5,c0147540e44c63a439c28d24315bbc83" - ] - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-04-05T11:22:00.577754" - }, - "Test propr/propr calculating adjacency_matrix for rho - fdr": { - "content": [ - [ - [ - { - "id": "test" - }, - "test.fdr.tsv:md5,32be6cc96d2d5563f779d2eec9c7ed34" - ] - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-04-05T11:23:04.464473" - }, - "Test propr/propr calculating adjacency_matrix for pcor - adj": { - "content": [ - [ - [ - { - "id": "test" - }, - "test.adj.csv:md5,d5ba274e1313177ddf28881b036885c5" - ] - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-04-05T11:24:45.008049" - }, - "Test propr/propr while running alr+pcor.bshrink - fdr": { - "content": [ - [ - [ - { - "id": "test" - }, - "test.fdr.tsv:md5,d446cc30af27643df8555b2924e3c0a1" - ] - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-04-05T11:20:50.487477" - }, - "Test propr/propr using default options - matrix": { - "content": [ - [ - [ - { - "id": "test" - }, - "test.propr.tsv:md5,1aed2bed28b3f6cff481065f535e6d24" - ] - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-04-05T11:19:27.698729" - }, - "Test propr/propr calculating adjacency_matrix for phs - adj": { - "content": [ - [ - [ - { - "id": "test" - }, - "test.adj.csv:md5,1cb74934c2dbb93ad6416b5410dee1c4" - ] - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-04-05T11:23:45.966557" - }, - "Test propr/propr while running clr+pcor.bshrink explicitly - matrix": { - "content": [ - [ - [ - { - "id": "test" - }, - "test.propr.tsv:md5,1aed2bed28b3f6cff481065f535e6d24" - ] - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-04-05T11:20:07.836881" - }, - "Test propr/propr while running clr+pcor - matrix": { - "content": [ - [ - [ - { - "id": "test" - }, - "test.propr.tsv:md5,5bd6a9c2d5899dedfec8ebfbabeb532e" - ] - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-04-05T11:21:59.693747" - }, - "Test propr/propr while running alr+pcor.bshrink - matrix": { - "content": [ - [ - [ - { - "id": "test" - }, - "test.propr.tsv:md5,e2cbc066fa7635e9ea4ec198987d11d0" - ] - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-04-05T11:20:49.898429" - }, - "Test propr/propr calculating adjacency_matrix for pcor - fdr": { - "content": [ - [ - [ - { - "id": "test" - }, - "test.fdr.tsv:md5,08d35cc8a7f5dd39ea4e3471cee7b2ec" - ] - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-04-05T11:24:43.724784" - }, - "Test propr/propr while running clr+rho - fdr": { - "content": [ - [ - [ - { - "id": "test" - }, - "test.fdr.tsv:md5,32be6cc96d2d5563f779d2eec9c7ed34" - ] - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-04-05T11:21:19.887004" - }, - "Test propr/propr while running clr+rho - matrix": { - "content": [ - [ - [ - { - "id": "test" - }, - "test.propr.tsv:md5,53865e6c2b05e022277df6dc1188c461" - ] - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-04-05T11:21:19.194321" - }, - "versions": { - "content": [ - [ - "versions.yml:md5,2e3159924c190ab42e22a4d0e192b1e6" - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-04-05T11:19:27.963267" - }, - "Test propr/propr calculating adjacency_matrix for phs - fdr": { - "content": [ - [ - [ - { - "id": "test" - }, - "test.fdr.tsv:md5,d7e540af9ed2d59ffbc69caae819648d" - ] - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-04-05T11:23:44.841504" - }, - "Test propr/propr calculating adjacency_matrix for pcor - matrix": { - "content": [ - [ - [ - { - "id": "test" - }, - "test.propr.tsv:md5,1aed2bed28b3f6cff481065f535e6d24" - ] - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-04-05T11:24:41.975415" - }, - "Test propr/propr while running clr+rho with boxcox transformation - fdr": { - "content": [ - [ - [ - { - "id": "test" - }, - "test.fdr.tsv:md5,a0fc0d01dddb4bd285306766eefeff67" - ] - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-04-05T11:22:29.830787" - }, - "Test propr/propr calculating adjacency_matrix for rho - adj": { - "content": [ - [ - [ - { - "id": "test" - }, - "test.adj.csv:md5,e1b6e50216976397655066f17f0703de" - ] - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-04-05T11:23:05.438967" - }, - "Test propr/propr while running clr+rho with boxcox transformation - matrix": { - "content": [ - [ - [ - { - "id": "test" - }, - "test.propr.tsv:md5,e30643e340aa88e3acd4c181f9e4ba81" - ] - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-04-05T11:22:28.793097" - }, - "Test propr/propr calculating adjacency_matrix for rho - matrix": { - "content": [ - [ - [ - { - "id": "test" - }, - "test.propr.tsv:md5,53865e6c2b05e022277df6dc1188c461" - ] - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-04-05T11:23:03.240604" - }, - "Test propr/propr while running clr+pcor.bshrink explicitly - fdr": { - "content": [ - [ - [ - { - "id": "test" - }, - "test.fdr.tsv:md5,dc9e6f135064363c503e83105a9c9b69" - ] - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-04-05T11:20:08.230977" - }, - "Test propr/propr calculating adjacency_matrix for phs - matrix": { - "content": [ - [ - [ - { - "id": "test" - }, - "test.propr.tsv:md5,67ba22131ebd747404a3037f922a77f5" - ] - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-04-05T11:23:43.441629" - } -} \ No newline at end of file diff --git a/modules/nf-core/propr/propr/tests/tags.yml b/modules/nf-core/propr/propr/tests/tags.yml deleted file mode 100644 index 539706d4..00000000 --- a/modules/nf-core/propr/propr/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -propr/propr: - - "modules/nf-core/propr/propr/**" diff --git a/subworkflows/local/correlation/main.nf b/subworkflows/local/correlation/main.nf index 1f7e5e18..d5d101c5 100644 --- a/subworkflows/local/correlation/main.nf +++ b/subworkflows/local/correlation/main.nf @@ -1,7 +1,7 @@ // // Perform correlation analysis // -include {PROPR_PROPR as PROPR} from "../../../modules/nf-core/propr/propr/main.nf" +include {PROPR_PROPR as PROPR} from "../../../modules/local/propr/propr/main.nf" workflow CORRELATION { take: @@ -11,7 +11,7 @@ workflow CORRELATION { main: // initialize empty results channels - ch_results = Channel.empty() + ch_matrix = Channel.empty() ch_adjacency = Channel.empty() // branch tools to select the correct correlation analysis method @@ -34,8 +34,8 @@ workflow CORRELATION { .set { ch_counts_propr } PROPR(ch_counts_propr) - ch_matrix = PROPR.out.matrix - ch_adjacency = PROPR.out.adj + ch_matrix = ch_matrix.mix(PROPR.out.matrix) + ch_adjacency = ch_adjacency.mix(PROPR.out.adjacency) // TODO: divide propr module into cor, propr, pcor, pcorbshrink, etc. From bc9c86accc687b272dd4f51c5b7ed3723cbebaa8 Mon Sep 17 00:00:00 2001 From: suzannejin Date: Tue, 8 Oct 2024 16:11:07 +0200 Subject: [PATCH 080/154] fix bug in propr.R --- modules/local/propr/propr/templates/propr.R | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/local/propr/propr/templates/propr.R b/modules/local/propr/propr/templates/propr.R index f355bab9..afbc35e6 100644 --- a/modules/local/propr/propr/templates/propr.R +++ b/modules/local/propr/propr/templates/propr.R @@ -242,12 +242,12 @@ if (opt\$permutation > 0) { ################################################ saveRDS( - pro, + pr, file = paste0(opt\$prefix, '.propr.rds') ) write.table( - round(pro@matrix, 8), # round matrix decimals to avoid floating point inconsistencies + round(pr@matrix, 8), # round matrix decimals to avoid floating point inconsistencies file = paste0(opt\$prefix, '.propr.matrix.csv'), col.names = TRUE, row.names = TRUE, @@ -268,7 +268,7 @@ if (!is.null(adj)) { if (opt\$permutation > 0) { write.table( - pro@fdr, + pr@fdr, file = paste0(opt\$prefix, '.propr.fdr.tsv'), col.names = TRUE, row.names = FALSE, From fed6d4555be7aaa9fe0ca96156a98b5c02cceecc Mon Sep 17 00:00:00 2001 From: suzannejin Date: Tue, 8 Oct 2024 16:18:38 +0200 Subject: [PATCH 081/154] remove nf-core/propr/grea --- modules.json | 5 - modules/nf-core/propr/grea/environment.yml | 7 - modules/nf-core/propr/grea/main.nf | 24 -- modules/nf-core/propr/grea/meta.yml | 57 ---- modules/nf-core/propr/grea/templates/grea.R | 253 ------------------ .../nf-core/propr/grea/tests/grea_test.config | 8 - modules/nf-core/propr/grea/tests/main.nf.test | 62 ----- .../propr/grea/tests/main.nf.test.snap | 31 --- modules/nf-core/propr/grea/tests/tags.yml | 2 - 9 files changed, 449 deletions(-) delete mode 100644 modules/nf-core/propr/grea/environment.yml delete mode 100644 modules/nf-core/propr/grea/main.nf delete mode 100644 modules/nf-core/propr/grea/meta.yml delete mode 100644 modules/nf-core/propr/grea/templates/grea.R delete mode 100644 modules/nf-core/propr/grea/tests/grea_test.config delete mode 100644 modules/nf-core/propr/grea/tests/main.nf.test delete mode 100644 modules/nf-core/propr/grea/tests/main.nf.test.snap delete mode 100644 modules/nf-core/propr/grea/tests/tags.yml diff --git a/modules.json b/modules.json index 9dc121da..2e9b6d4e 100644 --- a/modules.json +++ b/modules.json @@ -65,11 +65,6 @@ "git_sha": "82024cf6325d2ee194e7f056d841ecad2f6856e9", "installed_by": ["modules"] }, - "propr/grea": { - "branch": "master", - "git_sha": "71b1180a5a3de6398eb0eb4d55424cbda36f52d8", - "installed_by": ["modules"] - }, "proteus/readproteingroups": { "branch": "master", "git_sha": "a069b29783583c219c1f23ed3dcf64a5aee1340b", diff --git a/modules/nf-core/propr/grea/environment.yml b/modules/nf-core/propr/grea/environment.yml deleted file mode 100644 index c6897c73..00000000 --- a/modules/nf-core/propr/grea/environment.yml +++ /dev/null @@ -1,7 +0,0 @@ -name: propr_grea -channels: - - conda-forge - - bioconda - - defaults -dependencies: - - conda-forge::r-propr=5.0.4 diff --git a/modules/nf-core/propr/grea/main.nf b/modules/nf-core/propr/grea/main.nf deleted file mode 100644 index d2e1ee6d..00000000 --- a/modules/nf-core/propr/grea/main.nf +++ /dev/null @@ -1,24 +0,0 @@ -process PROPR_GREA { - tag "$meta.id" - label 'process_single' - - conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/r-propr:5.0.4': - 'biocontainers/r-propr:5.0.4' }" - - input: - tuple val(meta), path(adj) - tuple val(meta2), path(gmt) - - output: - tuple val(meta), path("*.go.tsv"), emit: enrichedGO - path "versions.yml", emit: versions - path "*.R_sessionInfo.log", emit: session_info - - when: - task.ext.when == null || task.ext.when - - script: - template 'grea.R' -} diff --git a/modules/nf-core/propr/grea/meta.yml b/modules/nf-core/propr/grea/meta.yml deleted file mode 100644 index de40abd3..00000000 --- a/modules/nf-core/propr/grea/meta.yml +++ /dev/null @@ -1,57 +0,0 @@ ---- -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json -name: "propr_grea" -description: Perform Gene Ratio Enrichment Analysis -keywords: - - logratio - - differential - - propr - - grea - - enrichment - - expression -tools: - - "grea": - description: "Gene Ratio Enrichment Analysis" - homepage: "https://github.com/tpq/propr" - documentation: "https://rdrr.io/cran/propr/man/propr.html" - tool_dev_url: "https://github.com/tpq/propr" - doi: "10.2202/1544-6115.1175" - licence: ["GPL-2"] -input: - - meta: - type: map - description: | - Groovy Map containing sample information. - This can be used at the workflow level to pass optional parameters to the module. - [id: 'test', ...] - - meta2: - type: map - description: | - Groovy map containing study-wide metadata related to the knowledge database - - adj: - type: file - description: adjacency matrix for gene ratio proportionality/differential proportionality - pattern: "*.{csv,tsv}" - - gmt: - type: file - description: relational database containing genes and GO terms (generated by mygene module) - pattern: "*.{gmt}" -output: - - meta: - type: map - description: | - Groovy Map containing sample information. - This can be used at the workflow level to pass optional parameters to the module. - [id: 'test', ...] - - enrichedGO: - type: file - description: File containing GO terms and their enrichment values - pattern: "*.{csv}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" -authors: - - "@caraiz2001" -maintainers: - - "@caraiz2001" diff --git a/modules/nf-core/propr/grea/templates/grea.R b/modules/nf-core/propr/grea/templates/grea.R deleted file mode 100644 index 2d568b70..00000000 --- a/modules/nf-core/propr/grea/templates/grea.R +++ /dev/null @@ -1,253 +0,0 @@ -#!/usr/bin/env Rscript - -################################################ -################################################ -## Functions ## -################################################ -################################################ - -#' Parse out options from a string without recourse to optparse -#' -#' @param x Long-form argument list like --opt1 val1 --opt2 val2 -#' -#' @return named list of options and values similar to optparse -parse_args <- function(x){ - args_list <- unlist(strsplit(x, ' ?--')[[1]])[-1] - args_vals <- lapply(args_list, function(x) scan(text=x, what='character', quiet = TRUE)) - - # Ensure the option vectors are length 2 (key/ value) to catch empty ones - args_vals <- lapply(args_vals, function(z){ length(z) <- 2; z}) - - parsed_args <- structure(lapply(args_vals, function(x) x[2]), names = lapply(args_vals, function(x) x[1])) - parsed_args[! is.na(parsed_args)] -} - -#' Flexibly read CSV or TSV files (determined by file extension) -#' -#' @param file Input file -#' @param header Boolean. TRUE if first row is header. False without header. -#' @param row.names The first column is used as row names by default. -#' Otherwise, give another number. Or use NULL when no row.names are present. -#' -#' @return output Data frame -read_delim_flexible <- function(file, header = TRUE, row.names = 1, check.names = TRUE){ - - ext <- tolower(tail(strsplit(basename(file), split = "\\\\.")[[1]], 1)) # Get the file extension - - if (ext == "tsv" || ext == "txt") { # If the file is a tsv or txt file - separator <- "\\t" # Set the separator variable to tab - } else if (ext == "csv") { # If the file is a csv file - separator <- "," - } else { - stop(paste("Unknown separator for", ext)) - } - - mat <- read.delim( # Read the file - file, - sep = separator, # Set the separator defined above - header = header, - row.names = row.names, - check.names = check.names - ) -} - -#' Converts the .gmt file into a df -#' -#' @param file_gmt_path path of the .gmt file provided by mygene module. -#' @return output dataframe a Dataframe: 1st column = GOterm, 2nd = Description, 3d to end = genes. -process_gmt_file <- function(file_gmt_path) { - - lines <- readLines(file_gmt_path) - data_list <- list() - - for (line in lines) { - fields <- strsplit(line, "\\t")[[1]] # Split the line based on the tab character - go_term <- fields[1] # Extract the GO term - - # Create a data frame with the GO term in the first column - # Fill in missing values with NA to ensure consistent column lengths - data_list[[go_term]] <- data.frame(GOterm = go_term, - Description = fields[2], - GeneIDs = c(fields[3:length(fields)], rep(NA, max(0, 3 - length(fields))))) - } - - gmt_df <- do.call(rbind, data_list) # Combine all data frames into a single data frame - gmt_df\$GeneIDs <- as.character(gmt_df\$GeneIDs) # Convert gene IDs to character to avoid coercion - - return(gmt_df) -} - -#' Converts the .gmt data frame into a knowledge matrix (contingency table) -#' -#' @param gmt_df .gmt df created by process_gmt_file -#' @return output dataframe. A knowledge database where each row is a graph node (gene) -#' and each column is a concept (GO term). -gmt_to_K<- function(gmt_df){ - - summ_df <- as.data.frame(gmt_df\$GeneIDs) - summ_df <- cbind(summ_df, as.data.frame(gmt_df\$GOterm)) - colnames(summ_df)<- c("GeneIDs", "GOterm") - summ_df<- unique(summ_df) - - summ_df\$value <- 1 - - K <- table(summ_df\$GeneIDs, summ_df\$GOterm) - K <- as.data.frame.matrix(K) - - return(K) -} - -#' Expands knowledge matrix with missing genes to ensure same number of rows for A and K -#' -#' @param adjacency_matrix gene x gene correlation or proportionality adjacency matrix (output propr/propd) -#' @return output dataframe. A knowledge database where each row is a graph node (gene) -#' and each column is a concept (GO term). -add_missing <- function(adjacency_matrix, knowledge_matrix){ - - missing_genes <- setdiff(rownames(adjacency_matrix), rownames(knowledge_matrix)) - extra_rows <- data.frame(matrix(0, nrow = length(missing_genes), ncol = ncol(knowledge_matrix))) - rownames(extra_rows) <- missing_genes - colnames(extra_rows) <- colnames(knowledge_matrix) - - knowledge_matrix <- rbind(knowledge_matrix, extra_rows) - return(knowledge_matrix) -} - -################################################ -################################################ -## Parse arguments ## -################################################ -################################################ - -opt <- list( - adj = '$adj', - gmt = '$gmt', - prefix = ifelse('$task.ext.prefix' == 'null', '$meta.id', '$task.ext.prefix'), - permutation = 100, - fixseed = TRUE, - ncores = as.integer('$task.cpus') -) - -opt_types <- list( - adj = 'character', - gmt = 'character', - prefix = 'character', - permutation = 'numeric', - fixseed = 'logical', - ncores = 'numeric' -) - -# Apply parameter overrides -args_opt <- parse_args('$task.ext.args') - -for ( ao in names(args_opt)){ - if (! ao %in% names(opt)){ - stop(paste("Invalid option:", ao)) - } else { - - # Preserve classes from defaults where possible - if (! is.null(opt[[ao]])){ - args_opt[[ao]] <- as(args_opt[[ao]], opt_types[[ao]]) - } - # set NA - if (args_opt[[ao]] %in% c('NA', NA, 'null')){ - args_opt[[ao]] <- NA - } - opt[[ao]] <- args_opt[[ao]] - } -} - -# Check if required parameters have been provided -required_opts <- c('adj', 'gmt') # defines a vector required_opts containing the names of the required parameters. -missing <- required_opts[unlist(lapply(opt[required_opts], is.null)) | ! required_opts %in% names(opt)] -if (length(missing) > 0){ - stop(paste("Missing required options:", paste(missing, collapse=', '))) -} - - -# Check file inputs are valid -for (file_input in c('adj', 'gmt')){ - if (is.null(opt[[file_input]])) { - stop(paste("Please provide", file_input), call. = FALSE) - } - if (! file.exists(opt[[file_input]])){ - stop(paste0('Value of ', file_input, ': ', opt[[file_input]], ' is not a valid file')) - } -} - -################################################ -################################################ -## Finish loading libraries ## -################################################ -################################################ - -library(propr) - -################################################ -################################################ -## Enrichment analysis ## -################################################ -################################################ - -# Read gene x gene adjacency matrix -A <- read_delim_flexible(opt\$adj, header = TRUE, row.names = 1, check.names = TRUE) - -# Read and process gene x GO term matrix -gmt_df <- process_gmt_file(opt\$gmt) -K <- gmt_to_K(gmt_df) - -# Ensure same number of rows (genes) -if (nrow(A) != nrow(K)){ - K <- add_missing(A, K) -} - -# Run Graflex -G <- runGraflex(A, K, opt\$permutation, opt\$fixseed) - -################################################ -################################################ -## Generate outputs ## -################################################ -################################################ - -write.table( - G, - file = paste0(opt\$prefix, '.go.tsv'), - col.names = TRUE, - row.names = TRUE, - sep = '\\t', - quote = FALSE - -) - -################################################ -################################################ -## R SESSION INFO ## -################################################ -################################################ - -sink(paste0(opt\$prefix, ".R_sessionInfo.log")) -print(sessionInfo()) -sink() - -################################################ -################################################ -## VERSIONS FILE ## -################################################ -################################################ - -r.version <- strsplit(version[['version.string']], ' ')[[1]][3] -propr.version <- as.character(packageVersion('propr')) - -writeLines( - c( - '"${task.process}":', - paste(' r-base:', r.version), - paste(' r-propr:', propr.version) - ), -'versions.yml') - -################################################ -################################################ -################################################ -################################################ diff --git a/modules/nf-core/propr/grea/tests/grea_test.config b/modules/nf-core/propr/grea/tests/grea_test.config deleted file mode 100644 index 8d0d229a..00000000 --- a/modules/nf-core/propr/grea/tests/grea_test.config +++ /dev/null @@ -1,8 +0,0 @@ -process { - withName: "PROPR_PROPR"{ - ext.args = { "--adjacency true --permutation 5 --fixseed true --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.05"} - } - withName: "PROPR_GREA"{ - ext.args = { "--permutation 5 --fixseed true"} - } -} \ No newline at end of file diff --git a/modules/nf-core/propr/grea/tests/main.nf.test b/modules/nf-core/propr/grea/tests/main.nf.test deleted file mode 100644 index afac1dec..00000000 --- a/modules/nf-core/propr/grea/tests/main.nf.test +++ /dev/null @@ -1,62 +0,0 @@ -nextflow_process { - - name "Test Process PROPR_GREA" - script "../main.nf" - process "PROPR_GREA" - - tag "modules" - tag "modules_nfcore" - tag "propr" - tag "propr/grea" - tag "mygene" - tag "propr/propr" - - test("grea chained to propr using default options") { - - tag "default" - config "./grea_test.config" - - setup { - run("PROPR_PROPR") { - script "../../propr/main.nf" - process { - """ - input[0] = [ - [ id:'test' ], - file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv") - ] - """ - } - } - run("MYGENE") { - script "../../../mygene/main.nf" - process { - """ - input[0] = [ - [id : 'test'], - file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.gene_meta.tsv") - ] - """ - } - } - } - - when { - process { - """ - input[0] = PROPR_PROPR.out.adj.collect{ meta, adj -> adj }.map{ adj -> [[ id: 'test_adj'], adj]} - input[1] = MYGENE.out.gmt.collect{ meta, gmt -> gmt }.map{ gmt -> [[ id: 'test_gmt'], gmt]} - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out.enrichedGO).match("grea chained to propr using default options - enrichedGO") }, - { assert snapshot(process.out.versions).match("versions") } - - ) - } - } -} \ No newline at end of file diff --git a/modules/nf-core/propr/grea/tests/main.nf.test.snap b/modules/nf-core/propr/grea/tests/main.nf.test.snap deleted file mode 100644 index a915603d..00000000 --- a/modules/nf-core/propr/grea/tests/main.nf.test.snap +++ /dev/null @@ -1,31 +0,0 @@ -{ - "versions": { - "content": [ - [ - "versions.yml:md5,222a7a8b79b5a2987637279847c609d1" - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-04-29T10:45:07.582509" - }, - "grea chained to propr using default options - enrichedGO": { - "content": [ - [ - [ - { - "id": "test_adj" - }, - "test_adj.go.tsv:md5,914d8b750ba303a297efb7331ec238b7" - ] - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-04-29T10:45:07.508934" - } -} \ No newline at end of file diff --git a/modules/nf-core/propr/grea/tests/tags.yml b/modules/nf-core/propr/grea/tests/tags.yml deleted file mode 100644 index e7f80baf..00000000 --- a/modules/nf-core/propr/grea/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -propr/grea: - - "modules/nf-core/propr/grea/**" From cf58a2b9caef6278e8460b9269bcc07eae416d0f Mon Sep 17 00:00:00 2001 From: suzannejin Date: Tue, 8 Oct 2024 16:55:47 +0200 Subject: [PATCH 082/154] add local propr/grea module --- modules/local/propr/grea/main.nf | 24 +++ modules/local/propr/grea/templates/grea.R | 245 ++++++++++++++++++++++ 2 files changed, 269 insertions(+) create mode 100644 modules/local/propr/grea/main.nf create mode 100644 modules/local/propr/grea/templates/grea.R diff --git a/modules/local/propr/grea/main.nf b/modules/local/propr/grea/main.nf new file mode 100644 index 00000000..64c2df97 --- /dev/null +++ b/modules/local/propr/grea/main.nf @@ -0,0 +1,24 @@ +process PROPR_GREA { + tag "$meta.id" + label 'process_high' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mulled-v2-401a215d4024df776a98d90a352048199e342a3d:5ba9bbf6cd4f4f98983526673c223d2e7d829b36-0': + 'biocontainers/mulled-v2-401a215d4024df776a98d90a352048199e342a3d:5ba9bbf6cd4f4f98983526673c223d2e7d829b36-0' }" + + input: + tuple val(meta), path(adj) + tuple val(meta2), path(gmt) + + output: + tuple val(meta), path("*.grea.tsv"), emit: results + path "versions.yml", emit: versions + path "*.R_sessionInfo.log", emit: session_info + + when: + task.ext.when == null || task.ext.when + + script: + template 'grea.R' +} diff --git a/modules/local/propr/grea/templates/grea.R b/modules/local/propr/grea/templates/grea.R new file mode 100644 index 00000000..b59537bd --- /dev/null +++ b/modules/local/propr/grea/templates/grea.R @@ -0,0 +1,245 @@ +#!/usr/bin/env Rscript + +################################################ +################################################ +## Functions ## +################################################ +################################################ + +#' Parse out options from a string without recourse to optparse +#' +#' @param x Long-form argument list like --opt1 val1 --opt2 val2 +#' +#' @return named list of options and values similar to optparse +parse_args <- function(x){ + args_list <- unlist(strsplit(x, ' ?--')[[1]])[-1] + args_vals <- lapply(args_list, function(x) scan(text=x, what='character', quiet = TRUE)) + + # Ensure the option vectors are length 2 (key/ value) to catch empty ones + args_vals <- lapply(args_vals, function(z){ length(z) <- 2; z}) + + parsed_args <- structure(lapply(args_vals, function(x) x[2]), names = lapply(args_vals, function(x) x[1])) + parsed_args[! is.na(parsed_args)] +} + +#' Flexibly read CSV or TSV files (determined by file extension) +#' +#' @param file Input file +#' @param header Boolean. TRUE if first row is header. False without header. +#' @param row.names The first column is used as row names by default. +#' Otherwise, give another number. Or use NULL when no row.names are present. +#' +#' @return output Data frame +read_delim_flexible <- function(file, header = TRUE, row.names = 1, check.names = TRUE){ + + ext <- tolower(tail(strsplit(basename(file), split = "\\\\.")[[1]], 1)) # Get the file extension + + if (ext == "tsv" || ext == "txt") { # If the file is a tsv or txt file + separator <- "\\t" # Set the separator variable to tab + } else if (ext == "csv") { # If the file is a csv file + separator <- "," + } else { + stop(paste("Unknown separator for", ext)) + } + + mat <- read.delim( # Read the file + file, + sep = separator, # Set the separator defined above + header = header, + row.names = row.names, + check.names = check.names + ) +} + +#' Loads the .gmt file and converts it into a knowledge database +#' +#' @param filename path of the .gmt file +#' @param genes vector of gene names +#' @return output dataframe. A knowledge database where each row is a graph node (eg. gene) +#' and each column is a concept (eg. GO term, pathway, etc). +load_gmt <- function(filename, nodes) { + + # read gmt file + gmt <- readLines(filename) + gmt <- strsplit(gmt, "\t") + + # initialize database matrix + db <- matrix(0, nrow = length(nodes), ncol = length(gmt)) + rownames(db) <- nodes + colnames(db) <- sapply(gmt, function(entry) entry[[1]]) + + # fill 1 if gene is in concept + for (i in 1:length(gmt)) { + nodes_in_concept <- gmt[[i]][-c(1, 2)] + db[nodes_in_concept, i] <- 1 + } + + return(gmt) +} + +################################################ +################################################ +## Parse arguments ## +################################################ +################################################ + +# Set defaults and classes + +opt <- list( + prefix = ifelse('$task.ext.prefix' == 'null', '$meta.id', '$task.ext.prefix'), + + # input data + adj = '$adj', # adjacency matrix + gmt = '$gmt', # knowledge database .gmt file + + # parameters for permutation test + permutation = 100, + + # other options + seed = NA, + ncores = as.integer('$task.cpus') +) + +opt_types <- list( + prefix = 'character', + adj = 'character', + gmt = 'character', + permutation = 'numeric', + seed = 'numeric', + ncores = 'numeric' +) + +# Apply parameter overrides + +args_opt <- parse_args('$task.ext.args') +for ( ao in names(args_opt)){ + if (! ao %in% names(opt)){ + stop(paste("Invalid option:", ao)) + } else { + + # Preserve classes from defaults where possible + args_opt[[ao]] <- as(args_opt[[ao]], opt_types[[ao]]) + + # handle NA, and avoid errors when NA is provided by user as character + if (args_opt[[ao]] %in% c('NA', NA)) args_opt[[ao]] <- NA + + # replace values + opt[[ao]] <- args_opt[[ao]] + } +} + +# Check if required parameters have been provided + +required_opts <- c('adj', 'gmt') # defines a vector required_opts containing the names of the required parameters. +missing <- required_opts[unlist(lapply(opt[required_opts], is.null)) | ! required_opts %in% names(opt)] +if (length(missing) > 0){ + stop(paste("Missing required options:", paste(missing, collapse=', '))) +} + +# Check file inputs are valid +for (file_input in c('adj', 'gmt')){ + if (is.null(opt[[file_input]])) { + stop(paste("Please provide", file_input), call. = FALSE) + } + if (! file.exists(opt[[file_input]])){ + stop(paste0('Value of ', file_input, ': ', opt[[file_input]], ' is not a valid file')) + } +} + +# TODO maybe add a function to pretty print the arguments? +print(opt) + +################################################ +################################################ +## Finish loading libraries ## +################################################ +################################################ + +library(propr) + +################################################ +################################################ +## Enrichment analysis ## +################################################ +################################################ + +# set seed when required + +if (!is.na(opt\$seed)) { + warning('Setting seed ', opt\$seed, ' for reproducibility') + set.seed(opt\$seed) +} + +# load adjacency matrix +# this matrix should have gene x gene dimensions + +adj <- read_delim_flexible( + opt\$adj, + header = TRUE, + row.names = 1, + check.names = TRUE +) + +# load and process knowledge database + +db <- load_gmt( + opt\$gmt, + rownames(adj) +) + +# run GREA +# Basically, it calculates the odds ratio of the graph being enriched in each concept, +# and the FDR of the odds ratio through permutation tests + +odds <- runGraflex( + adj, + db, + p=opt\$permutation, + ncores=opt\$ncores +) + +################################################ +################################################ +## Generate outputs ## +################################################ +################################################ + +write.table( + odds, + file = paste0(opt\$prefix, '.grea.tsv'), + col.names = TRUE, + row.names = TRUE, + sep = '\\t', + quote = FALSE + +) + +################################################ +################################################ +## R SESSION INFO ## +################################################ +################################################ + +sink(paste0(opt\$prefix, ".R_sessionInfo.log")) +print(sessionInfo()) +sink() + +################################################ +################################################ +## VERSIONS FILE ## +################################################ +################################################ + +propr.version <- as.character(packageVersion('propr')) + +writeLines( + c( + '"${task.process}":', + paste(' r-propr:', propr.version) + ), +'versions.yml') + +################################################ +################################################ +################################################ +################################################ From 5b561628001b986eb40f68cc571111afca403b80 Mon Sep 17 00:00:00 2001 From: suzannejin Date: Tue, 8 Oct 2024 16:58:01 +0200 Subject: [PATCH 083/154] modified enrichment subworkflow to fit new grea module --- conf/test_experimental.config | 2 +- subworkflows/local/enrichment/main.nf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/test_experimental.config b/conf/test_experimental.config index f4aeaa11..c29bfc71 100644 --- a/conf/test_experimental.config +++ b/conf/test_experimental.config @@ -28,7 +28,7 @@ params { matrix = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv' contrasts = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.contrasts.csv' tools = "$projectDir/assets/tools_samplesheet.csv" - pathway = "propd,propd_fdr,propr,pcorbshrink,cor" + pathway = "propd,propd_fdr,propr,pcorbshrink,cor,propd_grea" //Features features_metadata_cols = 'gene_id,gene_name' diff --git a/subworkflows/local/enrichment/main.nf b/subworkflows/local/enrichment/main.nf index f0fe670d..20cbc70f 100644 --- a/subworkflows/local/enrichment/main.nf +++ b/subworkflows/local/enrichment/main.nf @@ -35,7 +35,7 @@ workflow ENRICHMENT { .set { ch_adjacency_grea } GREA(ch_adjacency_grea, ch_gmt.collect()) - ch_enriched = ch_enriched.mix(GREA.out.enrichedGO) + ch_enriched = ch_enriched.mix(GREA.out.results) // ---------------------------------------------------- // Perform enrichment analysis with GSEA From 38a32b690149102f2e1cdf995f54e63fe1d28fef Mon Sep 17 00:00:00 2001 From: suzannejin Date: Tue, 8 Oct 2024 17:01:20 +0200 Subject: [PATCH 084/154] fix bug in enrichment.nf --- subworkflows/local/enrichment/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/enrichment/main.nf b/subworkflows/local/enrichment/main.nf index 20cbc70f..4141ae1f 100644 --- a/subworkflows/local/enrichment/main.nf +++ b/subworkflows/local/enrichment/main.nf @@ -2,7 +2,7 @@ // Perform enrichment analysis // include { MYGENE } from "../../../modules/nf-core/mygene/main.nf" -include { PROPR_GREA as GREA } from "../../../modules/nf-core/propr/grea/main.nf" +include { PROPR_GREA as GREA } from "../../../modules/local/propr/grea/main.nf" workflow ENRICHMENT { take: From 5626dc72f95c2d13739381cfff1cd2210b4ac397 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Wed, 9 Oct 2024 11:05:52 +0000 Subject: [PATCH 085/154] Template update for nf-core/tools version 3.0.1 --- .editorconfig | 4 - .github/CONTRIBUTING.md | 2 +- .github/workflows/awsfulltest.yml | 6 +- .github/workflows/linting.yml | 4 +- .nf-core.yml | 2 +- .prettierignore | 1 - docs/output.md | 1 - modules.json | 6 +- modules/nf-core/multiqc/environment.yml | 2 +- modules/nf-core/multiqc/main.nf | 4 +- .../nf-core/multiqc/tests/main.nf.test.snap | 26 +- nextflow.config | 8 +- .../main.nf | 12 +- .../nf-core/utils_nextflow_pipeline/main.nf | 46 ++- .../nf-core/utils_nfcore_pipeline/main.nf | 279 ++++++++++-------- 15 files changed, 209 insertions(+), 194 deletions(-) diff --git a/.editorconfig b/.editorconfig index e1058815..72dda289 100644 --- a/.editorconfig +++ b/.editorconfig @@ -11,7 +11,6 @@ indent_style = space [*.{md,yml,yaml,html,css,scss,js}] indent_size = 2 - # These files are edited and tested upstream in nf-core/modules [/modules/nf-core/**] charset = unset @@ -26,12 +25,9 @@ insert_final_newline = unset trim_trailing_whitespace = unset indent_style = unset - - [/assets/email*] indent_size = unset - # ignore python and markdown [*.{py,md}] indent_style = unset diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 0afc1872..23cadba9 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -90,7 +90,7 @@ Once there, use `nf-core pipelines schema build` to add to `nextflow_schema.json ### Default processes resource requirements -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. +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/main/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.cpus}` and `${task.memory}` variables in the `script:` block. diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index 12f56d56..5afda0e2 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -14,16 +14,18 @@ on: jobs: run-platform: name: Run AWS full tests - if: github.repository == 'nf-core/differentialabundance' && github.event.review.state == 'approved' + # run only if the PR is approved by at least 2 reviewers and against the master branch or manually triggered + if: github.repository == 'nf-core/differentialabundance' && github.event.review.state == 'approved' && github.event.pull_request.base.ref == 'master' || github.event_name == 'workflow_dispatch' runs-on: ubuntu-latest steps: - uses: octokit/request-action@v2.x id: check_approvals with: - route: GET /repos/${{ github.repository }}/pulls/${{ github.event.review.number }}/reviews + route: GET /repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/reviews env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - id: test_variables + if: github.event_name != 'workflow_dispatch' run: | JSON_RESPONSE='${{ steps.check_approvals.outputs.data }}' CURRENT_APPROVALS_COUNT=$(echo $JSON_RESPONSE | jq -c '[.[] | select(.state | contains("APPROVED")) ] | length') diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index b882838a..a502573c 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -42,10 +42,10 @@ jobs: architecture: "x64" - name: read .nf-core.yml - uses: pietrobolcato/action-read-yaml@1.0.0 + uses: pietrobolcato/action-read-yaml@1.1.0 id: read_yml with: - config: ${{ github.workspace }}/.nf-core.yaml + config: ${{ github.workspace }}/.nf-core.yml - name: Install dependencies run: | diff --git a/.nf-core.yml b/.nf-core.yml index 52ebfa42..1584ad5e 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -6,7 +6,7 @@ lint: - params.css_file - params.citations_file - params.report_file -nf_core_version: 3.0.0 +nf_core_version: 3.0.1 org_path: null repository_type: pipeline template: diff --git a/.prettierignore b/.prettierignore index 610e5069..437d763d 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,4 +1,3 @@ - email_template.html adaptivecard.json slackreport.json diff --git a/docs/output.md b/docs/output.md index 3f817bd4..001e6702 100644 --- a/docs/output.md +++ b/docs/output.md @@ -14,7 +14,6 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d - [FastQC](#fastqc) - Raw read QC - [MultiQC](#multiqc) - Aggregate report describing results and QC from the whole pipeline - - [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution ### FastQC diff --git a/modules.json b/modules.json index da2bf281..29e24e93 100644 --- a/modules.json +++ b/modules.json @@ -12,7 +12,7 @@ }, "multiqc": { "branch": "master", - "git_sha": "666652151335353eef2fcd58880bcef5bc2928e1", + "git_sha": "b8d36829fa84b6e404364abff787e8b07f6d058c", "installed_by": ["modules"] } } @@ -21,12 +21,12 @@ "nf-core": { "utils_nextflow_pipeline": { "branch": "master", - "git_sha": "d20fb2a9cc3e2835e9d067d1046a63252eb17352", + "git_sha": "9d05360da397692321d377b6102d2fb22507c6ef", "installed_by": ["subworkflows"] }, "utils_nfcore_pipeline": { "branch": "master", - "git_sha": "2fdce49d30c0254f76bc0f13c55c17455c1251ab", + "git_sha": "772684d9d66f37b650c8ba5146ac1ee3ecba2acb", "installed_by": ["subworkflows"] }, "utils_nfschema_plugin": { diff --git a/modules/nf-core/multiqc/environment.yml b/modules/nf-core/multiqc/environment.yml index f1cd99b0..6f5b867b 100644 --- a/modules/nf-core/multiqc/environment.yml +++ b/modules/nf-core/multiqc/environment.yml @@ -2,4 +2,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::multiqc=1.24.1 + - bioconda::multiqc=1.25.1 diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index b9ccebdb..9724d2f3 100644 --- a/modules/nf-core/multiqc/main.nf +++ b/modules/nf-core/multiqc/main.nf @@ -3,8 +3,8 @@ process MULTIQC { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.25--pyhdfd78af_0' : - 'biocontainers/multiqc:1.25--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.25.1--pyhdfd78af_0' : + 'biocontainers/multiqc:1.25.1--pyhdfd78af_0' }" input: path multiqc_files, stageAs: "?/*" diff --git a/modules/nf-core/multiqc/tests/main.nf.test.snap b/modules/nf-core/multiqc/tests/main.nf.test.snap index b779e469..2fcbb5ff 100644 --- a/modules/nf-core/multiqc/tests/main.nf.test.snap +++ b/modules/nf-core/multiqc/tests/main.nf.test.snap @@ -2,14 +2,14 @@ "multiqc_versions_single": { "content": [ [ - "versions.yml:md5,8c8724363a5efe0c6f43ab34faa57efd" + "versions.yml:md5,41f391dcedce7f93ca188f3a3ffa0916" ] ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" + "nf-test": "0.9.0", + "nextflow": "24.04.4" }, - "timestamp": "2024-07-10T12:41:34.562023" + "timestamp": "2024-10-02T17:51:46.317523" }, "multiqc_stub": { "content": [ @@ -17,25 +17,25 @@ "multiqc_report.html", "multiqc_data", "multiqc_plots", - "versions.yml:md5,8c8724363a5efe0c6f43ab34faa57efd" + "versions.yml:md5,41f391dcedce7f93ca188f3a3ffa0916" ] ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" + "nf-test": "0.9.0", + "nextflow": "24.04.4" }, - "timestamp": "2024-07-10T11:27:11.933869532" + "timestamp": "2024-10-02T17:52:20.680978" }, "multiqc_versions_config": { "content": [ [ - "versions.yml:md5,8c8724363a5efe0c6f43ab34faa57efd" + "versions.yml:md5,41f391dcedce7f93ca188f3a3ffa0916" ] ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" + "nf-test": "0.9.0", + "nextflow": "24.04.4" }, - "timestamp": "2024-07-10T11:26:56.709849369" + "timestamp": "2024-10-02T17:52:09.185842" } -} +} \ No newline at end of file diff --git a/nextflow.config b/nextflow.config index 4a30d3a3..cc72bc73 100644 --- a/nextflow.config +++ b/nextflow.config @@ -12,10 +12,12 @@ 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 @@ -36,6 +38,7 @@ params { show_hidden = false version = false pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/' + // Config options config_profile_name = null config_profile_description = null @@ -44,9 +47,9 @@ params { custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" config_profile_contact = null config_profile_url = null + // Schema validation default options validate_params = true - } // Load base.config by default for all pipelines @@ -161,6 +164,7 @@ includeConfig !System.getenv('NXF_OFFLINE') && params.custom_config_base ? "${pa // Load nf-core/differentialabundance custom profiles from different institutions. // TODO nf-core: Optionally, you can add a pipeline-specific nf-core config at https://github.com/nf-core/configs // includeConfig !System.getenv('NXF_OFFLINE') && params.custom_config_base ? "${params.custom_config_base}/pipeline/differentialabundance.config" : "/dev/null" + // Set default registry for Apptainer, Docker, Podman, Charliecloud and Singularity independent of -profile // Will not be used unless Apptainer / Docker / Podman / Charliecloud / Singularity are enabled // Set to your registry if you have a mirror of containers @@ -172,6 +176,7 @@ charliecloud.registry = 'quay.io' // Load igenomes.config if required includeConfig !params.igenomes_ignore ? 'conf/igenomes.config' : 'conf/igenomes_ignored.config' + // 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. @@ -263,4 +268,3 @@ validation { // Load modules.config for DSL2 module specific options includeConfig 'conf/modules.config' - diff --git a/subworkflows/local/utils_nfcore_differentialabundance_pipeline/main.nf b/subworkflows/local/utils_nfcore_differentialabundance_pipeline/main.nf index ac616e5b..e9678758 100644 --- a/subworkflows/local/utils_nfcore_differentialabundance_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_differentialabundance_pipeline/main.nf @@ -18,9 +18,9 @@ include { UTILS_NFCORE_PIPELINE } from '../../nf-core/utils_nfcore_pipeline' include { UTILS_NEXTFLOW_PIPELINE } from '../../nf-core/utils_nextflow_pipeline' /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ SUBWORKFLOW TO INITIALISE PIPELINE -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ workflow PIPELINE_INITIALISATION { @@ -99,9 +99,9 @@ workflow PIPELINE_INITIALISATION { } /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ SUBWORKFLOW FOR PIPELINE COMPLETION -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ workflow PIPELINE_COMPLETION { @@ -147,9 +147,9 @@ workflow PIPELINE_COMPLETION { } /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ FUNCTIONS -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ // // Check and validate pipeline parameters diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/main.nf b/subworkflows/nf-core/utils_nextflow_pipeline/main.nf index 28e32b20..2b0dc67a 100644 --- a/subworkflows/nf-core/utils_nextflow_pipeline/main.nf +++ b/subworkflows/nf-core/utils_nextflow_pipeline/main.nf @@ -3,13 +3,12 @@ // /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ SUBWORKFLOW DEFINITION -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ workflow UTILS_NEXTFLOW_PIPELINE { - take: print_version // boolean: print version dump_parameters // boolean: dump parameters @@ -22,7 +21,7 @@ workflow UTILS_NEXTFLOW_PIPELINE { // Print workflow version and exit on --version // if (print_version) { - log.info "${workflow.manifest.name} ${getWorkflowVersion()}" + log.info("${workflow.manifest.name} ${getWorkflowVersion()}") System.exit(0) } @@ -45,9 +44,9 @@ workflow UTILS_NEXTFLOW_PIPELINE { } /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ FUNCTIONS -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ // @@ -72,11 +71,11 @@ def getWorkflowVersion() { // Dump pipeline parameters to a JSON file // def dumpParametersToJSON(outdir) { - def timestamp = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss') - def filename = "params_${timestamp}.json" - def temp_pf = new File(workflow.launchDir.toString(), ".${filename}") - def jsonStr = groovy.json.JsonOutput.toJson(params) - temp_pf.text = groovy.json.JsonOutput.prettyPrint(jsonStr) + def timestamp = new java.util.Date().format('yyyy-MM-dd_HH-mm-ss') + def filename = "params_${timestamp}.json" + def temp_pf = new File(workflow.launchDir.toString(), ".${filename}") + def jsonStr = groovy.json.JsonOutput.toJson(params) + temp_pf.text = groovy.json.JsonOutput.prettyPrint(jsonStr) nextflow.extension.FilesEx.copyTo(temp_pf.toPath(), "${outdir}/pipeline_info/params_${timestamp}.json") temp_pf.delete() @@ -91,9 +90,14 @@ def checkCondaChannels() { 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 + } + catch (NullPointerException e) { + log.warn("Could not verify conda channel configuration.") + return null + } + catch (IOException e) { + log.warn("Could not verify conda channel configuration.") + return null } // Check that all channels are present @@ -106,19 +110,13 @@ def checkCondaChannels() { required_channels_in_order.eachWithIndex { channel, index -> if (index < required_channels_in_order.size() - 1) { - channel_priority_violation |= !(channels.indexOf(channel) < channels.indexOf(required_channels_in_order[index+1])) + channel_priority_violation |= !(channels.indexOf(channel) < channels.indexOf(required_channels_in_order[index + 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" + - "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + 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_nfcore_pipeline/main.nf b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf index cbd8495b..b78273ca 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf +++ b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf @@ -3,13 +3,12 @@ // /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ SUBWORKFLOW DEFINITION -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ workflow UTILS_NFCORE_PIPELINE { - take: nextflow_cli_args @@ -22,9 +21,9 @@ workflow UTILS_NFCORE_PIPELINE { } /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ FUNCTIONS -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ // @@ -33,12 +32,9 @@ workflow UTILS_NFCORE_PIPELINE { def checkConfigProvided() { def valid_config = true as Boolean 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.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 " + ) valid_config = false } return valid_config @@ -49,12 +45,14 @@ def checkConfigProvided() { // 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" + 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" + 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" + ) } } @@ -70,13 +68,7 @@ def workflowCitation() { manifest_doi.each { doi_ref -> temp_doi_ref += " https://doi.org/${doi_ref.replace('https://doi.org/', '').replace(' ', '')}\n" } - return "If you use ${workflow.manifest.name} for your analysis please cite:\n\n" + - "* The pipeline\n" + - temp_doi_ref + "\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" + return "If you use ${workflow.manifest.name} for your analysis please cite:\n\n" + "* The pipeline\n" + temp_doi_ref + "\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" } // @@ -102,7 +94,7 @@ def getWorkflowVersion() { // def processVersionsFromYAML(yaml_file) { def yaml = new org.yaml.snakeyaml.Yaml() - def versions = yaml.load(yaml_file).collectEntries { k, v -> [ k.tokenize(':')[-1], v ] } + def versions = yaml.load(yaml_file).collectEntries { k, v -> [k.tokenize(':')[-1], v] } return yaml.dumpAsMap(versions).trim() } @@ -112,8 +104,8 @@ def processVersionsFromYAML(yaml_file) { def workflowVersionToYAML() { return """ Workflow: - $workflow.manifest.name: ${getWorkflowVersion()} - Nextflow: $workflow.nextflow.version + ${workflow.manifest.name}: ${getWorkflowVersion()} + Nextflow: ${workflow.nextflow.version} """.stripIndent().trim() } @@ -121,11 +113,7 @@ def workflowVersionToYAML() { // Get channel of software versions used in pipeline in YAML format // def softwareVersionsToYAML(ch_versions) { - return ch_versions - .unique() - .map { version -> processVersionsFromYAML(version) } - .unique() - .mix(Channel.of(workflowVersionToYAML())) + return ch_versions.unique().map { version -> processVersionsFromYAML(version) }.unique().mix(Channel.of(workflowVersionToYAML())) } // @@ -133,25 +121,31 @@ def softwareVersionsToYAML(ch_versions) { // def paramsSummaryMultiqc(summary_params) { def summary_section = '' - summary_params.keySet().each { group -> - 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" - group_params.keySet().sort().each { param -> - summary_section += "
    $param
    ${group_params.get(param) ?: 'N/A'}
    \n" + summary_params + .keySet() + .each { group -> + 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" + group_params + .keySet() + .sort() + .each { param -> + summary_section += "
    ${param}
    ${group_params.get(param) ?: 'N/A'}
    \n" + } + summary_section += "
    \n" } - summary_section += "
    \n" } - } - def yaml_file_text = "id: '${workflow.manifest.name.replace('/','-')}-summary'\n" as String - 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}" + def yaml_file_text = "id: '${workflow.manifest.name.replace('/', '-')}-summary'\n" as String + 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 } @@ -199,54 +193,54 @@ def logColours(monochrome_logs=true) { 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" + 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" + 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" + 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" + 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" + 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 } @@ -261,14 +255,15 @@ def attachMultiqcReport(multiqc_report) { 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" + log.warn("[${workflow.manifest.name}] Found multiple reports from process 'MULTIQC', will use only one") } mqc_report = mqc_report[0] } } - } catch (all) { + } + catch (Exception all) { if (multiqc_report) { - log.warn "[$workflow.manifest.name] Could not attach MultiQC report to summary email" + log.warn("[${workflow.manifest.name}] Could not attach MultiQC report to summary email") } } return mqc_report @@ -280,26 +275,35 @@ def attachMultiqcReport(multiqc_report) { 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" + def subject = "[${workflow.manifest.name}] Successful: ${workflow.runName}" if (!workflow.success) { - subject = "[$workflow.manifest.name] FAILED: $workflow.runName" + subject = "[${workflow.manifest.name}] FAILED: ${workflow.runName}" } def summary = [:] - summary_params.keySet().sort().each { group -> - summary << summary_params[group] - } + summary_params + .keySet() + .sort() + .each { group -> + 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 + 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 = [:] @@ -337,7 +341,7 @@ def completionEmail(summary_params, email, email_on_fail, plaintext_email, outdi // 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: "${workflow.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: "${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() @@ -346,30 +350,32 @@ def completionEmail(summary_params, email, email_on_fail, plaintext_email, outdi def colors = logColours(monochrome_logs) as Map if (email_address) { try { - if (plaintext_email) { throw new org.codehaus.groovy.GroovyException('Send plaintext e-mail, not HTML') } + if (plaintext_email) { +new org.codehaus.groovy.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) { + ['sendmail', '-t'].execute() << sendmail_html + log.info("-${colors.purple}[${workflow.manifest.name}]${colors.green} Sent summary e-mail to ${email_address} (sendmail)-") + } + catch (Exception all) { // Catch failures and try with plaintext - def mail_cmd = [ 'mail', '-s', subject, '--content-type=text/html', email_address ] + 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)-" + 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_hf = new File(workflow.launchDir.toString(), ".pipeline_report.html") output_hf.withWriter { w -> w << email_html } - nextflow.extension.FilesEx.copyTo(output_hf.toPath(), "${outdir}/pipeline_info/pipeline_report.html"); + nextflow.extension.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 } - nextflow.extension.FilesEx.copyTo(output_tf.toPath(), "${outdir}/pipeline_info/pipeline_report.txt"); + nextflow.extension.FilesEx.copyTo(output_tf.toPath(), "${outdir}/pipeline_info/pipeline_report.txt") output_tf.delete() } @@ -380,12 +386,14 @@ def completionSummary(monochrome_logs=true) { def colors = logColours(monochrome_logs) as Map 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}-" + 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}-" + } + else { + log.info("-${colors.purple}[${workflow.manifest.name}]${colors.red} Pipeline completed with errors${colors.reset}-") } } @@ -394,21 +402,30 @@ def completionSummary(monochrome_logs=true) { // def imNotification(summary_params, hook_url) { def summary = [:] - summary_params.keySet().sort().each { group -> - summary << summary_params[group] - } + summary_params + .keySet() + .sort() + .each { group -> + 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 + 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'] = getWorkflowVersion() @@ -433,13 +450,13 @@ def imNotification(summary_params, hook_url) { def json_message = json_template.toString() // POST - def post = new URL(hook_url).openConnection(); + 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()); + post.getOutputStream().write(json_message.getBytes("UTF-8")) + def postRC = post.getResponseCode() + if (!postRC.equals(200)) { + log.warn(post.getErrorStream().getText()) } } From 118b257fb50b0d5447fcad624f8d26b935f07507 Mon Sep 17 00:00:00 2001 From: suzannejin Date: Thu, 10 Oct 2024 10:51:41 +0200 Subject: [PATCH 086/154] added updated local version of propr/grea module --- assets/tools_samplesheet.csv | 2 +- conf/test_experimental.config | 1 - modules/local/propr/grea/main.nf | 8 ++-- modules/local/propr/grea/templates/grea.R | 54 ++++++++++++++++++----- modules/local/propr/propd/main.nf | 8 ++-- modules/local/propr/propr/main.nf | 8 ++-- 6 files changed, 56 insertions(+), 25 deletions(-) diff --git a/assets/tools_samplesheet.csv b/assets/tools_samplesheet.csv index 12b2f592..139c52bb 100644 --- a/assets/tools_samplesheet.csv +++ b/assets/tools_samplesheet.csv @@ -4,4 +4,4 @@ propd_fdr,propd,--permutation 100,,,, pcorbshrink,,,propr,--metric pcor.bshrink,, propr,,,propr,--metric rho,, cor,,,propr,--metric cor,, -propd_grea,propd,,,,grea,--permutation 10 +propd_grea,propd,,,,grea, diff --git a/conf/test_experimental.config b/conf/test_experimental.config index c29bfc71..2469a025 100644 --- a/conf/test_experimental.config +++ b/conf/test_experimental.config @@ -23,7 +23,6 @@ params { max_time = '6.h' // Input data - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.samplesheet.csv' matrix = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv' contrasts = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.contrasts.csv' diff --git a/modules/local/propr/grea/main.nf b/modules/local/propr/grea/main.nf index 64c2df97..0a5f8baf 100644 --- a/modules/local/propr/grea/main.nf +++ b/modules/local/propr/grea/main.nf @@ -2,10 +2,10 @@ process PROPR_GREA { tag "$meta.id" label 'process_high' - conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/mulled-v2-401a215d4024df776a98d90a352048199e342a3d:5ba9bbf6cd4f4f98983526673c223d2e7d829b36-0': - 'biocontainers/mulled-v2-401a215d4024df776a98d90a352048199e342a3d:5ba9bbf6cd4f4f98983526673c223d2e7d829b36-0' }" + // conda "${moduleDir}/environment.yml" + // container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + // 'https://depot.galaxyproject.org/singularity/mulled-v2-401a215d4024df776a98d90a352048199e342a3d:5ba9bbf6cd4f4f98983526673c223d2e7d829b36-0': + // 'biocontainers/mulled-v2-401a215d4024df776a98d90a352048199e342a3d:5ba9bbf6cd4f4f98983526673c223d2e7d829b36-0' }" input: tuple val(meta), path(adj) diff --git a/modules/local/propr/grea/templates/grea.R b/modules/local/propr/grea/templates/grea.R index b59537bd..a4cbcc55 100644 --- a/modules/local/propr/grea/templates/grea.R +++ b/modules/local/propr/grea/templates/grea.R @@ -54,27 +54,39 @@ read_delim_flexible <- function(file, header = TRUE, row.names = 1, check.names #' Loads the .gmt file and converts it into a knowledge database #' #' @param filename path of the .gmt file -#' @param genes vector of gene names -#' @return output dataframe. A knowledge database where each row is a graph node (eg. gene) -#' and each column is a concept (eg. GO term, pathway, etc). +#' @param genes vector of gene names. Note that this set should be as complete as possible. +#' So it should not only contain the target genes but also the background genes. +#' @return output a list with: `db` A knowledge database where each row is a graph node (eg. gene) +#' and each column is a concept (eg. GO term, pathway, etc) and `description` A list of descriptions +#' for each concept load_gmt <- function(filename, nodes) { # read gmt file gmt <- readLines(filename) - gmt <- strsplit(gmt, "\t") + gmt <- strsplit(gmt, "\\t") # initialize database matrix db <- matrix(0, nrow = length(nodes), ncol = length(gmt)) rownames(db) <- nodes colnames(db) <- sapply(gmt, function(entry) entry[[1]]) - # fill 1 if gene is in concept + # description of the concepts + description <- list() + + # for concept in gmt for (i in 1:length(gmt)) { + + # get concept and description + concept <- gmt[[i]][[1]] + description[[concept]] <- gmt[[i]][[2]] + + # fill 1 if gene is in concept nodes_in_concept <- gmt[[i]][-c(1, 2)] + nodes_in_concept <- nodes_in_concept[nodes_in_concept %in% nodes] db[nodes_in_concept, i] <- 1 } - return(gmt) + return(list(db = db, description = description)) } ################################################ @@ -92,6 +104,10 @@ opt <- list( adj = '$adj', # adjacency matrix gmt = '$gmt', # knowledge database .gmt file + # parameters for gene sets + set_min = 15, # minimum number of genes in a set + set_max = 500, # maximum number of genes in a set + # parameters for permutation test permutation = 100, @@ -173,30 +189,46 @@ if (!is.na(opt\$seed)) { # load adjacency matrix # this matrix should have gene x gene dimensions -adj <- read_delim_flexible( +adj <- as.matrix(read_delim_flexible( opt\$adj, header = TRUE, row.names = 1, check.names = TRUE -) +)) +if (nrow(adj) != ncol(adj)) { + stop('Adjacency matrix is not square') +} +if (!all(rownames(adj) == colnames(adj))) { + stop('Adjacency matrix row names are not equal to column names') +} # load and process knowledge database -db <- load_gmt( +gmt <- load_gmt( opt\$gmt, rownames(adj) ) +# filter gene sets +# gene sets with less than set_min or more than set_max genes are removed + +idx <- which(colSums(gmt\$db) > opt\$set_min & colSums(gmt\$db) < opt\$set_max) +gmt\$db <- gmt\$db[, idx] +gmt\$description <- gmt\$description[idx] + # run GREA # Basically, it calculates the odds ratio of the graph being enriched in each concept, # and the FDR of the odds ratio through permutation tests odds <- runGraflex( adj, - db, + gmt\$db, p=opt\$permutation, ncores=opt\$ncores ) +odds\$Description <- sapply(odds\$Concept, function(concept) + gmt\$description[[concept]] +) ################################################ ################################################ @@ -208,7 +240,7 @@ write.table( odds, file = paste0(opt\$prefix, '.grea.tsv'), col.names = TRUE, - row.names = TRUE, + row.names = FALSE, sep = '\\t', quote = FALSE diff --git a/modules/local/propr/propd/main.nf b/modules/local/propr/propd/main.nf index cbc0c735..c6fc5235 100644 --- a/modules/local/propr/propd/main.nf +++ b/modules/local/propr/propd/main.nf @@ -2,10 +2,10 @@ process PROPR_PROPD { 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/mulled-v2-401a215d4024df776a98d90a352048199e342a3d:5ba9bbf6cd4f4f98983526673c223d2e7d829b36-0': - 'biocontainers/mulled-v2-401a215d4024df776a98d90a352048199e342a3d:5ba9bbf6cd4f4f98983526673c223d2e7d829b36-0' }" + // conda "${moduleDir}/environment.yml" + // container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + // 'https://depot.galaxyproject.org/singularity/mulled-v2-401a215d4024df776a98d90a352048199e342a3d:5ba9bbf6cd4f4f98983526673c223d2e7d829b36-0': + // 'biocontainers/mulled-v2-401a215d4024df776a98d90a352048199e342a3d:5ba9bbf6cd4f4f98983526673c223d2e7d829b36-0' }" input: tuple val(meta), path(count) diff --git a/modules/local/propr/propr/main.nf b/modules/local/propr/propr/main.nf index dd5360ee..1d70a4e1 100644 --- a/modules/local/propr/propr/main.nf +++ b/modules/local/propr/propr/main.nf @@ -2,10 +2,10 @@ process PROPR_PROPR { 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/mulled-v2-401a215d4024df776a98d90a352048199e342a3d:5ba9bbf6cd4f4f98983526673c223d2e7d829b36-0': - 'biocontainers/mulled-v2-401a215d4024df776a98d90a352048199e342a3d:5ba9bbf6cd4f4f98983526673c223d2e7d829b36-0' }" + // conda "${moduleDir}/environment.yml" + // container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + // 'https://depot.galaxyproject.org/singularity/mulled-v2-401a215d4024df776a98d90a352048199e342a3d:5ba9bbf6cd4f4f98983526673c223d2e7d829b36-0': + // 'biocontainers/mulled-v2-401a215d4024df776a98d90a352048199e342a3d:5ba9bbf6cd4f4f98983526673c223d2e7d829b36-0' }" input: tuple val(meta), path(count) From 5c44e3cd82ec13e5f42a0af1e8b7dce8ff59238c Mon Sep 17 00:00:00 2001 From: suzannejin Date: Thu, 10 Oct 2024 11:12:10 +0200 Subject: [PATCH 087/154] change test_experimental to remove propd_grea (no container yet) --- conf/test_experimental.config | 2 +- modules/local/propr/propd/main.nf | 8 ++++---- modules/local/propr/propr/main.nf | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/conf/test_experimental.config b/conf/test_experimental.config index 2469a025..e6f9e8f3 100644 --- a/conf/test_experimental.config +++ b/conf/test_experimental.config @@ -27,7 +27,7 @@ params { matrix = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv' contrasts = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.contrasts.csv' tools = "$projectDir/assets/tools_samplesheet.csv" - pathway = "propd,propd_fdr,propr,pcorbshrink,cor,propd_grea" + pathway = "propd,propd_fdr,propr,cor" //Features features_metadata_cols = 'gene_id,gene_name' diff --git a/modules/local/propr/propd/main.nf b/modules/local/propr/propd/main.nf index c6fc5235..cbc0c735 100644 --- a/modules/local/propr/propd/main.nf +++ b/modules/local/propr/propd/main.nf @@ -2,10 +2,10 @@ process PROPR_PROPD { 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/mulled-v2-401a215d4024df776a98d90a352048199e342a3d:5ba9bbf6cd4f4f98983526673c223d2e7d829b36-0': - // 'biocontainers/mulled-v2-401a215d4024df776a98d90a352048199e342a3d:5ba9bbf6cd4f4f98983526673c223d2e7d829b36-0' }" + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mulled-v2-401a215d4024df776a98d90a352048199e342a3d:5ba9bbf6cd4f4f98983526673c223d2e7d829b36-0': + 'biocontainers/mulled-v2-401a215d4024df776a98d90a352048199e342a3d:5ba9bbf6cd4f4f98983526673c223d2e7d829b36-0' }" input: tuple val(meta), path(count) diff --git a/modules/local/propr/propr/main.nf b/modules/local/propr/propr/main.nf index 1d70a4e1..dd5360ee 100644 --- a/modules/local/propr/propr/main.nf +++ b/modules/local/propr/propr/main.nf @@ -2,10 +2,10 @@ process PROPR_PROPR { 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/mulled-v2-401a215d4024df776a98d90a352048199e342a3d:5ba9bbf6cd4f4f98983526673c223d2e7d829b36-0': - // 'biocontainers/mulled-v2-401a215d4024df776a98d90a352048199e342a3d:5ba9bbf6cd4f4f98983526673c223d2e7d829b36-0' }" + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mulled-v2-401a215d4024df776a98d90a352048199e342a3d:5ba9bbf6cd4f4f98983526673c223d2e7d829b36-0': + 'biocontainers/mulled-v2-401a215d4024df776a98d90a352048199e342a3d:5ba9bbf6cd4f4f98983526673c223d2e7d829b36-0' }" input: tuple val(meta), path(count) From 995a656003c21c7811246bacbd30af8a64d3ed62 Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Fri, 11 Oct 2024 10:09:14 +0100 Subject: [PATCH 088/154] Skip fastqc, igenomes and nf_schema --- .nf-core.yml | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index 59dfde11..41220c35 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,4 +1,4 @@ -repository_type: pipeline +bump_version: null lint: nextflow_config: - config_defaults: @@ -6,4 +6,21 @@ lint: - params.css_file - params.citations_file - params.report_file -nf_core_version: "2.14.1" +nf_core_version: 3.0.1 +org_path: null +repository_type: pipeline +template: + author: Oskar Wacker, Jonathan Manning + description: Differential abundance analysis + force: false + is_nfcore: true + name: differentialabundance + org: nf-core + outdir: . + template: + skip_features: + - fastqc + - multiqc + skip_features: null + version: 1.6.0dev +update: null From d719fcae34e49a021e56de04e7a1377fc27efd24 Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Fri, 11 Oct 2024 11:00:31 +0100 Subject: [PATCH 089/154] Update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 85cd025b..c3e2904f 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 ### Fixed +- [[#299](https://github.com/nf-core/differentialabundance/pull/299)] - Add exclusions for 3.0.1 template update ([@pinin4fjords](https://github.com/pinin4fjords)) - [[#280](https://github.com/nf-core/differentialabundance/pull/280)] - Bump shinyngs, fix contrasts passed to app creation ([@pinin4fjords](https://github.com/pinin4fjords), review by [@WackerO](https://github.com/WackerO)) - [[#274](https://github.com/nf-core/differentialabundance/pull/274)] - Fix pagination on samples table ([@pinin4fjords](https://github.com/pinin4fjords), review by [@WackerO](https://github.com/WackerO)) - [[#272](https://github.com/nf-core/differentialabundance/pull/272)] - Show >10 contrasts in report ([@pinin4fjords](https://github.com/pinin4fjords), review by [@WackerO](https://github.com/WackerO)) From 3e5cda80fe4d4b054e77e7d28eeefd8bdd63fe8a Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Fri, 11 Oct 2024 10:03:54 +0000 Subject: [PATCH 090/154] [automated] Fix code linting --- .nf-core.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index 41220c35..08010023 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -18,9 +18,9 @@ template: org: nf-core outdir: . template: - skip_features: - - fastqc - - multiqc + skip_features: + - fastqc + - multiqc skip_features: null version: 1.6.0dev update: null From 2f1a5403679ee0410b0abab17a99f628aa41c7ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20H=C3=B6rtenhuber?= Date: Fri, 11 Oct 2024 10:25:35 +0000 Subject: [PATCH 091/154] fix structure of `.nf-core.yml` --- .nf-core.yml | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index 08010023..6d6f2600 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,4 +1,3 @@ -bump_version: null lint: nextflow_config: - config_defaults: @@ -7,7 +6,6 @@ lint: - params.citations_file - params.report_file nf_core_version: 3.0.1 -org_path: null repository_type: pipeline template: author: Oskar Wacker, Jonathan Manning @@ -17,10 +15,7 @@ template: name: differentialabundance org: nf-core outdir: . - template: - skip_features: - - fastqc - - multiqc - skip_features: null + skip_features: + - fastqc + - multiqc version: 1.6.0dev -update: null From b498163366d7739d32a75985b2c8d83914c5ef93 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Fri, 11 Oct 2024 10:38:35 +0000 Subject: [PATCH 092/154] Template update for nf-core/tools version 3.0.1 --- .github/CONTRIBUTING.md | 2 - .nf-core.yml | 4 +- CITATIONS.md | 8 - README.md | 3 - assets/methods_description_template.yml | 29 -- assets/multiqc_config.yml | 15 - assets/sendmail_template.txt | 22 - conf/modules.config | 12 +- docs/output.md | 33 +- docs/usage.md | 2 +- main.nf | 4 +- modules.json | 13 +- modules/nf-core/fastqc/environment.yml | 5 - modules/nf-core/fastqc/main.nf | 64 --- modules/nf-core/fastqc/meta.yml | 66 --- modules/nf-core/fastqc/tests/main.nf.test | 309 -------------- .../nf-core/fastqc/tests/main.nf.test.snap | 392 ------------------ modules/nf-core/fastqc/tests/tags.yml | 2 - modules/nf-core/multiqc/environment.yml | 5 - modules/nf-core/multiqc/main.nf | 63 --- modules/nf-core/multiqc/meta.yml | 78 ---- modules/nf-core/multiqc/tests/main.nf.test | 92 ---- .../nf-core/multiqc/tests/main.nf.test.snap | 41 -- modules/nf-core/multiqc/tests/nextflow.config | 5 - modules/nf-core/multiqc/tests/tags.yml | 2 - nextflow.config | 7 +- nextflow_schema.json | 31 -- .../main.nf | 12 +- tower.yml | 2 - workflows/differentialabundance.nf | 62 +-- 30 files changed, 21 insertions(+), 1364 deletions(-) delete mode 100644 assets/methods_description_template.yml delete mode 100644 assets/multiqc_config.yml delete mode 100644 modules/nf-core/fastqc/environment.yml delete mode 100644 modules/nf-core/fastqc/main.nf delete mode 100644 modules/nf-core/fastqc/meta.yml delete mode 100644 modules/nf-core/fastqc/tests/main.nf.test delete mode 100644 modules/nf-core/fastqc/tests/main.nf.test.snap delete mode 100644 modules/nf-core/fastqc/tests/tags.yml delete mode 100644 modules/nf-core/multiqc/environment.yml delete mode 100644 modules/nf-core/multiqc/main.nf delete mode 100644 modules/nf-core/multiqc/meta.yml delete mode 100644 modules/nf-core/multiqc/tests/main.nf.test delete mode 100644 modules/nf-core/multiqc/tests/main.nf.test.snap delete mode 100644 modules/nf-core/multiqc/tests/nextflow.config delete mode 100644 modules/nf-core/multiqc/tests/tags.yml diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 23cadba9..9a9880c4 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -79,8 +79,6 @@ If you wish to contribute a new step, please use the following coding standards: 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.yml` 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 diff --git a/.nf-core.yml b/.nf-core.yml index 1584ad5e..f222c419 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -17,6 +17,8 @@ template: name: differentialabundance org: nf-core outdir: . - skip_features: null + skip_features: + - fastqc + - multiqc version: 1.6.0dev update: null diff --git a/CITATIONS.md b/CITATIONS.md index aaa718a6..9e5434e7 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -10,14 +10,6 @@ ## Pipeline tools -- [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) - -> Andrews, S. (2010). FastQC: A Quality Control Tool for High Throughput Sequence Data [Online]. - -- [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. - ## Software packaging/containerisation tools - [Anaconda](https://anaconda.com) diff --git a/README.md b/README.md index b217052a..f4e091dc 100644 --- a/README.md +++ b/README.md @@ -31,9 +31,6 @@ workflows use the "tube map" design for that. See https://nf-co.re/docs/contributing/design_guidelines#examples for examples. --> -1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/)) -2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/)) - ## Usage > [!NOTE] diff --git a/assets/methods_description_template.yml b/assets/methods_description_template.yml deleted file mode 100644 index bd52c754..00000000 --- a/assets/methods_description_template.yml +++ /dev/null @@ -1,29 +0,0 @@ -id: "nf-core-differentialabundance-methods-description" -description: "Suggested text and references to use when describing pipeline usage within the methods section of a publication." -section_name: "nf-core/differentialabundance Methods Description" -section_href: "https://github.com/nf-core/differentialabundance" -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/differentialabundance 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.

    -

    The pipeline was executed with Nextflow v${workflow.nextflow.version} (Di Tommaso et al., 2017) with the following command:

    -
    ${workflow.commandLine}
    -

    ${tool_citations}

    -

    References

    -
      -
    • Di Tommaso, P., Chatzou, M., Floden, E. W., Barja, P. P., Palumbo, E., & Notredame, C. (2017). Nextflow enables reproducible computational workflows. Nature Biotechnology, 35(4), 316-319. doi: 10.1038/nbt.3820
    • -
    • Ewels, P. A., Peltzer, A., Fillinger, S., Patel, H., Alneberg, J., Wilm, A., Garcia, M. U., Di Tommaso, P., & Nahnsen, S. (2020). The nf-core framework for community-curated bioinformatics pipelines. Nature Biotechnology, 38(3), 276-278. doi: 10.1038/s41587-020-0439-x
    • -
    • Grüning, B., Dale, R., Sjödin, A., Chapman, B. A., Rowe, J., Tomkins-Tinch, C. H., Valieris, R., Köster, J., & Bioconda Team. (2018). Bioconda: sustainable and comprehensive software distribution for the life sciences. Nature Methods, 15(7), 475–476. doi: 10.1038/s41592-018-0046-7
    • -
    • da Veiga Leprevost, F., Grüning, B. A., Alves Aflitos, S., Röst, H. L., Uszkoreit, J., Barsnes, H., Vaudel, M., Moreno, P., Gatto, L., Weber, J., Bai, M., Jimenez, R. C., Sachsenberg, T., Pfeuffer, J., Vera Alvarez, R., Griss, J., Nesvizhskii, A. I., & Perez-Riverol, Y. (2017). BioContainers: an open-source and community-driven framework for software standardization. Bioinformatics (Oxford, England), 33(16), 2580–2582. doi: 10.1093/bioinformatics/btx192
    • - ${tool_bibliography} -
    -
    -
    Notes:
    -
      - ${nodoi_text} -
    • The command above does not include parameters contained in any configs or profiles that may have been used. Ensure the config file is also uploaded with your publication!
    • -
    • You should also cite all software used within this run. Check the "Software Versions" of this report to get version information.
    • -
    -
    diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml deleted file mode 100644 index 3c2228d0..00000000 --- a/assets/multiqc_config.yml +++ /dev/null @@ -1,15 +0,0 @@ -report_comment: > - This report has been generated by the nf-core/differentialabundance - analysis pipeline. For information about how to interpret these results, please see the - documentation. -report_section_order: - "nf-core-differentialabundance-methods-description": - order: -1000 - software_versions: - order: -1001 - "nf-core-differentialabundance-summary": - order: -1002 - -export_plots: true - -disable_version_detection: true diff --git a/assets/sendmail_template.txt b/assets/sendmail_template.txt index 9df4760f..55d57de4 100644 --- a/assets/sendmail_template.txt +++ b/assets/sendmail_template.txt @@ -26,28 +26,6 @@ Content-Disposition: inline; filename="nf-core-differentialabundance_logo_light. 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/conf/modules.config b/conf/modules.config index d266a387..3ca9a37a 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -18,16 +18,6 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] - withName: FASTQC { - ext.args = '--quiet' - } - 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/docs/output.md b/docs/output.md index 001e6702..a3a62323 100644 --- a/docs/output.md +++ b/docs/output.md @@ -2,7 +2,7 @@ ## 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. +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. @@ -12,39 +12,8 @@ The directories listed below will be created in the results directory after the 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 - [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution -### FastQC - -
    -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. - -
    - -[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 - -
    -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 . - ### Pipeline information
    diff --git a/docs/usage.md b/docs/usage.md index a727d27b..6e2892da 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -110,7 +110,7 @@ It is a good idea to specify a pipeline version when running the pipeline on you First, go to the [nf-core/differentialabundance releases page](https://github.com/nf-core/differentialabundance/releases) and find the latest pipeline version - numeric only (eg. `1.3.1`). Then specify this when running the pipeline with `-r` (one hyphen) - eg. `-r 1.3.1`. Of course, you can switch to another version by changing the number after the `-r` flag. -This version number will be logged in reports when you run the pipeline, so that you'll know what you used when you look back in the future. For example, at the bottom of the MultiQC reports. +This version number will be logged in reports when you run the pipeline, so that you'll know what you used when you look back in the future. To further assist in reproducbility, you can use share and re-use [parameter files](#running-the-pipeline) to repeat pipeline runs with the same settings without having to write out a command with every single parameter. diff --git a/main.nf b/main.nf index c0353d9d..701867ce 100644 --- a/main.nf +++ b/main.nf @@ -53,8 +53,6 @@ workflow NFCORE_DIFFERENTIALABUNDANCE { DIFFERENTIALABUNDANCE ( samplesheet ) - emit: - multiqc_report = DIFFERENTIALABUNDANCE.out.multiqc_report // channel: /path/to/multiqc_report.html } /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -93,7 +91,7 @@ workflow { params.outdir, params.monochrome_logs, params.hook_url, - NFCORE_DIFFERENTIALABUNDANCE.out.multiqc_report + ) } diff --git a/modules.json b/modules.json index 29e24e93..db5ec9f3 100644 --- a/modules.json +++ b/modules.json @@ -4,18 +4,7 @@ "repos": { "https://github.com/nf-core/modules.git": { "modules": { - "nf-core": { - "fastqc": { - "branch": "master", - "git_sha": "666652151335353eef2fcd58880bcef5bc2928e1", - "installed_by": ["modules"] - }, - "multiqc": { - "branch": "master", - "git_sha": "b8d36829fa84b6e404364abff787e8b07f6d058c", - "installed_by": ["modules"] - } - } + "nf-core": {} }, "subworkflows": { "nf-core": { diff --git a/modules/nf-core/fastqc/environment.yml b/modules/nf-core/fastqc/environment.yml deleted file mode 100644 index 691d4c76..00000000 --- a/modules/nf-core/fastqc/environment.yml +++ /dev/null @@ -1,5 +0,0 @@ -channels: - - conda-forge - - bioconda -dependencies: - - bioconda::fastqc=0.12.1 diff --git a/modules/nf-core/fastqc/main.nf b/modules/nf-core/fastqc/main.nf deleted file mode 100644 index d8989f48..00000000 --- a/modules/nf-core/fastqc/main.nf +++ /dev/null @@ -1,64 +0,0 @@ -process FASTQC { - 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/fastqc:0.12.1--hdfd78af_0' : - 'biocontainers/fastqc:0.12.1--hdfd78af_0' }" - - input: - tuple val(meta), path(reads) - - output: - tuple val(meta), path("*.html"), emit: html - tuple val(meta), path("*.zip") , emit: zip - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - // Make list of old name and new name pairs to use for renaming in the bash while loop - def old_new_pairs = reads instanceof Path || reads.size() == 1 ? [[ reads, "${prefix}.${reads.extension}" ]] : reads.withIndex().collect { entry, index -> [ entry, "${prefix}_${index + 1}.${entry.extension}" ] } - def rename_to = old_new_pairs*.join(' ').join(' ') - def renamed_files = old_new_pairs.collect{ old_name, new_name -> new_name }.join(' ') - - // The total amount of allocated RAM by FastQC is equal to the number of threads defined (--threads) time the amount of RAM defined (--memory) - // https://github.com/s-andrews/FastQC/blob/1faeea0412093224d7f6a07f777fad60a5650795/fastqc#L211-L222 - // Dividing the task.memory by task.cpu allows to stick to requested amount of RAM in the label - def memory_in_mb = MemoryUnit.of("${task.memory}").toUnit('MB') / task.cpus - // FastQC memory value allowed range (100 - 10000) - def fastqc_memory = memory_in_mb > 10000 ? 10000 : (memory_in_mb < 100 ? 100 : memory_in_mb) - - """ - printf "%s %s\\n" $rename_to | while read old_name new_name; do - [ -f "\${new_name}" ] || ln -s \$old_name \$new_name - done - - fastqc \\ - $args \\ - --threads $task.cpus \\ - --memory $fastqc_memory \\ - $renamed_files - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fastqc: \$( fastqc --version | sed '/FastQC v/!d; s/.*v//' ) - END_VERSIONS - """ - - stub: - def prefix = task.ext.prefix ?: "${meta.id}" - """ - touch ${prefix}.html - touch ${prefix}.zip - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fastqc: \$( fastqc --version | sed '/FastQC v/!d; s/.*v//' ) - END_VERSIONS - """ -} diff --git a/modules/nf-core/fastqc/meta.yml b/modules/nf-core/fastqc/meta.yml deleted file mode 100644 index 4827da7a..00000000 --- a/modules/nf-core/fastqc/meta.yml +++ /dev/null @@ -1,66 +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/ - licence: ["GPL-2.0-only"] - identifier: biotools:fastqc -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: - - html: - - 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: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - "*.zip": - type: file - description: FastQC report archive - pattern: "*_{fastqc.zip}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" -authors: - - "@drpatelh" - - "@grst" - - "@ewels" - - "@FelixKrueger" -maintainers: - - "@drpatelh" - - "@grst" - - "@ewels" - - "@FelixKrueger" diff --git a/modules/nf-core/fastqc/tests/main.nf.test b/modules/nf-core/fastqc/tests/main.nf.test deleted file mode 100644 index e9d79a07..00000000 --- a/modules/nf-core/fastqc/tests/main.nf.test +++ /dev/null @@ -1,309 +0,0 @@ -nextflow_process { - - name "Test Process FASTQC" - script "../main.nf" - process "FASTQC" - - tag "modules" - tag "modules_nfcore" - tag "fastqc" - - test("sarscov2 single-end [fastq]") { - - when { - process { - """ - input[0] = Channel.of([ - [ id: 'test', single_end:true ], - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ] - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - // NOTE The report contains the date inside it, which means that the md5sum is stable per day, but not longer than that. So you can't md5sum it. - // looks like this:
    Mon 2 Oct 2023
    test.gz
    - // https://github.com/nf-core/modules/pull/3903#issuecomment-1743620039 - { assert process.out.html[0][1] ==~ ".*/test_fastqc.html" }, - { assert process.out.zip[0][1] ==~ ".*/test_fastqc.zip" }, - { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(process.out.versions).match() } - ) - } - } - - test("sarscov2 paired-end [fastq]") { - - when { - process { - """ - input[0] = Channel.of([ - [id: 'test', single_end: false], // meta map - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) ] - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert process.out.html[0][1][0] ==~ ".*/test_1_fastqc.html" }, - { assert process.out.html[0][1][1] ==~ ".*/test_2_fastqc.html" }, - { assert process.out.zip[0][1][0] ==~ ".*/test_1_fastqc.zip" }, - { assert process.out.zip[0][1][1] ==~ ".*/test_2_fastqc.zip" }, - { assert path(process.out.html[0][1][0]).text.contains("File typeConventional base calls") }, - { assert path(process.out.html[0][1][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(process.out.versions).match() } - ) - } - } - - test("sarscov2 interleaved [fastq]") { - - when { - process { - """ - input[0] = Channel.of([ - [id: 'test', single_end: false], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_interleaved.fastq.gz', checkIfExists: true) - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert process.out.html[0][1] ==~ ".*/test_fastqc.html" }, - { assert process.out.zip[0][1] ==~ ".*/test_fastqc.zip" }, - { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(process.out.versions).match() } - ) - } - } - - test("sarscov2 paired-end [bam]") { - - when { - process { - """ - input[0] = Channel.of([ - [id: 'test', single_end: false], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert process.out.html[0][1] ==~ ".*/test_fastqc.html" }, - { assert process.out.zip[0][1] ==~ ".*/test_fastqc.zip" }, - { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(process.out.versions).match() } - ) - } - } - - test("sarscov2 multiple [fastq]") { - - when { - process { - """ - input[0] = Channel.of([ - [id: 'test', single_end: false], // meta map - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test2_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test2_2.fastq.gz', checkIfExists: true) ] - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert process.out.html[0][1][0] ==~ ".*/test_1_fastqc.html" }, - { assert process.out.html[0][1][1] ==~ ".*/test_2_fastqc.html" }, - { assert process.out.html[0][1][2] ==~ ".*/test_3_fastqc.html" }, - { assert process.out.html[0][1][3] ==~ ".*/test_4_fastqc.html" }, - { assert process.out.zip[0][1][0] ==~ ".*/test_1_fastqc.zip" }, - { assert process.out.zip[0][1][1] ==~ ".*/test_2_fastqc.zip" }, - { assert process.out.zip[0][1][2] ==~ ".*/test_3_fastqc.zip" }, - { assert process.out.zip[0][1][3] ==~ ".*/test_4_fastqc.zip" }, - { assert path(process.out.html[0][1][0]).text.contains("File typeConventional base calls") }, - { assert path(process.out.html[0][1][1]).text.contains("File typeConventional base calls") }, - { assert path(process.out.html[0][1][2]).text.contains("File typeConventional base calls") }, - { assert path(process.out.html[0][1][3]).text.contains("File typeConventional base calls") }, - { assert snapshot(process.out.versions).match() } - ) - } - } - - test("sarscov2 custom_prefix") { - - when { - process { - """ - input[0] = Channel.of([ - [ id:'mysample', single_end:true ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert process.out.html[0][1] ==~ ".*/mysample_fastqc.html" }, - { assert process.out.zip[0][1] ==~ ".*/mysample_fastqc.zip" }, - { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(process.out.versions).match() } - ) - } - } - - test("sarscov2 single-end [fastq] - stub") { - - options "-stub" - when { - process { - """ - input[0] = Channel.of([ - [ id: 'test', single_end:true ], - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ] - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() } - ) - } - } - - test("sarscov2 paired-end [fastq] - stub") { - - options "-stub" - when { - process { - """ - input[0] = Channel.of([ - [id: 'test', single_end: false], // meta map - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) ] - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() } - ) - } - } - - test("sarscov2 interleaved [fastq] - stub") { - - options "-stub" - when { - process { - """ - input[0] = Channel.of([ - [id: 'test', single_end: false], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_interleaved.fastq.gz', checkIfExists: true) - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() } - ) - } - } - - test("sarscov2 paired-end [bam] - stub") { - - options "-stub" - when { - process { - """ - input[0] = Channel.of([ - [id: 'test', single_end: false], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() } - ) - } - } - - test("sarscov2 multiple [fastq] - stub") { - - options "-stub" - when { - process { - """ - input[0] = Channel.of([ - [id: 'test', single_end: false], // meta map - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test2_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test2_2.fastq.gz', checkIfExists: true) ] - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() } - ) - } - } - - test("sarscov2 custom_prefix - stub") { - - options "-stub" - when { - process { - """ - input[0] = Channel.of([ - [ id:'mysample', single_end:true ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() } - ) - } - } -} diff --git a/modules/nf-core/fastqc/tests/main.nf.test.snap b/modules/nf-core/fastqc/tests/main.nf.test.snap deleted file mode 100644 index d5db3092..00000000 --- a/modules/nf-core/fastqc/tests/main.nf.test.snap +++ /dev/null @@ -1,392 +0,0 @@ -{ - "sarscov2 custom_prefix": { - "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] - ], - "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" - }, - "timestamp": "2024-07-22T11:02:16.374038" - }, - "sarscov2 single-end [fastq] - stub": { - "content": [ - { - "0": [ - [ - { - "id": "test", - "single_end": true - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ - [ - { - "id": "test", - "single_end": true - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ], - "html": [ - [ - { - "id": "test", - "single_end": true - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "versions": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ], - "zip": [ - [ - { - "id": "test", - "single_end": true - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - } - ], - "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" - }, - "timestamp": "2024-07-22T11:02:24.993809" - }, - "sarscov2 custom_prefix - stub": { - "content": [ - { - "0": [ - [ - { - "id": "mysample", - "single_end": true - }, - "mysample.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ - [ - { - "id": "mysample", - "single_end": true - }, - "mysample.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ], - "html": [ - [ - { - "id": "mysample", - "single_end": true - }, - "mysample.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "versions": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ], - "zip": [ - [ - { - "id": "mysample", - "single_end": true - }, - "mysample.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - } - ], - "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" - }, - "timestamp": "2024-07-22T11:03:10.93942" - }, - "sarscov2 interleaved [fastq]": { - "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] - ], - "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" - }, - "timestamp": "2024-07-22T11:01:42.355718" - }, - "sarscov2 paired-end [bam]": { - "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] - ], - "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" - }, - "timestamp": "2024-07-22T11:01:53.276274" - }, - "sarscov2 multiple [fastq]": { - "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] - ], - "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" - }, - "timestamp": "2024-07-22T11:02:05.527626" - }, - "sarscov2 paired-end [fastq]": { - "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] - ], - "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" - }, - "timestamp": "2024-07-22T11:01:31.188871" - }, - "sarscov2 paired-end [fastq] - stub": { - "content": [ - { - "0": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ - [ - { - "id": "test", - "single_end": false - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ], - "html": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "versions": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ], - "zip": [ - [ - { - "id": "test", - "single_end": false - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - } - ], - "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" - }, - "timestamp": "2024-07-22T11:02:34.273566" - }, - "sarscov2 multiple [fastq] - stub": { - "content": [ - { - "0": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ - [ - { - "id": "test", - "single_end": false - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ], - "html": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "versions": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ], - "zip": [ - [ - { - "id": "test", - "single_end": false - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - } - ], - "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" - }, - "timestamp": "2024-07-22T11:03:02.304411" - }, - "sarscov2 single-end [fastq]": { - "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] - ], - "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" - }, - "timestamp": "2024-07-22T11:01:19.095607" - }, - "sarscov2 interleaved [fastq] - stub": { - "content": [ - { - "0": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ - [ - { - "id": "test", - "single_end": false - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ], - "html": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "versions": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ], - "zip": [ - [ - { - "id": "test", - "single_end": false - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - } - ], - "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" - }, - "timestamp": "2024-07-22T11:02:44.640184" - }, - "sarscov2 paired-end [bam] - stub": { - "content": [ - { - "0": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ - [ - { - "id": "test", - "single_end": false - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ], - "html": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "versions": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ], - "zip": [ - [ - { - "id": "test", - "single_end": false - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - } - ], - "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" - }, - "timestamp": "2024-07-22T11:02:53.550742" - } -} \ No newline at end of file diff --git a/modules/nf-core/fastqc/tests/tags.yml b/modules/nf-core/fastqc/tests/tags.yml deleted file mode 100644 index 7834294b..00000000 --- a/modules/nf-core/fastqc/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -fastqc: - - modules/nf-core/fastqc/** diff --git a/modules/nf-core/multiqc/environment.yml b/modules/nf-core/multiqc/environment.yml deleted file mode 100644 index 6f5b867b..00000000 --- a/modules/nf-core/multiqc/environment.yml +++ /dev/null @@ -1,5 +0,0 @@ -channels: - - conda-forge - - bioconda -dependencies: - - bioconda::multiqc=1.25.1 diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf deleted file mode 100644 index 9724d2f3..00000000 --- a/modules/nf-core/multiqc/main.nf +++ /dev/null @@ -1,63 +0,0 @@ -process MULTIQC { - label 'process_single' - - conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.25.1--pyhdfd78af_0' : - 'biocontainers/multiqc:1.25.1--pyhdfd78af_0' }" - - input: - path multiqc_files, stageAs: "?/*" - path(multiqc_config) - path(extra_multiqc_config) - path(multiqc_logo) - path(replace_names) - path(sample_names) - - output: - path "*multiqc_report.html", emit: report - path "*_data" , emit: data - path "*_plots" , optional:true, emit: plots - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ? "--filename ${task.ext.prefix}.html" : '' - def config = multiqc_config ? "--config $multiqc_config" : '' - def extra_config = extra_multiqc_config ? "--config $extra_multiqc_config" : '' - def logo = multiqc_logo ? "--cl-config 'custom_logo: \"${multiqc_logo}\"'" : '' - def replace = replace_names ? "--replace-names ${replace_names}" : '' - def samples = sample_names ? "--sample-names ${sample_names}" : '' - """ - multiqc \\ - --force \\ - $args \\ - $config \\ - $prefix \\ - $extra_config \\ - $logo \\ - $replace \\ - $samples \\ - . - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) - END_VERSIONS - """ - - stub: - """ - mkdir multiqc_data - touch multiqc_plots - touch multiqc_report.html - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) - END_VERSIONS - """ -} diff --git a/modules/nf-core/multiqc/meta.yml b/modules/nf-core/multiqc/meta.yml deleted file mode 100644 index b16c1879..00000000 --- a/modules/nf-core/multiqc/meta.yml +++ /dev/null @@ -1,78 +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/ - licence: ["GPL-3.0-or-later"] - identifier: biotools:multiqc -input: - - - multiqc_files: - type: file - description: | - List of reports / files recognised by MultiQC, for example the html and zip output of FastQC - - - multiqc_config: - type: file - description: Optional config yml for MultiQC - pattern: "*.{yml,yaml}" - - - extra_multiqc_config: - type: file - description: Second optional config yml for MultiQC. Will override common sections - in multiqc_config. - pattern: "*.{yml,yaml}" - - - multiqc_logo: - type: file - description: Optional logo file for MultiQC - pattern: "*.{png}" - - - replace_names: - type: file - description: | - Optional two-column sample renaming file. First column a set of - patterns, second column a set of corresponding replacements. Passed via - MultiQC's `--replace-names` option. - pattern: "*.{tsv}" - - - sample_names: - type: file - description: | - Optional TSV file with headers, passed to the MultiQC --sample_names - argument. - pattern: "*.{tsv}" -output: - - report: - - "*multiqc_report.html": - type: file - description: MultiQC report file - pattern: "multiqc_report.html" - - data: - - "*_data": - type: directory - description: MultiQC data dir - pattern: "multiqc_data" - - plots: - - "*_plots": - type: file - description: Plots created by MultiQC - pattern: "*_data" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" -authors: - - "@abhi18av" - - "@bunop" - - "@drpatelh" - - "@jfy133" -maintainers: - - "@abhi18av" - - "@bunop" - - "@drpatelh" - - "@jfy133" diff --git a/modules/nf-core/multiqc/tests/main.nf.test b/modules/nf-core/multiqc/tests/main.nf.test deleted file mode 100644 index 33316a7d..00000000 --- a/modules/nf-core/multiqc/tests/main.nf.test +++ /dev/null @@ -1,92 +0,0 @@ -nextflow_process { - - name "Test Process MULTIQC" - script "../main.nf" - process "MULTIQC" - - tag "modules" - tag "modules_nfcore" - tag "multiqc" - - config "./nextflow.config" - - test("sarscov2 single-end [fastqc]") { - - when { - process { - """ - input[0] = Channel.of(file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true)) - input[1] = [] - input[2] = [] - input[3] = [] - input[4] = [] - input[5] = [] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert process.out.report[0] ==~ ".*/multiqc_report.html" }, - { assert process.out.data[0] ==~ ".*/multiqc_data" }, - { assert snapshot(process.out.versions).match("multiqc_versions_single") } - ) - } - - } - - test("sarscov2 single-end [fastqc] [config]") { - - when { - process { - """ - input[0] = Channel.of(file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true)) - input[1] = Channel.of(file("https://github.com/nf-core/tools/raw/dev/nf_core/pipeline-template/assets/multiqc_config.yml", checkIfExists: true)) - input[2] = [] - input[3] = [] - input[4] = [] - input[5] = [] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert process.out.report[0] ==~ ".*/multiqc_report.html" }, - { assert process.out.data[0] ==~ ".*/multiqc_data" }, - { assert snapshot(process.out.versions).match("multiqc_versions_config") } - ) - } - } - - test("sarscov2 single-end [fastqc] - stub") { - - options "-stub" - - when { - process { - """ - input[0] = Channel.of(file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true)) - input[1] = [] - input[2] = [] - input[3] = [] - input[4] = [] - input[5] = [] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out.report.collect { file(it).getName() } + - process.out.data.collect { file(it).getName() } + - process.out.plots.collect { file(it).getName() } + - process.out.versions ).match("multiqc_stub") } - ) - } - - } -} diff --git a/modules/nf-core/multiqc/tests/main.nf.test.snap b/modules/nf-core/multiqc/tests/main.nf.test.snap deleted file mode 100644 index 2fcbb5ff..00000000 --- a/modules/nf-core/multiqc/tests/main.nf.test.snap +++ /dev/null @@ -1,41 +0,0 @@ -{ - "multiqc_versions_single": { - "content": [ - [ - "versions.yml:md5,41f391dcedce7f93ca188f3a3ffa0916" - ] - ], - "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" - }, - "timestamp": "2024-10-02T17:51:46.317523" - }, - "multiqc_stub": { - "content": [ - [ - "multiqc_report.html", - "multiqc_data", - "multiqc_plots", - "versions.yml:md5,41f391dcedce7f93ca188f3a3ffa0916" - ] - ], - "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" - }, - "timestamp": "2024-10-02T17:52:20.680978" - }, - "multiqc_versions_config": { - "content": [ - [ - "versions.yml:md5,41f391dcedce7f93ca188f3a3ffa0916" - ] - ], - "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" - }, - "timestamp": "2024-10-02T17:52:09.185842" - } -} \ No newline at end of file diff --git a/modules/nf-core/multiqc/tests/nextflow.config b/modules/nf-core/multiqc/tests/nextflow.config deleted file mode 100644 index c537a6a3..00000000 --- a/modules/nf-core/multiqc/tests/nextflow.config +++ /dev/null @@ -1,5 +0,0 @@ -process { - withName: 'MULTIQC' { - ext.prefix = null - } -} diff --git a/modules/nf-core/multiqc/tests/tags.yml b/modules/nf-core/multiqc/tests/tags.yml deleted file mode 100644 index bea6c0d3..00000000 --- a/modules/nf-core/multiqc/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -multiqc: - - modules/nf-core/multiqc/** diff --git a/nextflow.config b/nextflow.config index cc72bc73..2a9d22c8 100644 --- a/nextflow.config +++ b/nextflow.config @@ -18,12 +18,7 @@ params { igenomes_base = 's3://ngi-igenomes/igenomes/' igenomes_ignore = false - // 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 diff --git a/nextflow_schema.json b/nextflow_schema.json index 5886be23..b740c1cf 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -35,11 +35,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" } } }, @@ -166,14 +161,6 @@ "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.", - "pattern": "^\\d+(\\.\\d+)?\\.?\\s*(K|M|G|T)?B$", - "default": "25.MB", - "fa_icon": "fas fa-file-upload", - "hidden": true - }, "monochrome_logs": { "type": "boolean", "description": "Do not use coloured log outputs.", @@ -187,24 +174,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", diff --git a/subworkflows/local/utils_nfcore_differentialabundance_pipeline/main.nf b/subworkflows/local/utils_nfcore_differentialabundance_pipeline/main.nf index e9678758..b8ca9aa8 100644 --- a/subworkflows/local/utils_nfcore_differentialabundance_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_differentialabundance_pipeline/main.nf @@ -114,7 +114,7 @@ workflow PIPELINE_COMPLETION { 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 - multiqc_report // string: Path to MultiQC report + main: summary_params = paramsSummaryMap(workflow, parameters_schema: "nextflow_schema.json") @@ -131,7 +131,7 @@ workflow PIPELINE_COMPLETION { plaintext_email, outdir, monochrome_logs, - multiqc_report.toList() + [] ) } @@ -206,8 +206,8 @@ def toolCitationText() { // Uncomment function in methodsDescriptionText to render in MultiQC report def citation_text = [ "Tools used in the workflow included:", - "FastQC (Andrews 2010),", - "MultiQC (Ewels et al. 2016)", + + "." ].join(' ').trim() @@ -219,8 +219,8 @@ def toolBibliographyText() { // Can use ternary operators to dynamically construct based conditions, e.g. params["run_xyz"] ? "
  • Author (2023) Pub name, Journal, DOI
  • " : "", // Uncomment function in methodsDescriptionText to render in MultiQC report def reference_text = [ - "
  • Andrews S, (2010) FastQC, URL: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/).
  • ", - "
  • Ewels, P., Magnusson, M., Lundin, S., & Käller, M. (2016). MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics , 32(19), 3047–3048. doi: /10.1093/bioinformatics/btw354
  • " + + ].join(' ').trim() return reference_text diff --git a/tower.yml b/tower.yml index 787aedfe..c61323c0 100644 --- a/tower.yml +++ b/tower.yml @@ -1,5 +1,3 @@ reports: - multiqc_report.html: - display: "MultiQC HTML report" samplesheet.csv: display: "Auto-created samplesheet with collated metadata and FASTQ paths" diff --git a/workflows/differentialabundance.nf b/workflows/differentialabundance.nf index 7941ab61..e10028f0 100644 --- a/workflows/differentialabundance.nf +++ b/workflows/differentialabundance.nf @@ -3,10 +3,10 @@ IMPORT MODULES / SUBWORKFLOWS / FUNCTIONS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -include { FASTQC } from '../modules/nf-core/fastqc/main' -include { MULTIQC } from '../modules/nf-core/multiqc/main' + + include { paramsSummaryMap } from 'plugin/nf-schema' -include { paramsSummaryMultiqc } from '../subworkflows/nf-core/utils_nfcore_pipeline' + include { softwareVersionsToYAML } from '../subworkflows/nf-core/utils_nfcore_pipeline' include { methodsDescriptionText } from '../subworkflows/local/utils_nfcore_differentialabundance_pipeline' @@ -23,15 +23,7 @@ workflow DIFFERENTIALABUNDANCE { main: ch_versions = Channel.empty() - ch_multiqc_files = Channel.empty() - // - // MODULE: Run FastQC - // - FASTQC ( - ch_samplesheet - ) - ch_multiqc_files = ch_multiqc_files.mix(FASTQC.out.zip.collect{it[1]}) - ch_versions = ch_versions.mix(FASTQC.out.versions.first()) + // // Collate and save software versions @@ -39,55 +31,13 @@ workflow DIFFERENTIALABUNDANCE { softwareVersionsToYAML(ch_versions) .collectFile( storeDir: "${params.outdir}/pipeline_info", - name: 'nf_core_' + 'pipeline_software_' + 'mqc_' + 'versions.yml', + name: 'nf_core_' + 'pipeline_software_' + '' + 'versions.yml', sort: true, newLine: true ).set { ch_collated_versions } - // - // MODULE: MultiQC - // - ch_multiqc_config = Channel.fromPath( - "$projectDir/assets/multiqc_config.yml", checkIfExists: true) - ch_multiqc_custom_config = params.multiqc_config ? - Channel.fromPath(params.multiqc_config, checkIfExists: true) : - Channel.empty() - ch_multiqc_logo = params.multiqc_logo ? - Channel.fromPath(params.multiqc_logo, checkIfExists: true) : - Channel.empty() - - - summary_params = paramsSummaryMap( - workflow, parameters_schema: "nextflow_schema.json") - ch_workflow_summary = Channel.value(paramsSummaryMultiqc(summary_params)) - ch_multiqc_files = ch_multiqc_files.mix( - ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) - - ch_multiqc_custom_methods_description = params.multiqc_methods_description ? - file(params.multiqc_methods_description, checkIfExists: true) : - file("$projectDir/assets/methods_description_template.yml", checkIfExists: true) - ch_methods_description = Channel.value( - methodsDescriptionText(ch_multiqc_custom_methods_description)) - - ch_multiqc_files = ch_multiqc_files.mix(ch_collated_versions) - ch_multiqc_files = ch_multiqc_files.mix( - ch_methods_description.collectFile( - name: 'methods_description_mqc.yaml', - sort: true - ) - ) - - MULTIQC ( - ch_multiqc_files.collect(), - ch_multiqc_config.toList(), - ch_multiqc_custom_config.toList(), - ch_multiqc_logo.toList(), - [], - [] - ) - - emit:multiqc_report = MULTIQC.out.report.toList() // channel: /path/to/multiqc_report.html + emit: versions = ch_versions // channel: [ path(versions.yml) ] } From 4446eabb544f139cf95d6fac872dee29ea2412ed Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Fri, 11 Oct 2024 12:32:24 +0000 Subject: [PATCH 093/154] Template update for nf-core/tools version 3.0.2 --- .github/workflows/ci.yml | 60 +++++++++++++------ .../workflows/template_version_comment.yml | 21 ++++--- .gitignore | 1 + .nf-core.yml | 2 +- main.nf | 2 +- modules.json | 4 +- nextflow.config | 4 +- .../main.nf | 4 +- .../nf-core/utils_nextflow_pipeline/main.nf | 30 +++++----- .../nf-core/utils_nfcore_pipeline/main.nf | 10 ++-- 10 files changed, 84 insertions(+), 54 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 856cce8e..72d02f45 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,6 +11,8 @@ on: env: NXF_ANSI_LOG: false + NXF_SINGULARITY_CACHEDIR: ${{ github.workspace }}/.singularity + NXF_SINGULARITY_LIBRARYDIR: ${{ github.workspace }}/.singularity concurrency: group: "${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}" @@ -18,7 +20,7 @@ concurrency: jobs: test: - name: Run pipeline with test data + name: "Run pipeline with test data (${{ matrix.NXF_VER }} | ${{ matrix.test_name }} | ${{ matrix.profile }})" # 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/differentialabundance') }}" runs-on: ubuntu-latest @@ -27,33 +29,57 @@ jobs: NXF_VER: - "24.04.2" - "latest-everything" + profile: + - "conda" + - "docker" + - "singularity" + test_name: + - "test" + isMaster: + - ${{ github.base_ref == 'master' }} + # Exclude conda and singularity on dev + exclude: + - isMaster: false + profile: "conda" + - isMaster: false + profile: "singularity" steps: - name: Check out pipeline code uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4 - - name: Install Nextflow + - name: Set up Nextflow uses: nf-core/setup-nextflow@v2 with: version: "${{ matrix.NXF_VER }}" - - name: Disk space cleanup - uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 + - name: Set up Apptainer + if: matrix.profile == 'singularity' + uses: eWaterCycle/setup-apptainer@main - - name: Run pipeline with test data (docker) - # 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 + - name: Set up Singularity + if: matrix.profile == 'singularity' run: | - nextflow run ${GITHUB_WORKSPACE} -profile test,docker --outdir ./results + mkdir -p $NXF_SINGULARITY_CACHEDIR + mkdir -p $NXF_SINGULARITY_LIBRARYDIR + + - name: Set up Miniconda + if: matrix.profile == 'conda' + uses: conda-incubator/setup-miniconda@a4260408e20b96e80095f42ff7f1a15b27dd94ca # v3 + with: + miniconda-version: "latest" + auto-update-conda: true + conda-solver: libmamba + channels: conda-forge,bioconda - - name: Run pipeline with test data (singularity) - # TODO nf-core: You can customise CI pipeline run tests as required + - name: Set up Conda + if: matrix.profile == 'conda' run: | - nextflow run ${GITHUB_WORKSPACE} -profile test,singularity --outdir ./results - if: "${{ github.base_ref == 'master' }}" + echo $(realpath $CONDA)/condabin >> $GITHUB_PATH + echo $(realpath python) >> $GITHUB_PATH + + - name: Clean up Disk space + uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 - - name: Run pipeline with test data (conda) - # TODO nf-core: You can customise CI pipeline run tests as required + - name: "Run pipeline with test data ${{ matrix.NXF_VER }} | ${{ matrix.test_name }} | ${{ matrix.profile }}" run: | - nextflow run ${GITHUB_WORKSPACE} -profile test,conda --outdir ./results - if: "${{ github.base_ref == 'master' }}" + nextflow run ${GITHUB_WORKSPACE} -profile ${{ matrix.test_name }},${{ matrix.profile }} --outdir ./results diff --git a/.github/workflows/template_version_comment.yml b/.github/workflows/template_version_comment.yml index 9dea41f0..e8aafe44 100644 --- a/.github/workflows/template_version_comment.yml +++ b/.github/workflows/template_version_comment.yml @@ -10,9 +10,11 @@ jobs: steps: - name: Check out pipeline code uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4 + with: + ref: ${{ github.event.pull_request.head.sha }} - name: Read template version from .nf-core.yml - uses: pietrobolcato/action-read-yaml@1.0.0 + uses: nichmor/minimal-read-yaml@v0.0.2 id: read_yml with: config: ${{ github.workspace }}/.nf-core.yml @@ -24,20 +26,21 @@ jobs: - name: Check nf-core outdated id: nf_core_outdated - run: pip list --outdated | grep nf-core + run: echo "OUTPUT=$(pip list --outdated | grep nf-core)" >> ${GITHUB_ENV} - name: Post nf-core template version comment uses: mshick/add-pr-comment@b8f338c590a895d50bcbfa6c5859251edc8952fc # v2 if: | - ${{ steps.nf_core_outdated.outputs.stdout }} =~ 'nf-core' + contains(env.OUTPUT, 'nf-core') with: repo-token: ${{ secrets.NF_CORE_BOT_AUTH_TOKEN }} allow-repeats: false message: | - ## :warning: Newer version of the nf-core template is available. - - Your pipeline is using an old version of the nf-core template: ${{ steps.read_yml.outputs['nf_core_version'] }}. - Please update your pipeline to the latest version. - - For more documentation on how to update your pipeline, please see the [nf-core documentation](https://github.com/nf-core/tools?tab=readme-ov-file#sync-a-pipeline-with-the-template) and [Synchronisation documentation](https://nf-co.re/docs/contributing/sync). + > [!WARNING] + > Newer version of the nf-core template is available. + > + > Your pipeline is using an old version of the nf-core template: ${{ steps.read_yml.outputs['nf_core_version'] }}. + > Please update your pipeline to the latest version. + > + > For more documentation on how to update your pipeline, please see the [nf-core documentation](https://github.com/nf-core/tools?tab=readme-ov-file#sync-a-pipeline-with-the-template) and [Synchronisation documentation](https://nf-co.re/docs/contributing/sync). # diff --git a/.gitignore b/.gitignore index 5124c9ac..a42ce016 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ results/ testing/ testing* *.pyc +null/ diff --git a/.nf-core.yml b/.nf-core.yml index f222c419..b094b989 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -6,7 +6,7 @@ lint: - params.css_file - params.citations_file - params.report_file -nf_core_version: 3.0.1 +nf_core_version: 3.0.2 org_path: null repository_type: pipeline template: diff --git a/main.nf b/main.nf index 701867ce..52fcb57e 100644 --- a/main.nf +++ b/main.nf @@ -74,7 +74,7 @@ workflow { params.outdir, params.input ) - + // // WORKFLOW: Run main workflow // diff --git a/modules.json b/modules.json index db5ec9f3..16add46a 100644 --- a/modules.json +++ b/modules.json @@ -10,12 +10,12 @@ "nf-core": { "utils_nextflow_pipeline": { "branch": "master", - "git_sha": "9d05360da397692321d377b6102d2fb22507c6ef", + "git_sha": "3aa0aec1d52d492fe241919f0c6100ebf0074082", "installed_by": ["subworkflows"] }, "utils_nfcore_pipeline": { "branch": "master", - "git_sha": "772684d9d66f37b650c8ba5146ac1ee3ecba2acb", + "git_sha": "1b6b9a3338d011367137808b49b923515080e3ba", "installed_by": ["subworkflows"] }, "utils_nfschema_plugin": { diff --git a/nextflow.config b/nextflow.config index 2a9d22c8..559f64bb 100644 --- a/nextflow.config +++ b/nextflow.config @@ -249,10 +249,10 @@ validation { """ afterText = """${manifest.doi ? "* The pipeline\n" : ""}${manifest.doi.tokenize(",").collect { " https://doi.org/${it.trim().replace('https://doi.org/','')}"}.join("\n")}${manifest.doi ? "\n" : ""} * The nf-core framework - https://doi.org/10.1038/s41587-020-0439-x + https://doi.org/10.1038/s41587-020-0439-x * Software dependencies - https://github.com/${manifest.name}/blob/master/CITATIONS.md + https://github.com/${manifest.name}/blob/master/CITATIONS.md """ } summary { diff --git a/subworkflows/local/utils_nfcore_differentialabundance_pipeline/main.nf b/subworkflows/local/utils_nfcore_differentialabundance_pipeline/main.nf index b8ca9aa8..65e3dd55 100644 --- a/subworkflows/local/utils_nfcore_differentialabundance_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_differentialabundance_pipeline/main.nf @@ -47,7 +47,6 @@ workflow PIPELINE_INITIALISATION { workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1 ) - // // Validate parameters and generate parameter summary to stdout // @@ -56,7 +55,6 @@ workflow PIPELINE_INITIALISATION { validate_params, null ) - // // Check config provided to the pipeline @@ -64,6 +62,7 @@ workflow PIPELINE_INITIALISATION { UTILS_NFCORE_PIPELINE ( nextflow_cli_args ) + // // Custom validation for pipeline parameters // @@ -110,7 +109,6 @@ workflow PIPELINE_COMPLETION { 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 diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/main.nf b/subworkflows/nf-core/utils_nextflow_pipeline/main.nf index 2b0dc67a..0fcbf7b3 100644 --- a/subworkflows/nf-core/utils_nextflow_pipeline/main.nf +++ b/subworkflows/nf-core/utils_nextflow_pipeline/main.nf @@ -3,9 +3,9 @@ // /* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ SUBWORKFLOW DEFINITION -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ workflow UTILS_NEXTFLOW_PIPELINE { @@ -44,9 +44,9 @@ workflow UTILS_NEXTFLOW_PIPELINE { } /* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ FUNCTIONS -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ // @@ -106,17 +106,19 @@ def checkCondaChannels() { 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 - - required_channels_in_order.eachWithIndex { channel, index -> - if (index < required_channels_in_order.size() - 1) { - channel_priority_violation |= !(channels.indexOf(channel) < channels.indexOf(required_channels_in_order[index + 1])) - } - } + def channel_priority_violation = required_channels_in_order != channels.findAll { ch -> ch in required_channels_in_order } 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" + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" - ) + log.warn """\ + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + There is a problem with your Conda configuration! + You will need to set-up the conda-forge and bioconda channels correctly. + Please refer to https://bioconda.github.io/ + The observed channel order is + ${channels} + but the following channel order is required: + ${required_channels_in_order} + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + """.stripIndent(true) } } diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf index b78273ca..5cb7bafe 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf +++ b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf @@ -3,9 +3,9 @@ // /* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ SUBWORKFLOW DEFINITION -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ workflow UTILS_NFCORE_PIPELINE { @@ -21,9 +21,9 @@ workflow UTILS_NFCORE_PIPELINE { } /* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ FUNCTIONS -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ // @@ -62,7 +62,7 @@ def checkProfileProvided(nextflow_cli_args) { def workflowCitation() { def temp_doi_ref = "" def manifest_doi = workflow.manifest.doi.tokenize(",") - // Using a loop to handle multiple DOIs + // Handling multiple DOIs // Removing `https://doi.org/` to handle pipelines using DOIs vs DOI resolvers // Removing ` ` since the manifest.doi is a string and not a proper list manifest_doi.each { doi_ref -> From 488f1a2c6f4330934e6a86fb838c255497a33b97 Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Fri, 11 Oct 2024 15:25:31 +0100 Subject: [PATCH 094/154] Linting fixes --- nextflow.config | 2 -- 1 file changed, 2 deletions(-) diff --git a/nextflow.config b/nextflow.config index e2af5b0b..01875137 100644 --- a/nextflow.config +++ b/nextflow.config @@ -193,8 +193,6 @@ params { igenomes_base = 's3://ngi-igenomes/igenomes/' igenomes_ignore = false - - // Boilerplate options outdir = null publish_dir_mode = 'copy' From 2d0ebac97925d27edd426eb11c8c1be93d572247 Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Fri, 11 Oct 2024 15:32:55 +0100 Subject: [PATCH 095/154] Fix linting --- main.nf | 1 - .../local/utils_nfcore_differentialabundance_pipeline/main.nf | 3 --- 2 files changed, 4 deletions(-) diff --git a/main.nf b/main.nf index 1818888c..7f48b900 100644 --- a/main.nf +++ b/main.nf @@ -84,7 +84,6 @@ workflow { params.outdir, params.monochrome_logs, params.hook_url, - ) } diff --git a/subworkflows/local/utils_nfcore_differentialabundance_pipeline/main.nf b/subworkflows/local/utils_nfcore_differentialabundance_pipeline/main.nf index 6f1b3447..6c5cbcc4 100644 --- a/subworkflows/local/utils_nfcore_differentialabundance_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_differentialabundance_pipeline/main.nf @@ -88,7 +88,6 @@ workflow PIPELINE_COMPLETION { 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: summary_params = paramsSummaryMap(workflow, parameters_schema: "nextflow_schema.json") @@ -181,7 +180,6 @@ def toolCitationText() { def citation_text = [ "Tools used in the workflow included:", - "." ].join(' ').trim() @@ -194,7 +192,6 @@ def toolBibliographyText() { // Uncomment function in methodsDescriptionText to render in MultiQC report def reference_text = [ - ].join(' ').trim() return reference_text From c57a3c0c81618d03ddd9cbcfbe9226748d652ee5 Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Fri, 11 Oct 2024 15:35:24 +0100 Subject: [PATCH 096/154] Fix files_unchanged --- .github/CONTRIBUTING.md | 2 ++ ...-core-differentialabundance_logo_light.png | Bin 71588 -> 71023 bytes assets/sendmail_template.txt | 22 ++++++++++++++++++ ...-core-differentialabundance_logo_light.png | Bin 18165 -> 17745 bytes 4 files changed, 24 insertions(+) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 9a9880c4..23cadba9 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -79,6 +79,8 @@ If you wish to contribute a new step, please use the following coding standards: 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.yml` 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 diff --git a/assets/nf-core-differentialabundance_logo_light.png b/assets/nf-core-differentialabundance_logo_light.png index 0639e2ae6972fee76169f53e49fbcfdad11c7878..f575c2b7a5e16798a31694c8e4f94781230841e9 100644 GIT binary patch literal 71023 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

    j&TE?H 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%0DuD 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 H)7}3MF9vs} literal 71588 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 +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/docs/images/nf-core-differentialabundance_logo_light.png b/docs/images/nf-core-differentialabundance_logo_light.png index f23e51a2c894fd3ada31e415c4a4e930b9bf30bd..de7a3916adb7344f306cadc013be7ee2019b77be 100644 GIT binary patch literal 17745 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 JS?83{1OP`;?v?-m literal 18165 zcmcFpWn9x=)c=i^F6kVjk&tc>1`H%62Lb|8qeDtyfYLcY=|)6Sl&&F42+|=9GNmL$ zI-mJ}^}KstJ#S!xefGQe+;h%1&W$tB(DMH{mN3{1+Z0%*L#Utsc%z1G_oaJVd76) z=9aIG7CJijA+07JW*IGib|SlxmOtVAVD5mglHO6)qwO_K4x?MLqZ`jhg9=81$j!kP z+!fNnoUcWk*KErHK z?2hI!p=pol3~4F7R865TNr)TbiulZ~tZIkw>n`{FRYCYrTI@fd22?K+-o9;V5D`a< ziVrI-nPf6DZd`Izy{~A$U)5IiuDv2|ALHfJ0C zoAG+LV`(J%g2Y%ss3;Qf8UaCQ?;v&snBT}Rp1+QHt?Os=->22|{RkDx0cDEb4`A19_7>THoBj|~( zyYEi6xK;POxwDfjVd>@!>|LS7*{trX)l&9jaC|{+5i(tDxCMuU@*D^0*Kzsx?{3r1 z4oHgNAeNru-+uS*KP9V{U6FH#k7`_)$9D9b3>AO}HSlzdU&zQYRnOa{@P>DOb0^IA zy6kCQh})}kaup-YGUe7|^?ra!xo({I?CaJm9~AaqJLBXfDL%?7s<3K{ zTD{p}fA#W-@j~cN?dm;^QcLTTSA6+YdleZhDz^GmZlE4F(3>>TU=GvCn?pDKkIv<9 zb*)@%C+EzsBk?J}{O-kl?xCJ4gC85NifIUI@e~flg25wgTj<>q}lM~|EUKt<6elJn?Fl~5QR4mM6`kh7|AADl1eNraE(<-md zAxRQ<4+7(?#IzTKaNA_YLG$dGG&d+@SnCiSSKQ$%jkujIc? zO=BPPN@v=7%9T9Y(;oot00?f_3Y4cEQ4ydKuLfMXK9xXd%Uy)<5YQh;;B@wqFBqRC z=`}yC4iVw{OI!)DuTzJA7$|cr*1i~f>boRn?>UUE;{xS}jO!0JpV`|2@;=Q`Jjl<3 z8+2WJ3pT7if&3%ND~Nl+a(zczlTH=hyJc$&qd1EeHKzMp4wkvM828+sH~XkSmb)56 zNEw<)M33q0S8RvfI3LUqtLOOMu;z_JZRs7+7W7$G6fDggmKW(+)cdL6 z;})~U#D{XJFoIX+gq$Y}N70X@!kJbqBs|Fel@7r`#vGW|PGjBE^#Kx+IQ`ChZz4LH zfD(s@r;Uphj6Pe|e~aftuFQwVy`J9IW%bncau8ey;YXU|HGQc;Kgd(rvTakXx4g{6 zHl@+2H&ue>Bpz}hbnfng#mjm|bL4)xRNuAmIyq>O0s}vZpD%*KeJiiFDrduY22HmM ze0yCcAAV$ALt*4X!l%bXa}Nd>k$jPNBdU=Hs_~1{HdWU)Rj0Fv zVUMxxpTG%~tss$8q$nkXuzs#vu_n16MHBH7*(`sS_aNxU2g3E(xgh#>`x$g+U(Y%!1J4 z3pPRC2(e1m(=Ga)2*K7vGw=vyTCUR|@^_~DNEycXfNZ7F;63JST)7MyN{=se(p|^1 zUWb{`y2}~Qgn0oSuL#r`WE_B_x)NlpZO#GAlGblwL3;ym5+ z^=7vIlwT|oPwtb^+*4l1F|9Fr{>SSeT#cNvNM_+tGF$1Y6pmSSmFfP2boaMDtykbr z`6Ow*DkE$HLg#r4l(UE+_>Hom{WNa=aBJ#sl{MS-JUSp~%D`C%ft4jCKad=UNo4zhM3sK*# z)su5@f48s-Jh)b|Q>?6MK zR1D=;4DWe+&H)Vub8$!8H%X-;5125Qg6~jyB&+!^Sf(un^2f2+=_)ZRT{4@sq|)(D z6=6n3N-E^he6yxiBvpC`2bn5?uOi9;(Nm>Cb8j^)HHNKRN)?`N!Vxwone)*u1JCE% z9oecWMt@@H?@5+ufkU3U>ebsj{D%2Dwc$D)y$dRyDOV|e)uw#q`}k+Yewf`>TSbjL zG$z|E>xlx|&8Npx6_i+@uzDWT-k8oa}s*gM3PH$Hv#Ghmi zdD1#{tN0{H!Tlhb3J*g=Lw(a_TBFgb?o*waeAX+L0-a6WrkDQA$10JlHFzaYVh{#f zUv{T*7uXhmy8l zYIZc+B1IbY24P3Yy7MbAUl7kd0ijA?x4A3X z4%YQlk9zw-EEVzeBtxgrmN&7AGxf~DlU8xgrskJNxU9FQ$7IV_E?R^L*IcqUKENSL z_BjCCqjdVVUuV`#%-u3PSs@OSHGu6Qnp2X}y4xX2&g1W2-*^x7Skf&9_KCp!XFu5s zcZNG}oy*_Mh7PgaoY8;%IpLH(b-4T23BMaYSx8=%%)VmRrRXywVGlCJH~8TyrKg|Q zydD!S_c58U!RiIQoA(l9c&&lPMGm%`r#LBMtA?md_pW!A`xB)9Et6_fsQJeUZk*^G zBmaFI(Frt|76%{C-;;V){R{k$Y`6$8=O34w8rv%CD_S#O*R{a8F7VpL@MAab^7PAh z{Hdd_hkh;)UuDUqt$4pse&$J=kNabQu2vT?2Y!As!u%pWGz2PADq}|SwR}p~VxX-g z{l+#VLUJb!^31F@fy2#R`2o7Rm>7mwLIw)EW zo3?L_PTxX~j#sSOZeZ0&-9n8V;`^snt;Rx<5)JC=EUyf#F7{s%fRJB)x;rMd+uD^Y z2h+!O!UgXo;F)W!xpHb#y5ZRhQsWz@Gm;GX9p9D>twM>mnP_P4atSV{`V>f9J+p4i_SKN#%(RKr z$_-b-E5)n0b~PFn(;ABo?~x;eG!}{44Dh?@vO+o=H~3snb4qDjB{nv0S$?x)yjKy;X@C~4~MVS0Xb!Vq#iXxAeL%Sqvsb2gm;4eJ;&Oi2cf%7nd zjuxxhYj-RQX7kb0H2hdeV1rprez`ggeC-Xb$Aaq&hmFNlEK!$24gC6mx+wg6-ZG(?efHMxMV?e*t!=jsHLR~eo-2gT!y>Nc%cOc5QnXWrEG#o~g2 ztY4^_1NrB9>S3&aOn>}}SivD262Xc!dCQnCr9SRMkjuxb<%dH{=4m!!YLx)u>gphECUBmkvroPz?VrmydA;C7WAXW z?7GTuX=I*DE4ihR(-`XYOQrEd5qN8=nb(X(V@~8tpf;|=S*IK`=9N`U?LfX78k9tI zP!-{NtcWW+LEZ@8{e#Uc8qO_6fL@~ZrRB_p&LvK1@@E>@w5x&5H?!KzkD4(&D zTqlI?>A2}x#SrDKw*A>n`xmaqZG{3c!wauKfY9@G?%U=s{uL|lv@aUDObZ)!Kt&Zn z@?UfwR5Eg2rziMtAxu)vZ6vdz%c^Z(S3`G;ojBs~snD{74~l51D2vD`Ul3CZn8%0! zXW>bg{F<~i)^V%pHD5UZl}30d4!XQIQwY{owkZedPUdN|z*54|BlU4^h|()dee~;+ zv=l2EhYSn6H!s(uk{7v~fu9wK^|RtnQut;lSpvG&^^c;9?<`oOGKPMJ5(S+P1Rr!t zB4(JIP8t8Df^-y?cj zapma1J=ktp6(e0bKuI&_f7HpWNR8KSUq<`M*WmlqA33i*4~*v$REh}RMUO8_!li6* zk#6k6`i(bd46lmgEqVBKh7o0tU3=S!-?|{y!sr)=^FSLmgz$$kQScsN%a|LR6$%S8 z{Es+^1ZudiaNeS#g&Fa$6%(%z%& zdEa}qx2`h#AJ>$^5B(mYn9#-UXB*r>sE|!io(-=$n-1! zsspun4C^!P?~*RjdbU&p%M{+ zqek|ENeF+eSi@k#_U)QBQ>_DKMnhq`ZSTDYKNtPpUimYmjZ|aGU0m@*gUAduGM~#7 z52zHp?;CEJ*ldX4&S2DC{4F=$m*@EO7clwGEu%nl&)TeJX*wy)Kb`|E1Q_GDbC8e$b(Wo%uJdmk+C0Q*^ zsm6aOnQmt|YOmBHcCeD8p!I@`5WF ziMKk?44I@uWZUW-s}Iwva1UExp%mE6`B1z{R!tzJaL6nOs{ZZQ`OxAXu^@+RJI$_h z4NdO6RV%3B<=bJ-={s}jP74m;;u?49CVVlY`jTEE-13+)Q8UE7WYt0?29Cmy+dh)oF1_#@`KNmrmeEX_c}576Ci=-SYtDLm-g%48VE^(8 zmKs6xPdPCUy*_NYLTzkT{G8HdTP$wv&F2ha6BFLqBAQ&p$rJBhOeA^ZC~eg9P(FL~4>L>-9)t`@3QD{4VVf+npw!_o4G+=&wdU(QVNLt^fFqMv8QOAH5)&^(A*K zg}ULDz*SbKvvxx-mvSC`iK;)~&6Mn0nByA}?Id;@eB8%#D& z+a!6A7dP?qLZV?~bW-TgiG>RN!h)Tn<=I*3X6bmnO@7U0xq&3CaNp6rVLBr-;OJLj zS*C#|O`dazD}0_$IQ&bAgH$klHyu_O-sM|uos`KDZfzWm8SgaobN8%sc{9Lvbd;rd z8C>$0@auS|3lqDgaiE+ib7VSGUR#Y(<>Es1emclI&?L>E$`^=zP(1yuHfZ5Q=JvU= zBX)uMB!TSJ-j42#!TO%G*EpZof}Uy(QyuKM7+tF98@I)L?goT#je(YP$~_*bIT8#H z9tYY7wX=I&T{+FRl~iIADbrSzKYE;@6EePbpG2Xok&UQ2zW{YfrZR&6-ZOpSyocC! z(fI7;_Jer&J7}W!!y6pr^znem(NcvXPez5RB8aX>nv*8|U*cx}(fc$Csje~XMZ znNrT*i{6gqYIOeT;L7NJ)Bq?>w=jW*VcBJah2uNCwo7i+o2#6O&MLg`5`T-IdAGrB z<>@ljGWMu*evnoF>F3m1;T8T~$WTn6MCzexmk@s2&W6;oHRrJFg%zMT@MUl;KHIL- zp=pY|A_-<-u82xIMiqT=7eOiuu(6HcUbqt@14BzQZ+w^TkLnU1ybBc;=qg_XQtfGv zMqT;S&4Z@3**ga*+T1r^-XeB5NNN?YNjc6YKh4@)Rh0M$WzS~lIO>=a@={WBz~t4f zrrwZ4n&4dbNx$gTC;zNt?PD~!5==iLP_-JF8K>(BZ{?BQdH>}kD&ZB64h>=`er)*YPd<%$ zT0t$2tkc-5#lwq9idliSeC)dHNCcuI7z-EE|Lb_`X7xO=5%ArHWxgEzA0PP4pSZqW zc0InnHvEViXXf`#kMKOO9DZqCvCT}jGgA}NR41ZfZRAhG#Q!dU0p&!Y%mdb8$YM{9 zxiX_Fp%h(p1E0+!zsNUttR)tr2bYjSP1^Fi4kxnRL7VQTPc}kKDauA6rX;FVs|Eg< zM=xY2*Jp?G-bhKo8KK|d@nIXw*YDexhw79*JeMyHX2msf%}y3-jMRDB_hR|uKhn+- zh>O74sx$327k*7I&?17fSaN>16(f);f;;n#FEd%kbvgmoRh%RR*aDHawZ;e==MM!< z=FP%4W|hXlCPiNSJ-7=s`elDY#ugCIqI#<|3)V8Pudj6$+?zugxbPu*#W;;ziStx? z95b9q+{8~wI~QpXehJ1G+bauYI_^x*!~VptE)1ELTSoVN6O&`r$`6*)J0kva3gyOq z&;Oa+!oeShkq{dC&z>gs`-CR8a5c~k6$%)UT#ANNGS7gJ#nGP|O)o6$VD>M5w1CS{ zM_Q@Rlx>z7-Wm(cVma9DBd`7FRrS=|{f4{-^O2Ab%tuzgr{UHf;ae6@If(U6dty08Uo$fR|dPcbcd=Dm_HpXjVHX!4| zGV77mfg{}ovZ#5nUZ!nq2z20)?E*>{0#tYvQLD#Km_a?WM3h7~6baD?cJI)-cqaL6Fe z9j#q{Urv^Qn_dmml=s2KKv+Zrl`H(-+urN{Q<8&>9iO{5PVx|7H)a`?5|Sga0c zilc!VEzWVvlOdm(*?zI!Qp|zC!r^n+?j5c}^7zF?_WoP9=5xq9CDttwhKVs$({l#-_NN#@0_JCnv>U zKl~+Aafw5fkCM!PgJ6IT%~V^6yChBEe8p1EFiJe}d|yQftBatV$qvKxt2*nXY3Cli zt$VLm$Oh!I~LA|AW*jYA-z{gO$Y`=X-t3}`#s@2*A)@5vY44JxNyQ=}ChAzG6gR7M#79CIG_ z-@tcI#7?Vwh4MNFZRo3m4?UuPJ*94Lh?SKxp5tJRtt)JP>a|ridIy7rymUN~$<;rk zrFB+HiRh8ul!Vn>h9_})9E9Oh)Mv5gxhjqI-{|@3%T#F+k4)T*m+@>FIBLG{zrLud zSZp8tlD@J0Z@7qBZzfVKI38F0IZ>yf&Ks}5_zKZpYZW(5GgW6rXBBWEJGLDTEB`Dt z@=2XW<;T$z^fmFS>4Pq-Oh4EUiJ=ox0P>c|ITK3yW=~1x`IEIB;Z_`Gq+RDfxyAF3 z=#V}MuKeh(Z56S$uwlHiUuWErFu7??Ck1_xKH@2kpv<*_& z5pQuq;q>eBS`Dq31Sp>-Lzse&?g*+ zv#THS%2wQ2U4+1dSx1$E6w>+WpAZ$*t#%B`vN_k(akPexoI{8r*Q=(tKfRKpik6QZ zkOr|VmO0}UEk4LpWr${{OFIQ^KJku6X+-Ds;{s!Fc9lb&ppAUr?uU~{xa)HjJbYB= zN`s0_`Lt;(pujL`&kfa=r|m*(zxWhvaDwkAV3vb6 zU`Dr`B{>Plz-U3_W%; zpoMnHC3={Y&Apm;Sn&B*7aR8;eL{mR)aceGW0?jWEvfM8!+U~w!R$>lHzG(7KpMF! zsa?tKG9Rd^s(zyStEI4iNxL!~(Kz3$!b6z$W-H>j>tSCF&FJTJ@U1Li!>-rA?0<;! zCNd(EK=puN!)kduWy-bDailvG-0)QO#Y$mKV<8jVDd&yyka+DjMs^7o={piC3PZ&Z zQcRVy)HzS+kN(Y)(DkH(zR~WM8+6c#=Tk$J8o4E5NF#M@jc>g0(KRINVPwTLDxe=(I zAYDA?!y~-2({?*RtK6uPGsNuOW7kKxS*+1(52@k+newSNcuf-v8jdx8YSpULKpX*Vc#c#8>|V_A?NpyU(mkVy9>A$XPvQbj}2@b z5@ic8+r|Fz1CM6r+lgy&0q2@it{@>~6yU}M7S|$Yign3(a}D2t0yp~Vwc3+Mv(BS+ zLk#xM?xx`a9kgf?t&xC{V;my&&y4m0;09W>O{S4qzxUN639%-u+1lii!=`g+0&Yl; z9p;vOYr!+p8b1?!2dSLiAq7LRmxkISnr4CtfsoWiR`kj7be{$Ab!HyTunrijJKzs$ zs$&8mo_Z+E=r@5`IJ=CxCO>VO)gLv$Z-n)3^jfW2A@0WFJT@zPv<8vDoNeK0iSf9d zT%}Rv$9&(tFTe?IeL}38o{wYBo2LL={WHTOnzWw~cAlV$*eeAXD#Ws~d-7k~$@jek z1&Sdb?_B3+zHy;waH2fEsfC;qA=}k48#D7OrM^l@cK{l^o}o;m7|{3TJ-Fx+eCR^H zo)o?nbg8*UNj*90^ozGbPUc^0`{8H6v%1^n z^jJ5Lt<)eJq6Wm#m-Q~Tx^}02X(#Uzn)4>0xRauTkF?iJZX=nXo?`GD)WIt+V5Bu? zCRny%<>KPPT)I zZC;(n-rn^~PXRUpFA-#Wbz^wnrjn~87NBU;N`Veh-N_`-5y}|g0KXS=#7AC2F&prm zs`;hz9KJSce{4SKsxRyN#28vNG2v_f8fl%KBFv(~_E~%{2BxxgpdO20KGmLNqhfsu zi9$?X!!jGmSQx1QY!h24(Q~^~ykKbygl{=GQLG*Jj2+Ol_3Qid4Oo5+8C=nrEEFZR z;Q;q142VGjSaowDE0q0z8f7b_@Ao~YMDsIzSy55H5eBovCXb>`>p%@Fy6V=jLrSW- zbj+L5)-FBLRXSjU7j{??*%XGqnkqJR%K|=p(fEv))RKy**Nb;!QDp3FUj?0`_^;cv8}lpo6Wsk=Ew;fgKH5PqGF)bS4aSC4%hN^nTnb zOy$Rb#0C8(wH1nN5(GV0hN1Lr-J+L&^=179@`yO3E9|+{F(6>&En&pn;*T?)_y@~| z+qz1E;D0M-vtQxNrj+Z9oGxwbqC{Kv)iX`&j>ENe7ElE1%5L}uMK*$Nar&oiG{=tgg`Nk16@KIOSYkn4Tei02?IX|2vCNq zK4z#{EI6gfBrDIAwMg}`P^>-#MA)p>5cZi8cwP`BZjzX%E()`q=ac{amHV07OtXEn z%1w;n+K1vsB}TOL{N`(r*IT1)1Jug1J%Cl^tx!&x~OG3%aV9xlqq}+~(n7lD)H?@L&qFy>$j; zaBv`Ti!Ab$L<#&ewr;p(sRrW{UVW1e3@5T5<_Ef>-ZPp-4O68FHqN|kT}c!R0kuS7 za#MFNQ!=R*?)POWg09NGfuL~%ydP)w-Hbfwkab*_0>2&D8nyu8Y54v^kDMjc;7URI zZvw+Ev4Jo|e;jU;$TRQlJ~8sQnGKR6-Dj0NqC`^D6#7E!mw?|vm>k)l{>&1&TsB1} zpk$XQTblW)FKZMhkiE}lH0gM^|3vWXB5oHwUJn)YXC%k>6b!GNgB6+kExy0Kx1-?C z#+i-y0h8mDh-Z8kz@~Vgm7>PFE1xE!MntVkeypt2p5WEYg(4(n-#D}YOR2+vuIQ16 z4wE1&tJ`q3JYVL!`JPd8U>|&BM`oX)>fxk+cQd%{CuT+GFnnx|B13P?&2Iaxn$RFk zqL}BVLw@h(N47=7zN~b4E2kF7&lw*K;DVe# z^_wwwXGFET)Qq~Cj$o74ad5r;JPpr&cmwEYpz%+8o+l_PQ?iN=-dX2&_z%7JfIAyA=`2 zu8^WfCb84`u`i1PwOGE1LuEm<>PXcJLbDsVaU91EXo`7n|BQL@q~%f6dcMK>{^t*} z)_F;TPR?}RbaJQoR=t~j^}dN>rSpz?U^mA^*^bpK7ApQDGG>jtb5~-FrIsK7(k$Lb zTWjZ^EnR9WB!FEkcwu5^`-~BAriL!S8aSVczX3_~_TE?%7(3+L&(x;oonF zR!`P8qBsHr4csy?BI*vJs0Tm?6*@BSVg~0-xB+z0DhI3Gc)=FEHV!`g5qW9;;4m*( zslA7L9t&`#>X-+BuWzk92^z|fdpo=f_7NZaIS|%Qn=N)Xe!vg)SKT3(gNTm8+8_lG zyuVFN)ry8+>H>n>{TVaC?7+%^?=$Y8EU{lNp?Vwm=2Yj*gYuxOB+Pvv!q-CwsN*Hx3kEbe8bVS7W6hlUlgu5Q_6Uw0_xUs`S^%yVK_EsKeSP3?7Oa zitq6(9QJgoY*#T`}C1B)Qf+$imieoci1UfVCj^!I%%%1(!9TTx1 zm82H$flv9%>B?Q;B#}kG^A?!UocHrmC%&h^1@=G(;Q-rPP1uRd#xo;r z);qTQB?&MO_UN^ype}QloUkle*k%l!8Xd%^-Dq1Cg;0mQ(?so&+1>_I;*AAXlV%vP zf0ZQ!DAN$wSBcocW{92F(!IVQ~rZx=a@v+BZ$R zFY9rdy=~k8wlN3s&6tDuKV5QeVjcEoBnP?D6o&*4zdn@Orb@gl z?eU~o%{@kERwX2QqZT&uCj7%kOHOW84`1}~Z9e(i&*hS{OpVtgl4+#u;v)#nNUMnt z)mQH_d(CF<>BcazXVy3)g6s8#64xHje`8;)T!|)a)EseJG2SYntNb)kmR)7M)-dbM z)(pcrC>G0(lYDEv5H{*Jc&iGC-Q8m;=DWF!(Q6si)i!4!SfOt(zU za&fvL(z1pga>Gy^A8PYWWxOpB`_*+CzX;6Z2K*93sqCNjw8F2WZbwRpGmOZtmnS3? zsqv}rfe(2RyHBF}Oh8pXWNzXbPsm`XL?Vx>l*^#MwgTV{t`%9O8civw7Z~9u48It6 z)1#ZngivIXX3+W^H)23Q#5Us95k-(KN`lSZv@I~>C+}j;(veth8=WH5rI=YKM?JE(nDJ;Xt z(tnGQ=Am2iut)v-nF~^&jy{bw!)V9dB>jc2N6pLyC#o6ej5DXqNi~4%RV#dF64v#8 zZ?(NZKhKDGq}3n369c<}tJl(|Ifj3zWip4{T2KVKY<8P*#CLFVv8XAjP|a1_=A}Ct zj_0c*LOGDloI0vaaj^=`@y6`h`C^WD?iY?SqadwROX-m=FAY<4fBFO^H#R*HD3=Ro z(CO^u&(!wK_k~*isZ%GJAQK9c$-!TJD3fpA^EHW$D(&BZ`u^Km4=>9Xkc6v{*pud` ziN3Yj6ov~^ToMWKA3HlC;78t{m`J`T`%!kpW29kpKL_!UF2@7kI)S_eHz=R(WG#ab zdG76v*E=j=@04I=hJs^ccyyQ@B$pp8`wCdh0ybh90&oM66Gs}-2j`W@8AbLeX zmbFD)EcR;>SdRN4Ysi^Et%!rBg72ghnH!a3Z=~Dzz~yoAZ@P7xf-L)FrD?txzRLH~ z&zbdLU3&8vH$ithR_u@VHglf0NyQFaD{5$Esf_LM#I97^4+q7}|7=sH#4w)}xTu$$ zQXGT*34s@`hRBkgmed3HD`&~uOS9CwmG^oZk|l+ zZBDQekHt}L07Rf}S<2h(%X41FA@2=r))i|K8>{J?!iT>Co zN0vWYv1lka-nuB#c)?ypfzR2s{yDlO-sA}Xcj}$7#!`oeR2GXJ=2$7$R~DT9F(wMEKO){&}$q4}FSb ztGQi(;k#-0{_GVc0bL6;HZSZLU)@PB%YJc0pO>(0sk;=ZT^Z15;DL{f0fcDMUSK4s z=04U&Obc~m%I-I4nWi!}l9?Go%f_6Z(e9FRa8IpO^53yJ5pdA>1{f1=tg z)tBvSu4y#3Cx*#-4}_@B&3lenSuq(#b;5Esvp+BN5xeZEPiYvwy44(8YK6Uj8~^Om zT%95MZ-T^xdRcaX85cY=cdkf@XUBr{kO=sV6cT^XzqPeBCjlq#Iio7!x z=nYN(goR@c-ARPjuX5!azw~Y~M<@!ilUn%r$IF4lx~3-LC=T<2H!jMDX5ZNLQ4ZDc zL}t=_F9|{7HJ(AU#s!UBHv`-e%J>qe?+>p78#ureC4ogjxN_8JFjt7S>1QncmPH(#A7ZUuzu5|x7R6rntDSbG5Z7URWr@#| zohB(Ndf=AEB|n&tHO-qB^cvxh=N)1&FZ;5{biD$m{5~mf*Fkxq7+Q(JGV6-mWLM^r zv}1WJ*hBQk;QP|a*NikX^Oqn@t?hjsrKNl9v1Ac?u{NyLNinunL6|ctwni>71#ozD+-yqok zAg&}^>}p<=H23H0&kWq)3j+n|t2ZxQcLe((pO^3YGH;jU(;$^#;Py0+Wj~ zYgB1GPdC?vy_y`%5H0UoGs<F0 z<0Ute=F)Vn^m~cA+Yc(Ceh7R-c+D|4)(kn=C*r}i)x#QQWAGKCA}l4C7G zhkYG9TR1iv*r2qH`3|$_cgUAG^=GfleWJmb*P_?lS{T$D|nR!p_u|X_8wn>wrTOp&8eL_@ecL#Wm?+?np zjcKFs_F+TIbe~~$237{i-jC?A(!x6T=H*k`R6%reU*A^lSh=hF1P+`ym|5s+34`i= ztwE@Mmzq<~bD4&^oY~9{ogiVRj@DXTZYl=S=Yvj)azO%mBN`|O$Uu2 zs{G~UZbCGF5HBojoON%caeeR*tivgQ;{9l#0G6G99&mYj6Vm>AX zrbK3Yx523j>wN#FlPE3tjFG6v+VjW9CZmp3JyA!tq*dE9^E!!Q{Uw78<`oZps>Ykd zvbQp#ERrw_2CKu11Ui{U?4Kc_2JN~ih%#`H9k-|1{@MF^cqmD!^Gn;WoZwlz$kJx4 zhQfy0l20xPLkYNH9*SV@7A@t(GLp zjRm_W&0Bb3C<+Ndhnj0*q#k5}^((ha4&8;So~T`oqP}`tv6HmHsV+ih59?9*JLEik znY#G##`?FhbZsuN&x|P9#?wJd9 z2gA?#s}~U1@?>#a+n_ks9l>4QBcC}J8kCkEC$Ylh$Y6#AiD2$?~+l1qIs|i+4>#27|jhsDPx(AN2 zM3CTG8LV=MfT1IQudy0GWthH(Mv4A3e!%cv>|g9ub0cnma6CuV_%jnw2t#3Fu^QQ- zirz#Z^Pln}yT6k8UM{5;|KL3Yrl;~Ae!&3^Pk80GopYs_`#-xD2&~tDGYD7D?d)gP zxHLV>txKo>>FLK7d18j`z?q##bF7!mtc&XY!u(^?)^8~#^>g03$Y!tIn$P%QnwgmU zFVA~TO{@(Teezqb?PI!m+}rxtnk#>!%sF-m`ff7;jxZcD*c0I5Co=KyYrmGW-|~TT zV~msbGkkE)ej6Wsc9EXa_p5*PrLIY{IKC6tW|$D8u2in@yixY?r)Tpg{%_DfDzWd^ z>*k~Ddkp_GK5${EUidSpG}J|m@dxwC`H|W6olT-Dle8J`L>AOt%=m3PN5%6U^M_dq z9C6N{LME{<@RTrX*s?C~f4JbzP|dHKRXpYNG~}6gFdqOePhov2cCOuWZQiP_|NQpKvtR!k z85Ma^rl#**m{+Xy@sDRSZ$>sS%y(b=Rn6eX{();!^n$JYhi7%z za6Xs^TxHjHt#|5`sNcZZ*pkv&%kq^fSsLa}crR==C976ucjuGuk1XUK#@tm}JxQf< zy5X}RhUHx+vS011a-EzOifUpN}mqzD#$y%B=eUygZ|a1`4Qh)Z!@p`ySFjNruKkk zxwimI`1Vh`ud{j;ACFuba=9=}bL*OSHS@2#oz}Akjs)^Os7gL_QK`u0WNo0#4&Y$< zewQcdUMsVsYOaL=XH@h4&a_*bC!N#$?EPo1l%(U^yHEH6Tc1}Z&hF_s9yU>Ls#kR9 z3BGeX*G>tN<`t}XEk1Fn*UIA_b^)ue&O4wIB0X;nXr|dUMf~}lZ7R|zYj@?|{Yw@9#u_i#&kd}2JFbQ0&sqo^;|9)!14o*ki$6a8$D&5&h$qoEW%VNUOxe9`U`UX!>PZGeMH%rox1|CNy_;>tZq z<))+NR@0L|m5g|AE{PGGm_9YApSfbgzuo0WjvIF^(w(ewbK(;-ua%WwEwvdEUO&F1 zHObp0WuoD;kHAHTS1%nrdo?QGyJ+<;8NUu4t*WWT?>v*wBwx+i`mp_h#*52Q?_EBz zeoe1Z+q7|mmeOhuJ+X<$4;$3vBqS_&U0Dp;>;POvNX#NHI;r#t{b&Dsq0!`H%&IGa Q$JsD=y85}Sb4q9e0L7@B`2YX_ From 5bb2b16b3b1c17e4a0d15116e11611415caae696 Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Fri, 11 Oct 2024 15:36:38 +0100 Subject: [PATCH 097/154] Linting fixes --- .../local/utils_nfcore_differentialabundance_pipeline/main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/utils_nfcore_differentialabundance_pipeline/main.nf b/subworkflows/local/utils_nfcore_differentialabundance_pipeline/main.nf index 6c5cbcc4..81ca7d0e 100644 --- a/subworkflows/local/utils_nfcore_differentialabundance_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_differentialabundance_pipeline/main.nf @@ -179,7 +179,7 @@ def toolCitationText() { // Uncomment function in methodsDescriptionText to render in MultiQC report def citation_text = [ "Tools used in the workflow included:", - + "." ].join(' ').trim() @@ -191,7 +191,7 @@ def toolBibliographyText() { // Can use ternary operators to dynamically construct based conditions, e.g. params["run_xyz"] ? "

  • Author (2023) Pub name, Journal, DOI
  • " : "", // Uncomment function in methodsDescriptionText to render in MultiQC report def reference_text = [ - + ].join(' ').trim() return reference_text From 4cde8326cd7f08c5770c9c31b27ff0048275eba7 Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Fri, 11 Oct 2024 15:49:39 +0100 Subject: [PATCH 098/154] Fix template pngs --- ...-core-differentialabundance_logo_light.png | Bin 71023 -> 71588 bytes ...-core-differentialabundance_logo_light.png | Bin 17745 -> 18165 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/nf-core-differentialabundance_logo_light.png b/assets/nf-core-differentialabundance_logo_light.png index f575c2b7a5e16798a31694c8e4f94781230841e9..0639e2ae6972fee76169f53e49fbcfdad11c7878 100644 GIT binary patch literal 71588 zcmeEt_aobT^tXGvxvIBST8e6^+MBA8>LPYgJGR);+JvNwUbWg75sKEVJz~dhRqdJ) zvqnO!6d_jR`SjNPexE<#`QiEe^bzlz_c`Z%&g*?vA`J92Sedz)nV6VZ!J79CnV3!= zFfsi>IeilNq!VJ43H$+fy?4(5eDB^>18*4A)x(L2De%4DyJ^vvk1n-?6t0b5v#NPg zCReP`Gc@}UBj*N|b*dpu(GADz8z=&`kG)LeYu1-vG(EEkT?S|i*Rz5ieBQY&6P4~zs@CGvnB3%j`ZHe!XF>8Z)0o1{L4JN)z>Gah9p7*ghbY+O zskX=oSniL1?k=!aNF>5d2n+LnT;tw&j4!QbqkA`ck~x2VbuO()WkoRk!Ndfr3^Yl_gh;zZfhDHFT1vVUexeBZa^$TJVG$y%*Nxmq>#)emmy8; zjYoBe=&z`oT5^xnA3PwJiiwq$dUoc~7WU}UvR&mKm`PQiHCfq`h0jk3va)!;R05f{ zZ^d^8FoFO7{C^GnKdFJ0WTNVC#(a9nxuSW~h>$!P12*o+ygrzpPS3}cZ;ah^(yn1Q zT+HX>+Qi?p>DoR5==+02^>8dYc@j4_4McSw@tr9iKnK{jQ zesaO9TBvAcA(EF?voC>LDHo$CANx)31L)ii;FL^EA0qWYbn1KyH%w(r6<#&p7f*6tgc==^N5`!yI;T! zJf)m^)|L5%7Q{+u@M{c@6KZx!AjIF!Ui-UdZe|>E2R97?c}5>?N-cUz`~BK&EW{Ty z%Hr|iz=nVH1k``%i?r3?m~5Ts8M~{;K`s{D|H{h5v}ox%^?OUHK^5AlgZpaXE+>lq zR7zAg;G45MG{--&D1fbL#oXvq?%If~B zaq|Nj$e-iWQ|0LFqpx)v97p{7nv{{t=d&Ztzta=vzG+US%0e^Rd#`x(k*|( zXvq*q*WdQnH-S`Tl*)`7xi#25OPn_df0av&xQ7 zHVz{UeHv$Z5I)i9q_w6%fILDpjir_k_#!lC>yyZp{G-YtiZOr4%GQed*KeK?_iChY zK?cd&^dqH9`HU9Z9REf8S?wwYknR!htm2EXgmK=Pi{0^UflVnAVEYA|M%wr|0*kfK zSDt?>2$rS?ovvaS-vxoCocbw#g#F^(9#~UN0PSBwOiaxlcYd7umuBj%-O|q-miz~B zDdnd)J3hQTX56x*Vf`z2uGQwJ&kP0D4mkEwz>Z9dPJaV&1KB0BzwC~r;ZkS^*8d93 z#FV6aYk=inVm!BY9kUNVgsR9ZKV5dH*FkCbPcmGyCiV)Ji*ccYYePNE2}lFnVU(PJ z{={vngTm7gQ)&#(CesD!(*r}&(jmBeM?|3~6pn1|Sf9#9X@I$=THPv?Pu9qnPLyxj zU46Y>u{{{0MExMg!f=5~p61V5D_(509zZ6wM{-UFZpx#rEQNZ66H9K7ODJsq#6NLGPq0h2Ao_~twF29*kIaqj+T_F9=Y3F<1s5$>opBn z=zG&kpx$L6LJ6!baSWV>Ir8Tp$kDKXBp zNF;^Y?Fr+X-nvk-x_jrp-7a|i#!lN(-)CKCH;Q65Wx#8Pw(7#|LI2^5=n+Hz`1{%` z%v(-6LQ&Ll)`ZTn_c?$5Ci86dNS8^Q6RTw9z}~)M+*+MKEcb}SvsCR(-hY?o^xIZi z9oBcy(Cj$lLB}fL{HM@{VtAeL1*O}7S5)<;OCkQjU$0#bzw+=u;;Fxh+m7TXbV(+X z<5y28ZNJ$!U1ojSJt+1!pGu(lHB0jN#2QNF(npCSxk6uGZ}|1vZ4!~vn-*TjQ>&J@ z=K0s%sq)tI9q1a6%*NcB^!ohs{}qAfXcrR^beFyYId8IL1$5a{p=p|4_f6aW>4VcB zOSe2PD1TI_y61i?7IUXuu$o$P@zQ$G08(=6mI)O8minw;P!>H14`-7%l zZTQ;F;fpKAG}gEd=CDo{M}}bb^H)Lb%479P%d2unUnq6|eO}!nn)3cIBv=31Qapr*{iHO4S z*mjaI#+7neVBv(S#?~Km3}+d_7vc%oj)V^E_fmiNo#%p$Uc|@F^s$%p0hI%pvK8lm z`jy#zpPEQO8hVzky0iYhNhql_4H6jw7DA zmM#t8Da&oGSf}7BXM$0thm)aJmp6FLkh%_nZ0N<`e(DycTmGd}CgEk6AhUng3FXh+ zJWkBCqWXcG{b_Ej@H2NBbi0{Qks=VZ9R?g*!V z4s)C1^k|emM4`T_#^hf+B?++HZpSfv^r8mBP&r8hUv*Hg3YWCp#z~=H(OzTU|9R+! zdgycMKXCH@rw^ZIq0Qw@6rXwN7%(`z4NN zqo_wUw{%2<{&))a`Q#@n4NLa9rY~-n= z3eC00arq{ijuEN{8*3<-&z&UqYfTPweNr7&2i0J6V~>C_sKR;X6nshjQlTZ?ZE|Ix z&uMQanM6|d{pxh^;|OwpU0coUtD9l?p*JtHHyyWyIK-a#0)g0_=}+JMNY^iLK%{fd zso}TsldPwel^~5?t{<(h=tO328Q#QqCI*{J7u@9NG@)*MZ&)4-YHBR_;9qcsGIYjb za%6i7sZv+qQX)2@yva#F*d{IJXBU-)lJNCrr#my|xsXhE;FNX+mJ=8bv(qf>E4D1# zAx@9V;yf)LCDB-Ld+!-<9^wBIziAaPCktx(+voQQH($ZiZ6c0gzi(*wSzKb?E4(;} z4pxoam}Z$#@`&O1N7i30%6&`EZ;GF*f zU&ub?H!@<8qAYs%yPC8cSjuuGr_EdZUB!@&wpEpJaTqjBi+N2;C-ED*mDb%T6Ru*I zSkd%*6PWdM-re~65r8;O69iqHrGE0z{${r1(n68i zFLZ9c;#BEPE|7tP(aTV;8KQ%OgAK(SqLV7lh{bXQLfTKVv}2Z~Ohcl;uQe5H)&#@e zTJUS~>s-l}N4!tW0FsbcH{B_Y8)pe_0b?&|iVr&#i)bw=_yAwZH-k?B=M@FhEO0)? zeic|7yN|OwqGN&0xoY0c12ej(BvNt(;%}rYu68@NWC`3$s5v&P4?NxK{RI?OrWJ1r7e zdrXK`(GG2J#i*Q*f7=t#!etq-%{i=-wEK!Ia`K)ApOg*wCQXbgD?GZ>$Fw^7G?u}? zxk*9n3WAnb&mD2Pfg-6geeYZH;!8SX2V@w}YDEM(xF?1tOJfCmnqHOa$A*w5T029r z7cQ`NW=5jhi zm*adZlx`Zec&hBofi*kXJgmxpRu|xlK;FZ5F&E*%R2X%=I?|l$4LPzQRW+12yl`Ly zA5yE@9_CaT#i<|hIRBg#)O@zEe(AkY!f2C7Fbw&$>GkNZn30sMm0do;j)azn)>#rv zEe&tkIXXH*0+#LFU)zL|Y(K9G_O~i+>TQEQykpc=ED?Dx*CtbczMh= z-{x{_xba6i>AwKar63ge%0lR*$NOScVkDZZzm$2hX6g#Q>;hwF%}DZ4&kK9RQj$Lq z{8c#&KZf0IF4}yA&03^CDf@*VvG!|7+mTg3dt{q4`#R|lOw*OjHh+fKt$1j!jGoh( zdRIT}Y$*?!8%NF?CdapLL(GaLG1J0l@rwA7Lhhoe>W}%0j|KTJ*LZr?HoCafKnngc zkJ|0#hD z3KxSMMIiFQ!K%7J)2nrts+aPyh?1P25YZca)n8(^E)iD?K?-{-Q8=+kl(1)SiMSPV zzB7!C7wLkneDYKM0ZeGsY&VG4uqc}LYgoGy(2Vc1s+?WIHvNFw zVC9thEiv^M+N&441tiQloQl7jNtN18&av^1`R*KYm)px2HX`y{qZ3gqaj|j<}$;z8x>y`4Zc-?0lc}y!71Cj_QC+t$br9Q#em) zF#?qeX@%vgz+^5V#b5^%pMY39V9@) z@+r|Ab|x=$cwqhs%zuxuSUgFTi1aG@xK!^K3#!PGBP3Pa?x~O68cVLe&D=&U9LMuf z@j-n@0sIFz5cOJ?nfQla9Q>ndAJ~Rk662egWr$}*v4 ziVAd`GO^nInoCqY`EQVI=T2>-a z3jVk?tBTo9tlGIZGpcF3E6T0zrh7YU!M^5PZX75EjEJ8uze))@;&p`wfYRe=)#-tA zdmCsf6h%}8!iPJJq@I-OJ2`lOTO26f@lbNISedh^{-7Ig!B3Zs^^sbUJr<}OcX42D z*rNeNG5^1)J5kcV+fq`k_AI3zdH5>?QzgG7S$X&6rSB4pt(}_+rb=5a z$l9ulsvnbz=f45!lu8-a%8nCQK74o{Pg{!K)337*h`Ag&Gx;(8z2>Mh^r!y~mX1i% zEASC4Wu$Go1O7WDWn#j`%06cTOQa^5+J0qLFN>q!JdPZh%(bG%o1<;m^ zB=;OqZMksS{r7@5(1L@ilE4A-sw`dshk2o+IV4e|Ps$Zdto^pvp?eo7KcVlXt;)YJ zL-*q5Kt5j8pyH#mqcT0``=N3ItRcLu_S2#5{#0k9J9wropy2?OP60*MB&hjXn0 zp&nIzaRrmESs_-(n4XzCeJ~4&a+F;0hXl~`tzmSH>g8TxAZVVTOBN=XZ0;bq;JwNi zl~GxW4T=Z-KR)8m*TU2t)TJLdDFf~bZurqYa24iM9lq#Xf>_U0T!BdME}?A>koKo3 znq4XtTtL1oktR^0=xPmEOIsh9Yt?_U*0F64uQERH^BT-29v?MlcvGP53$?CZ;|MQH z_fH?#_F^BdU&U~2AO77zD&Cp-R|>Dk^$SGK1In+MZKNm|kUxm~(j~KNZKnPWrTZ4u zR3J=OM(+fvKcbWiuy5Yx<%G9mZ=xGQh!+9CKpJU(>)_f0lD9r$Y&-`bE~{N>5t`E-vkV*(gEVTkAMS-u)jr#} zBrYld4+|)-*J!Z@63PtF)(6q4dV&9OXC0pBeBD7DmFdA4+L@fuHIJCo5lZmrMJ6WO zoHK9Mbx|k@d^9tnY-o_e)@UQS zkHH9d{x#g0Y`qQOViGuixU~!#><=hvU%&mU#q_fOq!O`y^95Wb?Ay?ao$Ff_fBM`} zy4XzR|M^mB^_zB|XmUkqu0}A%v3#U?^krs)J8&0Def~191FkH_v)0`=%v|au89{Y6XGSR{e2 zi`WASA+q2%raJc~mD)PnoXz;nzdg0awg(1w#ahS*56#v)ADNq!{BeX-wV;Dw+}8G^ z!a0p#R$7G+fHr@fSJ@B6td4KB_A{IU19v_a<5PVOg39Zi@0dP7pBPtkmpj`9XFt-D z(Y+t1d@PKJ87a992#@j(B?j;h+x?S}8P-9A0HY_2R=J^6qqB9?iJ-M@v#R}WwZ!8m zSlZ`Rk4mM_^2n>u3m^K9vj__3cuSZuC9S{6YCWI#JvmoyGHZoDuV_72Y=Q6$VPJLb zqNQP->%m-xa9$kEAh6=O)_RZx&m_I`uyV#^nY4yawY(h`_>a!17`{Kk%mtHF{$U0E z=Cb)O^&igRx8}KFqHV$OG)rfM++*w)=8qR66F;4sj7)r$(Gl5?s)CQ4<-Lt**ZVno zrsbh5cBb`HIQOxRpTAQjI+>GWOfX2Z4RgHNm_2`ZDdRg?EXvgaJi)SN?MurLvSu!} zmy;L6K0N&~4I_UycTlIBYgNFNo!KE;H>Co6-t=_9=N~_QWQe(oRf~yLoa4Zi(*?)- zvgrbrZX5YlC%}2yVUMuJ;@PWj%Jb_TimS3>bUe|+FGE6oEgc3_QEQK8mnY)3p#GG_ z#YMW(^rVveJGoniBH~)8TasTK5zwa}G2$|`eE3b_PxfnqvhKk{pD?ixu>C(2IK;VS zu_jS=0$+FTUW-qjqm<0>e`j)m5&g8U$BPs8Ii7z#98_1c@JK= z%P$-pDMt2iEIvk*!35qv%I&`|oIapN{E82g1FO;>SVEJ~{P=U>x_WlDC4q zxTFR@WR*Lmi9Bk#cbflrTfm$sx^P+(A-QOZdK=q`|OCwaukJF2;=QHJrIA{ zeN#!yjPH!^)FI88hII>`5bjhaO}*il%dB@wlOHegE-)D>%~Ezk#HDyu=>#P2hk^?# z{o^X6r{QT$7DZJ<jurQQj5r2%jkS*1H*X5@J|?);3?!o)zm@emu<7^7~i*o{{N)#2;*n` zT+Nr%rd2OL8N6fgeJ6V)0$CEl@JBmdV8lq&T9NE#;Y^ey*U(Bsguy^4sqO&>>ztR199IA_unE@&6hog!_48acAquP$%ZCN?wY_#A_5o@0XrI@A*0t}WfAD4 z0~M0=}fcR{_KYf() z=p24$uXs_yr&d4YA0epL{UPLQAb}Q5wAvmSyB+E#KzVuu3M*Hhr}J8F5%6evN!9O@ zY#RbfUsQN!2JAX#5hM#S*LRQKKrd+Mgmu{D#4^e))SlvWt#;yY^$jmI@X1+MWm$;;lFLiuP|%)|qhqAxyy zzU5^z$LS8Xwzgo8$~4;u)koz*a@qIh$82(z<^`q4mlz&yrX7ahJkRRzn8EvI>gsQb zS<4I&pG0h&%Tp!}G}dMowstpRLt~ZLP;GFTMG^06nrgpQ-{z>29#piarwZ|M>(1ly z$EXq%S(tR=gm7Seu8HvU)i&4zK~O$^xd}D2IBbAzJfSaeUbvZbo(3;S*wB?|y7rK+0r<3M@>rj_I-)8I zNH~(0?W6gK;SEp81oooBmM5`Q%dx%np&vuB$)p-X3`(IWgYRNvl-;TrHn` z%%Ql|apx4<=DN$!>~lkGmEP|XK5(2=CEkf!(J}Q@>a5w*pUqX{E#OiIm8JV&jih}U zQ300t;~k*~-YGbhz0XKWcEq{2VN#8^T6LzDhE(@-QK8D%oz>md4aQX9L!?@#&#!=F zb7*?0KVX?2q~djs_HNma<1TnAQ!(VUVd5lDPviID@|++26ze*f+QqsH5 z`5LsZba)+Ji%XN?-CpFA7#5rq-1U=z%<&@BkcS7{_+Au~0T4615Ax5Su%6Air;|@q z9W1UHdb@0bL5^Q+1Y8c8kGXJ(ocGa?{G)s2I3|rUV5D=~ER?<69}ksfBxpbki-#p_ znhUtVZ3x?f6M`CEr~F6XYY()PBjgjp)>){$@d z$4qPYu?rGS|6?Z&V6+NDCp`XvD7gODWlts zUnDHYJz}kV8R6S##lP5`4BvTzl2!I)m(7BQ8bY^af0YP;=b6U!pIA;4$kyI&zqUq7 z+nm**uMhlvm+32SyAVsA_xv+y5a|xo)v&8D=Vi!V_^Hs49&O13*QreKKz>0l;(b?1 zocZEw7Pg==xo^q@{c-TdUw?u|Eo!Z-6OtP4^4f@E=Qh%ExvlEj98DjPJ0o;u=~$>O z_pxKgA{}x!Ps%o!&!t#HIcf6Vp=#kj`?i8Zb*JX226-kTst=&KI5Ob|PnO!)EH>r# zS}?;bbN!vl>rW<;k}_r(46bQM^uxL zCalCn3nU*_;%k5K5J1H16v7R0t4|+;8>ma8QsI*7XNn0N8rFJcRgNwHl8K}80)ItQPm)u!f4SXcLk5gdAa z*EO@LU)8H=e<^Z-df{1^3?qrAPvdrcV3}PaH@9x98pM9%*hX55U}fg=nc~jY{JIYU~iwTSH=CU9fVnvs@(MUTWc!dkwX=x&^Xzb^T(~=r*_byE1<>jX6kk z=zxVRhobk7x=FUdfA0{&9;b(f5*9f5D7@)ja=Xu_5pffpHnE=aZW~XVgH^6*kfwEHlw=_ z6CPUtt(Zr7ai(^4SBgykktJ~Ew!??2-N`Oa&My8}52JXn2AXjn1X!1RGs->OA{i49 zRy2==xcJV(%S6xMO;4IvV|EtNbjA&KypU9gc%L6xI@U`tpq?{HdpJbi{>C z)}{Z(45l2m=jl9VL2b3M=r;714@UEd`!_kY-bnOi?Ae8duHAU47a=aig5>s?!Y0~0 zC8ZZCZJ}%yRJo+kj|wU)e)B+rv96Cyih-hIu456Yy=P^o-Wl`o7<8tj zfVd%hFN$)>wGxp+yF<_ag(2m+zCh(5U^)8h*00h*ZBeH<<&uu{L!@`!P8eIE)n3=# zenfRGq3&^_1-0gjj3uGBob!0t0%v50nsnXm)VveOdghFzdx5?b$MP1}OOb)^PJ*cYZjF78C~${?U)+ z{C41LuG0U8{LJZ*8h0#tDY2W_>DWdMYAL4_*6ejFPSQ8D8xv_}%~rBy!gF-e-gR(8 zpl$H9v@l+dbf@-UsBrk;Q@38XPmG$~4Y;n9YMG&MW3@F5l0dtI%LGC{81M8oyzAU} z$amdgH}b^d-an3;n`zmc-PDPsQN>f8M0~Uy7w8*24KY8Uq`(S7-)G?zStwz}c4p@a zd5yJij7}yV?`W`FqwIHX9+LT*HWtw}<^xFWy=wWUy&ufg^MW@TuvS`Zo>k>Mubg@F zE@#FRCM+PI?4tZA^~-8qFB0x@QrvF{2S;hJM_z|n$u#Z0KXGihMUJO){^Kf2|EcIZ zOrDwM(3+!L^;}Pn$wIr#zDZu;@>!jN%u{Pv-}#}iFj8mwq|XzNc16sApNY;wkaEhv zS3cRn*|!pP&XN?M@b>F@M%MVD@$bcDp%rp(omhcM~0;y*KnyF?6wj)lbc_952)&meQJ-lGFYZ&|u{BpcVDI%{1-% zHAU_1?YIPOH=Mf@KaWxXIb)9^eyQ+m78w;|6@9DnZC{q5^keMsx(RO6#(Up!%*9HU zvABt+{Afd7C$FBeTF;4;g*911b6?*zoEWYev(3530w$ty@<*dl&s4f6n`667tV4U_ zRCiKT$GYwb^H9a&s`vIR9BnrB;?EbHVB;*V*(ltYEUDQU4C*`H?O&<2o{CbtNw_nG z?S6cLagy&HiS)O%(c5s_h2c(O=t-_tlEYuvm&bEHmAL>3(al1*`LyN~nv5`Xc0kPxn27C8r$ZV!9cx^X){Y17xq z(QFeNGkjqJyMgBm->+V?os+1{njhZpPN!kZzJ7&y@Is8oBC%JLQCc}8d}5czsH9L% z4m8JLnrCmpW{;e6^)x7$()LaA!jk3lvhzr&pQ%Zfz z%v3^bP*3UJSQVDLTJC{_$<2iTcZ_CC$rC)CqTtHZ($ThR?*xZ$x{8 z_f%3_CjgmzSwE%0uR=H8jfiA7VRjU+u3$xT6l3GHZ7yB~_73L+K*8QH4yd7oV- zMqA2E`&-9EhbZk|pBk!Mg{`*8-F)RQ#LHK>IsakXNXDtXW_PnbA#^Nr+PTd!gynnh z-o*<+%KNESk~p~HXEjU9;6)p&(cS}987GCXpL)LNZY^Zp^sHmL0MB?_YKcT1x%l%N zGAZ(`RTWv%R3f$MQ&O+{{b~;pZd8?_NDhi>n@b3yg`2?-2kuQVdh!6a{rg-wL;4i_ ztv~1;IAA7WVU7XXM=D&D_3{6#pKPw4Co;9P((e|ua-Snx&UoIxhruvqMkJQnHL&p@$+(X<4OP%ysced zs52}MQr7jLMx=UVCKHA`S5U)^WR2T%<*P+HlQ+p;;Ay2F8?vBTad>t2w1=x^{pO;l zqKOXsI3ZSbXL$q|TC$}1Z-<_xWAzJhL|7twx?$&@7YOKF9!|F(lM_w|z72@)Pjl`(MgS zQuh}%{ya8%9f*C*a}68cm+Ci)WDlggTbi*h;ZoLU9SgPVqe)JOZzH*d9Uue z=(Uy2n^23zoIW=8$k+~e;*|u4A#L ziIBO;TpQ|Vo>!r~GrfZnwadju5(n2~Z_7VyBD}HmOfHKk)fYvm%7e1G?b5+TZgVip z)fJ((*&&7TipkGioUE*=DrV!~lkKnOi056CpT)PNrY+bS+OWp0H22d?<1)^rwECEgTGZVF35IHB3uCG;hd%~@$fX1jr;KnZm4U&EPVTIoX|J1wE^^csGZ7s zO*`SLc>y$0iM{+vWyz@36%7-eudye!F9eAqs@w<#Yk`C|T7b_Xod!aRNry^x)yocN zHVnwcPh+PuO0S;Tf~Xp15sM$Y${h5aTC3hI%x2*TD)m-gJDk(*)(N|t0o(=To{_*+ z#A|w6-K2!f3HRO|v(T+B$&mDbS$CDahB%Fo+N_yxokz)}?TxEHUy|og?KeB7aI@vu z*iQHr+i>o0oy16;VE?I?-A+K-rvdfiOm@9WF^8(b^@|KUWzTiCb-NlD#81JXKtoky zS~hi50(~e#k@h~v?iZ5<$(8Weuec=1&Nn@HtxkNa8xK!xD6wBR4@mc3XN-?07wGS= ztR{vH+AHttpV%B-IiNq^q$$&K&^9s?(U|JWA0J4HW2q}CMw1(Zof&8I;za{R^vTs-3++RDCEp>=u?OsM<8{2RQ`& zZl!Zx$e2b|j`dm4%OlkWdhYZBm}O?^=2T)FCE2h)6gds=k?o`S7Hn5__r{X^)pKRH zdXzEdJM;&eouVuqqg5|!v#Q#6_E}!@?kqm<64{Su*-YuL%-w(brtN<8!~KP_so-V1 zCRz+B?J*(LU9a|sscV;Y26R6TB^-xsI~tcs`UB|LjRh$i$))-?4?FXw0d}rqESfMS zNsbQclg2;R%ErDRKLB1+k_aI|2TiE_puQJtpN5&+YYzC@fVMBx&>V^c-TDNq84yhq zgvnto@GKe-u{>w~h+1e*9_Jx7%?PyLMgA1Jd^sIbz30Rk3Q-;Hbu{8)q=0n}3 ztv>yz>brlL)1z)VK9ccmnSgT|8(Ka*@?U>oazm$Sk-4o^1)Z7-oScr4IET$mY`}tQ zyOk*rn<);S0x(QLhI|=F^HziUo)_N~(LU_$=2%eursI&~fYl@SZKh>%isY|24_qEJ z*sH1_)CY4d*(aKBB+<^M>|X@m-nu}PiEFU$Hz2+>w9C3Ktks#dBCgF*2&WusFW~Y9 zBH-x9BGG)Z+mexI4>tKIk3Tk4>_Vj6; zN7;r18}JUpQG}@4Wre=s--r?KfybD49W)HPZPnDbH%|dK7VItg1aK}!m~o}byEBXR z3rSudQK|fc2#Dkrx^_x7kQYUo3nxixfh19^elIE(g+QgQER8CMT3Bgn*fQ zlriLbz1XMst4^ar;1^5LBPS_4pq0lTCCq)kI&IZEAF1=#9P#%HX%EcLZ;SdS$^u5R-B`cSoFv+UX~)AW3I~# zTl9Z~R`AV|^v6j+OTzGs*=pXcmwCL)f?%Ew1Z>83OSp1l4`fs2GHAXp_I}zsVa_@{ zR3OhlbG|q-@ya@9)A+Le5mzLjB(<1&*B;2Fh^i;0E*N(aO;c9bHqwq6N+ENzyr+D+ z{cpfKY?VTRSKGcU^#%Q|k;Dd0!QshD!X)3@ebu$G9|NUX52rq>z9F*#ZPCI>e|dvE z75xDR90Z?LqL9)vUI*dCqEnxmlQs(c7yM)b67Cu954G%H>@$-=A_g6#_oiNl4#<6) zaw$2J77|htdDNRsG8(8q)$El#al47uWVxn9xsM?$i86@dEGA8RgWMZwrxs1`-Mh!4 zygHIjo{0^dcPupwGK_B$peXsCO@3!XBo%9AZ`|+D?}EpGf$4H6{?s5X^T65A8_9uXC3^cf)Pc=2O$sW;SA)Q) zZtbkc#eo^x`tMdQ#gT|A2wmPovjKOXG>6++YlvRC5GQxcaz?RfTcN35oO?>qw#(^{ z3d7>65~hOSlbN`>w_EQ7vRyOuNSu;tE1~XnMt}c4hh{7FAGy;>;2RhW`;9aml+GIo zr>6%*l+>Zh?v7Lc;>O~f-Rw_O>^|51S$8}9Q;4z*z|&2Uym(WtXkG5C#H^Ss zojJ<`W|r)`4ThJQKVqdGD$9L~@gb9MC|euKJt^vyk-Y>;Oh43>W#ON zT%PT-01^b33Pp~3YIgC(Uqea2BjtQyJ7Nd%Mi6| zwEl?eH|JA5zP~sr=4Q}Bf)Bkz@$tK=-^|HgM@P^v9zI21j5A(cdAbDsk$XWm%r?$0 zFRw3i9i2XVJs9WaJ>q4(#e73ChMYp~ByNZ(Hi%P{ayqkhQ6&m^Pn4&xYg`J9*(*hL z2l~K0dDp-8>y522T>oTMmh><6~ac zkjR@U4)16em|TEz_YB9^lXG&wy0!A5A#kHXc1zR?(JXI$K|z!uHv{{F^w@_xe)q$~ zNk^`Dc#o5yY=Rs@ZZf7(Z>8Tf3$XU%aZSGZ*4361l}g7$x`e9wMglaE z_U<++tB}W9VE0A+!dp3!T_G7lF4xxHBqX13nVWk*EX&5YU>ND&=F`0;0p7$JBl~Jq zoz-jWz3*j~-KIRsQTN3Q-TP_dv_=DW&?TCh`d!qr)?+{F%&C89*v;_dVq*%601bNA z);Bw9_mpR&Rx@3+vuk9`0;6zzOHh{W(p=1}vOt%Q(GU*_vHi_#v#IWJX}`;aI5`vu zkxrtK6Wtts1=~Xe*G*E-{D89o6_DgAny#Q+4tzvw`H80}m$U9sX3LwvR*rce0o<*uPu z+fFpfN_4Fy@S>>Gs6)$zR9asFFK#=ctUov*?57*h0<2G6&F`dkWlU_<+-qE~8YpU_ zMHC-5GHKeeQPkY4Rt=h@m#76`yQc`zN;zUl^LsszTXp8;KG(jCCCC%DD6m ze1HI?Sb*LOOg9`${_B*7b5S?Dp8}X$4&ggEuYjJlEvpeZ3C~Drx?c=r0s{>^2sXju zz^`ek7e^lyr#lafb4QaZ2Z!xFJUoiB7)C`LjS_5pvV_6h0=#jOtE=VVHE?>bPmC){ zFl;AcW@bcuaP+f0qHvre`k{l_!1kZUb~ATb<+#G`Z9BfxEizFyl(UU|J} z1eTk5;F7ssa*Vh!xrWH=-cF6-ReowP;-+dk;H0{yEN(GS&{Gk}rG-?#FfRFA^-(e> za`@87q-%2Fiem$u>6yUAf%`qs1te|Kcfo4Z?P&bPmh0ROIosBoc4{aFX`}f$ySj<` zf;?{hw4KE=UC1KclGRy ze$K4O8r1Eyi~Djm8eAvWsrDE)gdBT`C;~=fIKb7KdxqJD<`Oh#_k)@baqwEFOvAh@ zu#GwRFbr
    _XVmuYP?7>RIjSY3V{?yHpx*{kWWo{UUWKA&x>RcB@>+NYFrFUqs(nt2Ym&Rj+G0(5zelB4dhdyx8-qp4(FM@g=(kp@Cf;AfMMC;(F=&^LKBKP_nUky}v+DSyWPCsO0N7BFb z#1-&=DvEtoe=12^?2HT^W|Hnb!$=(|?NcymqWa(!yY5NGtoFVZ2r%#E7VQ=R=Z9|a z{JALEg_bPQT-rO)-|%zwCY6pJ4##nyPHHhku z|CG{{P4LijA9Wu1Wf^OAA2=I$Td35Qmf4T0lyRq`V0zmPo_>0#e^3cX!+yIAK)T{U zhmw80D+`sv;)#vJ%TvESkO|86C#Zo`4h%T1t)-`wq1TXyps1mJWOJ6u)d=T-S(a9hCdl zedv6c{|*;C$^BcR<`rP#Dy9|=*|A-5XwqGykrbYj9f_R!Z4zI)5AOtBVO>7#DtkCL*WjhBQux}j?h`(g7>wwH`}YI& zet|f>L0x$R93{$TJmr_`_p&!~o{dqAZh404|mWTmVK^4SI2&Vn8auzE0@-VEC>6dS2EJw>2^%WBSq+hXHH4X2sfHI0Ow9g z>9H&rUb0DU52oy)Q{v`6VACfzMvA8!p`f31BgPVn=FZTUI& z7adi>T*%$~VXSi{u$HW{tJPPvb-ff0>)Hey9eT!N8H8HN`n6XqW02Y=<$hn}8w~M+ z)H{J)$VfzPY?ZU#s53Xg1-qM$I>d6fW$c4hgWoc)*9`shh%aGCF?O2|xWMslwIMN> zw4voG=$Me%EtB)l)75~$Gt%SBE6Ci zz5erb**`%(#+eG#gxSR$5OdfQtG?=kZvxA`{mP4fz5L%(H#TR9%rz+zM4kL%( zMDsYiiH#;Q#h!{oN%0Py$w|_A_3T9#Dxz7Ry1pPJp|7)Xbrbl3 z8o750Z(6d>2?Pvxbp>DC4~*GRuKTn`f?am6MkW|B5OI2g>$14{0U7`ou^WpG7g!bd zKXo)^s7z@%gcN5XDM2>hbI|eFq zD#3mTf|R%e)2j{Re$oLv{-Z+4%U<*p){h#l({kV;4=CvN%qvA*_@^uX!2-tyFVk)f zW0xVtl_e=W|4#Y|=E4pJ+^rHUl<%&O8mm_Q)bH+Pc*T7+>;JI#oncKiUAsXns0bom znn>tK7o-bFZwdm^dr-RcVrYs;hoC@cQEAdk=v_cs0!Xh3BE9z-%Gvnf^S$qP{-0lG zekA0&Hha&kS#z&7Yu37VVMMUA-5Xr@j9=6lHH*p1V<9#1(Szj(6J+t`yQY>&`;xg9 zd)SOns;P7Q*N9+WLl)*Q0(6e3RjTMkxWv*f8|0{cs5Nxa3?G*EpEL>-~(!mmSIOaTlfEsT>m~Fk}p*ia> zAGkTq_&H>rGvRj&3nO9zJdnm~nEzZGPxfaP;M*?jss8lv20w*Qs!4a^(xgxOL78ce=_-wt1U%E4>}_ z$Vc=+5Wy8k?-VY-DOK}qD}U!-s$JPec1MdqI!>GxJ9>0Tp&B<5SJcB)ex$lrMh`Vi zU>Hu4A9rf-O*cNX;jY8!5h%>{4e#FCRY@=tTiWf8SgRHZ9?JgV`GN>q%*01Oz8tr9 z_m$gmqVYcF3mEsQhIqfo;@NkG{$^jF4E+ZwT%)8l#v{i`fX}&JZA=;cQLdqa(j=%K z+-}sM?>%r$KC9uv#`=#&HuliYXAYkDgis?}pNwSH1JV5s|L&ph3`vBis&@Nc2MLA2 z!iTC3hojDU@e;Hf#r85!=*zv8Spub$qFE3Q$$J&5(j^v|btw0QWpkx`aqoQr7b(%; zatntcDYN&hG_gBx4MmgYxA+3-c-OstDQpeq>)5)j;~XXzUgFdR3?@;j^sAe7D;1Qg z1<1h@1YZf)(xu(kymtf)2)?i~^fU6o7l{O>p%>x0Mq|Kew82-t)LJ)kRnV9*z{~AM zH*e3xeqrd3dmMGmUL?+zA4CS*^w$_!V&fTY4)~lOwOf+EtU)ii1Lv%o;G2|=>z#a$|XP!zft_zw^2Le@zv_a^lu~Kua5*C@yU0% zt(OX46e{qt-adeDCpQvjYTO+#mLS=CwR(Sr=^UbRABdACc?yy&Y%0*sX5>dM_r-ng zj-{l2)qBI90*6$!}gZlOk8T}hb6Lpy-#%)FcISA zEvn3t*!Ry`q*2XrYbY{e%f{?hH@*XJyVu03Er%2UrduEuHKc0tmpjHqDRCdv9xo?! zY?=tznZaf4v#IYjrWtU%PgSxxdy!JWSY~Hd?uWu zEFl%lnns!$vdlt{yZDw{51CMD@D}_L$*)#1@dX*ZUGOzGTX;ifH~ENJ6=OH<9?JU{X+=> zSek_!fRRl`=|f-d5+YUZ4AlF)U6M*};xq1RR&dgbR=ey>FBxa+T%$2!lh)IM2zm8} z{pSIRVJst{Z3}%m<4~^4KSH`B9b(NGBKB`e$Gr>jm45cD`nC6@YJrm?5rf|?_T$=p zdmO^50!Sf##a zF{<{3O}DF%P5 zgVePaqU6PkH#{%p8~mq~k8(tZfKMqfXi>CVCGmr2jgQF3 z@&2KIg)Vb0bg=a5L((?ShnZA+*ICA4YrV}1j-#Hp+bWKszYh({kHUj}W$v`%%Z}UO zC5qorHMrs@4%l#nL7)^V4+AX3UZ(CAj`zSlB)QNRl&jcDOO;5;H`|uu_vwozF&j;!}=K6g58i9(1gS5_Rh$0tutXv}5jLjOc_kiHSFYQT4sQ zzltB38(c2jnt@hNWoc%M8)wd|%P!gioD4mgU${5e7+G%0#z&=(bL);S`bgDW~54i>FO6ksw0DwaY&#|t#kuVhiGzt%F0_XV?KGhd|v zBK%l2d*^_Ucvk%AH;M9GB4YoxOXB#Y-Q(QB0yvI_*$rngkhUUlzRS5%-t)V@?qI=L z%en}1!QBH8%a8+Q`72fD$~oNvL1YI(1z#V>*^|$VZq1ihT(iFp3gV@oxgJ}g_RhP! zwtHrX-ly_?aEQMKuUE;g(3cL=-h()X_0?y_u=Ly0pOqwt6E0V%)vbxV-8r6=%~XG7 zY1w+&H}FTX_))c303!L;ty_Z=ADeaf?aVlMVmZ8`ip$P@wyl2P1jVS~?ziCv3}BHW zJ&A=9;7ZQxEqUGVFOHQ#MgR^prYZ%F?c4nvA$E+*yt~)i;*JQ(3XYobJ}B>Cswl^< zSw!7fJa;xbx+Kj|e5OKGB5c%!NGoKNeI3cdR91F3#y-_kNwaUczSlf=Si<@S5_`?p zaL7wBkuL!8@^0+MwxCXIaPbC#UL3h9#|&`%2ie-1)6btznsR4REEGgCV+w2`2m{s# z*Bb63CTTN-@eZFJ3dwQ7&IJ0Wn`=n~xB)*W)LIa#R8BI-@_E;(^ z8eD<0G)pSCF8d^iw{qHDzs-JKQ;}ZsE*G_*SI?po*?xM0f{DPx?FBK?O6QUL)5gPu zq9v{TG@k~x(-hGo8?hBs791Xzq(q!`MHXGJZl_vszJ(c2?&hrRSC7Wm7*mdfEF|vT zl7fM^1DP$L9)cG_^oO%|`2bWmJ#Vk5G#|V+gz0-YK0O&TnCaT{jE3AmgH@X1(kjHg z9{t?jus0L`AW)Ufnldpb;Oj#`d}c(-Lj%hf+6Nm1`LOsfcRaytHUtaCWRUtzexIdK z3Cx@BKRV=#2^Fuc>8bqWu_MW6q=WnCAfLR;v+&~E;p;Tp zR-d@kY;5)v9FRahonj^vpafR&kr5I3tL{do)~c^JUHx8dFF3#QW&OtWYP(eE0#bQd zou;lfatFNxitLSYO;hb@a|isK+x#oO<_eZ+FtYeODYAA(sV7Vf#Da+#CO?VSViY=> z6+G-m4`Ra|ua@uvU;wVzRFia_=-kO-MXm23!*mps_X)4vV-f4;p`BJ$qgot$em6-C1o+qfHJZ}J}nVTy$0IF zPnC;#uRQ&zo)I9Hef3P+bj}ux$lj6@oT<^ zLBpxXC&c1fNA(UkW904N8{}e^lk6ts)MMC)ZLodfflDsU{Hs{-tNs>&a^Jm7g=4wU zC{K(+Nyu>dYAw2;@5bvqtJwgX`9$l~$d>Xc6JIVg`n1Ub}R1-hOfAPeM)!t zqaYddXuE=&r}FpjSB@75Y^t8{jPfqtObfa&hNYQ@PH7k8wX23fyli#RWse$o=QX0F zYUALN-Mj5as;j2?v%uvgl(FT7OaDOk=JI`k$^0IX1xX&y94c?`k2LgMbro%ktBU4} za9F4j_qfsw<;$z~63r{opI}!)aK9g6Xnb3T)iMh%sP%v%YTcdVuXLct{Nr^$pI5Y` ztjQ%#qiO0K79kI3k$l!sEx+(JxdYy&o{j&Ckr~%_cAS^ECcfXOk^NkBBqQFVu4wtF z%c5)Dt&Y3sW`=W#$(Mxgq_xJV8IJVtGC#k*a`-#S$a8`=k)oGORXc7#f;pbcve&nk znIBe~*#H1PcS1}k4rr~lzDFdNp%djdI6T&r)&dYMD-T&7EVvup^o>b}0PaoAo$=EI zu&UqQkP!#jovP%&wVI&nK!99vrcss(l~xEpzkScN43d*BhC^b#CirV`fcR13u4H(S zf-)?fktw|Qn)9t=bnF~z2VezqTT~Bf(#90rRF%8a6jQfE9@qhZ!^JB3%nA61kBQJF zd`fyfG&MYnUOn*p!B0a}US(;*`2rY(3uk+W$*v#I8+ z>P3r;qcG>1|LGBxV8Bh|J7Moa58W&R&TAgd+8uNlIBB@pnG}6SRvQgu+7~2}tvWaBo$8mfc4yQz}5=-zg9r z?Z)n{`eiyHa)l|6%Xb8G%iE&%D$BAW_9r^U6BAt>fhQBF#R_L&P14-=Ng^1kgok;e zS-;D$7R~{|M$3-Wk=1I7ljY|8A+&3)+pnF0U0f$iW$d{8=2-Q?yF*E4jd!g{8! zqQ?tn7cDrpTtDaQS?IGCVqRQXsD#_8E`-~&QG_+ut%a>Ro!N8SXOP;6)UHpNrH%q@ zUPa?>U2b2}CnDLKC+5~5nbY3mS{&(0jIZe?Q1ut?6ND9TpQ58ww`g1z?L-|E^%GRq zC3Qkyzn$=*KZsc*P=fkBe|DdaJ9`2MUD60UVpV@-5m$~EZZFtEZq~gJXNW zwg@bZ<-T?0!KGnhuDv^yVDeR^A2P7&eTU{Ku$A6NH1X+fVGrkCDc{8e>H$;;pc!x?hWiyb zYp>@)JSx|D3Df4?;MSo!d;2#M2$XqzRL;OR^wy`ZQ=6Li+WC=YKUPtt1KFSL9Y;r= z^Cxzt?HlT3lOZ^fZ2;>?75C)G%ZWk2SzG(C*3&*M-o;ftBkFW$S`{Y?co=^glHgpX zN?&;0gJ)>A7VJwhAg8V8A(yaC;lrIWN)_d;1qpJ-g&;^`yzFwEM^l%`&X2u`jQ3SK z^MhF6NaW+(pdV4mFZa0Wv#MxeUqt9Rgz4s7^g7% zHzuidzDCuB?EBIebmo(bv8bkPqZo9cmz)!2Wsx?yz5SpYXBT_=Pwt5-{F^V z?bQM_bVz4csml4Ti)W)b0B`!9LcvDtarO9(A1if-yX#VPi`+nSy$4^dkYccO{hS8e}93KAWz`5V6k=_&J1h&@kt^*VsI-e5|=XoC7jY zLZ|AmfkS*GX?#0p1OHQRZ=B0mD-LR+8K>(bkRk?D6-pGIo@DmE%;Q@u5cjTGA={mL zEf>^c`~dk~+}o#=fwRHsdO4F|(y+=Q-7@o{*Wgm3$J~gYI&k8LQuFoR=fvFtVl?BJ z!ka7fv51e>XQnKaG`<&edd^1!icb4!b5c0L(C&CCw|XavcC}27rGJ0>rCkZDc5cQz zprYp+PG5RAb@f#V4qss)G#g;H_$B0?jstr4G{9M;Fkj0>#_0?SS8E#%3S%D3`ohg? zW$So?%UBZ?ikhxviP$fH%Tu?r1Fm4acre=Yk7$|tMA;|9=J_SmLlK6|pIlNb)<4>0 z^trr$|DIya{!79k@u!~G0#{so;?wJ^4k*bc8T(H~${LVA?M^v>Zd?~Q+fP=Yayn$a zdi84DjCfmKX^$jsU}EQe0j0ai^zPiO5io4-bz17c{1sPc!s8Y;0jY!ZSoP$NNuP^J zZl^vM`J}cNv1x&>_zQMFXZZ6jpE%5O+HcQ|pXGn7XX>X+>YDp$tg8w`)NmH&tMnAa zp$Y-Ab|%6<$bN@%GaC+Hiy-@!TMT*wE{cFYI=(;rcmFxE0q`+ePxl`t)T3raB3+7{Dsumkd+&m#)wV}Rwk{E7AWGMgsx@es~e{U&&C;aJI?UJc>jW@{THT!{MvD&AZFHM|a`A zmVXse4my@g0<2_kK+>& zkgzTBj5}U;h~rbmFh|DO^CCyDIDkh+6&8r<(TVqyciJ}#IyiI~y1e%eXMJOB)6$DR z?6^EtmS0aUo2b+6FAvoe6*}yGLhXJWhf>OWWJ=%Dxz?wEs3R$}+sU>c zFVw}gG(|W1&WL$`K5;&5w0M;^Y8wWyfEOpEGq&Qp(ESaTgv$e_`N&_%#5Efb4Gi4> z+Tq9>5OEE#wdG%b4Q4LWpGr{9-U%pnJ`Cn=7_ekjvu?h7f8%mK3k&!_Mne>O_oQ}yq|@JWU47=v=t2CMP0deX@*8bHUgo|I z=d7a-?07)ckF%c?tk;dSAFlPv!0&QZ2GB`EK_O{!-Pg!;ziQEoai=ZVl)?zcFtJ>p zTOhv7mr{DX9@??&^Y>)_vB$Z!J-ywv(hu8`urN1(pt@XrDVj8ZIzfO+@lc!8zz^n7 zq5t{HHgG`n3@Cj=>u2m7{@S#rU%3QNwbslSKXLzIWU}VgqktUN<;*D5%?)bPu#UGW z^ENEgJo2c*3Z_6an=pQ2hK^9Fb&(=lrGfbgC=}~r*OhKzd87ubg?!Cwosz71 z2~;^+P^0e^O#S8>4Zxz{#?qkf(6Dve;bUpJA$L@PNke@>ipj_=SSJvt<}B0C4^1bR z9@R43dzU#JRrXC*O~`kObN<>dgS1WiPb&MJT*FK}s(Y?cQwC+qi?I$J)~&6rL+-im zW%@>t)VfiNJqiJXzWi#RX4QC=yWKuSD`Rs&9)o__8$GGZKgz92VwqEt6C|GkI)zH- z6kC%5&hd%Qqreuz-smJ@N9j6a6GMWjC+w-<(d+zTW9cx?tg3wuk0Vy=-v57Z16J{yt~qitwEvZRJ?)rn#3v1@m1rhTSrFl2bEvd zRnfyzp#jvVr=L&6`Sy2odVET5TvnhHk@eD-6(7?1K{QP0-PjB#IV(; zzfg>oN5<~60e}`iaV->UobihAn5$uDN0|+cD?(%0tGwFU8s?p)(ql4kDn}UC-HUhy zZ{4|n#XxN<)S&esz5$Zizm;kwd|6;zp-*z$p^W!t>{;<{1SwA+D|>8;qWQ5a#flrG z94Pf*p}jYXxOymNGuwCTnLE_nH-$a#(~f_M9h6n66$XA)>GOe)0w@O$9QEZpFbj1L z?9hlFw_qm6t(r6%QaacOIrjJvsbWS(MtX8Tb?P$vSz(c?(mzxcl-<+Q<2%6dmh=)V zj4J8Re%Nt&)5d;G@KGu;znjP5^@BMmU$Sj?ysgJran?67uclYZV=`LVWC@~Xs&OcR z$d-Jx_wy!8`O?l6j}95O+;8|`BVjs;b3O!o!ypX`Y)I28zEZPg3KJL`xmQm}L?Bl?wB zzF04#ld3lWEq4lCXSL|NqLZR1L9e`F63og4i^AuMKMHr3+Sd5@77wsi(sgp(w4&>y z_i2%E72#mP6V>yC{fMC?%If6?AfLa+`tu9%CQBXwL1TSKUJCjG)QbxybE{r)VAR{7 zo4P=?Zj zCwAh~Z4}li-tB8$jiGWb-Jl`AW; zu&>az8;b^Dc!|-(tl4NF-wyOM>zqrP4e*TJfl6DqbJDx6U2E9U z3U4&L$B2?>c-aI6fOTEh?vX~<&L&WnF+fO2$Q84ba~^4G?UkRN1h&y9U1%L;*u?BA z8)v59Q)SV!s;y3BO}(^@M_$cpp-DpK9h8vQzu6kl(!xd5}1 zV(6e)RWi9)a)(SnfD4*uTxz5Boxwr)@5^_fj= zyd2?PlV;8bO;-Lf3}AWzK-Qb}?)QdpezfnCzUcMVVk_tPz*}TwajOo02XYbsxam7p zz24hA%x7<~E{}_E?^41FyM3bd%+V8*nIx}24(F9PfD=>L_f6&`uDj=u8CtsmsUDN- zamNM~%U{pnubjrmYh#rPzTW6yAeWsV`=pz?tMI36#G9|j3m|zM%b%P4q_Q}zZxCe4 zA}h&^>~<2Pse(+mjyDBJwDM@4q8aBV1*RUa^01DbXtQgkd*0weft>)sAipV z->|Z;2Nr3H%NhKQwA?#b)7?AgKbOE1hWXByd|#z!n&o!1x}o%FAas$nwy)m(hi(rP zb^huBKhb%waa(0awOA)eZVLOY%)WydqZGCL?)H6QBB>2)4~+1eqb?6?$7+jJn4<%| z5$_#sb~rmGQ=OwD<2U6HF^}(RzU|IrlKc>PhI}^aJ3^g8TQN2xbEC?~Z~Hr)1NNMp z`V+Zs%E?v7vO+cGMTCk_k%0lU+zMtXaoy|!LKo`o{j#nDXkalbznurkFpS-4sttyt zS`)h*wK+2OFON!v{92(8={?KD+8F}?mLQpyme!E-N!glx!C6VxtLLo(e~=598I!lz zmk{Vzp7fBPW~fwD=R-lCXdFHwGnOYr0sLT;FnB)?% zFn$zsw(@bx8yZT?kK~wbB89o{sWmLGcS|mgiTPGn_j&g!63izagMlJjv2jeVM`v1& z5!c1``*ZLg0sJA_$CZ=oXwYSQDqC>w`H32ew68JLuiD>J1$C?<;CYcKbry?Of?Lvuuax zsb<6I(dN&%^>~?C$nAS%B**!c zO%`@_Mi3dA%Nw`M?+doL{ zpL)Ld1yt*d8$3c>mFo;oZG}%_S__H4>?Z>0+DSmle1fWDmrsJPb%92tP@*44cFaE4 zLOzhuygjJ7C>d+Qg*@3#wdVd)VBaQCeQMQw0_3PK*I*um!dqsTe0DuYb%HQ_2_y6qey3Iy|;tefSb_%?}(; z-XNuKvU4)UH`$OtBvq_W@7sDDFeIJP^efbSjGMXRGrVa}{g^*?f?RBkiDpdC5Mx7G zz)(Q!=dt}_bxt11Ya^QXlt7c!MwCfJC{^um+7$lzo`U*iir`oI=~ZAHSK%in0$nJd zOpzRsv6r=JI@#fhr>V8Ui(1@=!3uY~h(Cmdx(vNQ9_HJW9hv`F*#;&Hc*}~mw5SmT zb^baO1i4wgNS7Lu4;_vlyf z)t{V*_lUDi)vnh;t83H;4IG2Gm_GEOIgp-?x#&~DUPC7z?cV`knbSB3OZoA{e!~5y{8%#W68B#ai-4 z&!u-qLGTCeElKfeLQ-&1N+m~g^WRZGZoh`p`<^AmCU7g^Ueg+-?8t-mrr`j{a3R;* zw~;8D?9#<)*=c@|-uyz*b<>?h9X@Y2WDtXevx{k0HmN_8Li=8?al}!dy}(;WthUDs zlD}<{C|(qggksC8(2oD4w6vM_E6)MQ;7{v>^;*i6B@>nYJ{ z%0rRE3aN;P#~osrH~cCB{(L|Z%B|}%VIMAfw_doCn4Hnu@MC42{gbDHey=$K35Zw|Ry z!{#O_+a%Jg(mPw+fTxl$N?GltMy)E(rIGShmGpXU9{k5=BB{T#avxv$3h+aqz2(Vv zU`WSYNcf&6et}Ag1|8a|kOaXGVbxGo1)G#6CL~n4n3o*B5fGpB&()mQ;=yHDhrz{ARt#QJ?B3i32KfnMkU;4^?;UWi;d{j_=(_rNwg7v9)QuXx@K zyr#9{*HDvx$4|&Xe*EDBT09m7;NwrLV5TuKyc%XV83|{6)3dcMdJ#Up-K~(2kV*Ux z*|AICSTZvu*JXX*QDX^_Vw$W2Dpw6HO5?c@cJwu_Uw7*U4%;8YUr0XOH9?o8-P$7u zk!F+TjK0H@!aG>v>S>tFy;r&<2a>OOGYTWIc0Wwy|7LR_Ob@Ey&~gwb~jrKS~H@8tv=jun-$cp#Iy|(ueEm4m^vl5sxv)dj@y`hWm z8^h@9bLhFuT1l*;H7`g9#E7qg3Tc2jZjg232=BRi_+h}y{&SN*qIW|CF+XWiV%c$$ zkf@x}UrHU#{O!$6s*S)JMmYLFGl~HK#9p7966mbReY8HvT4>pM?Oo_ipEvL7Q)Fc!_&3~x9CMR(r|rM zb#?63U(Fy%0ihvJ!dpGO8@!il03p$FBp5*&d&1ZJSXo*9Zrvj?|I%~gvIGCGy8}9V zH$iOtZQoBa245;6z3BY?=olEzUWCuGcOQ7ZrBij@9;nLCY9jQz;&tVj(VZA0exZlE z@wlgs#lPQ}I*_haNmTAUjL6P*BpN@o-P)MbA;#9ByXvA^hM?P@nTUCq^1>_BJ`GxB zYyF4X3fI=4SM42gw+j%&=xm-D%kP_q5kqCHP*){;>0z^;LWu_^hG;}{@6+*#S~ZIB zn=CBrqElh0<Dt&Vz0eV|4kuw=IG`R5cQ2y_7JONe?y@vQ{bznNeqPBcrKD|i%v zXY2r>>~EW#L0MyJslpgk;R6Tl?Th#7KX6AKD%HA;whT0QY$x&`P^93#7FNFZdtbIg zGQ6H({h@0s*+5-n`ITvYP~pETqff5cV1w!YeOuVWyAg5$hGbpt!Od&DYfnamu5vBW z;+OMH(#85?@S9h!P7rNC5{v>8P69+64eH+<8exv4uRga>Pb>b0w$r7=NXJYBL&V;W zT$jju`mh=Qosq5UaN~-GAkO}};jo>MV?d}@I&l~Lt(v*5C4xX4Rw_X_5xJVyP%gbL z`a&JA62C|c?aAtIplIxvSAbGJc6*iUM&s{m<4xKsPa_5Pv=rvCX@qK*z7R5kJ#cheu{jPDAmZoQ=QGLj6?JMlY{qNXHrrz%<@{o||rR9v;VMi`IT;A9w_j7SE zeFMn$&BxhHZq!^0m34oW9z-atyGsbEm)>>B^utT)QSi@8B3F<&Q};rvO=FX)j8FTh zI3APJdt+hqoaAMv$tO8g>7%t2jb)(vYoMC}dinAe(lJ&^qDXuH$}&6y{E@q@YJ^mH z`FOJGyux3l?@>MN`*}If>IrEpO90EuFuV!*N&|uk{g?{*u>GzS8>|oI=WYxB+i_gq zPZ|g0K-^2m52Pd|>#v8Iam1#0F zHT=xSs=bfQ8lC&%UbFyIzF0WM*sCFZ`*2WozrPTnhmkihJQiiiRJXS=BN)J+D)0puGCV4r2HgHauQ=>RDQoD z{`#awwkNcq^_^E}`W)UnH6dv>l!zoM?s*tx+GE_wGxPU#Qowwj$!?4q)!XIr(>{Fo z&`l}6kW(O_uIs_koV}C_qgc}ox5GtUG%Z)F_2io^xQTMgzZUR=9jzPSACXYoy?6IZ zzXYP-x$4i%zD=^I%j~~(isKXMpJYOAzZve_ct`(n&*ag=hr7!KCfbmz^-Nn6l&815 z8Dd1q^#tA%7PI;FRUVc*rgzKzJ1(JAl@$L!u7;}y`hXU;UHwLn$&+Oa)AVHM!(4Y% zeolsD3ACL==Z96^#*l5#f%GJU3fsR5wVWBqa1Jan)aFB6T)Z24nEC>^5uc=W_kIo3 z2(ITaX1P4s_nUb~Z|S+E_T>cvvdu|H$=$p#tt?=PT{O&>zc;zx+S+m1ePPe-x)=_4 z3#2}Fb-9z!Wk*aoY!jK?A02GIW+rz$msdF>`=4fb?b&x=YJkZ>^9FvPbUVp`cszle zjRU43e1Ixtw`(MaTPq%M+9)n-7uQfoSa`Vo%EU3FTj5_JR4bf&IzSU>1ej&1VAnhV zWBSG(fUP~im_jmbHI5eUG+~L61KETUbJTg?xP!~oYgV(Zv5BI8hW`g!7rD# z?73Nes9ouo!+x-Cfp}ft=5iAvj#?n=vNUafybeT2+rRDke;+!%p_VOI%ct{e-y^XA=jm}XZ$5C@n-rEh%nMsq zdi<|ck3QY-{qy7MPr%wT(XLnn-msU^Tj*=R#Ww^&UEjx`$qak}7oSnbQK-_-2^;a^ z*h zQtyH4?*=Lh@&1J(%iDj|f1`4ifC+uH9jgX&&nt9@jqe zzaaNvDAihNrkZr>XSY6?e{T#4b}^~7z2XxDVDGH&mro=k3CE-C8yy5xrg9I>8V5fd zL|*ar$Qm^`nfjVG`OLu+^hdqVKj0zH&n^D_`~04*t@85SAUiY4LZwGoK45Rb2+HR+ z*0qc%KO74a>Ikf(buE-%t9U{_9wb$_@Zgh3BUj>&GY?dUHMEE(eqzp+XKd7~c7!%{ zS!U$U5WAuN_%kc;k&QLe~{29y>^h*tNYS}m|zmJQl-E2FDGMK|W%fBmAApT;) zpMb0A8ut3CbH|*fXo=^ow z#AD^ItQ#9s`NQe*^at(V>Nv(tm{apbu|K2?TQ{mf5jgRJPw>OBsnd7K$cf*(S<63adh+SpTAObmz!x1r~fMh)jD9{InATY;JU*#&(3 zXQ0~Jn0TvEOuo*tI%uEultdHW|58vWH^)Xg&T88{d>d_->f%5#)=&Wgfs^=JnZfH} zeAwmWnhLg1F}#T@jj+?p|2?8UH;#jt!7d`km2mH{%bj1@PH%kHwoqM+0e0jMfYh#3 z@cz{e0$2^+3j$Mae-Tj0ZtX`r&!1?D*xG({0cb-Eq#I}Db;bXhceJmvOWnQ?Y~p5P z0BBDL`9P^#7PlX#F|Ch6+wuAP;2GZfRRM9=OP$wM2lkKHUG%?@n2vZr$jEi+wr!{a zj1(AK;$4e#tRSQ#KW>+`)N?O&SrhyA`WLb3>o_X~RW&t?rk3hr$?c|7h&x#aDc;Hz z((9gL7FBk_MXR?J3gDT5{U;n!} z(ltESP2{%fzIkBJdgPwbUN_CjOgNX3Y+IK4nRd1LG6WhRCsBWV zrS1au0@kWDxCDKp7_a9QscF49I)$wrs_7Vz5R+|g-NfC-IV|ps4W;>ao0f zK7|O~9CJP2s`P1{i+<4St0X#0{1m&Br)`oADh3ucYf_PY} zOq#?K!MmxXe^G{-K5?J&9MJ>L5q;S<>~>SGML5ruqN3IU!M6n@GM?q|6Q&LcP1b+# z{#W^R#y5nGh65E&by_lDAS#H1)*Ob z5jQ>w9N{bB#GN4&PJ)Po~`80}S`q zjt(V2Nsf3yY6AuvT4o!mvtSZ|@$eZTx7KjJ$RX-~pYj%X%C~4cmKzdIVU$>$Ea*+> z%xSg@H5fP?HYnH6kBSv%{$~f-|8eP20{g)Db=fEB@i~|IcBwhe^#QP&@6Lto$J(>a z3Lmuw*~N**OT*?59RQ6*fr(ZBV<+X$Y&y z_>Y~*A2C3L&O@+^41gL9FRrASBNj)6S`W0zaTk{0;!Bb4yaynE@g5ImFBX3Ggan4)33$K=WiIkDVH7lzb~0R4{^SFcRTW0k96u;ZCFR|J zUqUEMx5&)@4(Kkx^_AIe@sQa+yW1pSZ@!;xOil>;rT3*BjfFU`8+|Sxh!hmsebxgK z1kH5t|LbM^8DC85`GaorBbk0O(ABRAA{p>1N6-as-I&>A10sLE)=jEu9k2(J7p;F9 zUU-Ho@FtmSMM|BtqH&iFg5X9kA%3sBF>}cVH$L+tdvkJxT)I~+AyJH8_x-!>%ya&a zn9u(*`XjHaJ)!%941ceVLsSb`+&t z4{pcYjfjkNz%!kH$9|kV!w0N0iChX?o{C;vgMFEP7M>@G|Bsgp2HLE|rjv;l!1FL< z7UCIfp}J&puSG=MPcI{W{4=QtpB=ibSsjaG~m7XhWZE zmr9$5*JLgbkz0tjyHM|Iq;fxW2vXmc6= zj{To+s48GrWi8Fk&GGzWs;3i2$=%vkNFa%?gkjXe?5^u6PbSY2Uc7|b(Xjf;LhC-@3~|g5dq{D z=-#z0tqKll)&J@<$)XDY%+%aW*`!oYsr|*>?)SQ^0eIgOb-<|X?Ck5HSWsM+>WiaP>^4m!nt#D#xX>Bo0{9s#RMS-cBmy+361x`k zC4bO8nB6C<(fd`&GwCi4C8KuScpLZpA)O45Pt~!9(?un`B406^Iq!@M2P2{)BD&a7 z&T;UF#L*A%2(NXTl>Nt7KZ8eea&oFVeM}Dr1_na+8y|a^k&?ir`Agfl>4{J1xy1Z9 zKyrx#Pe7&XUF6eYsr9ylmdPjtmv-R&`_M-G1OXu9K&IH(}Q89;5G3Ym#LY&qddCWLlE73k@pbi|~#I0XGV_d+?de)(wH09JbJ;USCDnQ8<9A-N2r~A^dfui-VTHI2uh6olI;R3Gb4b ze<+V*9R9M6tyd0vXUfO z6^@y`=Xpz%j2wj%2bqz5jBE`n$FcX09Qz14w(srp`~BCWhw~cuecji1KA+e1LbUpo zc)GZQ&o6N`Q|5;#$MYn@M(%WP?TNMOrFy2cu~x6jlWvRR_Ta=%NA*dR?Iva$uty;@ z#R5SVe>wb;Fq25+Fi7SD!So-RW`)X=aPdV7&VV?VtJV`?^H(1G#}PE@%$$GVJr08n zpQx0p*Kxl%w?;~-lMQu=5wlFN9mQe;w;KaO^Jp}PXE-v_we~2)&i=hOSh~K@%Zmp9?|YcUt=HJzbs=uiEP%#+lc;7iF-+ zo*LgQsWL|QEMK6_?`=-8&K+T!rv9YX4F@*)d3bn;jlKFVOfJ`$j$~b1N2yT)3Tz8tK^Iu$l6spP2hpKP-o|b{a$6DgjXfJnenMDS8 zey!Dc@8KB00%u`3?2(!M`X&~v>^ZK@?E-^chV&Q&pWx+pxy{=WB(6ylHNm4`8 zhxtk*U@M!zZvmTEyK6m|b5V8V2cDkN4UTHSI|mXc3XM;4E(rZ*S3CIRuw`7*yJw;A zPb#5tqw3&7AKHEy+^5@qI&dMx%gbx4Tu6$)COF!i1(NeUSA7L6{aMr=+^!_Rs-(1P zczXh{LikD03XJ}T`4zcpr$h$#7u$WmwYif)?iv{XQn_EMJXF97+O8| zG#+z%l^H{LGOSR`W6eNh$2)5iIUA^&N!rJkn!)g=l_#G)jVD{xXyqtJ=$b!4I}*5} zF6Yk6)?E@Y8jt+G?(rkc#{6SksobbgRF}KOef^bsXCH6?}N2_Wg**r zj_z${a@-E?d#a0~U}3TpaHsvIevQ;??mun81_M)eU0IKlncHLh?gG(^WFn(V{`qY3}cvcS*YH-Oba9`?D9A-_` z!wE57QBZI>y(MO_4d1*UdZlE4+UIx-Y`G=rXc9}TQKAGK{g=0yUt!JY_2Xo<{wX#3n?!9)^A^>0}$soe<%4(_45 zv2iF$GNb)`&Lb{~vplQTNd9>Fi_MLYq;@jlIn+e$=8|Zu^!OhScW1dZ)>ElaE?uaT zJ{c@i{=(Onx1i+6B@s&u`S=xldid!5kmDPSLZeV8$PBwK*Ku<;@1Jn8qxK$;irEBX z$RVz1C9Hnf=&EE%Pyg5II+9Rz* zIyZ+G`+?$;6{x;#kby0%anx?CV}pBUe7ZM%ESt7qhpvXqO*+Y)`|S;68npZ<_~Q4f zhdrF&a1}M30wf7S2RVPy!IHc+z*_rONVeZc-5%-FbK4+JMbBmux$CVT;A6~O|DFhFJ zg;rl6HK7r%W_qYf<-|+GB5DV|Yk>7+xs%eR^qkr&^6ymWhk1unWP#JfcrcE0JzeTr z%$jv{BxbY>;#BdF8bA=tr}o(QO{4z?8XF&7dpW6H4tq+!e4CGNY|HOxll|i-h3W@1 znHCkYui2!BkRW`%kbA{_0F!<icy;z;uVEVKL_uZCtmF!wl=ocHxi)y17 zVQcpL9<(lsd#jyh#@rHDdXKD0I$F^RDJ9t8SEI^>7`{Q5GvcD7g>FSXuNLa$bU;QX zj}qY38e_xW#>RQlBq?|kDfOUo!BMjPJL7jr$Oq=eJx0Yn?xh&XlC8Jq`Vr}K8zrc1 zsl17P^yMFMK>NbGB2c0B;A1rd(*pPhq#{fc>R=Q0$fWps*0tXaPNG|_GSFChjUCv9&6&58ImzBqW{-Jz2qbKbKf8uhIPvXV+2 z$BdVHm6??A$A!@03%)6%FBjLt56^V;gR`3Xc6j3PDHNx-Nd=EPQ|hoB&UyFj%mc`d zMZ;aVB7qvZ+dw{mq$B2g?Mau8>y{4{#i(XzkULhkrpNN$;$KEv15cRId07e_Jt9o? zU+RYO1SuTiOF=E|@;abTb=E(m8McZ^noUE`PiR;3Q zv$OIy#Q5awf|o-6KhHYMZOtT>;jYyi#>N&ST~5DhPYc>X$I2Z~0td~ETLpilk;{B? zaZ1-}9-*cL6mM_EGTILFXNa>vl(E)XJ~1uhTaV!w8^xq9Z@G@)S7p&kUWDKVFwZUu z_TuF%;q#?%HV&m|OmM zw^<|*_^@09%(3vMhs-TzPEo^xZ|li&nMZ}b0;oxCm&hGt_OJyY?AoLNK27&?SfM}6 zcli0uM=rk(T!1@} z^i~bFS4kskwy>t3n|V!$NDVPg9vy^2G&U)S6C|Ya-?Z-XRYQ2X!KU=~Upt4qgS{kK zwsn#gHm<$(0kAWn&8a5FW>4+)uY}M#B_T?;DvX83rnN*{F>c1rGK~nPi&L*LPAg+P z*AKdoIKhM;z*tDBD=TjnWRpjYZB03&{<%8TWc2^`DU5Wu5SEDH0BhiC#2@CPGtrM< zwZ&>|{`U+S3ft%?7gCCwb^0P((reGoZY|$|kL9c3r(T)$JJ)OnQjMuHucf~1+wwqB zMF6NSW)v|z&{`4q0ScKJkbS-()R6KBSyn$;(;pfS`UbcyO$46&BJe)6Xp0A^3-ARjPEk^~{~zET zkK9p5(_GiP=r`=0c0jnk_v+D?!7lw&g}kuz$X`G_0Y0J&lmCRsoqBF@(#0)`>x62b2#;+o5O&cqU{VbY6a%NX82Va zhyd`5r2GVJ`$x3TOdy)%QA22FDf&%r-NmozlhtFn_5ZQz{JTf{ObO~<@=6%J>8;4N zXo)zG=%f9f#IB-jIIkfkxB>K+iUmw$S=(QiSwB_FC0 z{nwWAklQ5V_|^E>xsd;5jGdcgxYHWv)V`JB)*2;1rIf9I@id3;gyDUSr=F4^F=l2(axTSx;0NK&Q3AD!eDhavB5(Ug)E>(tSa$bXRY8erz!fN!JH++wETg4=r^NBNZnrZ{1xQeR2dutcg6H+Df$>>fHD{{xT&%)mKh9XWNYC2CJ z8JsP!D~4+Ww{eR8%LS#zeyicXRZ-{G2(se05BPDyJmGfG?!8I(uGJaE(TbPy-Q+ts zL8tS3(;9~LnXP_o&sPYz?}iX(49Ekym54=Bh&uY_Jit2$?LSRWj(fqSx=RCf-yOUD zO!6+>S{B-=-;PQN1Oe#|a7OBze)Tr8icO}+`{B!hoM&pReL;`Oou(_i z+Q1KIJ&$&!ahpelKB9oMIG-XWN1k4t`)Bafg7UeXZ`CLcM^nV*o~5rpoBZJZ|^`SzyGTw9oI zK5`)nb*33?Vj!Q?n{(yfBkTZAl^+f~xq#*piu!E;w8DtX9a2A88NSbWr99@L-0(xk z{hK;5Fij+#ar0cxRv+S7kr$M|*8B$Axh}($M#?S1WgIJ#j<&QL>ja`itQWj7tXoq} z6wN0;W_)|URF34u;puo%DP{ol`X%YYH`W4`O?8BvSonqx`ef9xvM~lzdACeE(UwM* z7)#@JXH2uKi!*H4$NMUZ>3MWp0I8d2&sD>4z%)4}oO~<_ooH>oNyenVNQn=s#VAY$ zo&+KSeT|K$wXg#PvKAkvT#yE>=k0~Tx2A%`!`;MDp~6wW;~Wr|Fr0uU$_5@s&DfYk zy|K;1uG_xf-^KI8B?0UWvvm*^a;nTRc792$Rg>s{%z$-Kdg&|=(q(PMHaw?}hvjm3 zz<)MH92iwv8pw|UHMbINmY}EAC>8E@z5@XUd=BO_jVXgFRv97JA>(@qrJx;~t6yOC zZlc6!W_KR2DW`~z4mJTVpbeUM=H^li^z<6S=5-<}zcQ@x5{w}EVxxzD8#4uj4Y2Pk z{ue@x2c7V%{_x05r=QoN6M{HVMyj+{9)yO_+{@#x;pdx~9`KjN-_>da)-2y4#iC(& zP-e=zG6Pa*$j?0QZL=l3&4_BS#2}4mz`NIq+1y)gP)eQ;>=ovF_YE;LnjK7y zYIwk(&@+ql@uQt>Bh--TH+xrc$gU?Nj+L>m#T2hLXVL5~=32JPa_|9DX!?S?Dbj*W zO9QCoXjMUhROX~aaBh)Up&@Z(Apy4C`SHhR^6~i!sS0|>wz^6gSo5c;1E~+TdpGg* zsz?lQp16x3O$2d_0X?C3N}(P73JewKh=Ziz-ogr1Adg739fg5(n2oyd-yDEou7Fze z4kQAvv04s7G7=j?ucCaPyTv{lxzGQTH542uLEtZaftP7ir9DUqW%++@U4KtSJ ziGRkmU5fPXLSveDnlcLtjOxiG5K@}NC|M8@mpj&=Lj&5`*O>xS;o)s>qM)_w_~+3E z@I7Ye;F)x6jyg8x4k7Tf@zzr?}Y59w6(Hw ztu>se($20?R=lyh(^-C9D@_t0KkOZA|2`HE^1)9K;Tr;^qc5k1V}QM%^p)}Z*01s) znhwB6X=jMk^7_UOAB&E0(A$;!!bMno%y_J#B-uG6q^s z{uotT0q}BKn>5LLEsBC?h!ZIwAG22Gdj%k#>W;0$BCyO4&|Hto3{1NIO@)4(=NH|2 z8w`X2)nd4k0Fo6(Hpx2~OWez!Iv_#2R2{w)(zJ*Z`~G6?nzx?osf^!s9uRrU%kZlb zaO2f2@oPk8VHegq!BdJ;b&>&<(zmI1fId+Nr-Ym2QV*NeE&X^SpLz$CLqHO_FD7l=K#6v-hE$Wx^77{qqyzFZkR- zwPovPGW>yCnKQS%GEKz3m&H^%fEv_~G(FRBlH<7^rY|+LW<-=w*1s9`JCG;*$cVqZ z?DTy>X-3s-7g;fqCo=DU9L_oyclxr&5%YAaw8T@~E=88*v=-^!2AK89IDYCC#$Ph~ zwU!j{#C1^6H8p7!)y=Cs;U`!Lr=jlyHHF{WAtVhJu!meBF>@oV5(@j-^m z=9gG+>=}}dQhGwEN>cnuR>X#;5qzWm=2?5+bMKbeXg0J#X=cRFi%|X5ea@TOwC;M> zDvf`dlA<@Snl5>93=2$>0dVMf`s%goy?{~b4m@cec+=i9G7xxjk8~uG>Pd{3zp5sk z-h1OZTxq@`)N@%q*E%RD$dhz5467IN7B27oHE?ztcR9sxzf4plycAflH7GJvHyhw& z&6BR%7s3g-ge`E7T!O6{2x3fcGk3L#U&Xb52A((~4#wVHF;}P(>fG9tAHFNL;j(lMiQ+AayQ zpD^H~sS2IthgVQpMnv?x>wEg7BeMtm<*JFcapb8J^gNArftiM{4P0raA=Dqx)Y-mT zF1ARk3q0}&;4J_-=8GnRyvTgnJiAV7U3HV4bQGWO3D7Fws~gBo+@+JXEF1dP;{<7-(@sSD{HrLZ`?L6WS5tVd2Z^U8y)oIluh3s zNhTlnLzW+9;}zX2$j6=#GDrUmbea{eRVW|vc1#)(5lpWbcVfiS^0IoN3Vy%oDG|9= zkj?Yf7%j^qxivSHa6*CR%jz~6`O=LiF_hARo#jTrE;dC0*&1y6iU-m62;P(_tly^t z=gPO6Pvh?J1u(_?fj5O+fF*bYEQ1oIXlJtsSk>i*li>k>$UYfUD@uksIPj}mkfaW_ zGr%#NQBiC22kUR%1jU(hp+KpQYBf(u?wV>$umeCKzYNs8E_`z?WXNE>;p9w5Uar16 z^-xbJ&#(LTek3K;&Cz_OC4PANV#5h{pRe3lu}~)|pURO0@U9fhkw}My5wTB`y@O2j zpJK2UsN7!1ilNibl!9$g&(6Dx^-SNK0=jFUb0|a269F-C-J7@1+l*rOH?*#w^zD<~ ztEmpGCs*fIy%k--LXz#CEfkrpuMWSAcD=w;pUtq@V_2o2x~WV$3gtaI+^)p~UvYLO z8t4^dkfuA5#0jy(bBpyyfnaunh-j zY>@BBQ4Vq73gN&XOb(7>kEtL!BO)(ve^n0Vh#!z|yk8u^V!@OrXKhAgAQE|sD^d31 z5(m1Qo=0BLo6|{bJTSCMk|_@avm(!8F4@q3SxjoQr2m!$v%41~%p)1UdqRgg%knle z`9I?D_Soxz$5zYo`xs0^7N{RTh`yp-d$RiBZ>9i&*I#)Vm>v>RJp0u0w|sV_R@z6R zzg6{0Qe#fpCd5;dM?SXbS>Zcc5#tG$%GFn`jhlx}9mIV)iK14wnbbeWlbR;`#`qQE zl~4dI z>+8d{NQMI&1(i7f2 z-g{6KrlHO`B?(u0vtyTANZAprO6#hPjr0P3a0#+Zl8u9H{u1hp1=5Rc`i@{Z5?%aK z525Va98f=f!mZ?lc2R7U^cW@}E_GDc$HBbsAlg|`CC5AJB zSizlMZ%=&V3D3*XSDl}ICl7c(Yj7_Gv1-qOW_xhxY{o3ZDmYY@8crC{bEGjQ6cO=;&Zp$*RQEZW~+qI;6@XU<$JIhxWfzCziwk7piY|`-` z?M6UI_aQU`N$KgbXD?zn(Sb-)pXUX;Ajo0naSvKpuAV{eoQKA92xWRJ7KAHw^PJ zY3sin9|T1&ZwIh&Apc5##dvH=xfwH;8c2CsSiZYZ?vN+_Sdy`$2sn0Iu;zKORHdST zoA2|yiUOXUr~C>|OHl?qAsf6JEZQL0g7_sK|MRG^x<4T2()DNp+K2PJ=sZ;_2=U~X zmlZ|<(}>qp>%3DBhX4@)9~V&s-Kr3 zvsJ#>!UFV=TcG@Shk<9+khz5mc#sB_O)+SJ^0B$+Vo}%Xi|kz3e)AA?3}j_rKI2!P zK%sE|+o+T;1p%meI7CWilfZS!uE^K<4Ea}S{Fb?aHnTC^0Xh6snmEH%ms`808i}_2 zFxK}z^Hiv_h`Pvm3wwj&D!lW#HSI#`4pS^cQ&I2nZvxYTATJ^ubHvm!8vL$J0=d&f zsBr~Mp#;hnx^K*YZL?ZCv4bQ5TH=N_xW13?40kShXfN@kml+iMfAx>l&Z(JAOil30| zEZ2N!{BI5{ntZf^9Ni<6Z2j!GhxTzC02q8;k*;~Kf*5lbhF_E4lIY9%8lvSgg?Sq4 zbh?&LI4Lu#!nnY7wLyzceN4sgtvwgCFXiKN84iG}CQ@936N}3iW!RLpl1uQq7Z7sP zKu?J*UaKb`ytm!M$-azWJU-i8<=y%o;C!pb*ne}`_*EaY6$0nkSzdph0f(`_ur;xT z6OtQ|AwNXOy|O9SpMzV`&LlwV_ddKlFLn8_@O{E6G3!PyWKKVmWKWuDDirEWfpmS2 zO<~-{JJUAy288HWj8{%6qU(6Deu1hC6yD3oR}MohP8Z5A>XOL!D)@yXCqH9eY`Dh) z?WI=QL`zU^7k-@rd`8nWjcTS*;{5hdE`{4^-G64I3n+WxC!_eZsh1Cj+x`O(t&#B{ z`BIBP&gx-)Pg=!CAdV=c%HTH5Ji;RFn|v*Zjo$Vms^NrmL-cj~IJR&A^&4Fv^Ty~oGtu^k|5ynu3oQa=#)02<-SQxiIjGgktb%0-9)9yKj;4l+7r z?gOETX@9Fif#2ugnlR@+%)sQOX4d^sUAHr1r18PF&up2~p+mJxWHHuT6;cipDw~pM zU(Dzcl$Z=Y#}gFMsVxcN#eo!pC3&<8&H_t*c^uk+Kx;zxzje>t>}}L^z2P5;nbh!T zQILJ}VOmXay>}EF==BNnVi?1o7IUm59C8Jv39$}^rI#b#gixUbVdgK8!$4_`7<=1( zyF%$L?^sC=4WlY8&|Ub#Yq&Z9F2;yX;Xk-J6gH3R;WU~$t#>#DV7fkvStdZ}pn1^X zWFLArZU%JZ&Mj{JeTh-Hv_{-tQtWqmy$4x7R!hB5dA`{dc6e^Bd#Mv}DHoKP1c^s4 zDoV5+D)ynn94a1~+j}cYGw0Wcnn|(6?VSjtL1GZA0`S*JRmIB{m-*l2=FXCuTJWkCW1WjDv*l zH#^WWW|NPtjf{-g`d}e|H)VNf?5zU6))ESU%bw%LlHh)d4vnb;BT%CFO_pgumk$qP z$jA55nm~8yjob-@tZwWz0HRo}uGucw7~+F;fqGD6Y;Yu9<3Q!92--j##~(kDcYx6; zktVu`;ksu@T-!q}5J0G16ttXPaNfbWW*wFG7isvR>n}SkBFnBMK#JDLtmG+D@iP15 z*5VR;gz6#?3a)Z`xl&-^DN_e^fZ6GBs;6+E%M<3^`v@Q+Qfo_8=I(WrT{xpKv=IWO zc+J)Jzw<6=vUC0xhp~Xo_`+Q!aN}4{-&R%D4L$M`huQDqF}{zy5MnPv+?or zqrH_Viu7K_@9c;aC*&4T<@oT)0uy`$uU^*u?EK%(5g1FY7G+t@y;px>msFcWvGEPC za2(BOVe=9I-4S4J@#JGAt;TG+;nXW=IXPk)tMy@etu?<-I>zGerhz?+hgHq5Ofx1y zev*ks1^*c~XaQ+jCD@?}Nk`9T8J-Y__eah)Ux8evN9bgTE}W%*yU!6*M!Oa_)#E(Z zTOF>{@6=)XIs>nwKnR<{1E{nUuxs>dlMV@wPpEEZS`0{m5=lXe^YzZ}t}GaQysV0z z=2IY5NS_=-X2ZMPNCNBHX1S27^1*@Kr8Vu9f3rP}nnWAZDwd9yJ;#L#6wUSPd6SnT zDWv7RFG+k9#aVr_cufW(3=z$Pe^w;2y&*F>!vg;AMTJsQ)p?%OGc!vN=Uc`7RlXW) zz!7K|1_4xp*P@hlO)ow4=P$cgDLo<7=4D^&bIF?p-RJ7O6jK;h*hkAV67hNe&F=ux z#SrjTjl*T9!sd~hVfWnpJ2)$7*AcMu&XOro)&VUBH^!{HZEa1bsAl>I)9FCRbUoFR zKV@`Iu0^TbJr}=9UGcUYEQDY^*#xj@2R)oh5_#@LhLH8t0Y@*V64$vIEwr4M!iumc zP62X0H`6#!Gf*gs8;2bZ$@t2klu|~GH4G>I+i{xu{&Bj5eyw{pUcOt3rnDNv5w=tN z{lCQ@yduPjWA9c3E|gm)kC5D7!MsMA(SaT2Y;gopK585`Vg6O(qOtXgdMy2iT*5>i zg2fw5Vegp=?~wxaq{^>YX{3(~3N(7`z0Dli9h(NzT5qFFKz$aB=DJZcdDqJ8qn08| zvuTe5JsL!xM**DsD`a=E4hC?N6mw1Haf*qc@^b>Rg^hLj?zlLy#&`2)?+>S2E{&-_ zHe@z=PU)KiirBLmLsTM&x-6m2q^AK4N)4rj0#O%aBlyEN*axgOj9|ONgrCkPFBYL& z-CL7gtM7&La8vlzPC!0gV(9O4w`SJ(J1W%a!n3D=PVqk2cT(GY4AoKWI$_;cR5umC z-sTUxKWZo$E~Vw{Nqab2(QCizhy-jBS03Asz>{eG>Q~HQJN^MK*q5O=*wr*qgpLO& z__`Fn9zOv9ML_i5PW#aHuE$6pj*czua!{4#kz(&|KCYcwz&1>;}}J0lh9(8Gr@dfM50*o3)Br_a=x! z)qoJ^LjfUSXe!8wmP7R|Q|w^76hlpJdfBeYqcLz1Xk!kzC2BW@-0F@C*w7}brw+!( z)f8V#x5zC1q;%RD4J_~P5V1O;&PmvI?Mz#i0%=+Vk8gBBo){Yswm?xaBk!yEz>@51 z8yhRZHewmSGxe_L{!MnF#w^LUa4J!5c%qd^Lc1p~QtK|Ji15L5L3rarO+&k`5J07r zWLtNI&~chv-miFSUeG>U$rOnAG?Pa)BLx?EEp`l$Q9;oonZ?%xrwPZ(D_IR!=h>iZ zQwK-d00BnyXlf*jwNCb~pR2APE|Z-M)?f2Zy&!sah8H4U*7$1;RX^YF)(LfLMEMM3 zQc67tF4;gK1QNLkJSXK$vcA~8U&8rxvMo3B%~@6b)`57gXtL1_BqwKiCY+JPcN6*J z!&Z?mL4jOYP(U|)R1)Q7qICHy93d-PYiybbN?;l&c@zsxStkA=8X8=l*#vn9C(1Q| z#6>w11LrbPGuOV}!X0KGI+QKEJIb0rCbDBZ-o`rT04L_Y*4tbGEZUhh6;A_@HU5zA zwsJvQsWwQ)?ouAs`$c1(rJ=*={y85_(dP%SU0p9z@UZ_|r2`GYYj@3acZkmS7z-m;} zh;dT5P?(#RUfHlMPQJU^rSgdhfHv=AMnAxtoRCTafJFWLjDl;8DmDeA$F!*Ka7KLz zoD_QEOT@^EwNr(h&18aXyyc=7{o#GnL}Dfl8~l+GXvzV&v?0KBNI_Tr{fPae8Ns-- z?&W^@>KW=8&^8N{n0t#BG%;r2l4nrepcG}8(F2jruyCn;c~Nn$L5Vh4+)^CZ1i&*O zb*MHpF!^}^`jgn2lYn`3;HS>d%v}3T4>|)Vo2dvjCt$^RE8b?WY$)3WFUXUQF4~uL z%a`SjtX$GsKR;7G@MgP59I}$cbpu~!rrR{)5ey*y!^jZf~0{M6pYJ3?$w<=DYFalM?&Fur3l}fOVe$bH{{ay>)0Q}qNbJL$B zP{YJy8k!cq{&=2oMJ(XyNa*o}L4&61QG1fI)-2FV&Rt%7R@QwEOS8)GPnNKZUv)^X z(fE4g#pPNG@Db%&>?}znDl-XC2*4G)uCnt#$pdfGA<se-9{d-jaLebz?zrYOuLN^0)iBAOuT$zo}(~U0!_8|rI(=p5h zFUI{I>kUzedir|e1v34uSQ@aoXTZX1ggVo+(mD*g9CN)=mpjG5+5Gs7`@YBIxQr_9PtWLyGfF zyBzXJt=_x9dR2Lod0VB88FBED{J%q^HxPQpu@~@@0DCT!S?9K=_zE@Cb(YJ6Wgr5o zxFicab|hHV-+(%o#3iMeHhB$dd&~O(frBP^T2S;@WlFUuGJtCo1DT;eWcd_HCd*C* zu#%_9LDBNy>|a3j2XNRaXdn*cJ2Zi#S=KM}!&q*ez4*dazgNhCkqK1zKsZF{ax{Ew_iJhRmS=G>rc6;xIuB_ri$CeH3@rOtk1N z#)8ZGPzoIh!hSSxI=3Of2Mzvx3XJ5;hDY|z<;Nf1itVUXqdr+9O_E31fHMS6nFYik zn4`dZD=sD`CSS0x<%AJl?`LCv(Pdn<)Bo;OgKxrB>HnR(iS$t`Us`@s ze~@RtLm1HZ{z-_~$V(p80}X>=cKdMa&j3r6#MyluZMgZn z`4c;JV3#ub0X)32_+EHydxR+N%m0!SFp#C78Ysn@atTYbUa@-tw=W6rQlc>b)P^TM z^)9uOGs}hIfEgcwl1M5K{0(?D(0S?f`_5wO7aTTl5>5Ey72E75yu9?FT=F225xJcF z0LhKe*_^Vd^;!xB9>f1^ZJnaJ-D(f6hL3b~{6?~*Xc;tc)zeG37Q{;+aCK09w~Q}v z7bS~$nW08)yI^n+1eAB(u=&*r!Oltl(AFo)$ecJpKIB3bSD|E96dPK>^{5jI&_t zuFJpyXBGzg*joM~bZb|IcGe9_$&GSFngAL!EFjjO@!}|B3dQFJ))suRNYwA^-fdJU z);Sq(5p;rlKEbd27`T1*W*_gi8+$pRA}Ep*MuGB%c6suR5~sC%RjZ%cGcXFp2N5W7 z$tOS**Od|GVOkwhtGO)6W{q!6$i_n4CY%v!-xI?%C?ql7a$HDCmwY zeS>fmK-B1GdMsNXvmg$FK+fR`%8gvSwL&Gx2ws7lxLF1W`g|!Chp4k7Fbc&w!yjX5 zz@so!$bA|H%{u8RqZ;0=cW?mQAG~U0vq%?$7ix(;y8HyWvk%(B#xE^!|69z{I3Mo- zdYeK4)J%JHHQUU_jDChrqHTgjxw~68aY<*JyJ7;5R@eY3!C92mF#C>S57~Cu*!Z8( zz=?lV!DtU6@_d9nGMyhNmJ&&K>$*;q0dZ@A+{p{SiPvKdWW56m0(z;3AZLL}?|7^B z+kou*Eha~vU}O1xMC}t0prnkl7%e3GGGuVbd(jyLJQA)!c)mc$uX~uTSXgPlp zxe$@tUTV-7M=32}?1nh-0O_sPWh-@?U}<8k=Fv0@`MoX1D-)n;90PUzFMynpW{A~b zs9Ol}W>G@1H_jL7^El?Ojl%!bp@FBevQDjvr*#w^TZW|YzDGb*>KH9` zCo1#nrRG;}zT5T8XB4u<+t&j%+YSF9V`D3Wi%sJoZvsv4Hw^t6hU>avyFs+GKo}R2 zEQ@gg-cScx*JZY>>tAuFL&fEt)AwitvlL$#0iHs67-L#+A-}kwAT63JDigFmARE5! z)FzKg*qY{=*R#xQf@}z!C$8p)%Qlja!0vf3+%swyonLwF4KD12^s$N>!DbexfnkSl zQ#}v@=VgIW++*BH0%k3yGGRPvL@u+0IL{W*>BL0rza7KVt7ks) zK>E0R8N4_6T^C^IcYy8}T7BRNq=VCiG7BG*F<2{4yyg(Q!O%B6y=L7;5g}RXp|LSp zt$i9CrE3G@E`xGJPDAVZXIowB?r)|lmsm#a!SjYjtTlpsVp@+m@H3Gm01m=`Rgo-#)?Le%gz zUH+FZZ3qTg(l;BhO#vd|ZWmB>OyNVSsKOFK zNXUTEglr!JD(G8%^#rJt|Do=!@+lxp>q1H<)OLWWb+s%KFbKJm0Pq;=s1fnG$(VpT z(UOe6MtXSX+@hO~RYJGQI%j=}m z?bf&|fK*`W3fy!rdreF6Mx?HTtA*NDTs zo#kdQUBK^~oeD3Y`v>yX7z-=r7Ju(H4(R5P|1s*gCeIA{i0rNHa7M($@!$R z`QL!d>%v#9ofbC8n~gdTb$M34@aA7{h=4lMA^RJ&3QYwCuR#Cz`Er^E{5`h`H5~Cs z=RFe+;*AFIgIIwFk?H%oJd^I98%lk{0HCsabjJN)k{vN#wUB)AAInJL2h3otq${%S zQ*Z@Vt9vlm(rTK!#vs6y1K)RVkyX&C0R-zq{zIwX4jLOsOOKRmqkxPV` zz%xhv>mK&;g~3EMyXqmn#q?LMAh~Sc@8hXad+{wIPSHfY)|CLnK8Ijc+z7X$#9Y)o zcu;y>&R0;>9T2x#U}n87@;0Q0CVw2|fRn^=X5~V4m7sx{x+f+p_5nLj(JR#Pou*!U zJZN{-L63hN9fGq!BR}!Tcy^UQmv-1|>;dl8j#w7R*RXKX>O@wx_j<337qM4C_6)EH zAY@dFaJT-e294zed6LAdO{s?JJu# zDkV@485=hh$+E zmC|_fpwc5A|I2qaxb7kr-k3(vbgUU}HRzm5TtIebPJ_USp(8$qu)v9+Q|WY`&js+) zNIT>>U-Cv!F8Nq}yPF*0eWiGX&OSFReX5uB;l6QG&_Yo^P#+Be({+V3-+}3+^q@aW z$D*Tac|dR4-=ua)to6^-L5lWNv`<^Lj@EIR=fIqo+|Eyj;{$Pon~jZ)p&|2u z95GfD*8r`uTAQnTTq#{RAn~v~ULzIx#3_!{Xu85S?9fece}4d>bM%YMXuHQbek%xJ zf`rw=uAg}xJwCu;WYgT0Y)6F{7uNXuU=mB2{pCsk$(Pbi8qDBX|N2{+7cmzR`xome ziUThriIz$k^@fK6j1V}Suq7_J_m0seVh1wM-9qPMJ0l~2Yg?|+Nip6I!9m^?c4=J)Z9Q~$BVTN51iy;yy(rkKL;m6 zr8Ge8T|b1+1vo!!7wfqmM4Twe%guFJHav_OG+^>qy8(oB*3qER4}d6?fV`n#XyUHC zxPYFZX;y^v#lgUAF!RU?I+Sho3rQn3rKhGAZb|nn^*lE|I=>c{o;S#mY=ib!x~MJE zd(b3~TeaJ>Uec%fDP)6g^}L#9C-Tq25lPJ50^q;tf}O1 zoyQm3#$SFOt?i?J)`K{4pCxGfjXTuvq~}BB__fmk29ih8Gxk7I0nlB5+j5$b#qz$e z^3*7yj=EMs+utOM>aGOJRhB4h59$}bUru@zjQ2}SfsBNJPqRa67B9{u@G?L&l+qxf zE+`iwZBJRLZkm&hUIjlo%nG~%BTiU7@EVcCbvZKJ;yvP~6qQn$_yZ2xLt{jaOdI}B zgHrhXR@drZsLG;2$4*ZiU6(v64Cy0qZy3Lmx>f_>O-9Tu>AgxV+t-vjB9iGc*2|JH zqv?*ZGK{jCa(VjJ0+`Xne9w2YqJ>mSXGBF*CT?|>r$}tD#H(a*#4r71m0;9$2IgJ} zM%Y;9h}D6J0EP!70gan_1iE|cP#d`;3&pMf&@R)1$4?Xpo`MS&O;$Gay0xt`@Q zKR2TTQaR9i?_flkA@*L^D2<52JNJM5kw~avt2o{#>Zv=js7ecjZ-A19rWvR} zahz8mzXH$oaUc^7By}s-anmlQbA0R5095{ERRFtq#wI~#{6r6hA3(e)VbLiBVSuC0PDss-A#bDqUew|9x)Ysg!y0^FYg(~fd-lis` zPbG?$>lZbUTm2)sve5AczGAu*KclcCzE$z^-=g?N(`)e@(-DsiK z<_0RC2ZFq7eljHH&ORCf7rj_I(|OB)16}<*b~3{ zzabJ8H+2FWAJc`%U(ywZJwB&*2aNJ%RSPtE4_AJmseL2Sc2pi=)M9pRfWUMyzZVIF zg9-8y-n^5_9xMNug6wjcySiuEf}8fCMx8p>fV!be~~l`cJ$r zgX-BE(nK@$zI)=207fp?#@a+X)5H8XQ0R*sxAtuhZ&TXY44_Za@*oe?Y%8yk1u7nY zxCfj0?~FSe>y*Di{3lx^Z0%KL?QK0qqao)i@^KRk2qfb3IOH?M4; z@NGm&iY(1V%qZyOYrzv>r3OH>GX&Zu29y(0ZXb4 zv?Ec$wK`;b*_&6sCkXAo)$*Wsm^v7%Nw)-YVCILb{V%{#=)dbBq%v}@)@1l+p7h_l z$E~1`7=I5Njt}~=KckbqH)_0kotN?({*KJYN0iD@G}lcX9@la2P$BwXzH4{O$4Q64 z!-0^NW{}nMvAsv7oFtG*P>$U6=0&_)?^V~zm7bbXNhwi}h{fatkesHJ${4?oYbzqa z%peNxuHGn_inKDmeEs@(NiORF`ReV7(vaP&sATS9zH1RlmVsCA^UD49zrUy2V& zDq#9pVJmi*BR?^bGrZ3+TVGk-(YTWW4Cd29KcQXZP$0TwgX`Yge3ieI{LL#a*NE@6 zDNh#?gkizKKr2t_CFix&11Q3`NGF?XP_e`jxx9fxJ|Sv%VlWFeImC#6dM;W<8(HW2 zXLBq##qA$lzI)FMiTwCkORz=Q#`I=nqnt)|U8`0j8%lQZUu@J(Ndg6$^nHWSKcI5D zt7$K8En*(ou;zU11`ERrG{N9=0^Xd6WZA>^2raP^SsI7fODnz?9im7%UEWc>>cFh| z(YFvzH(sZxeOLf?t(Dj_Z+{O%9oCV<%CAM!K^@_ndW%ArWdAJ|#IDI;#M+dqLGBOv-=u8eUTb8y~Q$YvzksmhKL>D086@$d%%KO&7aiuqxQjL z4;{z`VuU)*kY;Y17%+R0M`$JQ`UYnCG3FyPtM$RskSj^#}cr z=BZ(EZehH*=$kHlHb`)vH6QQBre`_)E&*xN(`UOhutE^XiABZ8sdIW$wf=yVbYFTFvl& z3(x6;O&yi5i}&%s?0#n5fsND!a%!6Jw*Q^vKlR(Mh_$&0e4N865iD)xkslA=sXl1p zqyEZ%;xW;{yuUtO7sv$;h=5mm<##`+D{(%2K31SkX+XSG{m7*vBX1k}Jnb<6K3zJV zFSiWejnV>|f{b|h8~eV*5k8eqwM{_(1Cpq`h~PP8qACTbayHi;C$@wxhFAKWQbP!H zLQb-19mV+m55*Q;<{gcF|~bfEx7G+yIwp@UXx zOr@S}h%W5|1$QJcchwg6`o8Bw=s!H-RnWAQ@joEv!}c~oE+ab`SHML3g#X->q{EW% z!lc`aIy>#4h2id)UT`Aq*Z~J+nZ&z(03`*>urU*5LB z;vdHw7Kb2CA(Eg18-zN_0&ZINwy#69F!>t0y+%#n_ONjSJCKw#^A)Sp2ozhvVI&X# z`St7@Sf>PbOlSEYaT4$!w-KnEU%3_LyZvWYMf#0dUWdkyCBKpm$ANnpS>+6N*ZCRE z%Yw}-i1Q0}obwweNfkj2Z-p8I-IE$P7P1uEOQF4e5@FeGc=h#-%&la^AwQTY z_8KZJZ%qn>qa+YiTz}f1Loqv2OVQfALtJy7o(I;-t|4p%v%dg545od^;Te6fG!>;n z*m^T2f6h_|aW;M`=+Lx^x`_D>$>xclH^9-VQb@#<08Inn;t9OOzGaTzX8Z-2^qMos0 zR_uU@}yW2ipohk>_zV@uCeDD~R?gRhK&zD-|C3{0mz) zQ7_b7JXNip$k;Z<1wDMIkP0p+txUb<24X1m!Bd3HeqTee&!+r%^&okP;0<*%U;fd0 zxf=K@9(6YvYjZu1&*)$nT|!QEotP(86}M; zeS_yop98Z)T7mqe`K=Y(=Z)_8ZK~PJDPyPZA{i?UA=9_BMo^S`@{cO$fByHz^bm9U zs{@9Ec_j7`wWBbIYFCUoQ^feIo|#{&{Uc2JbC`#Ieo5{KT`Usu$#%OYWgc+${RmdU zT|R$pVIG;Z2jLyFwC6`JC#c73op=%naS66O@Bdd2Ot`Yi;C${Ev&gi}0MA_-{C^FZ_KtSNv>z1a5S=_kwj4|1=WoFO_A0(@m8 z_}tXZW+CusNp@uV6zg|M5G6}LeE~QTh~r|=$>Hhf6iVJBWc9Ya5lP8)gVN3LbMAs+nC*d-D7&aS`fN2U7&Lg zY+R_rIF%QT_Iu%KOCJ*%-~2SGmlsT4Pp)VToK6b9FBm-VQKve*Ln>{()1w@le97WB z(FmZ%y!{`=jw4&<5J~bp3@Fr=;jrG>USUUHMQif3HOM7W%UGNHj$LKJZ!ix??>=7y zzq|fkCy4`7HP4h*q5B_Ej#{<(uKn`g#qE4fP^(}%$oP*sBErGGtIMd$g|#;glAJ=26hX$IM4FLLOE^MU|} zbJo$YQ??R8N7Q(1?SFirbs|*t?4wd4FjqtRF8obDZsD_Og_-Ge|NS2~xZNE1N~y|t za4pc1yQ^^9^CQhRbh9pW@U@4F(X`izmtzH|K&FcpCmoHl$pNb>%ZE?LxEqxxQ#{9! z1gu2H;C*W=wM8Wy! zS7iST6llSF^IU0&`wi<%JblakQO9hVm&9MSq)K5`g9n|twJt(*tq*dMmP9I z76VWmdnqx_x4g4PC}KXv{6NF#!*y`@HLa-Tk$Q)O$Z-WZ%VmT&rS{nD3IRsWGh_aJ zQ||DNcOj|^5^erG0PYU7COLx6HGN&A%^H|fgpVFkn>-x*iuqJ#zEls>a2J^$@kac- z$o}CxjAkY4C|vqk*4+^VULj1_zp>#Rb#K96D+=MQ+o?{QUELlmairyjqK|Su1bur? zed4*8jN__pq^g@G1;z{xz2*cnMld@LHuQV*oLtp)?KajnVVg{o(SLm+K*I#`7oID& z6H+|QFh$RlS4G6c>h?8S75)J1p#8OgU2}$0VY%fF`afuTvYYv7x$;TLtHTn_bK6tIsrg8i91MR@+QQ$_*k18IaHSPaQt0!s4w}RkLU@lJwv&-Pxp1W`g z6k;uHfsg=@T6Vfxg7}xn6L;dn2qg^xcx6+BM@CtV;i>%}AH6>>b+YveO7vIfO;p%> zzzhcqLoR}cx-r4VBD2XR^2QvRP^if(PVgA)zIRm`%mNVlMZe1LoA9uD58GkDji6M6 zG9!>*-bgdt{$Ow9N%!@Lj<3JddVgRL4e0C-zIC9h%>J-ram0uoxz#mkoMA>7oinx& z6~JGZ-zZR}XySa6FReA56hnq#NDv6}$Yg{E|#VUw*92+*Gs2P0Dh>Vs=Sn4Sjj>N(y% zOBiq!J^g2|Ib||CElS$Q@Kh@;fS8$S-tTX}V?>ayq9!3>d?WJ5VTV4I89q@3vuaYj zdC;TGPkYX8TRrvTu=$@2skjWePIo6TAc~wfGWla%nev%2=?P9T*g~R9_3uG{ZGt@b zjBNj+C3;ZPl;=trAX6Z4k^*W!(9=)+kvEUpJl4@9{wiNgUXh4yIwLYTpO#!=&^SMy-?|qGb#GP>^=FH^E)1~C|k=0K)w9waI zGoNJAR#>Q z=VR^owzuLt>)SnkNrs=CK8$z=+V(r}qBq|$>x{leZiyg3UVjxK?V_LlH-=y|O|Q}vZYzlAuix%A(_3?< z2W;_jXX~~Oed{nCna%DwWi++h1eo}O&GwkE@M(R-JFqLLain0B%rie6#H`RDvXX65 z*KOgMVt-nKTS7el+Ewlur=MU99?x&64kNoRAzZgDXje)o@A5k7_Y{1mAlKK%ipxxF z(?+$wW+5`ObaSzp62{uFoO@C118ule=il{n{U$}9BBUH;_uy66qSUVg8Hb0>F49h1TQiF5q1bW$X_Z@{ZMPs9jlmlh( z%rb{oYvfiiK~Ltc|2?6r(@&-Au04e;9*;>c!v393=2(!P-|+2rZRN+19I^uUNI9GT zX+;1@Ao|C>-QTlA;5*rHyCVzJ96N5Ld$iu+Hv}I6rPwk;)bX_jZ8WC- z8bcq={9ZS2#@+Fgbdvf?-ra*x&H7P0qY9Q+0k__^rS?9bRVO+oMuwv1H@qPUxlN2p z(M8P9DNgp^Bk?{Om8uEpsJKu)OsgN9k%W+Pps}PbnQ}11JO&sTIV!`Rj$wkaD%;HI zRrjtgz2N);XCtlCtcjshtn=t6 zmsDKJ&+z(7VjOyX_a+EY7Gl5qpFYXXK7apm>SkC2FRJB_ z?rQ+Zc1yuL@E0avR+zBp z=U>V=%EO<3RUl^`CAD!GAMh_{4JO6?tOzIpYsx#7;n`0$*D z@X*l8bm#_2wMXfLIoXEu%D@8O*9MRPyfk7B%7q%FE_1)F-8cWFdD?hMBF{hweUoETo%j> zKzOcL+mOjv7?Id-ys90$n?wIi`#^5;PTKmofx2+UO_-Q7crUr-V%BYrsJ6&0OYkRw zMDZC*i7)|zjJZ0zFZd)OVywV2D49!jWc(|k6KMB<=8Fj_JX7~g>4VvN|jOAJ4A zaiFywzJwSS^yabTzRwq;mth%>Sr`qY0rQ#_E*tdsn->WU5gV zuy65%f!`-suH)eOXFk8-iCC}f>8Nnceh{I#C=z?$=PpGV5=bN1iZpOSnzWus2EU!0 z!^UqVTUPhUOwacGK8?W1C8?lH&j}i-!=&Jeio|%#O6T*VF<|5XnC;n6JWadbOFemc z1P}Oy0f8O%cde)5)sPVUho{Io2m4xuN43<{Ui;triikBGmw)j4g=iuO`R(K@bP1R8 z3|g;4?r?g9T@Ch^oNfZ4p2e7SmvNpG{$pUQ7Se1uSy891QKk^7qCc0!CS@|GU zb1CUJxKOwz@Pq5I(Vn_oJK}$JcrXLYea9NTkK7b*EHF0|nZBsP*-~Kr)aDF0O`_!r zL-E=&6P!0V+9n9^N<)^uLi3gn81sB?`{#^_*g5hZ#3`W6DY+++$Uo8>zVhVC*mi(YKy0H>bk=5_~9OUr4?@ZEN=8W z+p&1y>dpS}qWK!nuWZJAI&a3(YE^wmUO(F7va(!wj>@Z|X>0UQS8Lbk-P^#WJP#%- z(_7Te70w%FO%ZR|SWLhDE!K6E-t(i0W>RtZSyqJ}sZ$*5Qs9+4TITCH?HdZVN|I9x z`Dd5ZQF`)mL3t4ZWm&d@b}zNi6)9v+a6TjCym~Kexh9Qk08p!8L-%sJM*)@Xv$y3| z$_68POTSA+i;~-qjRxbJ4D(vMy5J9NT?wl?u7n}LJz630I)lT?&zxJh zT|$O_J@6Rv$((kcjw#7x@F_&eH0yU|Skw;FO2b$nfVgyiU>Uq~tDXP6=YQnnxrN=bpd+w%08_;*!Cp=d|RE8pS}iZh$t@JuHEj znleUFpDMNw^=3^B_Rf8Gs-398&FAy4{3hfK9}avv;vd^_^1Y38%PIpDHz%itoXTw4 zY2wGGQf&zK`gNjKP}v7UExx$pv&(sS>!DhbgqTi&wBNtV~3AVokbPHvP?1W zgUof=;nPTW6nB1B|F@HMA=EkMkb2i%J@6=I)@M=Y3rC95@BNyP|63QUbZ%hzwPJh! zo+dIqJ@ib@1ndgC=~_cz)hNi8oS)bE+B+n7-4o3=kH{t$)UeZNe*AI*3G~_7+1F4u zoeR9K8?W_WxZwf!sDcPipJ+&bEoJ8V%En9L+hVN*-JLHAHY*Wq{o}*WoD&>^kw51o zs*OTf14mtoS7L-8@wR{kz+JM540ch!0U8D&tSp)zkvb~n?Xh@SP_}9~`t{$fxk)Bf zUF^2F2S(4Uyp_K}Zi;V1_o8FE*3a;m9HK$BYwK{P#(g)qIdO};7)u$Y zVAfEFp93q2T^5dab;Arh@1ORF2Bq{R12jHY_tW9Z4nKLc-qeUf z^t?yM1FsGvzViFF+z3@Ih~)q9Y{E#IZu?=FB9UMjvHE0Y>`p0hW^*ytRWJ2K(r;hL zNGe3mN`xw*S%JDcHiKU0A#*~3YUN>_y2jnH$^W*=8*XNS)S@Yw=3B4{>ce;1s zwxWNW?8kwoSR03TP5OQ7ui?ewzKB$6K}5!6yN(aMGyTEsVyGb#y0~b>fJh7O2+kFZ zfS+|GJix3NpgHXpCba~lmW$Z(pC)w?6TJ2U0Pfp~`l3M{>zB{GX zGa{4%yNzCuN6Eb1+{0F?YQUnIVru1ga>!iIpyDrvA`y2^@q9mp19QMu-7|IX6G=2b zKGcwX-NyS?VC-Bb4t8-%eh_%A$VTT(v}!4YOpG(!s=+DG6H{Ow@kM`qy(SYKI(!8e zF^wSbs#9{IQ!o`q-FW#|`$R#{VDZt!6p)SkFPGw?FAQK^b?4u*OE$E5Hz)5;`w#Y9 zkczWoL|hvb`;+Gn2NW^dh5cC4W*YkWMidHC*(#_ZRuJX zhh1V$-J-g77Kyn{Dr!*hkC*y-PsR#D&*T}ALIfySpSzF*j`RcV|#!D^7ii%F@{L4d&$>e)s)ab3Eq7|Q&96W)%(V;lC z(u)Z@{dt^E0i|bBH&cA8(< z021tBTBk5U*+}|5qpL^%z%@`+Tb&aWLPz|HT3@#cJ)7>)1ui!im@!4s2DoU+u5k?m(7gCb$rD=#4hfOZrPK9h7ZX>+ad(M{gAc0fuS}f4K zV;b>eCHfI8?E;tG)>P-1555i@K zf#uMgiGi#^D`re&NOFHIOXr)z{9%`;k-2#w*YkV01u zAn7qi>hoM-va5YxM#t;}%o~%UJ<^kUgo7`5Z>9>$ZrmpqSUx$E?Vt z>No^scWLk3<&tltnFdk*V(9J5Ved*En5i{{*<4}|bw5Qwj_odM5caj}9IipS)KtIEjeeU|eW_90DKB=ZfNwA2REH^Sj*NGjn^=vdh?w%9~Fk)B7?3Ka~NmTwO zBjCFwcqRUXFN`b3Ei*3^H8@K|7 zzUp>eQfIiuR}O@zMp@TqShp9KGvsNx#j;9PVplKrVK=045*fJh^U8LC>~}Gfwd}3s zsf+GyFhA9CB?j#=tqA6dcjo6ELYy7bFTmUFK4`ougljOwCZF@fMISLzOls&XxxKl-|Fy2t#!fyuw2 z0X)xCT!2iwo8Z72zc~JhrVIi1zTHIQWKq$yI&RBt`tZYA22%tRb_QTMO+GFomQ-92 zlBDqKLDpb`41=I+F46s+TUsG*A%zh0M3?*FCtLLCTK1pblL)^|Vzd!<2U);a8%_UP z7?Si7X8YyyB4@$KxjWcxWSHnN=)Ixu2F&$Gq34WJbWYU^8f!~o?^XeZ_#d;dT1eEV zV|!0YVThYP6o82`yJ){!kK?vt*Lr1-#06E5>ji}#NaKtg1zWG=Gz%Nq4J^ysPQ*f& z*ORePTo{7*8Y;N%cY^18F~KlPxAkQ(t4!17BqHffpH!SQgT&#V^g?)?3m{F$N&~JP zPCVc7gV){Nmh-e@@=Isn@rn znwmhi-lVGBL*@{4xm#`lk0FI=c$SOdUX+NeZ)Z3T@7*J^D@KzB5OXLi&6Zn4%ClK` zwD`SfHb=Qfz&)gRCqljjoFe2cBkpIK@7OUYMySux-A*rrSB7qdy?@mQw^jLe%l`mm z05IzWmOj%Por?}0<8NZgE@SB-5EMboGlL}nSm_as@$?K#Uy?)PUUaIR8Qyp;EIp(k z6;FhDw1gOv?x&YQtTJ#dnA)CDf0Aw_ugx?^QOdmDg?XKDVhE348r~2synRB!Jqa&8 zH4LwvCdOqXswL*GpP0C%G{F>tm?AB+A%#uf{*}Iae9Q@@M`N(-A`S}kNW}>ZZ}=08 zrxg+XDlIp%$<2i!V>X#9*hbDBP7ET1i&Jre7IjRuczjWR)yQT<*R=^$gN= z2-LxCT}k>~Vxca+-&lKu(Lnm~HSZIn3EpLh&DW5#$-E1uYeY*7KO!6P!U*Aek*poF>E z)+_a}caD&J9VaJL{g65eKg*W2hZ`2Rp)r6$t=F559teMwYU^9HQ@`MjmB{452uayrDZ*U`929EjP^i4w6+tC9B zFv17A8KX+x;nR}BmMCOP!{epk3QKd_f3X6{(dnV5V2L%8Z{^lp8q|Lq<3uQUpyoWh z0W{&u!*gMQ<|J7u-E}uVIAkz>O7}c{u#kc{){Bicb{Qz!cU!vg1TfAW_e`c#36BRd zHq5)R?v}J#_UL1ewy@I0r-Ly}|L2)Lmc!3RRxB*-xbGojJ~JAg=(avwvjW~euhcqZ zlvexP*9j3r8{jLf_LNyPvj$^jHe|5;C#L<|03WNMZsDdCKeR9!4!P?a(@BLCb0-X@ z49l8(rQ0n&K=<1+4N-7Rl%f9q6XE@|L z!B7H7&Pz*6gx)KNC7bFY7hz-VM>qYG;O>eUW2ywP?%R2CEXYH3s;41*n?5-e84NPe z0tfr$Q|Fc_I?t&Md0_JmAMDZ5FBmA~VyxN9z`96?xF3G>qm$n~ib}<6VIN-k!IZBa znrk@Te*I{560g)@&~fh{vM=#Py9^`*!$2J;ardYyGG1WlPe=1BY6Hw#!0i1J2Wo3D zJowIxiJn$8nf?m0@O0hnl4#gK{n(8oD5^d-9f>;~f?t10&eYu#yPP-XiTWtqFv;Xb zTU7C_t6n@l^@+b})Us9&o5^t^K_V&72+V+fGUo}EYFOc?qfj5rh3aynYB=}gKzL(r z#&p+&yn;-}7GCDTw2G{&PV{ao)-D=MzXGY2qhP*&;(u6|Eh~F_`2yb8$$iKcX-9sf zJOxgldsN?aUva|P8mM;L2$v<_WTwj0u+0dUflkzA>&d}10l)h*@c%w_`&nPZw#T|O z!2K(6s4*Z8X!#wp&HpFXCYy>Ywy-*i5Ud0nG&ok9= zh#mYejRv|Tn}DCZ$GYIp?_tjw?L{CCd_|j{JYQcjlYj|xGVgpu!0o zW8PjnqiPQ4xEgxM3c8k85mq)fqX*riO2`*#+4hBtKW^(G84z0Z zD}L5!uw4TG|9tbImaI7Pf~1T1vQSjCiKbT+-j*zZLkzOp8g}rZ@wTsfU&3z#1hKxk zu&K`vPkmMj^0;fcN3m2n35%j&3ted*^&Yv)bsqIoe>V`wV%+hzsU$- z6%>B(^DlNNaoT6BT|0=uylQD5j;2tt49stNaT>khFoHgZZJQNK2!2XlKK8 zy_6?8IpT>-Uifx(i!fgZi!V`(huJQ|+{_jp7qa8#&}=f{k;m$iJmFmIe9*mqi#jSf zb^p-AIXSSNl#5%qj@x4Y(g_@{0ti4x?r=5aw`CCQ2%&FV7PuN2LN#o*dy);GRFugc z0_Vks$ME=>gFTFmp+jBv(ml*g@EQ`z=e@NF3f#}2wL(!c9?Wb{p^o}sw(|BlRy;`M zfAZ!(38A6L7wNSpV#1StA4NsRQ(bek+a>=#Cf3Qc-1tbN?YSMkv!k;UBst>BQ+t^) z?$i35O|m3VN`MV-HQFgv_lq-@%79wQu$5u-li6-Jfqr?NWjDOx2obBysmjO8@IwcT z31Yb?bv;@_qN@u!QC%3=M3`3##Xod*n}8n#^qRYZS=F^{jl#vHON-9yE#L@!r*eTR z>b{;yH9Ae7D*Uhqs*uvD>BT0vysfW#y}Dc%;RvHGG$9sYVzW9_qaUl~&IK0Fc2QW)Ma z=-4|ks$qKDcPBZg5wQboqAq+Cb_G!UBq8P{^60v^?$hY=^i5>T1di&ma!bM$ysO%f zEu4&vNo4r3%+%0yvR11w3tYQxD$QEmc1p$Znd>^yT_A^tOgqyPtWoh0S@WrQcylj0 z)68Y3{Lp2)r1T3EEx%#;l8?tNRAJnf-3jUWypPN;&~0e503(|~YU)_X>7NfF&}hH= z@CAB->;pSi+8EOaBEXpNxFwhhka>Ggw?iuBCs$N2ImHJ*?$OP#!TxIxr4TArv65~I zZ}nPMYlO#phBw6A|A=q-qRRpkSCR)F2AYYuufu?yctUaz3k+<~%?!A8aLvN3`^cD+ zb-xd}O~RdN49;qs#m1+6bl*X6(>^|hz=8DU>}ro< zy-q)a58A@2+r=xnM@Y5;~uhrh(Uo09|;qI$a;3% z+f=jR*Ci4<|Aiv3_QIg_%;_6;6W^Tvr44#{r89QLMY^tMj*O2$y3!ysr3a1{&R`{M zV3uc>RA)hNW^THp*pLU=KDZ&Je#e#PdpiK$KA7CIfnRvWXOf{WBO5KlwQaPQ0 zpJuv33xU>qB{uweWYTXGAsHYUH*}f(eBG6y%8EBnhK4snaYhwIMU*~;axqyCp6{mU z0sz>c+(3W3kk@b)7f=1?k5~<6iudL^RE>>!GSCrhh*I(pic~2V%p-2y@r&wX1gcXY z3VeiUp?;0}5*#xhE!6_O_3@G%4xdUiIEpPTX=aqAg<1oRcaPM%#ch|kc%<3;uJxS| z?bOi)5RwwWqhuRO?>s$ChN0qLX%$vLwjAF03BxM*r1mVvjLQ|KjlG@Q-nuTpyqvkb zA%>BRVJSVjD$!}2x7BnE?c?w>r!SzIRa!Lt7_&mh#72IN**ZWdC4|1A<{or^XMTHm zKj~P6Zc!+oUFk67*2sdc$Gu9`4lK!L)RD%*k*ZqxsH= z`S}L3d}T?adz?wd-!F;~e~?OFa2!@=hEcUFbWhPe??2c6%5e3@*z_$t&>7D7#wbe< z4G2lzbdnx+d^+vL@3W=O@Q$&kQwEw_g4nl-pv z*5EST^qW`KtR`->!4iD^XMiv#Iyy+8C3+X+Sob+UGMDh$$m14NIxiIu9r@V^WEv zZ&9TKFL>33?v0q;kC6zHwxzw;^KJCKTo#E`ho;NRL~8<~^klG|vC)Y6-g#og^9h&M z1i*_M{7otv+stIFzISEGMl1dgnYuy{FZiA%?OZsb-xcndzVT{k?();_(PSZ$07;e5 zyjP5X`EjOA20Cb1tZjswlZ5W6&=qhX9KD?hWnBEB&N)#WY>s5%NAp(}lQvzE zE#n$Sk$wNh+K({UwHAXk2grlE`Sn%8bV+s7wK4friRUBi;S<@SA%ahQSyf;};xaJt zQMl~O!d_=9&H2!c!>QKHq<=(KII}?U^yjMqi?Kl!T@BA69@G+quqBR2#&#~d)PRc(Krn>iToZu^shq{8DCK-zHuT4qURyd77= zaSemC(u~j;mjO@s_;ybW=3qf*)jh(y``};;-f;?R;k3P88hGxZrNyTpAl5Wq#QP2@ zcP$!eQ6`E99?Yc@Y{N)3CUh*J6RxHus6-0BUkswif*=RP%9|GSMOgz2Ti3369Va>O zXVk4y;zSKNqWNk_j@L9gpIu1n=LD9RC0#&v&KDC&W#8`b6Iu>5eq%eI|N1KfdR&XL zF3`ER_A}y?tZRFIRD6nQ^EmV=xvpdO8R5;m`yDDH`W_LQK{K*0ic@TyXv8)lLAJk3vH*^t^h)bloCC`1X2lzT;UYd$jY67J6AktS0F z>sil~{&~6~b5jPo#8e|1EzGX$_I!VKic+7br3(fF&H{nOMQi@xm;{4#MK$WpWX!0H z7}G`8mLDpzG9tc0Zw2`w6x9-)MIAjlWs7S7xI3N^fJ?pOw(n4o>(NyaMI|)#pjky8 z(V(()=Co#sjD(^$H*U0__9nIRL|uT8*s|PuKTD?{`W!|mW<8zeU{Oo)K7eyi_ZX;U z?*&wxL?k*s4<9~+K)fNeL5aeTiuAI#Pw}ZG8=RphGwVr2|KiJ!SK}fSg8S#5Iux_c zx)kD~v%^?@g!~S_s)*t@(8j%rYp5xmF@uBp2D%sbns)5DBL)#Yh*I@o1Uloxv@jft z+x%PpUtYzt^CD6MxrWlObhd6sa7Oho4gE1a1c#Dv5iF}2j)?QXatD}1I6{4X+`Bfg zL00wYx4D%O=4L1kpF=kCWtuFWi>)@LA7IAR5;wr-tLBD-#11=>wI?``g(3en`7WaF zzNL`a8uKB$WvmKWuju`EF7TFx2ke}-`ud1zDD92uz+S2|J7n3X_~YeF#JO~jcA#R+ zQ79CJkJosa{zGBZI$wKxDun$YG*kcvjA(gWLoV6B!_R`1ofrQrEIGX+ml@I7ttZRq z7wjt2Ih_GmE}KT9?K-Dk{=z9OEe%A)5-{gd8FsalHw%Ltw4Qc}gqPAtlf!mhq(A9e zsh890PdWy>+|J1ZgR^uR+(S@#6ndNL3iCM$u!>&#)Smo>*yl&XN@gN(s3B_2sJg5j0X6#LtSLhY1VMUfc$h$@Rm2OVTi`G4Lsxfj5-RBtig=2qcSen{wtuP zS2s>MBH_gOCIx$FM~^C#AYbPA!aMC>R{M(>-f`H( zdB$dni37KLoGUblD2kV0FA%Cmuo!{$%O9RIrb5LPy#e)G@y_vP5h@pT7xmMoqj_ht zCJKAminTs1Z?RqaU9c3E=^nnn!UKR3*U#UihHhss>1~TPdEd40Nk-{nx!e2mNx`2P zL(Gx%-Z0jyzw`McW~G`G3tOUxBS--TiA19P^xpa;-{qsR-45p8Ffgh9q`kczb0qZ< zHPVu$zsI4Ys)BI71RI@w4rPAi8_oTO71~J^mdSo#`TSzi7pED$vt`knS&r(IL5E@u zJp%)SypcFnfq=&R!TO_#j4WkRiUtMXaAjuwZSvd`;|=ukj@f~jc_&mOwU+2crHDv6 zkwzoOehyC&H3?iQGS5&)-mjm=okAP>SD`?A&0qQBWgGf@cxQ8-_;M@S$v z1Q>k;hx^;`l8>F~w+i7)gEdyg{4gWRO2PDNP_V5Vj*?&SHDrGQrm&pBnsl)*n5wVtXzuIp72txDai(h)#x}Su-(BHyf(ZNuVi)r|5M40t0 z{(^7UVlT!4y6-4GJt`*0^Hk`}`^;w`l!C7}IczIyYh^gfMWr*z5nO9Z8Up^9gMFgI zB>yU>9)J?ycoEf+|9H{}=}c#|eGSm+S)tz4-xK~nh!vlnwK90_(I&hTsb&GbApp6C7&9f?*J-a z9lL7R>{q8)t=#+l=Y52t2S~xSnK;2T8Ee6<2&2t?EK{3T$uVt@ZD(!7uZlpsl>DFC zl zGy3p_WMUGh(82lw!&X!(us422;zmVfVV!=~@k8SU)w-KSpHmk=7p#YS_gKpndHic> z6=Mg#ZFrquiTc)Z0;u(A>(-5z`OdW(A6#3r+5(Pz5-Q-U$Rcx$Do^c}m$yTwoVYMT zLz%piAPavzi9^1nKmNHpf1*JqJ;H)GKl9gBfi-hNEsC2N(CWR&_v?#WZA0#fXpX-) zI6(LAn1$w0NYKb!Xc&t{-$bt2)d;Fb<|b)rCj%mzjeA!f^r_bdCI%hRJ@Eg z5HBv4ZkY7t5)ppb;418L`$_$k+ZUeK9)0~xN^LN%G>FDTN5gd1bSPH!zPYyb_IT}! zo&1DgQ2MLB{;+)VHTJImZ~Z?B{Qpt{kE4(Uod0t6!!cwIp-V;Y%}hntpxzjBZ7QaR zjPtI9+;a9np`sT{vYU8Sul+g1WAyX)-2XnRh7YWE2o;_Zl0a$yO%#W$K7iU@Uq6kM zYako=)4h6%4Fblz2JRz#{RoY^%Z$-c%xadcuQ%V;+kJ6l7XQXd_VRn27w}VFOxq~W zd%(AIcgFGIYIP00vy_U(4!C~e z4Nk2+EXO^b zmHD@An${%xi5o|cJ{%V0cw!$cdOZG){`W(nr%H26zEc6z8vRx28+yp*`8P=*IB{zb z-26plgHq#IB9-7^TDIoP0RR1Gm-lyO_u69r{BSlec%whfP&F*$`LCTg=f)6c{>fH_ z(@R7d!m>{^7Of<50;?#sUMy;h1Ts@j@i^~BA7?65Z!abaoZOh+=f%&@@zWn|NBnvj z3vB7{!?4cu*dt4)u`!5(j{ftTVJfT#1sj<3$aQFRG)WX>Blg@=X#4BZa9v&U>#a61 z-aO?Y=l7yd?=dr@L_hy};Tdf>vahxGhF*WP_Tvd$EdSRx*wHJyh8xXel3!GILM^F$ z?QarV_XZu9K@RPPYI`GtnsB>CDx>9+hM@3T)!a^pE{fHMCxtrCb7-9WbAAraE6V#O z1vJvwYo2U$1X8Ev~C{)#%aPw%A7K8ucgrMZ3-WXy9(;UOsCv8U5|pUTr%Li8+#T%GMhD$NP) z=``+iGeLeT#M(`d#ps*N3HELVBUs(;K-Q2spKgTVp?#S?-naVNPo_q<+_g3)RC+$j zQ`M$5&Spooj^Ts8s6=mftI<(=DX)M#r#}pEx!y8Z!`MO5V@e->7LR#+nrxg93(-YcFQ(Y=xZz~P{B0OyZFuB{G zD8Sty`iH{f?f-llZm2f(Of0iqHq$KoB_mTf>RKMe)_Yw8OTIkPr5-2ekin8xD@g zoR|N2P$t1pZMi`a!-_uAH0JG+F+*M1nKOc6&~N(p$vGws{I{!4$Ot>a+J6Vd$pdu8$;0RDb_9JZ(;6g?BrnK$K6pKhsNuqD+Com086|C;*E|6VKO z=@!cl8j&dtGZ35)CgbdPg8z3bp8vMeyR!8ClwfFHMmCJjwn8$m+?jn!`bVD#{eFDk zg7hI_E^imk&?BBBV#ZiJH+cSg#n@)!-^bUe`-OE^H^RAkD0}{|m~&K%m5`NYTmJ3} z(fIYor0Af!;whd@<#-g_wixh-pQMwnJ`_#yJ$Yr^_?y)}1v!yFHgeJIR_`3r<(BKu8uTS+ zuX@(#sQX!(s!nt4*}HPRvj0_{ZUAFe%G0`X;U@K>bni*Y2SR!@TDXC z7;m)ybJ4~BUO#OxuO~5YZ@J2ZJ52-|zZ^8QHC1x&J!t7U`snJGz9LYTTHagq-9W;hBsoajPk@m{saBj-F?!Tu53p* z7%=0?_j02f_o+~AMl%#1=a30HaZ2W17BoA-z6`n^f!mU$|o z#N4^)iUB{QU7LQvj;vc2Irui0MP$hTOWff{}@;BzjFCpkSWvLfJIy z`VK zt?TA$g0@~w>)r+?L9X&XGVRR|H_bg^;)8t7yluECt%~Xt@OjR?4{UYwRJhE|Cpj2* z4Q1ZleK4VA+_GQ;&-60l3`eL6{0XdVy9xh0`te0+EM-$Ou>t16TaPUIbuUbPRM%ZD zV@4(kPA^UGAP(koV?iIUay98dxJ~){j#o_>cxnW8Py41(Z+%N*agGGsmwyrulV31nFmWTH!z3 z31SmH`93*6v{&9b%l;I&=9s(t^Sh~T{&ROVxIY#(lUn25i4IrcuVZuq+F+f)ccIc)s) z+VxjrH2xG`wyD}>=q}BG`H)ZbT$it`Dy*W;mF9-ng!d{D)VIz>W?Z6o2F8xM4}Yx> z`pT#~eMT}YJyVSN+Qvyx`m-W!XcMCI$?B?aIw`v?e5$yxJ}Unw7n}U=6`{$tijpDA zeAb4KkuP`guk%SVE2lQtC%%5Su;1$K2yF3qYHNE}u4EkJVvCdw@#BO&`4e#&B@2f+ zGS+07TeYJ!Z^;{j@s3TSg_m6CJjWY*st5eK&CF3|C)ToT-(^WAqpgqg8i;Bk^9o`b z0pX=9OD>S*A>LMSduVS{YWDfOfx(`VaGa+?!TZ{_^{*-Dlfhv*>VFJSxu3 zI3DT6h(1#!H6b`SQzwweY8^`uWG7#a93F`tv*a5QW_eoR(JYtM{xK{`V68G?_tH)o z*V0=)KHCLZ6JB2HBMJH%QhMd}l~m*4&ZT4aT-7$-(@nKM(y=>liS}mb5K7%c=a83T z5zU~BI6{OAU~A0;uGMH8D}8~~>JirHP;(s7!N@<5&Mm-wz*QWMTppz#Ji zqM)V<$Q)R~-*(%VZ6MDRAx9w#2mcRm1%J-I&C-}qVv7Y=3#&d{p+^*gFFNZFs zaw06Wa!6HeGHXP31^cD}g1$tRS2J0=c8+o#6pLxNTYV0~?{5j7Q%YG%7ZoXwo<^sIc+nA{xX!z;V>%;gkEar6e>SyZPIxdN)k@ODO?s4)jTTBgLYb7=mgih7vU%e^C9 zd!e0%^6q6t?G~Vpq#s!~O+0V-P4B(W09;onvL^UzfkCz)Cg82EyXzZU;M2~5%PZQQ!ByR|KG1Gf-D)NM z^VVY&ealSGD0}FkP~7iQCDU?gbKn|J3QOKp8jlf;3T_yR zE-A9l3$BA!)HMJ2_Gq<}cSBtZXwG}`Xj+j3R2(x7j?c2mbjwoDR9qEXbjfwG#oD&{ zlGD59s%C?11K(=NMjXMCAWhLPbI)C)k27ko@k%^fx~NOB8b@qMRmK0n7y1 z?VpaZ`y9#%6lrmD^jHj;%(J*=gJ`k86U@2n%$#iKh&FsYxb6s}r@0Wwh)6R;G4&M~ z-bt(Cpfe}UolNG|7Wlt!`X)@jy$Xu|AVK_TQ;aQ=_rlHQb~VjeF=-JfOBJ6gD_Kvg zGckH=iqEnze47{gn(Wozz9-+o&0 z<^j7rpg9hS5n8|T$Yeyg|414o3H@6#tlz7$uyq$~^My#RRgwo}%Nuv5mAywB*s>gP zpLLy=K3Rsdit9@mbFNDLioD)_y|<)d95Ouy8%H(}-Ib{0-^)p8aRZy&L%er?!lk}Y zOJXn8;ljTD6ybG#i?mTqrvIz~klUh}2{O#P{-5@xb-w7q2FH7^z?pMx$ngSJ;i2Bd zTDC6Vt2MN^b z-PiIPg~Qqosr504Tghff=^3PozxwX9yUAE<_;!7SAk^*#CVU$g&^S=n_wmamx;Op7 z?$7a6=T@(;DZlcDEUTgj{rOCsZvTIQG1HnI-@%o8Go#mLXyLB^Rwa<^w>HbxkXzy_ zn7N(Lb0LhT7IL4PXKQ#!@aE7w4(#J_ta!#2A?f+n0vii&7lgtHa@BEyqjY_I3EENn7kEus$NQ>!knL;7cld&(tRiqMB;G z-i;d~78}21*PNf6+?7nd1)zVV0=*hB4qZ5^dc)dMU_Or?t^f54%@(z!HB)L<@WXsi zzv~q35K8THK_hL2Pm&9u9H}D+Si5 z;VaQ=Ez`Z9+F}(|pOFWV33LT(Rluk;L#=9>_HTv87Ngu0U-aXm>j2`wgKVXwz7wK) zF;b*iqccUqI$wCNva@U0%a<>u;N&zkU&!Q-^vJ7p%zDp5q3}=eM2`7gFp_lcN~yM^C|zEOQ%JUw%g%Tw8`hXJK5_?=WEbk!0DL? zO4YwvTm0|%{(Ifl_+2o^H|-48*uL|jo8jZtqTlPrwd8NM9L#1{)fUmF+H z8+Mi&Wi4uvM;SfQ6AASuYrlN3J02jG$%gvB`?E9Hi%*1lBB;2O9*W<&WP06dtr5k| zA@P_mmie47%Ajd}w=Z$}Lw@2}SSy-RPhdq2VfnspbXZ7B%igGEC!}&``O~_};JH~5 z57+T8L$GZmoumxZ0-}kkkGF8xAMnqOR{J&zF^VNIqIRJ9& zfyh&qMXkxzBw{g&={K8ARbvh;Gi>LZkQ#pA()`x<211?V>#dq>cYSk8b9PM=OxxX+ zWT3u$xi$HiVcV*-)={ z`EC4D64lxL>dFSpt9UItcKUEOsRFkZj6G3{X zCmhU1g?y{;*>_dJHy6m?Zu(7h3lA3FbvNGAp4~4h&cAC|`0Mf2D&T7Ki_}Z={@=7u zH@ndC#`5SBz38+CuIa{$2JBZ)9?;a(>{ch^ybkM5W`^9#&w7Gc|8m;08qnl>OOu^3 zAuCf4uWZ;$FG>!4PvZIA4`VMmZ0!{1x(y00o#MH88P@9!dQGpl#o#FAAA;EdB2%+| zLQmK>7it~I>`-<$od}*!iT)-@q$;4o(m?~J+-OQpu@-(m{5rBuZ+&QiSgU_FD1M?* zt#lMlgi>#j4+?OOoMQt(^*b~cm z7D;w6_TrmXg)fC=oPh9wmgd1wjYXTC)CYzchF&i|*v-r6X|_vi)GrwC)1U|)0A^0A zTX2rz^<|Wtl|l}WvI}{~^ok*mSj286TQp?1Gz;=NTQt5>ORC3m=7Z(xgp)Y|B@3$m zhlG?FCvK|44)-lF=Q;ZiwFy7=Oc0mgP;iPyX#VGr_Jg%-G~n*sxbB}r_|Oi9=Wl$a zgC9uzk6Z@X@nbzZ!u(LqBHLmflN9Z4snN@+(EG@wS$k++nHVX>E~HtFkj*X8FG4si zz-{y*UXcCf@AZD8Sd07dMYR6?aM!MJ1IwCATQ7t-MvSfvc?3T^LcH4j@vf0sFg@Vc zgWxj$7)ugP0)Z`a?YDu{T{5`jI?M$zz}NT68>lqeRQ1Abv|zVK3Tv(Smrhiqx^9}h ztfNptN8V-#R~fpSk$O$Er(s)1n@n*wRWe*xq#C6JR`0n&YyRd|;+~MR1jEM_A^rCY z+tanke)~yXi{RLH&6cH$Kyj?_>je^FhVeKw#tG`V<##qGJqRq@N(#mR#MEx zuprPaDP^plu(wR;#Xl$eUAnvR-r7O7q28#C+BnTNe?!*leBc$|xdK0_Gowf^6@Zw0?T`E0==1G zWJpPMF4s!>t4BA1PxidvB|rn;$1})g{rXQa4fhA$Qp>X|sU=xxg0Q(TsHDkdj1+}M zctev4r;WTL)aa^{2Q*{A$M8SNUXY^P;JWgPQ>ikRl@(F07LD z>Xnbwujzcg7cX9Y-<}hb7{7I2!1k|@*q&!C);DG!les-PXaBT*%94Sjx#jC zVJh5AjMl2NZ30NnB?9V8hf{nM=xQl8%Y9Y0D8ZM|iS!p;vxN#G9TIU#a*I}=ikYVG zGuPIdAAIn@M!}kwL+3kJ65q&eM_n<3d-F1~1%{R&odj%9N=)=m!RS$b{+;K_J{P5z zp5|)DNLKb@-{~1Vrwp)ls4cjw;{D2t?ho>ro?L0dqw-elAQm+ED|nD||KPqJGX)O- zwYHZq8@19XK@WL=`q5QC@r%-nH#1%>huBD}57j!IHz|0L2Jegr6ajpdtr4Ss4u4M$ zY3Xqh6^V~u>#q;bwr~iW5Y1qY>Q4r81CI}*_l5_7LFASZo}ekEC~%nml`1{!j96`F zXZ8v$1tC_%2+ulN?W5U_N1L71K@}sDXix;7dLfeVcyU3+BG2wa^is>ks zp(}X|F~*s^NIzVAD6SMEy+|(cW@BQO!c?1Q(M#+?WXxR+nvA|B~_O4-c zEBBASZpV_-o%cmyqLk|plh-H!nFOve_sJNelPI3lXm2d3)thDO6dD>D7mjlVY{enQ zoO_ur`0#FnrhB0Ca4J180+l}sykzMqkh^N_BXa;a}73aW>2D{WRhDkIMUwR zxdn^T`-Q7=39E6&t7e^suc)z{>sr{Txe(?({S*YRPSfoYC3vnAdr|gavVn zn)m+vcq*&Vy7Cpev>)sPDL%-!5bhVy33nV`5i;JmzOT`eq{*<8@2^cl?=1GYuKokx z?#~;Eo1k}O5;eiC_p009!Y#h6oTkUc7GWYY=G|thR~)CIU1OgCaUW)I`hrZKl*y9M zt-^$i0mEim2~uYC*1@wgkXhFnfL&U2Z@r66ep%(2l%i7ZXTqvO45EG_3hQXXt74m_ zPQZ4O1nccuIdS>c{1Q0ZbSW&@2>n{_G_9=vkra0wy?J2@;S(M|&aHwxq}4Y=6)?bn zcv~NKwVo?r2HBRbdtP$+>rHz?;~SC;&^S+hXvWBYyI)j5CcGLD(56?Pud{Pkkr7@o zw9|UB9+uQnm0X_f(P&!0D1+x+8PpWHBwA+o!wQg5ok8vnVCf?Vx66y{pR7|%arU=} zPHRCbuqWe&7r1A6dX$z1SQw(K{1-g*R<3Ql;G&~(g}Lmpfo;`{-tnL7*}YWQyd88x zb)%lkqO_P2kuKbw)|)pQDN{CIU0z22W)r+orrAhQdEv=SRs^d%@!FbTa6)5k9*s?~ zFx!e%WJ0k4|o?4lDJ%j;k-P6iw!TnEauFu^@&iO0Wp)RDj)5zqA*rDxfvwL!g zO9hU4m8m-YVs`=@!{ z@X3v6Wt`E>*0#zuh(#8nlQv3lZR!NeqgLLZ>ZuPcRaakc;&TXcGc@;qeL+yr{!9eU z4ZXc?aLc^jTnoS9IL@?BiI(P?{HLpRS+JGhgCg(&2z%uOz0%BBJ}gB)<&|W39`jqk zqFVf3zAhZEoNXZEDQZ?RWDZ%CpPMR!gx42c6X_kkc8xSU>GvGw(`aMq9&)Jp1^>{} z`gnuIT1U_5heW+n*FjGENf3y`MlwK*^Mr6_5u*!GG_ z0)zM5)3-Bvq;jQEwwM4VsfK)jolsQ!npUU$P(bm;N@_~dTRD(MUL*IkW%F3uMNbu3 zQZtbiL0*WduKZj+=5GNyH^zk7u?i9`{FTeW=3js6ZY zV9G-gk0-teZ`=hv-xz=(x1SbpNsI^;4>u+9UCQ# zSTs3J>(n|kom`$eK=e}+O_^DvEPmRQ_O+_B5>xizvXh{bhKQTtOdlgKq+D?9odv7f z{}El)w#heYY?*E`Os}6BkV3yhTvW;8X=F^_(Lbwa4L+7trl;+2^P1~^uHSS00FW{D zRni{a;ycuFedO#o^C)8Ryn?My@jYG9j{x~Tsvq90xtk%gS?H4f%w+8*LU3LJ=iYm6 zo|%B^7HU~Ow?eYp$P{($id45#vYY{U&fRd&l6>V?TVYXAdT5=19z*K$*I5UY4)5JS zo`c(a`_xohR!QUYIX7Bdbe|!BUFefm%+dfNYGG(JW=KiDa9*vD_TlYcS zh{F7i@=kk*uEWSXk^CbF)+Wt|{-Pi@OY^=rr!f+-$jS+5n5amZwZ>m>R`HWxpQP^# zUM}?S=n|*gk6GIJ&>Sf9sP0FFoqnS<;*^DJbSbH(d*jX1M5dPf&{s3?evbRb$?E7QR7u)B90m zQ>7uF%!(V&6Bic`&%2;3Jh)vq2}IggfV0}SShsTfq_w!yO4|owEUI>0QgX!!3Ib>@7dKI{9}wu&8s^`6_ygP2}+QL)yD0>J2;!DC!pWmuR@qh zgHpIJJ4{NhH{ZASnkjV~@HNw|LRHzkP2p8e-+U^bP_3x2$uQPvFZ?nNzLZh*E|qt0 z@O11eX1h1tYiFg(IidTZ+*={S)>ZScmkFAqfNJ}Ry?<P`l1VB1Z zT^?TjCpB!NwHxJD7wMbsjl+>V?U6X**2JShpJi7~0A2X#oz6W$)SOI8;zGT`+1%i; z^fAu;_LAe5(_2I}+o<+KNw4eY!)x8Xv>G0t4SK7;M!8J{0D}JBgYRYtbQepz6M;Pe`Mb>xU*c`9xx>Zo zl$v*;c6-aukuxj@)ldysRHyfdzTWueDTHB}xt@Dlei_hT&D8-T?{VFL-`4?WXX}Fr z97EYICnNNAv_Vl&a|4|Au;-YO!_8EHPm#T?v4ql@vbhiUor2J!hStOP=sk>NXTpT`-*ZwkiIQ>F@C1^&#*7ACk&X)-(or$#0?oDNo4SASDIwEz|F(^ zU6D-FBfI1Htct#9osA8mE~PyHmXoG;B0&cK^VJEJ^Yhc%QR1nCmgzf0XM$bugn%z# z8jj}$@W}}&l@Cp(FJ20`WV|7DNPOb}#-ai+%)>IS@8DDIkn($`&+30?k ztlfXmz_QT>pp@A*F>Xi*eREv(0)M%NJZ(C{CB&p3*(0Ywl#E$4)*M4tdhr7;!8P*7MJj1;!S;7e`LPz%zXhs^fs>pq3s)1DBj&Rau253KRp(mKYV zQ7L1-4wgo?v)T=6B&0qqMpqa=I?}kD|d>XuLG9(zZ_I$Rku6}=hg@YsT*b^ZThSKBW>OQl0 zWkE@hdEsr2OtPZj8lu!TvZMz*vD~fODK8ThImB+6`!X-^!D<)k9&Z=)KdO8%%#cJ3 zm%k|to5S9(qG91};B~i(f!4nfeG2prwumN$$U&_p8@Ejz6Ln|BZ$v!R$0K|NvJO9d zXAuFWFw}ayiWaO7w--$p?8e(vH8l-+FfIGndz1x(szG7%l9&(61v#F5o)yZe>4=U) zgQMpa5UJ{~Up_c5`;#=G=DX+%BfBS|Lz5QMK5@6ziZ8;1nRr~=4jCGPW0mq!8jDTf zw31Vyi}wj{)7Cyht8AiIwpAw2HGLlWN|x%YE_(4@)p_b0Ezm;hm^MM;nvCQoX(;dR zWp|S-QQb49sBBW!CbAp6vtlB?>o=7JBt^1NQ8NsgtsgkapX*LFEZE&Fb;D6~Zm@3w zHeIaq+xo!Uf#-v}=l5Zn$J3rO+QL2rB3+b_H($njg*HSgf?D$HI^BSwvMF#mm$?;( z;LXu?vQgU>SPTF6MasXRNp9^#?S zTe*E;dT%!b)D}TF;md*-LDRZBPm`#vzJy?>hS(EB>3i)D^;V+Rcd!*c=@-9dKt#pE zU$zn7c}ERi(fj!+*5jIw#nMh6zSr!TqeRA;&7IXRhA3DZhQuwaw)c^flmlJ%lwAU0 zJZ4?pqWhHA0uDu_qzz8v@|QO!-;0}g^yj}b1>P^dH52n!jyo@ThAxcj`bk7uk7^7)4Qqe=_(*P@Jb0KE?{ zdX}R!8+F-@%rM{nPd$g3pY1O}93`{R6S8F)P|~*4>fVD?bJ}j#Wxbe|L7{}aC?jKn zE~dZdOOMmia%e+#u2;2~wa5k9Uh7j}`eAfORo5<*(6#_)jpQS^Rp;>46QR>;!*mR> zw5xcgmTIQVY^GT2z2LP&dIznijeSYCpeZB{r!`1DtD6MZ6>a}4zLpqpWV2d(JLrHB zyleIz&YseUWy02lTb;L!VbSwJ6R=O#87N_J0K2cx2(nlQrW47Psb+NA`}6}Rz1Slt zzt`)hVFFvLZ>H}SZ!C;ZYWu~E`imX!e3)Q2EdvQPu>N9)>*2ybE}wl-J_Ljgvc$w| zOvU6*NEUrrpmlM^EQ)C1Z)lqp{W40lab2{kSm)E?z9wE~E>ROacq>I(Hazp`@XvNG zo2oi`Hl?ya8zG`=yc26v73o$ngu^U6j8{}tZ1|3xkc7P1kd<7fm3Bbh{ED2r;+`21 zM!5HNMpv;F8y+O~F-PtjF*AFsADYeb{%M7auVXIm0leVKf)JG8%s=MIwEF2@h zQuA{w9F(a|$aaYCB*FI{^@{Z| zYZmrUZ*$bYL>O~p>h^Eg-{;8t3ibP#%rRfaD)c>DsCWEyY^q==-!9@FyEDd_aL%Ux zon^&}|KRhh6w_3fh{j#|jcXJIZ`ypK$7WJ|UV(81_Z(iisEn zDUdSMyIe43v+S>hHz}$lMAW%>u2qw(xxL{{vtVfJ`oalG5mEYTA-1bbedqAXChH~* zlSKMekic4ar69A{FZf9V9yImb|I-CNW)QpQ8;uN$w4k_6HYp}kpHu5iS_C82Nl-Wp^krrVk#00#?w_1F)PgG~IL!-&M^+flCr|9D2lhXS(CuiF; z_MRJ(PA_D45~dMt2IQ?<2Lm3E?8nx8A>rQrPkY=pJvLdH&)JE4M~-WFM4^rJTBukG zqmYXN6e=Qxkn?*e?ONP71Q5jf9;W8Cw60{fX#P2Cc%2g&xGqB;02uE)nh3sv@YIP* z^qury2}Qw@cbJ1dYSVD2&rR|tlu_w$l`Ljs%%I&Z92kK*G?x6aE(llQ`FKsQi`||D1a9Pd?LYm?kFG{XthVSh7-d9^NYBsi?d=gBT=NG4y}Z?w(biaDPt zKhf*r9=h12T^aSTAITAD$F>rdW4$FW;A`aYBQpp0>9Mq0R{0I4XQ6SJ?h^(5Sq(c% zX?Wuf1XLp){)*V6-$Co$%P$J(M;^CfrrYL;4*Jg6j|920FU6GTnAc|rI zt8WgQ;nph8qI?_UsJdq=S{Hv6+jtGfbFayOp+L0FDDA^FZeM_JXN(BgQe-TtHc8lA zLd2Cx`6;3;xVdvq415#gpjEQaq#%R7Nt+II0y3VMn;cT`j+e&<=*5yye}L%yMfU8L zLI)UPI6?FVHSAM^E%@Pu>*&o>BHXE>Qm9)bNDlTwSJtDRCXr+eTJ>UZz zSu?K~GE^DF6wGIy)yKPkm*C?8e0ksAY%%cNqDns*n>DfQkmY7TnW^`=NXE4*2j@q1 zv&VZ4?1R~dhojo1B9PEueLT&Q-F6Fbp?6!qbPzZ2FEmiWysAvqwy$>y zZ9v6xBEL zczJxW`w^JiKzsqGs#RuCs(35dD@OH^qHb}@%qrkU1v`e>P5F@diw7(_!g2Y0fbPrR z$(t#?(+ca=o&$s|=3ZkMp}l#NRF$z**^N~&j`(yTV|QBrI}V8CnkK32ZfYZY@xJ(;;=ql*lwTH2TU~`_c1-TD^*Lo{jEZoKg}uINLae8|$*S z!TuTnjxf3L@?FHQh6!yxrFM*L}fNPy0)K+z^0$ zwz;zt_+-W*vHDLgUax+`{}6xQ};G~caLd=kGs0+!L~ARqq7wet0U zt5~ppjAp02QtSw5z6X8f#4nN7bsBi3rK{&Lbyx-^&qjc4ma&2$`BFYi>U>%NsVea zpChK-zi5S??y8r<+XoIAbUV#U$I75r=-jq9;D;(8oabrs3a|GaEIn4juYQ^2qu zJe)eUA#yEIFG<~Nj3~(~P0>pWef(Q=|7M$65u;4Wlg<0HMUTTIrNcRT&h{67KAD8; zbB9;UgkN-Q;^*hLS+a)Z9&zE7IXV?A>R_{RaqyH#qvBqpsbpxnxPtpb@e{Cb%S+Js zyhDSgHD-A}^%*>Xj_UEK!k%cEBp}x@dRJs2);rF`iI)%5G(yVgqPU=6DIsUI@KT_D z3b*$C`xBIEg~{N`X9z6AIu#e;On5+ z@s;&cO)t))KEL+XGuOS5aE;gdp`wEeM6Wlv0UNDZq9mHg!@Q#YnCzNpvgq&|a(Ds9 zN~Dz5fvHmB;io_boi%dLSxZ=0+n~>+dK$Exed8vc4N&iL_%VPGmCjteL;s>L=0c)& z3*%7lEN7b7hsyO-b7BBj?wtIUz9*S3xLchh&EklTYBlm2=kDFD|G9DZUNv0bNEzAn z{-ZI(JL1r7B}13d-_vqUmY1 zq4I^D+5LB~^|@Z>aL1oT!;chSAfsV7kNR6#Ta}+Oys`NGIxN#JHrrkK`C|zgSRCX- zxDa&Gsf1o!P51SLMg#T+n60o{pz<)I>^q~Z2=+TZnb!heZ;VHl03PhcgyZ%yI2TU? z`ilibNIq*POhz0B4uhbb%!%_KGZCAW1o9!IJ)zPKf)fT|iU%Iak}9QSk~bOGKriLv z@sA*xT0s>^_y(L_=y$ozL24@6`oi~Qs=$9%=q?vZy%B?xkLO&ii zH{TV={a{miiK$BXtX>zsneT77(O*INC>z2?rAM>1yl=(b%Sp`#!0}W3$aAtPfWFGXU21 zbhxd9-?nuIJ_g3q!^<9FTJ;Gx?+>K3OH+4V-rdy~AFXK$8CCJ*R{LyIg`4ZOadvi= z2GJ>N^|GLy(litAz(W6*^^~_VECWOyr2ed#mf10`*Kj_|F2QL+PN8k(3p7%i+>wEB zf1vVLh|VCpT;JV#*wGq1?Wne27Tr95dh0^bs+xLJXbmfjYwwQt5^Q-mP~&?aw%5Q7 z++aR%4qj~)yopXS!Lz>Tb}Fb#hK?m+E8!(|1mOLFj06FfajP=>uY@)|+NZagCW%7* z2Xx@-AbXMR2W&BaVPa(>jC2NBf&!OvlhsO;b)*v$nfC^agux|g<>o6@8n@(Ot=)Of z1FQTS<(H6r6+iNmsC)R{ka;7K-i_hv5w8#pE18V8Tv5z-m(o7JHqNxf*h?D1?!P?w zAnDmeujZZ=c4RxjKPj^TgzrVc;+r=D&TRmGQi0uevI`Aks2;PVy1EIY7cVI1CQ!0n zlv>0RQk#nZoyW6>V$=?gLJtea;d&wuzq)^Mk~-LplbK75PT%#N!`Z{1!MWvD&&HGu zQWM+1P1bbV?}xwUHulu=dR$rz4-$s^U1Nolxn#G;^`AvieVL0H(LmY@hx1q_FxcG; z^g;W3CQr*_=Npf$y*|VoN)Q27EU1d2H@MLD^21d1VxkW$H0Z@gjfjRjRUugBW}U^n zbgu10o%JAzMRVnMv}HQdm~5OVtr7I3SsHC+XH-uhXRfC z!|ibPFso#Ro;N@7|8(DBfAd5p%(&ydH%KaHaxusUv3S3*kVF=aNH~0{Pf6{wl!osc zfZO{5Eq-|dQQ^T3fo(S_3J>_!b&9h{63B?VePgAxVl!Qy*-3l<8O>6h_5PQSIcU$` zLtJcuee;%1TnV6iKV4o*dN<_p6rd~RP}YOD?3?VMwu%R{ zl78nZH?XxU@omQs9^cJGjOIp{rV6tFwZDh#ey@|^&t&Eho3fa#$<%G2t<5(eGxW#& zx3h*VGSUzZ#}Ic#{*LU8&sW|2774|#)u9bTn3k`qCFMk~J@&U#wx?egB?S^Z?e?S< z$TJT{?QTiO-eMG1EWiq?+I_3fFNf3w5^jO&UjH?2RB2J+6_fqEYnDB{bGKFdmMA0Q zTTY0Sx$70*TcnUgI29&}R29rbX10RxqO2aQ1WtxrNL=0};=_c{wIMxt5fb=WQ^TK{mAPc@ zlb2;1?I7p=da_a4o%v(9JwER%EmGU($iqnO+j7=N0#c;@etub8_-qZA$&q8C?T*Lp z)C=nzn`RjZI%gd2jN$RxjS2~KI3%9MZsrK5M29gvHP)!(8pE6^uK3qw>aXo1LXc7| zE}qEk!UJw2vS+jZ(GXq)79V6?w2(+s3dptk>T`iGpGBh1A6sbAt}>h-xL>uV+nFb~ zFac>A=P^odi2jCK{W0)8?>gbz8wO@~sV-#R_9<0O{CbN@7e3WY;DMe3H$HX4;owq6 z#iQ0?m*Sl6keDD)pOSo1SUQ*xjK6!N^K$(&h-ebcRgK2IcI5iLwLTU;09+ra!bjl2 zp4I9rlc~?zXg5bvobBM9U8Gp^BfCAP0gGRSN5<}o=Z=31`VrIFf$?AlJq;Jorei#N zThxO@P}{$B!|-`sqg5agV?;c+g;xDo6p{x9+8zpiJQIr|fi z!Gva#27lB@W}*RFfr=DAIR#l40c%1U&h}6=%*(fN4`p1jd%M1aySgG@wCswzmmh$8 z+z%aTHy3U{@d1?4+RC1cGHf-M&(|szh-q;v5w58~ML0v2f_8lJqWmFh`*moh?-6j1 zsWp)KhF(8*?r>Yz$6{f$c*V&Ud0N7uBtaaRq>tWR)NYrSPK;XQTOu{NtKUmqo=p;N zUsbulQfR%}1zx+ky8GD_odnF+B7Qd25(1_^T63Q>xd_9a2ggtQP9wUJ?=rR87veu) zo^Fl*ZhzW^Q`lIHV75QPMj7}s-S{jci_G3f3(u#?P`aA| zhWH<>=f0ok^ZV`Hmlrc5!`XYSy;q*KekbYCtq(SlpGsmKU^uDE6u}A`bY`^vLbE-8 zbH(#+nV_jb4H#OsH zvj+a0N#yN}_wB$tyxaUKo?g`G6SJEg0dGjng)7!Olqjoat$1N+Zf3k*H|AbsF1$j- z=gpj565yhdhhd$T!_7)YeZrR{Z0pi=~-|Lg+RjVr-Jhj>W=QxNVVHOdyzr^ zBDEZFCB3Q=-)v_!`2O_dQNHAb`05#L$#hAOfqH_K^n=oHh0)5Ju4vV9vg3-bzyVWn zzvq$e^XdXlr#aciWT%z|l}a5H{URw>1QE{^A~M`DU(k=NYcvN7gD`EzQ0z^i!&#Il z-)lXmDuWW#S&U*WVP#&5luh(0vF4hVO5$EL(7OUuZ|4kL=rx0;lW*?PXfwRey;Q*p zYErdwjR~tpe>Tin7T6la*0DxLSY}6ycy!WFav(wOe#z^iRqx7?Qiz8;WE)wr-$5R` zz4!_myiT~Wc2*;X_ein=$rf^(M9jzg%B%+h(GZ4+VtkTCu%l}4P}{7fw23TGFDQ1! z_@W?L_M#w}YBwFJam)?3Bpo|CK2=gb`4S=Wr{0`*lk^bUA>Os& z7=}U1&5q$^nHBCB~df`whVg|WWyh4m8x#YN$$>l62Gx;f$aSypR`enn6cHdL&xrT`sh!dp!miyH@ROtdLS ztzk>y5`{_DTOEq{*cfoDlX2YCW!heWU1r+I_R2>GQ$U({z6*S?1XOdc?Ep8{eWu-T z6r8Phl^B;Tz$^Qi1UX|pR?L4kVfRK*hF9?biJi+NSl}ew9$_Z-RZ`?$%FA)NFYQrC z{&mV7q!3~@F2&y+vJM@eid(xuoa_r-FBUtKo1OH7RH}}9iH~!;f%PM{?+F-)&qi)^ zpqfQSmwjFO{Vd`4=z-<6rf>vh(*4nkIsUSGDqizfmW z4{;H*gIi-$A9CWlDDocZs`iwjKdzN>X%J(roQHb3@1*k5^g=z6rE~$1mqUGXPR3yP zYj=0Z9`eYaAy^!VWWIZs6@Ke9UTH7w#XIbM_PKmYY-;w#47S()k-os;lkk@>-G^o- zRifgb(M?rb^!pjIFif7j*8Ady4G|D ztYc=Z4ZIG{hMc&98WOjd(*avd|5w_J2*c$1dm{~^NR@T!>bsgnH>@Pez{v~Dil z=>Z{4E*7i%!PYql-2aUAL!^XS9c_|7>^ZOLo1j|5%J*suZ_=xdMi!C(`0U3MY zq~)eZ7@^%C-i=L;{eIihUrs%VyzvsS>k6?`{Qc=zUTqW4a0R^6bhqXFM+cLP=@yGg z*7p`Gp`ov5+4!GD)Z<>@&)5>ePQ>1bwqT)oSRQv&tJesPSl%ZgHUxo!mZc++spEjH$;EFyTf1>`6@CjT#L!!J9+D9q!T6(kb`yTd7t&E- zD%L8=@bx{B)U_9KQmS7)J*{4LM-dRc#ONsx?$B&H2W&_IP$t_~b|oCG+ge~zxo}~d z+0+L=TMe6|m+#}PThsQ&n*X@%^RmxS)O^P20qjj|y4a*l*DHpOS0yx#-PTtJ70ul} zr`@uaZz!ZStm4A?VS`FMqVyy%Ta}aIKX<)&F^<_(fxeeCAZ{Zk$3)*Z#`*Wl`=0ba zg+rz)jDjWN9;F$*k`@y=TJuiT=`Zc@TNfX+we0U;laXfldbq1FPR3Aa?i=#RN|08l zi-7Tv4^WM_JkiK9c39ghdz(_a%P5y-=xJtPX@Q=huC&P-H(%`+6XO@Dw$SXS17>To zj~V)Unv2m1EIF!kCRF2TiWYP&1MLedeV%_1mq37eVgwOzC%uH#3arH`-C2V%M+;QE z>2Pm?>@1b0;e15liGyF%VycaVPpwD-#4ok+k{v@I4BE<-khZrTA{DbOxb3{N*x zwW;0_Fn4zb__&t=6fj~IjHo_0e=8Oo3Sx{SH-ar%$^1U+AOZ>iM}-(+KE6mdrs@al zdm`Oo_tGZ{*~{Dr!IVcK+^-YpMa%HMd1oi}Vyr|e4u=6oU+vowV;U#tu6zpFikG*va3(+To57R@C>7#m zgkxW%B7Z*X1e?vUU1i_~KvX7U5mMrKZb1ZZ)mjBmt*oq%P|%G(ZnCLA(1dS#j;{e( zzi|Nl3T9N8{gF&R>EUj_2tAnQ_}f!c3WfM-ztWJkd|0n zhlHh@F>qjDytAKPFBgssqNDfb0K0V3{1lEd0k}ENyqhy%`Jj6x7EW}s_(!h?9tE|K z1fB|z9nhq-^BDs!fwMc&UWCI0(n~P$MvCq+fPkgoe%a?McThT(z}Fo9IskHVSlabG zW^?Ib1=&3$%{AK3FKZI^%#!WdKW-K;ZmvF^yQeM79v%#aQ%b~%wSm_sD&$5`@!cbSHIIn-hQgV}7gzY!V5un$e0(c#~ zeqYE9Q15yqQ}QSdpoGWc_CHeJWiap~-+$5!2 zi`BF8JSh*_Io2vEtjguQl$|jRn=EP1`ix^)rhZfr6!_@T`p&TRej<|kgm!>m4hYRj zAv(zyTH~f^ZlFEH5V-S)hli)X&;b&yk#b_p05Z#Y29RY-@fyQFSn7C8(Unk-ji_<* zfJXd7ok3gy4rZ?94t3duRXpITyw5mW?XvqGB0ipFdJTT7dp>T`17dmGvO~?Jt2eOk z{UTeicpT21ln138Dz|>*e4A6?XSg@Px^#1JyV(clqO*KAD3n^sCIv|-_1@1u3?JX0 zA2#~YXQRwmP0m~4lK-`Z4GJf}iszJeY6Ajm?D9M!Fbl6Sq1te*mU+U3ynXBZ&MKC6 zDA5VItJWVeZxN57lmG=Hd$^MCE8J}rbt*1e5V3!L{=Oj8?{3sQEjnMI$;omtAq`+S z{F0}6oSc1RsOwjtp5ldN&%5#{wnu;=hd%huarNe;-`#1+G~ecOOjZMeB?Bo|`^s7B zvIYAwSQv(}>Cq~97KTT1@XnkKiZO0yTV|&lPgh^XgSM=Ev9W z_Bfz4H_&ym+Q~MOFZufgXf|l1f^9q0jN!L-bKc#4UfxC8cNku6HXG%RB(H)sY&zf4 z6{JH?2~@~hoxJ7kvJ>}YiOV#cm}IWcQpi2P3HZtI8m?v6PjVz&)It3)!IEUEQT$Ac zza?Fr?e$se!=G8|1y!Q!+8+HTHL{S_uN%Q^T09U&S{4O+*xjw6lA3gm<<9_U43HqS z-2f=*Y-k>qx!2=3EjL?4VX12M=T1Y*7XUvjkbuH$m*5Wlv9cC>@j>;-or~aV9X=gQ&tOm&qnR%(1zh23%St9q$`DfhxhC!;qt1cCKU@bw2ZEMY6ONMgWBfg(N>1i2n5BdQGSKI4fsa><1jgWgw@qnRydIuVR>$fKG$*CA z*Bew%*erF{(NXM9)6@zJIC0MK=6IfxXpNzY;E?d&Hx_LHOij$Z`&?y{2ac_i(8II zx?SmsJ}<@+YpeCg7L2LJLvKsj7v% z3$>F?`%yvyV(i`EvrIcCO~G43yq5k8e=JXu7$7ArflvdoAjYnrUuBMaox!6nj3@NH z8!xQ-B``W~D{^s#Pm*W=QM8z)^M5c}^xSwU#<;b$RguL5*SNbX)hdE=tlk)#V2XW0vYB^F>9~BK`$lDftXs$AYi<+ImCNYFCdE@E zkYv*R-jm-5dxW}kTnNkIJYazyZ(=JTQAZdHp zc;Fipp*W;AyihJJ(MJm-hFF^g0)gDy><C6)b^&BL$x+}|=yy0bFY89$2SrvPEGno< zG4`Vho0$9U|IDEPr%tA7{hBk;F@q~C3+VHFk*2bk8+4F%S|981VQmQqBk^oD<=|%^ zRwV_VX8x)VTP2|&40I#AYZT;<2jcjYWWn%e zQtW2Hd2p-($)@Ei14GIz#V=!@%dUf|dXF=X{%~M{`28MkAkJzXn%kO}gaeIov^f~R z5bFimTl5y8g0zu2uQtW(ETHdcTs1t<+TSa=UTuV<>?X2n6l=)`Cg+>Ao|r_~et5># zwRh3cd;&9TobKB#y{^>ebUjLsW%)HHo#Dpa?o32AcvrdlN087TFP@hNFzkUiMI-fe zMs2q=W(Nyo_tH)q-ey@4$JBRUTN2}ne>U$}$HVAp23s$5AK%hwD20~tWW%so#PKU{ z_CmxJdSiw=>mZuLZOM2kJ&ukxKIfM_Ol}bzQc!1g8x>8C8a()1`j<>Rz%cWg8r0gP z)Y)@p)!EbUT<0 z!pL5BKN};i^SiJG=rTU?NJ;A*yPz|kKq6D0i*-ZtbNXz_N`X3e-=8_>!Y%~F*tH-@ ztUt%hApZO8^%V(Q=-#Rft(;g+bkh(i1tar)8dnpM^PF*9ehyuyM4kBYF&E%lWl$`X zUrhY`YyA^-F-(06`R8uVV>1M#KMg1{%T?+i{>=A#lE7C0WCZA*wBxy#T1n3uBG|i6 ze_(AaHW_fZkGUvFbD<%cU`z6W@hN}ZCnn<2p=*~F(q7hwj&UYXk`MVz+jP!86nKuw z6)Z6n0{qzfb;}dYMz@E|u&0oZeyAMvWcje)kbA&%zvv`gbKtp z2iJP?;oMZvPr~;xdemr{vp!j^FlYzl`v&FFYXv~&$%4@O7tcP?otSl)`~Xpogp=x`zw)0k{eD6l!|lYppH0ASHCP{Ki!nB{8uM zoKlg4>{Wa8{lYqYAKwyfAA7aa#WHk``~uV&HT*(|-y)KoLAT zg|c;da_7&sPF)BG?i72q(XqSQsj|KmpI2yh6;M7x4`ZYl7@dzQ(PWn+AHaSg)GCUK zqi{)0oRdlr)K+p>Q+sQosn$XI>|NJ+lXg)FXa0G^i}W;-1dYw`6&nAD6UE@0a zb*`m>Q-5vwb84fFrU&N87jOPpThPo$plAjZ_VQTf%V`EGf5gAGp9UOr@3buY01ypi zEa~3LBMgcld`IeoCRer(=b;ZCNpvo1^ZV&R=5dN^)%~-^?Cg9RVt2rAt~TfCf|n|q zFxu5Nr+65dih3KRK`I|-QpJn8uqw#k;9%6~|069RVj1A1eY}0=LuouV z-+lKGJecS9Pkb*(r{18=>2Qw0ZjyC<@M?p8iLfohK004B9RhxH>(ktzu%g+E4!IY7 zHFiUHMT|7&2=DqVKQF1Q>7*eBKk}}FasfWa@49th9fru+q7ijkGrk~3j{?nSbN_M5 zLjb8IH+Oa2lY}-IZc!73Be9`{BWx7n9cR>qIz^VXDLoD$A9snX#xEDl4~pzkLnaW~ z$sHn8gIIs<;^(c(0YxWK`_LOM&Hj*L4?iIFPLj(*Arag?jm+2X1HzwFpk8tCer)m5 zBbG?{bZjnPoWHT1pyV(9OpW2|J?Oa(WUja`X}C(&_y0K%pj(=NO_z3>>XG6u829;z zAP!$hBuVUk193%?JO;`MQ=e8lM?xj7azpRui6MISBE?tMEO*f~h1#kd#pkc>CfNgC zf}`$3Ktnoh!qIvKAC_%nYbeCqaiNl$WtzP_p6^eE4Y?UL%CynyW!g<<3}-n@UMvMb zGu#;BeIML@@9+n91MUE1H-nZxpSJHg)=3qjqu%tA2_y!WY;QJ~X)fLVvy;TM7aJ*E zJ+UQXbZjx;k_7Qm`r5I&zmoB+kW!-0m@|KjV^O$pq|BgP(c*v(-oTyMuNnKzq3EOZ zD}`#SvuPk@Q2F*Ob~s<#gw{O3P%}Wm58tn}<;;`RKrC&4C%DFRz0~H*v;nZzOk@SU zCHu<0_fZ|t($1_`zL~U~20q}eQ>UOm{xE1t(8RiaHsz)&`y&eo+j5H%Sn_hMEA#Vb z8}3^0ea{Ys=nX>1MgL&C1-`m`p-lVzFsNFi(kLp4j@Kb|XSr%c#uA1l>H2%TaVz`B z%pofyZu|QC1`F=*l%kRfjDc1thiIzW`400Af+JRDX6EqAD7bNf_|W`0Q^DsRywVJA z+Erh8`Pq0PXR=Y@PdxV655OY#ZRU5L7VK?hh9bkCmyM~Gjui!H18sJvzE!->7@x8)%LuA(srtNH_3WYAfSh;RQY`ip%Gg1H?34t)qor77 zPhWffTVV#iy3)Lb7Z@BrCABu#DBD*NZuxX5akct;^O#L_M`0ilZMDAL{PRX<|3>Z8 zU~zwxQGoT}J3Om(ZX@A9Ns@)yV^nVkK<%AZHo8UeebLK6V|Hg+be!RF=j8&eIYLiI z#e^!!)eWh8-tQH_2QO7)ZGm<^6CxraE)H)7g-^!pX}~c8j*?c>-6%Bgm`TcBc_zUm zorsjGda?^LLFV&C#9wt}cdi>gkTJDN;ggyu=#Sr;6E-Ym)8BZ}+17niOS0*B024u2 z{|mSlD6ECXVR$e&prNYjp}IQb663o=tKsPuR9bP3gL6EkV}z;Q4wg9>(SSP{7hc+zJ@&~J#z)1an-Z`;>K-MTD9n6F_q}& zRdUc1C%gtvsanAan)+)qP?SRCmEZsr zgzcL;2#pQx6vLYh&vF1WiqhS?HD0S;;OqrJ;>?Pif&M~4As;18-{QJ-7T8S|p}Pc7j=_&QiZ#58m8GOSv4V6rD3cb& zCvFy1tLLCLC?vwBa;nIOmzS3w?TPJ#0|2`<=rfXpkZJ}1u=gWh(Eb-SEEOft|ao%gHR4eiu z?*^Q4Z>3ncVE&SCo1HFGH9}tBBEcXfiC_LRE=2 zVHvq_u=cGg$GE68@q~>ZTjz5kd&U28#PXXSr*m&^9o1kSU6RM3ywZ5GP z`4%SF1#altoeh2%bW+CsTfA-5dQ^M34C})lALL<D$4 zLHJD!n)~ox!7_C$M1F9Ep3cjVKhBUl@xIm0W}HV@U#V%|bVSW08lqX0k+|#yv^@2W z%AZj!oaK6#>`25lSznXt%qHS%#}OGb^~o zrQKZ?OyrQayFR+^#*XqH5$^WQ%C@qPR2wR<H97@WN`0AW`5yL9n*PzQY0||*=14v?21V9 zRxBJ)IjZ7Z5_#$>q4lVrQM<_>EVw-+vKy4I3*mkFtObDn65MS>A!soq*n9O;e)|Nf zbrwO{Twa*J@L`^xmH?X|7D+!)*J-3fB|(r4Br$CV_S-TS$3qJht|K4?(D!`Eg1bJ! zN>S0SRZvQWLUM_@S58N4lj~<9;puooBBM5q=$tZ234+`*z_J0D)Vh70=0jd;p=NhhkIanm#S5edPSytSA=MCDS|Q z2j}#%1j_lFtBnpiHYSYsZYNP{Tv=3jw!^uyW0!D5uv`2N$z`rjyD~4wW_`RoqEnj2 zDrfrsx7J-&{biv9yUOc+a%L_@0}k_3C7Vwdu4YS9!8Kj&I55q|eW37bidf4v8yN%V>r<`x5r3g2l9Pgi^o7YR* z7#kfXzoMJ>H-6Lt6s^|S*Oc4<+fPP86-q_yj`z{;l~(D;O0E}`iEqZAK0A4KkF`wQ z^?u6qNZf6ym-?H(=>eIJUIdD;VfSUpeVER(`U;?#84eT%nsJ|d4!GRnR65fEkjb#J zeL*J|dX*Qs%DNBG=R;+7&Iu*%Yb>9{vbwpHh3oa?{6J-vb9>eDT(4=5-TE?;2l;F> zKe8xk{d^a4(uO8VyonuCf2cRQ8Aagl{@OS8V_0!*V}?)}vhp-ts$sr&K)_-AId%~) z%vD!0WZso<%87CN{0K6CID%EVNe^OWmCG_ij{*cV0g99}R$a=M9^V%-gCO z?!TSn(YSGjl6hcra;3~#*!}*q@VQqcX1^UvP$$qN0=Qz0bU;zPq&jz*Vsy#E%w%a>At)0a1-p;j? zIySj1N#u>S1sVILwl%c@{<~I3aI+F~zvgC^xLD2H@26kI?-snwrSmz(FKaw{-&;fl zG$PJKx5dW@(rlz~h97ZZ>7*t&{7&0f&kx2#wS6Rh?f`(8dH~wAzg$?et###;5452< z!{u{#_K(Lr^)TlDQYC|1U~@Z8$lG+=%2l47ai zQ~9+gMW|tnLV(*#Bn}#1lG?!H4qGg%cU}+h>5?=K+b;TL5Oz~7vC5l=jV#L3GmX?- z-q=!mwEdcEjlWa3?mRrJ#Qbqta}^J30W?^tOL8SAHnVu=3|qsEU9oamElPL~@$Jq0 zG4WNHFO;3D~stO*4e^2GOv)ONFugaLeT zI!}+?3xsRDb-a;|-VIV!~G^f6tneZbKmKBmcW zAb91gy6A_l$LNk%VpxvwQkDuE{cGnAlggV9Y!2UMO^faga8PlUiWpC?yY*hR-YM_e z(q!;GQ7uXRa47Ld_8m!QsQf^@a)M%MePcHBW1ai{0tUu=;=5WfQlcqeb(Xv|#4O>{j4s82(d zxz8~%8Zr8Pm-|-N?Q`=}{5Ng=8^-j<+aoJWO#?gY&AM)FUd>w{P4Hm`X5|J$Np`EO zIaU>$39R-C5o+ly10hooYfVFnOomd^j>er)F~+8x455wP2OnhLkU}0Y-H*TD^WzF! zGd38>)p! znSo%?`pq8SfJXiGq~*rg6@WV_UVFCUuXWrfN{D3pg1;c^-B!U0mSaWnlRaxBfJil6 zPfugMUT4qhQm_uDTGYGg(osE0vai+j0@A!A2oy@b+fprOO?b_wtDySa)ywtGQW!&J z|EiqAzz122?@9^v1?&n6^4Wu)m=r8@PLg4(%Pn+dLtVj|*8ts3*)ZFy+`3t3skk_& zUw69q=JBM8{cvGu{E#b)LM*9_8-MQXO^#>?6OGVWz~=r-h{HzPV2FL0SI;P)pILDZ z-2@6>??$@Tv$(V$`81}bR*e_+6u-vIZQ#irpoOH8#%U7T`F0nH12hojQ(XuPq*h8? zvnaCezyXdrN$7{}MLTrUX;Y@$qdOBoCqfi$^@MlVxwd-UQqV#cfT{C+-g2RQ z$y{XNSRaNu_V2ae)A3bS%NtM1ZTM-)li5AX@Rcj~8zR@{rIJ! z1o>yd$RwZr)gG1oRkIS^ikTwC4PNzB4CFjQOhbp`mvEug>6U+t5|E5q{K3=#=53PV8l;L9E zMlzDE(*)1ndJv9U6}ibas?$_|#3XNao$Yp|cO`x1Nj$-$SCi%W^slH5DxaSH zr1O^W^GXp<8nYwGNIlPJ6pM;0Vjm(n6JJbsDT2pI-+t|fwuteQdm^oOiQEw_YdPfx zzBT4#*uE{oozSS`Ba_c5s*UBHX{3!;anzzw4awva(tE*;O!F0rt$I*-%XDyO$&)?2a3l=Hq9S zmFB-_gyadiKeu^nQ7|+%(AW3{vb~hC_ z-Wi^!4fu|EIlcJOE|tg=654b~OP>at1`nL(?fGX&q1WJ`JNEl9vQs)G6(TIvQYeZ* zG^L0_aiTHX6HqdqM`dCkp{UE|=%r;Li+f~-vE^UV5g{~)wcKIrw||GcL;j516LVr9 zb!-HO6dqv&Z{f8bc zq;h-n0L%sdK*qO@1Y9XL=TuL#`;|tgD>Dyg&0+h3S&iQUrSf|7+`+Z9Yl^%L1txbE zq9W;^%s4eRmExGBBqytflHvr?{m|SJP~xP$1$!tVO!jxsuu8h&GBFMM0F2oM8S)A* zkT`Djv8_FcPRZ%D<*GJ4d}k)U{t1kQfVisk3taTmMu8nUavRlKjHpDNiIMWKmiw(_ zd$%DrSdaX)w_CfzM&}E5V?JpqtJJ8N0MBx2)(}i#i#hQjCCFAOG(oHx2UCF#!P(fO z;o)H}zsRxWjiDi8nai9Olu~2ew%@n-TlcLJ)9y+oh|+m!zL!=*8GK$5DbV=4V6vEL zYE&>IZOp^lMNT?43#RQsD~0AE5m3BJT~%p0T^fQVKT8I^%jLORVF(;q=*Uf_OBF~? z9^CKY?d|Pn%&#Oy2>Y1p7(*5b-{XRH0uSFk-d_(*o^LC-nf#7bF=2{e#_u{M=bH2L*}INU%^in(kvKZRhp|zIE3x3+I;12eHB(Kd>c}2G0S#Z2X z6oprJJ@Dw=kk2K&gc}E90_oOsNR6Ha3Q%&vu09=!#9n_RsOid#;_U1!))L$o+46(M zz3n4onYDX3P9o`vzLj9F_tqBzM)|ZseLncj7A{le(|d%Mj!3)a&_0hpJ{++RUHqT{1qEy`$e*`TC8J2YE zLCLnL2|=P>1HOjG2!(@NX`LrF$6(!~)oEl-_p;K+jUi4;LcLv8cvDe6>&H&C4VP_o zFODNINJ^^DKC5%Z940BOg!4wcIy=g+2obRWlUDD=RA-5zhRS zZ3*t$-Zrv2c+&qq*ooxEbq%&F9|dQgQF9CKgx(Gi5E63Z0DXKo?4|=eVye%?Bw_x+ z3cLPoX?_)DmAmKDbWAl>$P?B;6Yk3kA{`wbMWPvTY`9Z#Ey2TAxh=sSL7%UMps7(_ zlG*{j`KTraX)!I8)l&F|w*`FvB;90uZLmvwbt>INCuDSV*Z%Y3G1lXA(0e-FNS}M= z?!|>+-`Cg*c1i#7Y?>y4+33lW>^@4)mdwKB@nk-G0+WWjk80Wbb48Dzk`#mx!UJsB>$&qWV<_SxkP89^kjJZdPEJ;z%DmE2RqJ`dCNYp z;iH+cg+i&wNQyC(2V=q>Uuh@g^O0AR84C$+9nV{O5aj7NB?zl~$y|}B;bys*b;D5S zD!pS#o2T1VLzGRm{Wp+XBh*UJSgB*^LV-8BI#=#PjRDFg6VP7E0p&l?kP?13_R7nI zG{yP7jRl@t)Z(*rUDs~>k0q(Sup~^jKiTfy6}}x#q-zn*?o4l46WF_8Fo)YuNj-&| z97*#$8iH3LYc|;#YU*D55Z-}6rC5xp!yL~mExI@GK62|s*#p=Tke{grsW>UrgW3Qt(&G4X8?UN$mNH%>CmL|`>?nSW3?Q@Qmq$bs3>MGy{c>Dk)mzTNDCth88> zWPWUoa;xA~nWuZ|EbyR~qsKk0N>&gd;v7-#MBPqwi;a&s5Nt&@dZ{0GfWKT8Mj3eb ztpzW4R%;ri6IakG%`7Tm5yN9tzvu57Hg{PsiP|AmaVwg^1mg|%KhIH2oF1B8{T@Ae zV!-pT-C~0fM6>enjt)3z`jgF%x?1t|DxSRFe~fwJZD}60cY`d(`aT;Q+a}0S&H?C1 zEAYL1*Pvvy8dPf3Q|1F=2>&r=SGHPIxWo5Ub&!AY*(M|VW-}wcDE>88ZMP@-*PpM) z6T%1>zu`$^aX>max+6{+4AM;-^{WdOdJCW>Sh4Pn1oF>R_@az~D{6Svp|jIMWdok# zEqLAm7TC-%KXWZZ=4R^k(e*9l!q6d$0xlu3_J?MuH%Ll8E&Q)xe7lz*dh+W70_Wyz zWZ4a0Fi)9v2o^?7;t2>qed1Vromu#1!yE@UrmwPw-TyK%&I27iwRGRz`*{IUZleD* z<)8ugg&hM%rTfC0at^|d{p0%VQ|UIz%BLZW%qtJd9(|h$qHgxuWvqF??8g1;s~0~8 zeJ-2>V9>ZvHwMlHGniBx(MX|YZNJ~r;Gz~|rW}dv+_QQpzeHbbWUQfobh%;GD8Q#U z?;i<-5=;z-uMrO$lo$ zau8c~5y?}L`|A`vIerYQ{I#OT5f$5l(J7e2%BM4eAgw6i0@0Bc8I@os68>Bj*;_bF z?Ss?q-3l3!9REqY)L$Bm&A^@tWjr=5@n*XVr{!Y+|CSeKRp69Wssok<8Z>tAL07}K z*F`c;mPvB{a{-F@Qok2q^TqS*Nwm+w$yZ7#kIhDmHjIQF;XvZ)~iw(3GO`aNS*?VI))bxt!0) zyE}M6SY53Ek6ncfFUu9*e{9HR_)CY(&6_VA@ZPVr<}@QA!VVj)ZWiz1N0=19A$F|P zg6KpMCCm7hwAyJGyV#HRI8`YLw`aeWfAK?|k>dB6BFsu^O#1dDs!SArQB&|XY`4^- z?OKV5Zc&4-tkh}S3`qA$(P6AZLdTTrU>>(pTHL=q9ad}{{UuK!h{MCfh2FIrq;#0Q zuV5+NQApbOknQ(QNA4VZ!hX-us(3~qvnJ8u

    j&TE?H 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%0DuD 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 H)7}3MF9vs} diff --git a/docs/images/nf-core-differentialabundance_logo_light.png b/docs/images/nf-core-differentialabundance_logo_light.png index de7a3916adb7344f306cadc013be7ee2019b77be..f23e51a2c894fd3ada31e415c4a4e930b9bf30bd 100644 GIT binary patch literal 18165 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 Q$JsD=y85}Sb4q9e0L7@B`2YX_ literal 17745 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 JS?83{1OP`;?v?-m From f56e710f3fbd3a45182a9d29b017b761a3c4f81e Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Fri, 11 Oct 2024 16:02:12 +0100 Subject: [PATCH 099/154] skip exists check for multiqc config --- .nf-core.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.nf-core.yml b/.nf-core.yml index 548fff93..e54625bc 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -5,6 +5,8 @@ lint: - params.css_file - params.citations_file - params.report_file + files_exist: + - assets/multiqc_config.yml nf_core_version: 3.0.2 repository_type: pipeline template: From 75b5f79e11f33d6b0e23e447b2429859c70949b5 Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Fri, 11 Oct 2024 16:11:27 +0100 Subject: [PATCH 100/154] Fix action --- .github/workflows/ci.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4f69097f..dffbc61b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -46,9 +46,9 @@ jobs: # Exclude conda and singularity on dev exclude: - isMaster: false - profile: "conda" + compute_profile: "conda" - isMaster: false - profile: "singularity" + compute_profile: "singularity" steps: - name: Check out pipeline code uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4 @@ -59,17 +59,17 @@ jobs: version: "${{ matrix.NXF_VER }}" - name: Set up Apptainer - if: matrix.profile == 'singularity' + if: matrix.compute_profile == 'singularity' uses: eWaterCycle/setup-apptainer@main - name: Set up Singularity - if: matrix.profile == 'singularity' + if: matrix.compute_profile == 'singularity' run: | mkdir -p $NXF_SINGULARITY_CACHEDIR mkdir -p $NXF_SINGULARITY_LIBRARYDIR - name: Set up Miniconda - if: matrix.profile == 'conda' + if: matrix.compute_profile == 'conda' uses: conda-incubator/setup-miniconda@a4260408e20b96e80095f42ff7f1a15b27dd94ca # v3 with: miniconda-version: "latest" @@ -78,7 +78,7 @@ jobs: channels: conda-forge,bioconda - name: Set up Conda - if: matrix.profile == 'conda' + if: matrix.compute_profile == 'conda' run: | echo $(realpath $CONDA)/condabin >> $GITHUB_PATH echo $(realpath python) >> $GITHUB_PATH @@ -86,6 +86,6 @@ jobs: - name: Clean up Disk space uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 - - name: "Run pipeline with test data ${{ matrix.NXF_VER }} | ${{ matrix.test_name }} | ${{ matrix.profile }}" + - name: "Run pipeline with test data ${{ matrix.NXF_VER }} | ${{ matrix.test_name }} | ${{ matrix.compute_profile }}" run: | nextflow run ${GITHUB_WORKSPACE} -profile ${{ matrix.test_profile }},${{ matrix.compute_profile }} --outdir ./results From 1c7ad9d049223f83231072191b5d2821807d0c7d Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Fri, 11 Oct 2024 16:15:45 +0100 Subject: [PATCH 101/154] correct skipping --- .nf-core.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.nf-core.yml b/.nf-core.yml index e54625bc..663c65d3 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -5,7 +5,7 @@ lint: - params.css_file - params.citations_file - params.report_file - files_exist: + multiqc_config: - assets/multiqc_config.yml nf_core_version: 3.0.2 repository_type: pipeline From cdb7f44a9b55007713b0f139ba320568dd607998 Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Fri, 11 Oct 2024 16:18:35 +0100 Subject: [PATCH 102/154] correct skipping --- .nf-core.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.nf-core.yml b/.nf-core.yml index 663c65d3..c3e6dd7a 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -7,6 +7,8 @@ lint: - params.report_file multiqc_config: - assets/multiqc_config.yml + files_exist: + - assets/multiqc_config.yml nf_core_version: 3.0.2 repository_type: pipeline template: From 4db87df688b5c09b0d39d5a522497ff1c3bffe61 Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Fri, 11 Oct 2024 16:25:51 +0100 Subject: [PATCH 103/154] remove lingering check_max --- conf/modules.config | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index f416d155..5eddade3 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -367,7 +367,7 @@ process { path: { "${params.outdir}/plots/exploratory" }, mode: params.publish_dir_mode, ] - memory = { check_max( 12.GB * task.attempt, 'memory' ) } + memory = { 12.GB * task.attempt } ext.args = { [ "--sample_id_col \"${params.observations_id_col}\"", "--feature_id_col \"${params.features_id_col}\"", @@ -384,7 +384,7 @@ process { path: { "${params.outdir}/plots/differential" }, mode: params.publish_dir_mode, ] - memory = { check_max( 12.GB * task.attempt, 'memory' ) } + memory = { 12.GB * task.attempt } ext.args = { [ "--feature_id_col \"${params.features_id_col}\"", "--reference_level \"$meta.reference\"", @@ -406,7 +406,7 @@ process { path: { "${params.outdir}/shinyngs_app" }, mode: params.publish_dir_mode, ] - memory = { check_max( 12.GB * task.attempt, 'memory' ) } + memory = { 12.GB * task.attempt } ext.args = { [ "--assay_names \"${params.exploratory_assay_names}\"", "--sample_id_col \"${params.observations_id_col}\"", From 83365773eddbab2aee0a93e1b54bf4a2518c0948 Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Fri, 11 Oct 2024 17:01:55 +0100 Subject: [PATCH 104/154] Fix multiqc config --- .nf-core.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index c3e6dd7a..af82ac6a 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -5,8 +5,7 @@ lint: - params.css_file - params.citations_file - params.report_file - multiqc_config: - - assets/multiqc_config.yml + multiqc_config: False files_exist: - assets/multiqc_config.yml nf_core_version: 3.0.2 From 46f1d8efb4c08d29fac4474fc3dec3138aefbc96 Mon Sep 17 00:00:00 2001 From: suzannejin Date: Wed, 16 Oct 2024 14:46:01 +0200 Subject: [PATCH 105/154] added the params for experimental workflow --- conf/andrea.config | 22 ++++++ conf/modules.config | 84 ++++++++++++++++++--- conf/test_experimental.config | 1 - modules/local/propr/grea/main.nf | 3 + modules/local/propr/grea/templates/grea.R | 2 + modules/local/propr/propd/main.nf | 3 +- modules/local/propr/propd/templates/propd.R | 27 ++++--- nextflow.config | 37 +++++++-- subworkflows/local/differential/main.nf | 19 ++--- 9 files changed, 159 insertions(+), 39 deletions(-) create mode 100644 conf/andrea.config diff --git a/conf/andrea.config b/conf/andrea.config new file mode 100644 index 00000000..df78879e --- /dev/null +++ b/conf/andrea.config @@ -0,0 +1,22 @@ +params { + study_name = 'andrea' + + // Input data + input = "$projectDir/data/samplesheet.tsv" + matrix = "$projectDir/data/counts.tsv" + contrasts = "$projectDir/data/contrasts.csv" + tools = "$projectDir/assets/tools_samplesheet.csv" + + // Set reporting parameters + report_title = "full tests" + report_author = "nf-core elves" + report_description = "test andrea" + + // run grea & gprofiler + gene_sets_files = "$projectDir/data/andrea.gmt" + gsea_run = true + gprofiler2_run = true + + // set this, otherwise TABULAR_TO_GSEA_CHIP gives errors + features_name_col = "gene_id" +} diff --git a/conf/modules.config b/conf/modules.config index ca874f2c..2e6f839c 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -482,35 +482,101 @@ process { ] } + // TODO + // for the moment, the parameters from toolsheet are parsed here. + // For the repeated arguments, since the R argument parser will only take the first one, + // here I add the toolsheet arguments at the beginning of ext.args to make sure they are + // taken into account instead of the default options. + // However, later we need to better handle this, maybe by a bit of groovy scripting to + // overwrite the repeated parameters (?) + withName: "PROPR"{ - ext.args = { "${meta.args_cor}" == "null" ? '' : "${meta.args_cor}" } + tag = { [ + "$meta.id", + (meta.args_cor ? "args_cor = $meta.args_cor" : '') + ].join(',').trim() } + ext.args = { [ + (meta.args_cor ? "${meta.args_cor}" : ''), + "--features_id_col ${params.features_id_col}", + "--metric ${params.propr_metric}", + "--ivar ${params.propr_ivar}", + (params.propr_alpha ? "--alpha ${params.propr_alpha}" : ''), + "--fdr ${params.propr_fdr}", + "--tails ${params.propr_tails}", + "--permutation ${params.propr_permutation}", + "--number_of_cutoffs ${params.propr_ncutoffs}" + ].join(' ').trim() } publishDir = [ - path: { "${params.outdir}/correlation_analysis/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, + path: { + meta.args_cor ? "${params.outdir}/correlation_analysis/propr-${meta.args_cor.replace('--','').replace(' ', '_')}" : + "${params.outdir}/correlation_analysis/propr" + }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } + withName: "PROPD"{ - ext.args = { "${meta.args_diff}" == "null" ? '' : "${meta.args_diff}" } + tag = { [ + "$meta.id", + "$meta.contrast", + (meta.args_diff ? "args_diff = $meta.args_diff" : '') + ].join(',').trim() } + ext.args = { [ + (meta.args_diff ? "${meta.args_diff}" : ''), + "--features_id_col ${params.features_id_col}", + "--obs_id_col ${params.observations_id_col}", + (params.propd_alpha ? "--alpha ${params.propd_alpha}" : ''), + "--moderated ${params.propd_moderated}", + "--fdr ${params.propd_fdr}", + "--permutation ${params.propd_permutation}", + "--number_of_cutoffs ${params.propd_ncutoffs}" + ].join(' ').trim() } publishDir = [ - path: { "${params.outdir}/differential_analysis/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, + path: { + meta.args_diff ? "${params.outdir}/differential_analysis/propd-${meta.args_diff.replace('--','').replace(' ', '_')}/${meta.contrast}" : + "${params.outdir}/differential_analysis/propd/${meta.contrast}" + }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } withName: "GREA"{ - ext.args = { "${meta.args_enr}" == "null" ? '' : "${meta.args_enr}" } + tag = { [ + "$meta.id", + (meta.args_enr ? "args_enr = $meta.args_enr" : '') + ].join(',').trim() } + ext.args = { [ + (meta.args_enr ? "${meta.args_enr}" : ''), + "--set_min ${params.grea_set_min}", + "--set_max ${params.grea_set_max}", + "--permutation ${params.grea_permutation}" + ].join(' ').trim() } + publishDir = [ + path: { + meta.args_enr ? "${params.outdir}/enrichment_analysis/grea-${meta.args_enr.replace('--','').replace(' ', '_')}" : + "${params.outdir}/enrichment_analysis/grea" + }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] publishDir = [ - path: { "${params.outdir}/enrichment_differential/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, + path: { "${params.outdir}/enrichment_analysis/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } withName: "MYGENE" { - ext.args = { [ - "--columname ${params.features_id_col}", - ].join(' ').trim() } + ext.args = [ + "--columname ${params.features_id_col}" + ].join(' ').trim() + publishDir = [ + path: "${params.outdir}/enrichment_analysis/mygene", + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] } + } diff --git a/conf/test_experimental.config b/conf/test_experimental.config index e6f9e8f3..23a0f0a1 100644 --- a/conf/test_experimental.config +++ b/conf/test_experimental.config @@ -26,7 +26,6 @@ params { input = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.samplesheet.csv' matrix = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv' contrasts = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.contrasts.csv' - tools = "$projectDir/assets/tools_samplesheet.csv" pathway = "propd,propd_fdr,propr,cor" //Features diff --git a/modules/local/propr/grea/main.nf b/modules/local/propr/grea/main.nf index 0a5f8baf..bb8da483 100644 --- a/modules/local/propr/grea/main.nf +++ b/modules/local/propr/grea/main.nf @@ -2,6 +2,9 @@ process PROPR_GREA { tag "$meta.id" label 'process_high' + // TODO + // the container is not updated for the grea function + // for the moment I'm running it locally // conda "${moduleDir}/environment.yml" // container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? // 'https://depot.galaxyproject.org/singularity/mulled-v2-401a215d4024df776a98d90a352048199e342a3d:5ba9bbf6cd4f4f98983526673c223d2e7d829b36-0': diff --git a/modules/local/propr/grea/templates/grea.R b/modules/local/propr/grea/templates/grea.R index a4cbcc55..f5d50374 100644 --- a/modules/local/propr/grea/templates/grea.R +++ b/modules/local/propr/grea/templates/grea.R @@ -120,6 +120,8 @@ opt_types <- list( prefix = 'character', adj = 'character', gmt = 'character', + set_min = 'numeric', + set_max = 'numeric', permutation = 'numeric', seed = 'numeric', ncores = 'numeric' diff --git a/modules/local/propr/propd/main.nf b/modules/local/propr/propd/main.nf index cbc0c735..8f831a40 100644 --- a/modules/local/propr/propd/main.nf +++ b/modules/local/propr/propd/main.nf @@ -8,8 +8,7 @@ process PROPR_PROPD { 'biocontainers/mulled-v2-401a215d4024df776a98d90a352048199e342a3d:5ba9bbf6cd4f4f98983526673c223d2e7d829b36-0' }" input: - tuple val(meta), path(count) - tuple val(meta2), path(samplesheet) + tuple val(meta), path(count), path(samplesheet), val(contrast_variable), val(reference), val(target) output: tuple val(meta), path("*.propd.rds") , emit: rds diff --git a/modules/local/propr/propd/templates/propd.R b/modules/local/propr/propd/templates/propd.R index a4939034..8b3606fa 100644 --- a/modules/local/propr/propd/templates/propd.R +++ b/modules/local/propr/propd/templates/propd.R @@ -119,7 +119,9 @@ opt <- list( # comparison groups samplesheet = '$samplesheet', obs_id_col = 'sample', # column name of observation ids - group_col = 'treatment', # column name of grouping variable + contrast_variable = "$contrast_variable", # column name of contrast variable + reference_group = "$reference", # reference group for contrast variable + target_group = "$target", # target group for contrast variable # parameters for computing differential proportionality alpha = NA, # alpha for boxcox transformation @@ -141,7 +143,9 @@ opt_types <- list( samplesheet = 'character', features_id_col = 'character', obs_id_col = 'character', - group_col = 'character', + contrast_variable = 'character', + reference_group = 'character', + target_group = 'character', alpha = 'numeric', moderated = 'logical', fdr = 'numeric', @@ -172,7 +176,7 @@ for ( ao in names(args_opt)){ # Check if required parameters have been provided -required_opts <- c('count','samplesheet') +required_opts <- c('count','samplesheet','contrast_variable','reference_group','target_group') missing <- required_opts[unlist(lapply(opt[required_opts], is.null)) | ! required_opts %in% names(opt)] if (length(missing) > 0){ stop(paste("Missing required options:", paste(missing, collapse=', '))) @@ -224,10 +228,10 @@ mat <- read_delim_flexible( mat <- t(mat) # transpose matrix to have features (genes) as columns # parse group -# This creates a vector referring to the group id for each observation. -# The vector should have 2+ different groups, so that differential proportionality will -# be computed to compare the variances between and within groups. TODO one can parse the -# 'group_col' from the contrast file information as the other modules +# and filter matrix and group values, so that only the contrasted groups are kept +# TODO propd can also handle more than two groups +# but that dont work properly with the contrast format +# Should we provide an alternative way to do that? samplesheet <- read_delim_flexible( opt\$samplesheet, @@ -235,10 +239,13 @@ samplesheet <- read_delim_flexible( row.names = NULL, check.names = FALSE ) -tmp <- samplesheet[[opt\$group_col]] -names(tmp) <- samplesheet[[opt\$obs_id_col]] -group <- as.vector(tmp[rownames(mat)]) +samplesheet <- samplesheet[,c(opt\$obs_id_col, opt\$contrast_variable)] +idx <- which(samplesheet[,2] %in% c(opt\$reference_group, opt\$target_group)) +mat <- mat[idx,] +samplesheet <- samplesheet[idx,] +group <- as.vector(samplesheet[,2]) if (length(group) != nrow(mat)) stop('Error when parsing group') +if (length(unique(group)) != 2) stop('Only two groups are allowed for contrast') # compute differential proportionality diff --git a/nextflow.config b/nextflow.config index 2b86853b..cde76a1e 100644 --- a/nextflow.config +++ b/nextflow.config @@ -11,7 +11,6 @@ params { // Input options input = null - study_name = 'study' study_type = 'rnaseq' study_abundance_type = 'counts' @@ -22,10 +21,6 @@ params { control_features = null sizefactors_from_controls = false - // Experimental analysis options - tools = null - pathway = 'diff_prop' - // Reporting logo_file = "$projectDir/docs/images/nf-core-differentialabundance_logo_light.png" css_file = "$projectDir/assets/nf-core_style.css" @@ -214,7 +209,6 @@ params { // Config options config_profile_name = null config_profile_description = null - custom_config_version = 'master' custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" config_profile_contact = null @@ -222,6 +216,37 @@ params { // Schema validation default options validate_params = true + + // ---------------------------------------------- // + // Experimental analysis options // + // ---------------------------------------------- // + + tools = "$projectDir/assets/tools_samplesheet.csv" + pathway = null + + // propd options + propd_group_col = null + propd_group_values = null + propd_alpha = null + propd_moderated = true + propd_fdr = 0.05 + propd_permutation = 0 + propd_ncutoffs = 100 + + // propr options + propr_metric = 'rho' + propr_ivar = 'clr' + propr_alpha = null + propr_fdr = 0.05 + propr_permutation = 100 + propr_ncutoffs = 100 + propr_tails = "right" + + // grea options + grea_set_min = 15 + grea_set_max = 500 + grea_permutation = 100 + } // Load base.config by default for all pipelines diff --git a/subworkflows/local/differential/main.nf b/subworkflows/local/differential/main.nf index e3f40ba3..b19a457b 100644 --- a/subworkflows/local/differential/main.nf +++ b/subworkflows/local/differential/main.nf @@ -9,7 +9,7 @@ workflow DIFFERENTIAL { ch_tools ch_counts ch_samplesheet - ch_contrasts // [meta, contrast_variable, reference, target] + ch_contrasts main: @@ -33,21 +33,18 @@ workflow DIFFERENTIAL { // ---------------------------------------------------- ch_counts - .combine(ch_tools_single.propd) + .join(ch_samplesheet) .combine(ch_contrasts) + .combine(ch_tools_single.propd) .map { - meta_counts, counts, tools, meta_contrast, contrast_variable, reference, target -> - def meta = meta_counts.clone() + tools.clone() - meta.args_diff = (meta.args_diff ?: "") + " --group_col $contrast_variable" // TODO parse the toolsheet with the ext.arg from modules.config at the beginning of the experimental workflow - [ meta, counts ] + meta_data, counts, samplesheet, meta_contrast, contrast_variable, reference, target, meta_tools -> + def meta = meta_data.clone() + ['contrast': meta_contrast.id] + meta_tools.clone() + [ meta, counts, samplesheet, contrast_variable, reference, target ] } .unique() - .set { ch_counts_propd } + .set { ch_propd } + PROPD(ch_propd) - PROPD( - ch_counts_propd, - ch_samplesheet.first() - ) ch_results_pairwise = ch_results_pairwise.mix(PROPD.out.results) ch_results_pairwise_filtered = ch_results_pairwise_filtered.mix(PROPD.out.results_filtered) ch_results_genewise = ch_results_genewise.mix(PROPD.out.connectivity) From e8f159a89e59b60ccba0fe14440297670995ad2d Mon Sep 17 00:00:00 2001 From: suzannejin Date: Wed, 16 Oct 2024 14:55:44 +0200 Subject: [PATCH 106/154] udpate schema for tools --- assets/schema_tools.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/schema_tools.json b/assets/schema_tools.json index 70e258f1..e70af3f1 100644 --- a/assets/schema_tools.json +++ b/assets/schema_tools.json @@ -1,5 +1,5 @@ { - "$schema": "http://json-schema.org/draft-07/schema", + "$schema": "https://json-schema.org/draft/2020-12/schema", "title": "nf-core/differentialabundance - params.tools schema", "description": "Schema for the file provided with params.tools", "type": "array", From 36fcff4f828ed82f3125ac5080bea8e7cd7cb15c Mon Sep 17 00:00:00 2001 From: suzannejin Date: Wed, 16 Oct 2024 15:20:38 +0200 Subject: [PATCH 107/154] updated fromSamplesheet to samplesheetToList --- nextflow.config | 1 + nextflow_schema.json | 133 ++++++++++++++++++++++-- subworkflows/local/experimental/main.nf | 2 +- workflows/differentialabundance.nf | 13 ++- 4 files changed, 133 insertions(+), 16 deletions(-) diff --git a/nextflow.config b/nextflow.config index cde76a1e..07d5a98e 100644 --- a/nextflow.config +++ b/nextflow.config @@ -222,6 +222,7 @@ params { // ---------------------------------------------- // tools = "$projectDir/assets/tools_samplesheet.csv" + tools_schema = "$projectDir/assets/schema_tools.json" pathway = null // propd options diff --git a/nextflow_schema.json b/nextflow_schema.json index d334783d..b7ba08d5 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -61,8 +61,8 @@ } } }, - "experimental_analysis_options": { - "title": "Experimental analysis, including CoDa", + "run_experimental_branch_through_the_toolsheet_config": { + "title": "Run experimental branch through the toolsheet config", "type": "object", "fa_icon": "fas fa-terminal", "description": "Values required for experimental analysis", @@ -75,11 +75,11 @@ "schema": "assets/schema_tools.json", "pattern": "^\\S+\\.(csv|tsv|yaml)$", "description": "Path to comma-separated file containing samplesheet", - "help_text": "This file defines possible combinations of tools, which are to be run by the pipeline" + "help_text": "This file defines possible combinations of tools, which are to be run by the pipeline", + "default": "${projectDir}/assets/tools_samplesheet.csv" }, "pathway": { "type": "string", - "default": "diff_prop", "fa_icon": "fas fa-border-all", "description": "(experimantal only): Choose a (list of) pathway from those predefined in the tool sheet", "help_text": "Choose the a subset of pathways to run. Pathways are defined in the tool sheet." @@ -109,14 +109,12 @@ }, "affy_cel_files_archive": { "type": "string", - "default": "null", "description": "Alternative to matrix: a compressed CEL files archive such as often found in GEO", "fa_icon": "fas fa-file-archive", "help_text": "Use this option to provide a raw archive of CEL files from Affymetrix arrays. Will be ignored if a matrix is specified." }, "querygse": { "type": "string", - "default": "null", "description": "Use SOFT files from GEO by providing the GSE study identifier", "fa_icon": "fas fa-keyboard", "help_text": "Use this option to provide a GSE study identifier." @@ -752,6 +750,92 @@ }, "fa_icon": "fas fa-border-all" }, + "propd_specific_options": { + "title": "propd specific options", + "type": "object", + "description": "Parameters to run differential proportionality", + "default": "", + "properties": { + "propd_group_col": { + "type": "string", + "default": "null" + }, + "propd_group_values": { + "type": "string", + "default": "null" + }, + "propd_alpha": { + "type": "string", + "default": "null", + "description": "Alpha parameter for Box-Cox transformation. Default is skipped, and log transformation is used." + }, + "propd_moderated": { + "type": "boolean", + "default": true, + "description": "Use moderated version of differential proportionality coefficients. This is usually needed when p>>n." + }, + "propd_fdr": { + "type": "number", + "default": 0.05, + "description": "FDR threshold for filtering the significant pairs." + }, + "propd_permutation": { + "type": "integer", + "default": 0, + "description": "When this parameter is 0, use the default statistical test to determine the FDR. When this number is > 0, run permutation test to get the FDR with as many permutations as defined by this parameter. Usually a minimum number of 100 permutations is needed." + }, + "propd_ncutoffs": { + "type": "integer", + "default": 100, + "description": "Because it is expensive to calculate an associated p-value for all the pairs through all the permutation tests, this number is used to define on how many values to calculate the FDR. The higher this value is, the higher the granularity." + } + } + }, + "propr_specific_options": { + "title": "propr specific options", + "type": "object", + "description": "Parameters to run correlation analysis through propr package", + "default": "", + "properties": { + "propr_metric": { + "type": "string", + "default": "rho", + "description": "The correlation metric to use.", + "enum": ["rho", "cor", "pcor", "pcor.shrink", "pcor.bshrink", "vlr", "phi", "phs"] + }, + "propr_ivar": { + "type": "string", + "default": "clr", + "description": "Which logratio transformation to use. 'clr' means centered logratio transformation, which uses the sample geometric mean as reference. 'alr' means additive logratio transformation, and it can use any gene or genes as reference(s). One can give the gene name(s) or index(es) as reference(s)." + }, + "propr_alpha": { + "type": "string", + "default": "null", + "description": "Alpha parameter for Box-Cox transformation. Default is skipped, and log transformation is used." + }, + "propr_fdr": { + "type": "number", + "default": 0.05, + "description": "FDR threshold for filtering the significant pairs." + }, + "propr_permutation": { + "type": "integer", + "default": 100, + "description": "Number of permutations for the permutation test that is used to compute the FDR of observing a given correlation coefficient value by chance." + }, + "propr_ncutoffs": { + "type": "integer", + "default": 100, + "description": "Because it is expensive to calculate an associated p-value for all the pairs through all the permutation tests, this number is used to define on how many values to calculate the FDR. The higher this value is, the higher the granularity." + }, + "propr_tails": { + "type": "string", + "default": "right", + "enum": ["right", "both"], + "description": "Use one-sided 'right'-tailed test or 'both' for two-sided test with symmetric cutpoints." + } + } + }, "gsea": { "title": "GSEA", "type": "object", @@ -975,6 +1059,29 @@ }, "fa_icon": "fas fa-layer-group" }, + "grea_specific_options": { + "title": "GREA specific options", + "type": "object", + "description": "Parameters to run GREA (Gene Ratio Enrichment Analysis)", + "default": "", + "properties": { + "grea_set_min": { + "type": "integer", + "default": 15, + "description": "Min size: exclude smaller sets" + }, + "grea_set_max": { + "type": "integer", + "default": 500, + "description": "Max size: exclude larger sets" + }, + "grea_permutation": { + "type": "integer", + "default": 100, + "description": "Number of permutations for the permutation test that is used to compute the FDR of observing a given odds ratio by chance." + } + } + }, "shiny_app_settings": { "title": "Shiny app settings", "type": "object", @@ -1254,10 +1361,7 @@ "$ref": "#/$defs/input_output_options" }, { - "$ref": "#/$defs/experimental_analysis_options" - }, - { - "$ref": "#/$defs/abundance_values" + "$ref": "#/$defs/run_experimental_branch_through_the_toolsheet_config" }, { "$ref": "#/$defs/abundance_values" @@ -1289,12 +1393,21 @@ { "$ref": "#/$defs/limma_specific_options_microarray_only" }, + { + "$ref": "#/$defs/propd_specific_options" + }, + { + "$ref": "#/$defs/propr_specific_options" + }, { "$ref": "#/$defs/gsea" }, { "$ref": "#/$defs/gprofiler2" }, + { + "$ref": "#/$defs/grea_specific_options" + }, { "$ref": "#/$defs/shiny_app_settings" }, diff --git a/subworkflows/local/experimental/main.nf b/subworkflows/local/experimental/main.nf index 3487bede..50e5ca57 100644 --- a/subworkflows/local/experimental/main.nf +++ b/subworkflows/local/experimental/main.nf @@ -14,7 +14,7 @@ workflow EXPERIMENTAL { main: - // TODO add a printing function to pretty print what are the pathways (tools, arguments) to run + // check tools ch_tools.view() // initialize empty results channels diff --git a/workflows/differentialabundance.nf b/workflows/differentialabundance.nf index 5d51038a..66f1ff2c 100644 --- a/workflows/differentialabundance.nf +++ b/workflows/differentialabundance.nf @@ -133,7 +133,7 @@ include { GEOQUERY_GETGEO } from '../modules/n include { ZIP as MAKE_REPORT_BUNDLE } from '../modules/nf-core/zip/main' include { softwareVersionsToYAML } from '../subworkflows/nf-core/utils_nfcore_pipeline' -include { fromSamplesheet } from 'plugin/nf-validation' +include { samplesheetToList } from 'plugin/nf-schema' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -362,26 +362,29 @@ workflow DIFFERENTIALABUNDANCE { } else if (params.study_type == 'experimental') { // Convert the samplesheet.csv in a channel with the proper format - ch_tools = Channel.fromSamplesheet('tools') + ch_tools = Channel.fromList(samplesheetToList(params.tools, params.tools_schema)) + // Filter the tools to the pathway(s) of interest, or run everything if requested if (params.pathway == "all") { ch_tools - .set{ ch_tools_filtered } + .set{ ch_tools } } else { ch_tools .filter{ it[0]["pathway_name"] in params.pathway.tokenize(',') } - .set{ ch_tools_filtered } + .set{ ch_tools } } EXPERIMENTAL( ch_contrasts, VALIDATOR.out.sample_meta, CUSTOM_MATRIXFILTER.out.filtered, - ch_tools_filtered + ch_tools ) + // TODO for the moment, these channels are allocated to not breaking the next part. + // they have to be properly handled afterwards ch_norm = Channel.empty() ch_differential = Channel.empty() ch_processed_matrices = Channel.empty() From 66148af466559d38be717ec3a490cb5cd34b5901 Mon Sep 17 00:00:00 2001 From: suzannejin Date: Wed, 16 Oct 2024 15:43:09 +0200 Subject: [PATCH 108/154] set toolsheet schema --- nextflow.config | 1 - workflows/differentialabundance.nf | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/nextflow.config b/nextflow.config index 07d5a98e..cde76a1e 100644 --- a/nextflow.config +++ b/nextflow.config @@ -222,7 +222,6 @@ params { // ---------------------------------------------- // tools = "$projectDir/assets/tools_samplesheet.csv" - tools_schema = "$projectDir/assets/schema_tools.json" pathway = null // propd options diff --git a/workflows/differentialabundance.nf b/workflows/differentialabundance.nf index 66f1ff2c..b4a8a236 100644 --- a/workflows/differentialabundance.nf +++ b/workflows/differentialabundance.nf @@ -362,7 +362,7 @@ workflow DIFFERENTIALABUNDANCE { } else if (params.study_type == 'experimental') { // Convert the samplesheet.csv in a channel with the proper format - ch_tools = Channel.fromList(samplesheetToList(params.tools, params.tools_schema)) + ch_tools = Channel.fromList(samplesheetToList(params.tools, './assets/schema_tools.json')) // Filter the tools to the pathway(s) of interest, or run everything if requested if (params.pathway == "all") { From 576bb8ccd2495859b249200b95b49ed602ec48ce Mon Sep 17 00:00:00 2001 From: suzannejin Date: Wed, 16 Oct 2024 15:44:59 +0200 Subject: [PATCH 109/154] remove temporal config --- conf/andrea.config | 22 ---------------------- 1 file changed, 22 deletions(-) delete mode 100644 conf/andrea.config diff --git a/conf/andrea.config b/conf/andrea.config deleted file mode 100644 index df78879e..00000000 --- a/conf/andrea.config +++ /dev/null @@ -1,22 +0,0 @@ -params { - study_name = 'andrea' - - // Input data - input = "$projectDir/data/samplesheet.tsv" - matrix = "$projectDir/data/counts.tsv" - contrasts = "$projectDir/data/contrasts.csv" - tools = "$projectDir/assets/tools_samplesheet.csv" - - // Set reporting parameters - report_title = "full tests" - report_author = "nf-core elves" - report_description = "test andrea" - - // run grea & gprofiler - gene_sets_files = "$projectDir/data/andrea.gmt" - gsea_run = true - gprofiler2_run = true - - // set this, otherwise TABULAR_TO_GSEA_CHIP gives errors - features_name_col = "gene_id" -} From 59bd17cb119c1ac3acb8af38e5973aef535e7bc4 Mon Sep 17 00:00:00 2001 From: suzannejin Date: Wed, 16 Oct 2024 15:56:32 +0200 Subject: [PATCH 110/154] minor changes --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index cde76a1e..1fab6a07 100644 --- a/nextflow.config +++ b/nextflow.config @@ -221,7 +221,7 @@ params { // Experimental analysis options // // ---------------------------------------------- // - tools = "$projectDir/assets/tools_samplesheet.csv" + tools = "${projectDir}/assets/tools_samplesheet.csv" pathway = null // propd options From bd51d59405160e130bac077f6e4ece7eb96a6300 Mon Sep 17 00:00:00 2001 From: suzannejin Date: Wed, 16 Oct 2024 16:24:36 +0200 Subject: [PATCH 111/154] fix error related to .nf-core.yml --- .nf-core.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.nf-core.yml b/.nf-core.yml index af82ac6a..29a057fb 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -5,6 +5,7 @@ lint: - params.css_file - params.citations_file - params.report_file + - params.tools multiqc_config: False files_exist: - assets/multiqc_config.yml From a077c0339f81749856cf8f99885bf640827f3c4d Mon Sep 17 00:00:00 2001 From: suzannejin Date: Wed, 16 Oct 2024 16:38:05 +0200 Subject: [PATCH 112/154] properly set the resources limits for test_experimental.config --- conf/test_experimental.config | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/conf/test_experimental.config b/conf/test_experimental.config index 23a0f0a1..22aeb686 100644 --- a/conf/test_experimental.config +++ b/conf/test_experimental.config @@ -11,17 +11,20 @@ ---------------------------------------------------------------------------------------- */ +process { + resourceLimits = [ + cpus: 4, + memory: '15.GB', + time: '1.h' + ] +} + params { study_name = 'SRP254919' study_type = 'experimental' config_profile_name = 'Test profile' 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/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.samplesheet.csv' matrix = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv' From d7ab1cad2a856e29db5dfaeef9d38fbfd93312a7 Mon Sep 17 00:00:00 2001 From: suzannejin Date: Thu, 17 Oct 2024 17:07:05 +0200 Subject: [PATCH 113/154] update propd.R template to compute weighted connectivity for hub genes --- modules/local/propr/propd/templates/propd.R | 226 +++++++++++++++----- 1 file changed, 177 insertions(+), 49 deletions(-) diff --git a/modules/local/propr/propd/templates/propd.R b/modules/local/propr/propd/templates/propd.R index 8b3606fa..1329612e 100644 --- a/modules/local/propr/propd/templates/propd.R +++ b/modules/local/propr/propd/templates/propd.R @@ -54,26 +54,58 @@ read_delim_flexible <- function(file, header = TRUE, row.names = 1, check.names #' Get connectivity of genes from adjacency matrix #' #' The connectivity of a gene is the number of connections it has with other genes. -#' In other words, the degree of a gene. +#' In other words, the degree of a gene. This connectivity can be weighted. In this +#' way, the strength of the theta value can be taken into account. +#' These information can be used to summarize the network and identify genes that are +#' potentially changing between groups. #' +#' @param pd propd object #' @param adj Adjacency matrix +#' @param de Differential proportionality values for each gene with respect to the +#' normalization reference +#' @param cutoff Cutoff value for de values to be considered significant #' -#' @return data frame with sorted degree per gene -get_connectivity <- function(adj){ +#' @return data frame with the following columns: gene_id, degree, weighted_degree, +#' genewise_theta, average_theta, classification +get_connectivity <- function(pd, adj, de, cutoff, features_id_col='gene_id'){ + + # initialize empty data frame + connectivity <- data.frame(matrix(NA, nrow=ncol(pd@counts), ncol=6)) + colnames(connectivity) <- c( + features_id_col, + 'degree', + 'weighted_degree', + 'genewise_theta', + 'average_theta', + 'classification' + ) - # calculate degree per gene - diag(adj) <- 0 - connectivity <- rowSums(adj) + # add features ids + connectivity[,1] <- colnames(pd@counts) - # create data frame - connectivity <- data.frame( - 'feature' = rownames(adj), - 'degree' = connectivity - ) - names(connectivity) <- c(opt\$features_id_col, 'degree') + # add degree + # degree is the number of connections a gene has with other genes + connectivity[,2] <- colSums(adj) + + # add weighted degree + # each connection is weighted by the theta value + # so lower theta values (higher between group variance than within group variance) will have a higher weight + mat <- getMatrix(pd) + diag(mat) <- NA + connectivity[,3] <- colSums((1 - mat) * adj, na.rm=TRUE) - # sort by degree - connectivity <- connectivity[order(connectivity\$degree, decreasing=TRUE),] + # add genewise theta + # a theta value can be associated to each gene by calculating the between group variance vs within group variance + # of the gene normalized with respect to a reference (in this case the geometric mean of the sample) + connectivity[,4] <- de + + # add average theta of the connections + connectivity[,5] <- connectivity[,3] / connectivity[,2] + + # classification + # green for DE genes, and red for non-DE genes + connectivity[,6] <- 'green' + connectivity[which(de > cutoff), 6] <- 'red' return(connectivity) } @@ -86,21 +118,67 @@ get_connectivity <- function(adj){ #' degree by node. #' #' @param connectivity Data frame with connectivity +#' @param cutoff Theta value for which DP pairs are considered significant. +#' @param weighted Boolean. If TRUE, use weighted degree to determine hub genes. +#' Otherwise, use degree. #' -#' @return filtered connectivity data frame with hub genes -get_hub_genes <- function(connectivity){ +#' @return filtered and sorted connectivity data frame with hub genes +get_hub_genes <- function(connectivity, cutoff, weighted=FALSE){ # get the expected degree - total_degree <- sum(connectivity\$degree) - n_nodes <- sum(connectivity > 0) + total_degree <- if (weighted) sum(connectivity\$weighted_degree) else sum(connectivity\$degree) + n_nodes <- sum(connectivity\$degree > 0) expected_degree <- total_degree / n_nodes # get hub genes hub_genes <- connectivity[which(connectivity\$degree > expected_degree),] + # sort hub genes + if (weighted) { + hub_genes <- hub_genes[order(hub_genes\$weighted_degree, decreasing=TRUE),] + } else { + hub_genes <- hub_genes[order(hub_genes\$degree, decreasing=TRUE),] + } + return(hub_genes) } +# this function overwrites the one in the propr package, that had a bug +# TODO update the container with the corrected package, and remove this +runNormalization <- function(object, norm.factors) { + if (!inherits(object, "propd")) { + stop("Please provide a propd object.") + } + if (!identical(length(norm.factors), nrow(object@counts))) { + stop("The norm factors should have one value for each subject.") + } + + # compute thetas + newCounts <- cbind(norm.factors, object@counts) + newPD <- + propd( + newCounts, + group = object@group, + alpha = object@alpha, + p = 0, + weighted = object@weighted + ) + if (object@active == "theta_mod") { + newPD <- updateF(newPD, moderated = TRUE) + } + newPD <- setActive(newPD, object@active) + + # parse thetas for each gene + rawRes <- newPD@results + perFeature <- rawRes[rawRes\$Pair == 1,] + if (!identical(perFeature\$Partner, 2:(ncol(newCounts)))) + stop("DEBUG ERROR #GET001.") + thetas <- perFeature\$theta + names(thetas) <- colnames(object@counts) + + return(thetas) +} + ################################################ ################################################ ## Parse arguments ## @@ -132,6 +210,9 @@ opt <- list( permutation = 0, # if permutation > 0, use permutation test to compute FDR number_of_cutoffs = 100, # number of cutoffs for permutation test + # parameters for getting the hub genes + weighted_degree = FALSE, # use weighted degree for hub genes or not + # other parameters seed = NA, # seed for reproducibility ncores = as.integer('$task.cpus') @@ -193,6 +274,12 @@ for (file_input in c('count','samplesheet')){ } } +# check parameters are valid + +if (opt$permutation < 0) { + stop('permutation should be a positive integer') +} + # TODO maybe add a function to pretty print the arguments? print(opt) @@ -257,6 +344,17 @@ pd <- propd( p = opt\$permutation ) +# compute DE theta values +# this is the theta value for each gene with respect to the normalization reference +# in this case, the reference is the geometric mean of the sample +# These DE values are only for interpreting purposes. +# TODO if we want to use the outcome from other DE analysis, at some point we should +# divide the below part into maybe a separate module that can take the DE and DP values as input +# and coordinate them through the pipeline + +ref <- exp(rowMeans(log(pd@counts))) +de <- runNormalization(pd, ref) + # use F-stat FDR-adjusted p-values to get significant pairs, if permutation == 0 # otherwise, get FDR values using permutation tests (more computationally expensive but likely more conservative FDRs) @@ -272,30 +370,52 @@ if (opt\$permutation == 0) { ) if (opt\$moderated) pd <- setActive(pd, what='theta_mod') - # get adjacency matrix + # get theta value for which FDR is below desired threshold + # theta_cutoff is FALSE when no theta value has FDR below desired threshold + # otherwise it is the theta value for which FDR is below desired threshold + # Only when there is a meaningful theta, we can compute the next steps + # that involve extracting the significant pairs. - adj <- getAdjacencyFstat( + theta_cutoff <- getCutoffFstat( pd, pval=opt\$fdr, fdr_adjusted=TRUE ) + if (theta_cutoff) { + + # get adjacency matrix + # this matrix will have 1s for significant pairs and 0s for the rest + # diagonals are set to 0 + + adj <- getAdjacencyFstat( + pd, + pval=opt\$fdr, + fdr_adjusted=TRUE + ) - # calculate gene connectivity and get hub genes + # calculate gene connectivity and get hub genes - connectivity <- get_connectivity(adj) - hub_genes <- get_hub_genes(connectivity) + connectivity <- get_connectivity( + pd, + adj, + de, + theta_cutoff, + features_id_col=opt\$features_id_col + ) + hub_genes <- get_hub_genes(connectivity, weighted=opt\$weighted_degree) - # get significant pairs and classify them into red/yellow/green pairs + # get significant pairs and classify them into red/yellow/green pairs - results <- getSignificantResultsFstat( - pd, - pval=opt\$fdr, - fdr_adjusted=TRUE - ) - results <- results[,c("Partner", "Pair", "theta")] - results\$class <- "red" - results\$class[which(results\$Pair %in% hub_genes\$gene | results\$Partner %in% hub_genes\$gene)] <- "yellow" - results\$class[which(results\$Pair %in% hub_genes\$gene & results\$Partner %in% hub_genes\$gene)] <- "green" + results <- getSignificantResultsFstat( + pd, + pval=opt\$fdr, + fdr_adjusted=TRUE + ) + results <- results[,c("Partner", "Pair", "theta")] + results\$class <- "red" + results\$class[which(results\$Pair %in% hub_genes[opt\$features_id_col] | results\$Partner %in% hub_genes[opt\$features_id_col])] <- "yellow" + results\$class[which(results\$Pair %in% hub_genes[opt\$features_id_col] & results\$Partner %in% hub_genes[opt\$features_id_col])] <- "green" + } } else { @@ -309,16 +429,14 @@ if (opt\$permutation == 0) { ncores = opt\$ncores ) - # get cutoff - # this is the cutoff used to get the significant pairs and ensemble of adjacency matrix + # get theta cutoff - cutoff <- getCutoffFDR( + theta_cutoff <- getCutoffFDR( pd, fdr=opt\$fdr, window_size=1 ) - - if (cutoff) { + if (theta_cutoff) { # get adjacency matrix @@ -330,8 +448,14 @@ if (opt\$permutation == 0) { # calculate gene connectivity and get hub genes - connectivity <- get_connectivity(adj) - hub_genes <- get_hub_genes(connectivity) + connectivity <- get_connectivity( + pd, + adj, + de, + theta_cutoff, + features_id_col=opt\$features_id_col + ) + hub_genes <- get_hub_genes(connectivity, weigthted=opt\$weighted_degree) # get significant pairs and classify them into red/yellow/green pairs @@ -345,17 +469,21 @@ if (opt\$permutation == 0) { results\$class[which(results\$Pair %in% hub_genes\$gene | results\$Partner %in% hub_genes\$gene)] <- "yellow" results\$class[which(results\$Pair %in% hub_genes\$gene & results\$Partner %in% hub_genes\$gene)] <- "green" - } else { - # TODO take top n pairs when no cutoff has FDR below desired threshold - # For the moment, we just print a warning and set adj, hub_genes and results to NULL - warning('No pairs have FDR below desired threshold.') - adj <- NULL - connectivity <- NULL - hub_genes <- NULL - results <- NULL } } +# deal with the situation when no significant thetas are found +# For the moment, we just print a warning and set adj, hub_genes and results to NULL +# TODO take top n pairs when no cutoff has FDR below desired threshold + +if (!theta_cutoff) { + warning('No theta value has FDR below desired threshold.') + adj <- NULL + connectivity <- NULL + hub_genes <- NULL + results <- NULL +} + ################################################ ################################################ ## Generate outputs ## @@ -376,7 +504,7 @@ write.table( quote = FALSE ) -if (!is.null(adj)) { +if (theta_cutoff) { write.table( results, file = paste0(opt\$prefix, '.propd.results_filtered.tsv'), From 9819e84ce9303695320017ab7a33713a396cbdbb Mon Sep 17 00:00:00 2001 From: suzannejin Date: Thu, 17 Oct 2024 18:06:59 +0200 Subject: [PATCH 114/154] add parameter for propd_weighted_degree --- conf/modules.config | 3 ++- modules/local/propr/propd/templates/propd.R | 27 +++++++++++++++------ nextflow.config | 1 + nextflow_schema.json | 5 ++++ 4 files changed, 28 insertions(+), 8 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 2e6f839c..cae1a06c 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -530,7 +530,8 @@ process { "--moderated ${params.propd_moderated}", "--fdr ${params.propd_fdr}", "--permutation ${params.propd_permutation}", - "--number_of_cutoffs ${params.propd_ncutoffs}" + "--number_of_cutoffs ${params.propd_ncutoffs}", + "--weighted_degree ${params.propd_weighted_degree}" ].join(' ').trim() } publishDir = [ path: { diff --git a/modules/local/propr/propd/templates/propd.R b/modules/local/propr/propd/templates/propd.R index 1329612e..8d842152 100644 --- a/modules/local/propr/propd/templates/propd.R +++ b/modules/local/propr/propd/templates/propd.R @@ -90,6 +90,7 @@ get_connectivity <- function(pd, adj, de, cutoff, features_id_col='gene_id'){ # add weighted degree # each connection is weighted by the theta value # so lower theta values (higher between group variance than within group variance) will have a higher weight + # NOTE this is a placeholder for the proper weighted degree, maybe we are gonna change the way how we compute it mat <- getMatrix(pd) diag(mat) <- NA connectivity[,3] <- colSums((1 - mat) * adj, na.rm=TRUE) @@ -100,7 +101,7 @@ get_connectivity <- function(pd, adj, de, cutoff, features_id_col='gene_id'){ connectivity[,4] <- de # add average theta of the connections - connectivity[,5] <- connectivity[,3] / connectivity[,2] + connectivity[,5] <- colSums(mat * adj, na.rm=TRUE) / colSums(adj) # classification # green for DE genes, and red for non-DE genes @@ -211,7 +212,7 @@ opt <- list( number_of_cutoffs = 100, # number of cutoffs for permutation test # parameters for getting the hub genes - weighted_degree = FALSE, # use weighted degree for hub genes or not + weighted_degree = FALSE, # use weighted degree for hub genes or not # other parameters seed = NA, # seed for reproducibility @@ -232,6 +233,7 @@ opt_types <- list( fdr = 'numeric', permutation = 'numeric', number_of_cutoffs = 'numeric', + weighted_degree = 'logical', seed = 'numeric', ncores = 'numeric' ) @@ -276,7 +278,7 @@ for (file_input in c('count','samplesheet')){ # check parameters are valid -if (opt$permutation < 0) { +if (opt\$permutation < 0) { stop('permutation should be a positive integer') } @@ -383,6 +385,8 @@ if (opt\$permutation == 0) { ) if (theta_cutoff) { + warning('Significant theta value found: ', theta_cutoff) + # get adjacency matrix # this matrix will have 1s for significant pairs and 0s for the rest # diagonals are set to 0 @@ -413,8 +417,12 @@ if (opt\$permutation == 0) { ) results <- results[,c("Partner", "Pair", "theta")] results\$class <- "red" - results\$class[which(results\$Pair %in% hub_genes[opt\$features_id_col] | results\$Partner %in% hub_genes[opt\$features_id_col])] <- "yellow" - results\$class[which(results\$Pair %in% hub_genes[opt\$features_id_col] & results\$Partner %in% hub_genes[opt\$features_id_col])] <- "green" + results\$class[which(de[results\$Pair] < theta_cutoff | de[results\$Partner] < theta_cutoff)] <- "yellow" + results\$class[which(de[results\$Pair] < theta_cutoff & de[results\$Partner] < theta_cutoff)] <- "green" + + # sort significant pairs + + results <- results[order(results\$theta),] } } else { @@ -438,6 +446,8 @@ if (opt\$permutation == 0) { ) if (theta_cutoff) { + warning('Significant theta value found: ', theta_cutoff) + # get adjacency matrix adj <- getAdjacencyFDR( @@ -466,9 +476,12 @@ if (opt\$permutation == 0) { ) results <- results[,c("Partner", "Pair", "theta")] results\$class <- "red" - results\$class[which(results\$Pair %in% hub_genes\$gene | results\$Partner %in% hub_genes\$gene)] <- "yellow" - results\$class[which(results\$Pair %in% hub_genes\$gene & results\$Partner %in% hub_genes\$gene)] <- "green" + results\$class[which(de[results\$Pair] < theta_cutoff | de[results\$Partner] < theta_cutoff)] <- "yellow" + results\$class[which(de[results\$Pair] < theta_cutoff & de[results\$Partner] < theta_cutoff)] <- "green" + + # sort significant pairs + results <- results[order(results\$theta),] } } diff --git a/nextflow.config b/nextflow.config index 1fab6a07..f1a577dc 100644 --- a/nextflow.config +++ b/nextflow.config @@ -232,6 +232,7 @@ params { propd_fdr = 0.05 propd_permutation = 0 propd_ncutoffs = 100 + propd_weighted_degree = false // propr options propr_metric = 'rho' diff --git a/nextflow_schema.json b/nextflow_schema.json index b7ba08d5..f5534865 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -788,6 +788,11 @@ "type": "integer", "default": 100, "description": "Because it is expensive to calculate an associated p-value for all the pairs through all the permutation tests, this number is used to define on how many values to calculate the FDR. The higher this value is, the higher the granularity." + }, + "propd_weighted_degree": { + "type": "boolean", + "default": false, + "description": "If true, use weighted degree to filter the hub genes. Otherwie, use the degree." } } }, From b566842ff3259a335991d5a921dc32b7e614e124 Mon Sep 17 00:00:00 2001 From: suzannejin Date: Fri, 18 Oct 2024 11:12:09 +0200 Subject: [PATCH 115/154] updated propr container --- conf/test_experimental.config | 2 +- modules/local/propr/grea/main.nf | 9 +++------ modules/local/propr/propd/main.nf | 6 +++--- modules/local/propr/propr/main.nf | 6 +++--- 4 files changed, 10 insertions(+), 13 deletions(-) diff --git a/conf/test_experimental.config b/conf/test_experimental.config index 22aeb686..9d588ce9 100644 --- a/conf/test_experimental.config +++ b/conf/test_experimental.config @@ -29,7 +29,7 @@ params { input = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.samplesheet.csv' matrix = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv' contrasts = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.contrasts.csv' - pathway = "propd,propd_fdr,propr,cor" + pathway = "propd,propd_grea,propr,cor" //Features features_metadata_cols = 'gene_id,gene_name' diff --git a/modules/local/propr/grea/main.nf b/modules/local/propr/grea/main.nf index bb8da483..4c37cc58 100644 --- a/modules/local/propr/grea/main.nf +++ b/modules/local/propr/grea/main.nf @@ -2,13 +2,10 @@ process PROPR_GREA { tag "$meta.id" label 'process_high' - // TODO - // the container is not updated for the grea function - // for the moment I'm running it locally // conda "${moduleDir}/environment.yml" - // container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - // 'https://depot.galaxyproject.org/singularity/mulled-v2-401a215d4024df776a98d90a352048199e342a3d:5ba9bbf6cd4f4f98983526673c223d2e7d829b36-0': - // 'biocontainers/mulled-v2-401a215d4024df776a98d90a352048199e342a3d:5ba9bbf6cd4f4f98983526673c223d2e7d829b36-0' }" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'oras://community.wave.seqera.io/library/bioconductor-limma_r-ggplot2_r-propr:75e6dfd62a2313a9': + 'community.wave.seqera.io/library/bioconductor-limma_r-ggplot2_r-propr:fbd569ab00953cb0' }" input: tuple val(meta), path(adj) diff --git a/modules/local/propr/propd/main.nf b/modules/local/propr/propd/main.nf index 8f831a40..7fce4307 100644 --- a/modules/local/propr/propd/main.nf +++ b/modules/local/propr/propd/main.nf @@ -2,10 +2,10 @@ process PROPR_PROPD { tag "$meta.id" label 'process_medium' - conda "${moduleDir}/environment.yml" + // conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/mulled-v2-401a215d4024df776a98d90a352048199e342a3d:5ba9bbf6cd4f4f98983526673c223d2e7d829b36-0': - 'biocontainers/mulled-v2-401a215d4024df776a98d90a352048199e342a3d:5ba9bbf6cd4f4f98983526673c223d2e7d829b36-0' }" + 'oras://community.wave.seqera.io/library/bioconductor-limma_r-ggplot2_r-propr:75e6dfd62a2313a9': + 'community.wave.seqera.io/library/bioconductor-limma_r-ggplot2_r-propr:fbd569ab00953cb0' }" input: tuple val(meta), path(count), path(samplesheet), val(contrast_variable), val(reference), val(target) diff --git a/modules/local/propr/propr/main.nf b/modules/local/propr/propr/main.nf index dd5360ee..efe25569 100644 --- a/modules/local/propr/propr/main.nf +++ b/modules/local/propr/propr/main.nf @@ -2,10 +2,10 @@ process PROPR_PROPR { tag "$meta.id" label 'process_medium' - conda "${moduleDir}/environment.yml" + // conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/mulled-v2-401a215d4024df776a98d90a352048199e342a3d:5ba9bbf6cd4f4f98983526673c223d2e7d829b36-0': - 'biocontainers/mulled-v2-401a215d4024df776a98d90a352048199e342a3d:5ba9bbf6cd4f4f98983526673c223d2e7d829b36-0' }" + 'oras://community.wave.seqera.io/library/bioconductor-limma_r-ggplot2_r-propr:75e6dfd62a2313a9': + 'community.wave.seqera.io/library/bioconductor-limma_r-ggplot2_r-propr:fbd569ab00953cb0' }" input: tuple val(meta), path(count) From ab9587b813de08ecbc8031c47351ce64cb35ad36 Mon Sep 17 00:00:00 2001 From: suzannejin Date: Fri, 18 Oct 2024 15:55:09 +0200 Subject: [PATCH 116/154] modify propd.R so that it output some plots for the top red/yellow/green pairs --- modules/local/propr/propd/main.nf | 3 + modules/local/propr/propd/templates/propd.R | 163 +++++++++++++++----- nextflow.config | 2 - nextflow_schema.json | 8 - 4 files changed, 125 insertions(+), 51 deletions(-) diff --git a/modules/local/propr/propd/main.nf b/modules/local/propr/propd/main.nf index 7fce4307..7f3c7f94 100644 --- a/modules/local/propr/propd/main.nf +++ b/modules/local/propr/propd/main.nf @@ -18,6 +18,9 @@ process PROPR_PROPD { tuple val(meta), path("*.propd.connectivity.tsv") , emit: connectivity , optional: true tuple val(meta), path("*.propd.hub_genes.tsv") , emit: hub_genes , optional: true tuple val(meta), path("*.propd.fdr.tsv") , emit: fdr , optional: true + tuple val(meta), path("*.propd.red_pairs.pdf") , emit: red_pairs , optional: true + tuple val(meta), path("*.propd.yellow_pairs.pdf") , emit: yellow_pairs , optional: true + tuple val(meta), path("*.propd.green_pairs.pdf") , emit: green_pairs , optional: true path "*.warnings.log" , emit: warnings path "*.R_sessionInfo.log" , emit: session_info path "versions.yml" , emit: versions diff --git a/modules/local/propr/propd/templates/propd.R b/modules/local/propr/propd/templates/propd.R index 8d842152..2467b398 100644 --- a/modules/local/propr/propd/templates/propd.R +++ b/modules/local/propr/propd/templates/propd.R @@ -144,40 +144,76 @@ get_hub_genes <- function(connectivity, cutoff, weighted=FALSE){ return(hub_genes) } -# this function overwrites the one in the propr package, that had a bug -# TODO update the container with the corrected package, and remove this -runNormalization <- function(object, norm.factors) { - if (!inherits(object, "propd")) { - stop("Please provide a propd object.") - } - if (!identical(length(norm.factors), nrow(object@counts))) { - stop("The norm factors should have one value for each subject.") - } - - # compute thetas - newCounts <- cbind(norm.factors, object@counts) - newPD <- - propd( - newCounts, - group = object@group, - alpha = object@alpha, - p = 0, - weighted = object@weighted - ) - if (object@active == "theta_mod") { - newPD <- updateF(newPD, moderated = TRUE) - } - newPD <- setActive(newPD, object@active) - - # parse thetas for each gene - rawRes <- newPD@results - perFeature <- rawRes[rawRes\$Pair == 1,] - if (!identical(perFeature\$Partner, 2:(ncol(newCounts)))) - stop("DEBUG ERROR #GET001.") - thetas <- perFeature\$theta - names(thetas) <- colnames(object@counts) - - return(thetas) +#' Plot pairs of genes +#' +#' This function plots the following pairs of genes: +#' - xy vs sample +#' - x vs y +#' - x vs sample +#' - y vs sample +#' - xr vs yr +#' - xr vs sample +#' - yr vs sample +#' The pairs are colored according to the group they belong to. +#' +#' @param df Data frame with the following columns: xy, x, y, xr, yr, sample, group, color +#' @param x Name of the gene x +#' @param y Name of the gene y +#' @param title Title of the plot +plot_pairs <- function(df, x, y, title){ + + # Define the layout + layout_matrix <- matrix(c( + 0, 1, 8, # First row + 2, 3, 4, # Second row + 5, 6, 7 # Third row + ), nrow = 3, ncol = 3, byrow = TRUE) + layout(layout_matrix, widths = c(1, 1, 1), heights = c(1, 1, 1)) + + # Adjust margins and text sizes + par(mar = c(4, 4, 1, 1), cex = 1.5, lwd = 1.5) + + # plot xy vs sample + plot(x=df\$sample, y=df\$xy, xlab='sample', ylab=paste0(x, '/', y), col=df\$color) + + # plot x vs y + plot(x=df\$x, y=df\$y, xlab=x, ylab=y, col=df\$color) + + # plot x vs sample + plot(x=df\$sample, y=df\$x, xlab='sample', ylab=x, col=df\$color) + + # plot y vs sample + plot(x=df\$sample, y=df\$y, xlab='sample', ylab=y, col=df\$color) + + # plot xr vs yr + plot(x=df\$xr, y=df\$yr, xlab=paste0(x, '/ref'), ylab=paste0(y, '/ref'), col=df\$color) + + # plot xr vs sample + plot(x=df\$sample, y=df\$xr, xlab='sample', ylab=paste0(x, '/ref'), col=df\$color) + + # plot yr vs sample + plot(x=df\$sample, y=df\$yr, xlab='sample', ylab=paste0(y, '/ref'), col=df\$color) + + # add legend + plot.new() + par(mar = c(0, 0, 0, 0)) + legend( + "center", + legend = unique(df\$group), + col = unique(df\$color), + pch = 19, + cex = 1.5, + bty = "n") + + # TODO the title does not appear somehow, fix it + # Add main title + mtext( + title, + side = 3, + outer = TRUE, + line = 1, + cex = 2, + font = 2) } ################################################ @@ -416,9 +452,9 @@ if (opt\$permutation == 0) { fdr_adjusted=TRUE ) results <- results[,c("Partner", "Pair", "theta")] - results\$class <- "red" - results\$class[which(de[results\$Pair] < theta_cutoff | de[results\$Partner] < theta_cutoff)] <- "yellow" - results\$class[which(de[results\$Pair] < theta_cutoff & de[results\$Partner] < theta_cutoff)] <- "green" + results\$classification <- "red" + results\$classification[which(de[results\$Pair] < theta_cutoff | de[results\$Partner] < theta_cutoff)] <- "yellow" + results\$classification[which(de[results\$Pair] < theta_cutoff & de[results\$Partner] < theta_cutoff)] <- "green" # sort significant pairs @@ -465,7 +501,7 @@ if (opt\$permutation == 0) { theta_cutoff, features_id_col=opt\$features_id_col ) - hub_genes <- get_hub_genes(connectivity, weigthted=opt\$weighted_degree) + hub_genes <- get_hub_genes(connectivity, weighted=opt\$weighted_degree) # get significant pairs and classify them into red/yellow/green pairs @@ -475,9 +511,9 @@ if (opt\$permutation == 0) { window_size=1 ) results <- results[,c("Partner", "Pair", "theta")] - results\$class <- "red" - results\$class[which(de[results\$Pair] < theta_cutoff | de[results\$Partner] < theta_cutoff)] <- "yellow" - results\$class[which(de[results\$Pair] < theta_cutoff & de[results\$Partner] < theta_cutoff)] <- "green" + results\$classification <- "red" + results\$classification[which(de[results\$Pair] < theta_cutoff | de[results\$Partner] < theta_cutoff)] <- "yellow" + results\$classification[which(de[results\$Pair] < theta_cutoff & de[results\$Partner] < theta_cutoff)] <- "green" # sort significant pairs @@ -562,6 +598,51 @@ if (opt\$permutation > 0) { ) } +################################################ +################################################ +## Plot red pairs ## +################################################ +################################################ + +if (theta_cutoff){ + + # get ratios between each gene and the normalization reference + ratios <- exp(logratio(pd@counts, 'clr', NA)) + + # plot for each pair type + for (pair_type in c("red", "yellow", "green")){ + pdf(paste0(opt\$prefix, '.propd.', pair_type, '_pairs.pdf'), width = 18, height = 18) + + # get pairs + pairs <- results[results\$classification == pair_type,] + + # for the top pairs + for (idx in c(1:3)){ + + # get x and y genes + x <- pairs[idx,'Partner'] + y <- pairs[idx,'Pair'] + + # create data frame + df <- data.frame( + xy=pd@counts[,x]/pd@counts[,y], + x=pd@counts[,x], + y=pd@counts[,y], + xr=ratios[,x], + yr=ratios[,y], + sample=c(1:nrow(pd@counts)), + group=group, + color=ifelse(group == opt\$target_group, 'red', 'blue')) + df <- df[order(df\$group, df\$sample),] + + # plot + title <- paste0("top ", idx, " ", pair_type, " pair with theta=", round(results[idx, 'theta'], 6)) + plot_pairs(df, x, y, title) + } + + } +} + ################################################ ################################################ ## WARNINGS ## diff --git a/nextflow.config b/nextflow.config index f1a577dc..e608354d 100644 --- a/nextflow.config +++ b/nextflow.config @@ -225,8 +225,6 @@ params { pathway = null // propd options - propd_group_col = null - propd_group_values = null propd_alpha = null propd_moderated = true propd_fdr = 0.05 diff --git a/nextflow_schema.json b/nextflow_schema.json index f5534865..c2695f71 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -756,14 +756,6 @@ "description": "Parameters to run differential proportionality", "default": "", "properties": { - "propd_group_col": { - "type": "string", - "default": "null" - }, - "propd_group_values": { - "type": "string", - "default": "null" - }, "propd_alpha": { "type": "string", "default": "null", From 04649322d643191d6019f6f87a55bdeec0a2a4be Mon Sep 17 00:00:00 2001 From: bjlang <> Date: Tue, 22 Oct 2024 11:40:01 +0200 Subject: [PATCH 117/154] finish merge --- conf/base.config | 3 +- modules/local/propr/propd/templates/propd.R | 122 -------------------- 2 files changed, 1 insertion(+), 124 deletions(-) diff --git a/conf/base.config b/conf/base.config index a6f357e0..6bfd4e27 100644 --- a/conf/base.config +++ b/conf/base.config @@ -15,8 +15,7 @@ process { memory = { 6.GB * task.attempt } time = { 4.h * task.attempt } - //errorStrategy = { task.exitStatus in ((130..145) + 104) ? 'retry' : 'finish' } - errorStrategy = 'finish' + errorStrategy = { task.exitStatus in ((130..145) + 104) ? 'retry' : 'finish' } maxRetries = 1 maxErrors = '-1' diff --git a/modules/local/propr/propd/templates/propd.R b/modules/local/propr/propd/templates/propd.R index 896217ef..2467b398 100644 --- a/modules/local/propr/propd/templates/propd.R +++ b/modules/local/propr/propd/templates/propd.R @@ -119,7 +119,6 @@ get_connectivity <- function(pd, adj, de, cutoff, features_id_col='gene_id'){ #' degree by node. #' #' @param connectivity Data frame with connectivity -<<<<<<< Updated upstream #' @param cutoff Theta value for which DP pairs are considered significant. #' @param weighted Boolean. If TRUE, use weighted degree to determine hub genes. #' Otherwise, use degree. @@ -130,21 +129,11 @@ get_hub_genes <- function(connectivity, cutoff, weighted=FALSE){ # get the expected degree total_degree <- if (weighted) sum(connectivity\$weighted_degree) else sum(connectivity\$degree) n_nodes <- sum(connectivity\$degree > 0) -======= -#' -#' @return filtered connectivity data frame with hub genes -get_hub_genes <- function(connectivity){ - - # get the expected degree - total_degree <- sum(connectivity\$degree) - n_nodes <- sum(connectivity > 0) ->>>>>>> Stashed changes expected_degree <- total_degree / n_nodes # get hub genes hub_genes <- connectivity[which(connectivity\$degree > expected_degree),] -<<<<<<< Updated upstream # sort hub genes if (weighted) { hub_genes <- hub_genes[order(hub_genes\$weighted_degree, decreasing=TRUE),] @@ -227,11 +216,6 @@ plot_pairs <- function(df, x, y, title){ font = 2) } -======= - return(hub_genes) -} - ->>>>>>> Stashed changes ################################################ ################################################ ## Parse arguments ## @@ -250,13 +234,9 @@ opt <- list( # comparison groups samplesheet = '$samplesheet', obs_id_col = 'sample', # column name of observation ids -<<<<<<< Updated upstream contrast_variable = "$contrast_variable", # column name of contrast variable reference_group = "$reference", # reference group for contrast variable target_group = "$target", # target group for contrast variable -======= - group_col = 'treatment', # column name of grouping variable ->>>>>>> Stashed changes # parameters for computing differential proportionality alpha = NA, # alpha for boxcox transformation @@ -267,12 +247,9 @@ opt <- list( permutation = 0, # if permutation > 0, use permutation test to compute FDR number_of_cutoffs = 100, # number of cutoffs for permutation test -<<<<<<< Updated upstream # parameters for getting the hub genes weighted_degree = FALSE, # use weighted degree for hub genes or not -======= ->>>>>>> Stashed changes # other parameters seed = NA, # seed for reproducibility ncores = as.integer('$task.cpus') @@ -284,22 +261,15 @@ opt_types <- list( samplesheet = 'character', features_id_col = 'character', obs_id_col = 'character', -<<<<<<< Updated upstream contrast_variable = 'character', reference_group = 'character', target_group = 'character', -======= - group_col = 'character', ->>>>>>> Stashed changes alpha = 'numeric', moderated = 'logical', fdr = 'numeric', permutation = 'numeric', number_of_cutoffs = 'numeric', -<<<<<<< Updated upstream weighted_degree = 'logical', -======= ->>>>>>> Stashed changes seed = 'numeric', ncores = 'numeric' ) @@ -325,11 +295,7 @@ for ( ao in names(args_opt)){ # Check if required parameters have been provided -<<<<<<< Updated upstream required_opts <- c('count','samplesheet','contrast_variable','reference_group','target_group') -======= -required_opts <- c('count','samplesheet') ->>>>>>> Stashed changes missing <- required_opts[unlist(lapply(opt[required_opts], is.null)) | ! required_opts %in% names(opt)] if (length(missing) > 0){ stop(paste("Missing required options:", paste(missing, collapse=', '))) @@ -346,15 +312,12 @@ for (file_input in c('count','samplesheet')){ } } -<<<<<<< Updated upstream # check parameters are valid if (opt\$permutation < 0) { stop('permutation should be a positive integer') } -======= ->>>>>>> Stashed changes # TODO maybe add a function to pretty print the arguments? print(opt) @@ -390,17 +353,10 @@ mat <- read_delim_flexible( mat <- t(mat) # transpose matrix to have features (genes) as columns # parse group -<<<<<<< Updated upstream # and filter matrix and group values, so that only the contrasted groups are kept # TODO propd can also handle more than two groups # but that dont work properly with the contrast format # Should we provide an alternative way to do that? -======= -# This creates a vector referring to the group id for each observation. -# The vector should have 2+ different groups, so that differential proportionality will -# be computed to compare the variances between and within groups. TODO one can parse the -# 'group_col' from the contrast file information as the other modules ->>>>>>> Stashed changes samplesheet <- read_delim_flexible( opt\$samplesheet, @@ -408,7 +364,6 @@ samplesheet <- read_delim_flexible( row.names = NULL, check.names = FALSE ) -<<<<<<< Updated upstream samplesheet <- samplesheet[,c(opt\$obs_id_col, opt\$contrast_variable)] idx <- which(samplesheet[,2] %in% c(opt\$reference_group, opt\$target_group)) mat <- mat[idx,] @@ -416,12 +371,6 @@ samplesheet <- samplesheet[idx,] group <- as.vector(samplesheet[,2]) if (length(group) != nrow(mat)) stop('Error when parsing group') if (length(unique(group)) != 2) stop('Only two groups are allowed for contrast') -======= -tmp <- samplesheet[[opt\$group_col]] -names(tmp) <- samplesheet[[opt\$obs_id_col]] -group <- as.vector(tmp[rownames(mat)]) -if (length(group) != nrow(mat)) stop('Error when parsing group') ->>>>>>> Stashed changes # compute differential proportionality @@ -433,7 +382,6 @@ pd <- propd( p = opt\$permutation ) -<<<<<<< Updated upstream # compute DE theta values # this is the theta value for each gene with respect to the normalization reference # in this case, the reference is the geometric mean of the sample @@ -445,8 +393,6 @@ pd <- propd( ref <- exp(rowMeans(log(pd@counts))) de <- runNormalization(pd, ref) -======= ->>>>>>> Stashed changes # use F-stat FDR-adjusted p-values to get significant pairs, if permutation == 0 # otherwise, get FDR values using permutation tests (more computationally expensive but likely more conservative FDRs) @@ -462,7 +408,6 @@ if (opt\$permutation == 0) { ) if (opt\$moderated) pd <- setActive(pd, what='theta_mod') -<<<<<<< Updated upstream # get theta value for which FDR is below desired threshold # theta_cutoff is FALSE when no theta value has FDR below desired threshold # otherwise it is the theta value for which FDR is below desired threshold @@ -470,16 +415,10 @@ if (opt\$permutation == 0) { # that involve extracting the significant pairs. theta_cutoff <- getCutoffFstat( -======= - # get adjacency matrix - - adj <- getAdjacencyFstat( ->>>>>>> Stashed changes pd, pval=opt\$fdr, fdr_adjusted=TRUE ) -<<<<<<< Updated upstream if (theta_cutoff) { warning('Significant theta value found: ', theta_cutoff) @@ -521,25 +460,6 @@ if (opt\$permutation == 0) { results <- results[order(results\$theta),] } -======= - - # calculate gene connectivity and get hub genes - - connectivity <- get_connectivity(adj) - hub_genes <- get_hub_genes(connectivity) - - # get significant pairs and classify them into red/yellow/green pairs - - results <- getSignificantResultsFstat( - pd, - pval=opt\$fdr, - fdr_adjusted=TRUE - ) - results <- results[,c("Partner", "Pair", "theta")] - results\$class <- "red" - results\$class[which(results\$Pair %in% hub_genes\$gene | results\$Partner %in% hub_genes\$gene)] <- "yellow" - results\$class[which(results\$Pair %in% hub_genes\$gene & results\$Partner %in% hub_genes\$gene)] <- "green" ->>>>>>> Stashed changes } else { @@ -553,28 +473,16 @@ if (opt\$permutation == 0) { ncores = opt\$ncores ) -<<<<<<< Updated upstream # get theta cutoff theta_cutoff <- getCutoffFDR( -======= - # get cutoff - # this is the cutoff used to get the significant pairs and ensemble of adjacency matrix - - cutoff <- getCutoffFDR( ->>>>>>> Stashed changes pd, fdr=opt\$fdr, window_size=1 ) -<<<<<<< Updated upstream if (theta_cutoff) { warning('Significant theta value found: ', theta_cutoff) -======= - - if (cutoff) { ->>>>>>> Stashed changes # get adjacency matrix @@ -586,7 +494,6 @@ if (opt\$permutation == 0) { # calculate gene connectivity and get hub genes -<<<<<<< Updated upstream connectivity <- get_connectivity( pd, adj, @@ -595,10 +502,6 @@ if (opt\$permutation == 0) { features_id_col=opt\$features_id_col ) hub_genes <- get_hub_genes(connectivity, weighted=opt\$weighted_degree) -======= - connectivity <- get_connectivity(adj) - hub_genes <- get_hub_genes(connectivity) ->>>>>>> Stashed changes # get significant pairs and classify them into red/yellow/green pairs @@ -608,7 +511,6 @@ if (opt\$permutation == 0) { window_size=1 ) results <- results[,c("Partner", "Pair", "theta")] -<<<<<<< Updated upstream results\$classification <- "red" results\$classification[which(de[results\$Pair] < theta_cutoff | de[results\$Partner] < theta_cutoff)] <- "yellow" results\$classification[which(de[results\$Pair] < theta_cutoff & de[results\$Partner] < theta_cutoff)] <- "green" @@ -631,23 +533,6 @@ if (!theta_cutoff) { results <- NULL } -======= - results\$class <- "red" - results\$class[which(results\$Pair %in% hub_genes\$gene | results\$Partner %in% hub_genes\$gene)] <- "yellow" - results\$class[which(results\$Pair %in% hub_genes\$gene & results\$Partner %in% hub_genes\$gene)] <- "green" - - } else { - # TODO take top n pairs when no cutoff has FDR below desired threshold - # For the moment, we just print a warning and set adj, hub_genes and results to NULL - warning('No pairs have FDR below desired threshold.') - adj <- NULL - connectivity <- NULL - hub_genes <- NULL - results <- NULL - } -} - ->>>>>>> Stashed changes ################################################ ################################################ ## Generate outputs ## @@ -668,11 +553,7 @@ write.table( quote = FALSE ) -<<<<<<< Updated upstream if (theta_cutoff) { -======= -if (!is.null(adj)) { ->>>>>>> Stashed changes write.table( results, file = paste0(opt\$prefix, '.propd.results_filtered.tsv'), @@ -719,7 +600,6 @@ if (opt\$permutation > 0) { ################################################ ################################################ -<<<<<<< Updated upstream ## Plot red pairs ## ################################################ ################################################ @@ -765,8 +645,6 @@ if (theta_cutoff){ ################################################ ################################################ -======= ->>>>>>> Stashed changes ## WARNINGS ## ################################################ ################################################ From 41adc93edccaa3e381079761bea423b4fc6ab6d2 Mon Sep 17 00:00:00 2001 From: bjlang <> Date: Tue, 22 Oct 2024 18:22:52 +0200 Subject: [PATCH 118/154] Split toolsheet data into subworkflow dedicated channels --- assets/tools_samplesheet.csv | 2 +- conf/test_experimental.config | 2 +- nextflow.config | 2 -- subworkflows/local/correlation/main.nf | 15 +++++++++++---- subworkflows/local/differential/main.nf | 24 ++++++++++++++---------- subworkflows/local/enrichment/main.nf | 17 ++++++++++++++--- subworkflows/local/experimental/main.nf | 11 ++++++----- workflows/differentialabundance.nf | 16 ++++++---------- 8 files changed, 53 insertions(+), 36 deletions(-) diff --git a/assets/tools_samplesheet.csv b/assets/tools_samplesheet.csv index 06509e05..efdf5457 100644 --- a/assets/tools_samplesheet.csv +++ b/assets/tools_samplesheet.csv @@ -5,4 +5,4 @@ pcorbshrink,,,propr,--metric pcor.bshrink,, propr,,,propr,--metric rho,, cor,,,propr,--metric cor,, propd_grea,propd,,,,grea, -deseq2,deseq2,,gsea,,, +deseq2,deseq2,,,,gsea, diff --git a/conf/test_experimental.config b/conf/test_experimental.config index 4264690d..7f0bd5c4 100644 --- a/conf/test_experimental.config +++ b/conf/test_experimental.config @@ -30,7 +30,7 @@ params { matrix = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv' contrasts = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.contrasts.csv' tools = "$projectDir/assets/tools_samplesheet.csv" - pathway = "propd,propd_fdr,propr,cor" + pathway = "propd,propd_fdr,pcorbshrink,propr,cor" //Features features_metadata_cols = 'gene_id,gene_name' diff --git a/nextflow.config b/nextflow.config index 845de673..e608354d 100644 --- a/nextflow.config +++ b/nextflow.config @@ -11,7 +11,6 @@ params { // Input options input = null - study_name = 'study' study_type = 'rnaseq' study_abundance_type = 'counts' @@ -210,7 +209,6 @@ params { // Config options config_profile_name = null config_profile_description = null - custom_config_version = 'master' custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" config_profile_contact = null diff --git a/subworkflows/local/correlation/main.nf b/subworkflows/local/correlation/main.nf index 82a97a43..44fe99fd 100644 --- a/subworkflows/local/correlation/main.nf +++ b/subworkflows/local/correlation/main.nf @@ -3,9 +3,16 @@ // include {PROPR_PROPR as PROPR} from "../../../modules/local/propr/propr/main.nf" +def clean_meta = { meta, data -> + def meta_clone = meta.clone() + meta_clone.remove('cor_method') + meta_clone.remove('args_cor') + return [meta_clone, data] +} + workflow CORRELATION { take: - ch_tools + ch_tools // [ pathway_name, correlation_map ] ch_counts main: @@ -17,7 +24,7 @@ workflow CORRELATION { // branch tools to select the correct correlation analysis method ch_tools .branch { - propr: it[0]["cor_method"] == "propr" + propr: it[1]["cor_method"] == "propr" } .set { ch_tools_single } @@ -40,6 +47,6 @@ workflow CORRELATION { // TODO: divide propr module into cor, propr, pcor, pcorbshrink, etc. emit: - matrix = ch_matrix - adjacency = ch_adjacency + matrix = ch_matrix.map(clean_meta) + adjacency = ch_adjacency.map(clean_meta) } diff --git a/subworkflows/local/differential/main.nf b/subworkflows/local/differential/main.nf index 13d8e159..7c967bc5 100644 --- a/subworkflows/local/differential/main.nf +++ b/subworkflows/local/differential/main.nf @@ -4,9 +4,16 @@ include { PROPR_PROPD as PROPD } from "../../../modules/local/propr/propd/main.nf" include { DESEQ2_DIFFERENTIAL } from '../../../modules/nf-core/deseq2/differential/main' +def clean_meta = { meta, data -> + def meta_clone = meta.clone() + meta_clone.remove('diff_method') + meta_clone.remove('args_diff') + return [meta_clone, data] +} + workflow DIFFERENTIAL { take: - ch_tools + ch_tools // [ pathway_name, differential_map ] ch_counts ch_samplesheet ch_contrasts // [meta, contrast_variable, reference, target] @@ -21,7 +28,6 @@ workflow DIFFERENTIAL { ch_adjacency = Channel.empty() // branch tools to select the correct differential analysis method - ch_tools.view{"t "+it} ch_tools .branch { propd: it[1]["diff_method"] == "propd" @@ -44,10 +50,8 @@ workflow DIFFERENTIAL { } .unique() .set { ch_propd } - PROPD(ch_propd) - - ch_counts_propd.view{"cp "+it} + PROPD(ch_propd) ch_results_pairwise = ch_results_pairwise.mix(PROPD.out.results) ch_results_pairwise_filtered = ch_results_pairwise_filtered.mix(PROPD.out.results_filtered) ch_results_genewise = ch_results_genewise.mix(PROPD.out.connectivity) @@ -78,9 +82,9 @@ workflow DIFFERENTIAL { // .mix(DESEQ2_DIFFERENTIAL.out.results) emit: - results_pairwise = ch_results_pairwise - results_pairwise_filtered = ch_results_pairwise_filtered - results_genewise = ch_results_genewise - results_genewise_filtered = ch_results_genewise_filtered - adjacency = ch_adjacency + results_pairwise = ch_results_pairwise.map(clean_meta) + results_pairwise_filtered = ch_results_pairwise_filtered.map(clean_meta) + results_genewise = ch_results_genewise.map(clean_meta) + results_genewise_filtered = ch_results_genewise_filtered.map(clean_meta) + adjacency = ch_adjacency.map(clean_meta) } diff --git a/subworkflows/local/enrichment/main.nf b/subworkflows/local/enrichment/main.nf index 4141ae1f..f6524ad6 100644 --- a/subworkflows/local/enrichment/main.nf +++ b/subworkflows/local/enrichment/main.nf @@ -6,6 +6,7 @@ include { PROPR_GREA as GREA } from "../../../modules/local/propr/grea/main.nf" workflow ENRICHMENT { take: + ch_tools // [ pathway_name, enrichment_map ] ch_counts ch_results_genewise ch_results_genewise_filtered @@ -31,10 +32,20 @@ workflow ENRICHMENT { // ---------------------------------------------------- ch_adjacency - .filter { it[0]["enr_method"] == "grea" } - .set { ch_adjacency_grea } + .map { meta, matrix -> [meta.subMap(["pathway_name"]), meta, matrix] } + .join(ch_tools, by: [0]) + .map { + pathway_name, meta, matrix, meta_tools -> + def new_meta = meta.clone() + meta_tools.clone() + [ new_meta, matrix ] + } + .branch { + grea: it[0]["enr_method"] == "grea" + gsea: it[0]["enr_method"] == "gsea" + } + .set { ch_adjacency } - GREA(ch_adjacency_grea, ch_gmt.collect()) + GREA(ch_adjacency.grea, ch_gmt.collect()) ch_enriched = ch_enriched.mix(GREA.out.results) // ---------------------------------------------------- diff --git a/subworkflows/local/experimental/main.nf b/subworkflows/local/experimental/main.nf index e1f4f5b8..5376b592 100644 --- a/subworkflows/local/experimental/main.nf +++ b/subworkflows/local/experimental/main.nf @@ -10,19 +10,19 @@ workflow EXPERIMENTAL { ch_contrasts // [ meta, contrast_variable, reference, target ] ch_samplesheet // [ meta, samplesheet ] ch_counts // [ meta, counts] - ch_tools // [ pathway_name, differential_map, enr_diff_map, correlation_map, enr_corr_map, sel_method ] + ch_tools // [ pathway_name, differential_map, correlation_map, enrichment_map ] main: // split toolsheet into channels - ch_tools.view() ch_tools .multiMap{ - pathway_name, differential_map, enr_diff_map, correlation_map, enr_corr_map, sel_method -> + pathway_name, differential_map, correlation_map, enrichment_map -> diff: [ pathway_name, differential_map ] corr: [ pathway_name, correlation_map ] - enr: [ pathway_name, enr_diff_map, enr_corr_map ] - }.set{ ch_tools } + enr: [ pathway_name, enrichment_map ] + } + .set{ ch_tools } // initialize empty results channels @@ -66,6 +66,7 @@ workflow EXPERIMENTAL { // ---------------------------------------------------- ENRICHMENT( + ch_tools.enr, ch_counts, ch_results_genewise, ch_results_genewise_filtered, diff --git a/workflows/differentialabundance.nf b/workflows/differentialabundance.nf index 38cc28f5..69b23d2c 100644 --- a/workflows/differentialabundance.nf +++ b/workflows/differentialabundance.nf @@ -364,16 +364,12 @@ workflow DIFFERENTIALABUNDANCE { // Convert the toolsheet.csv in a channel with the proper format ch_tools = Channel.fromList(samplesheetToList(params.tools, './assets/schema_tools.json')) .map { - meta -> - def pathway_name = meta[0].subMap(["pathway_name"]) - def differential_map = meta[0].subMap(["diff_method","args_diff"]) - def enr_diff_map = meta[0].subMap(["enr_diff_method","args_enr_diff"]) - def correlation_map = meta[0].subMap(["cor_method","args_cor"]) - def enr_corr_map = meta[0].subMap(["enr_cor_method","args_enr_cor"]) - def sel_method = meta[0].subMap(["sel_method","args_sel"]) - // def enr_corr_map = meta[0].subMap(["enr_method","args_enr"]) - [ pathway_name, differential_map, enr_diff_map, correlation_map, enr_corr_map, sel_method ] - // [ pathway_name, differential_map, correlation_map, enrichment_map ] + it -> + def pathway_name = it[0].subMap(["pathway_name"]) + def differential_map = it[0].subMap(["diff_method","args_diff"]) + def correlation_map = it[0].subMap(["cor_method","args_cor"]) + def enrichment_map = it[0].subMap(["enr_method","args_enr"]) + [ pathway_name, differential_map, correlation_map, enrichment_map ] }.unique() // Filter the tools to the pathway(s) of interest, or run everything if requested From 1cbdb17efe8b4110630f98114b1c2a1e1f177dec Mon Sep 17 00:00:00 2001 From: bjlang <> Date: Tue, 22 Oct 2024 19:25:17 +0200 Subject: [PATCH 119/154] Fix linting and include propd_grea in test --- conf/test_experimental.config | 2 +- subworkflows/local/correlation/main.nf | 2 +- subworkflows/local/differential/main.nf | 2 +- subworkflows/local/enrichment/main.nf | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/conf/test_experimental.config b/conf/test_experimental.config index 7f0bd5c4..249084bd 100644 --- a/conf/test_experimental.config +++ b/conf/test_experimental.config @@ -30,7 +30,7 @@ params { matrix = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv' contrasts = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.contrasts.csv' tools = "$projectDir/assets/tools_samplesheet.csv" - pathway = "propd,propd_fdr,pcorbshrink,propr,cor" + pathway = "propd,propd_fdr,pcorbshrink,propr,cor,propd_grea" //Features features_metadata_cols = 'gene_id,gene_name' diff --git a/subworkflows/local/correlation/main.nf b/subworkflows/local/correlation/main.nf index 44fe99fd..4154cd84 100644 --- a/subworkflows/local/correlation/main.nf +++ b/subworkflows/local/correlation/main.nf @@ -3,7 +3,7 @@ // include {PROPR_PROPR as PROPR} from "../../../modules/local/propr/propr/main.nf" -def clean_meta = { meta, data -> +def clean_meta = { meta, data -> def meta_clone = meta.clone() meta_clone.remove('cor_method') meta_clone.remove('args_cor') diff --git a/subworkflows/local/differential/main.nf b/subworkflows/local/differential/main.nf index 7c967bc5..d7ffc1ac 100644 --- a/subworkflows/local/differential/main.nf +++ b/subworkflows/local/differential/main.nf @@ -4,7 +4,7 @@ include { PROPR_PROPD as PROPD } from "../../../modules/local/propr/propd/main.nf" include { DESEQ2_DIFFERENTIAL } from '../../../modules/nf-core/deseq2/differential/main' -def clean_meta = { meta, data -> +def clean_meta = { meta, data -> def meta_clone = meta.clone() meta_clone.remove('diff_method') meta_clone.remove('args_diff') diff --git a/subworkflows/local/enrichment/main.nf b/subworkflows/local/enrichment/main.nf index f6524ad6..936ddfcc 100644 --- a/subworkflows/local/enrichment/main.nf +++ b/subworkflows/local/enrichment/main.nf @@ -34,8 +34,8 @@ workflow ENRICHMENT { ch_adjacency .map { meta, matrix -> [meta.subMap(["pathway_name"]), meta, matrix] } .join(ch_tools, by: [0]) - .map { - pathway_name, meta, matrix, meta_tools -> + .map { + pathway_name, meta, matrix, meta_tools -> def new_meta = meta.clone() + meta_tools.clone() [ new_meta, matrix ] } From 9d35597cd0f94aec2a2cc25fb71536c5f0332149 Mon Sep 17 00:00:00 2001 From: bjlang <> Date: Wed, 23 Oct 2024 11:27:12 +0200 Subject: [PATCH 120/154] remove duplicate tools declaration --- conf/test_experimental.config | 1 - 1 file changed, 1 deletion(-) diff --git a/conf/test_experimental.config b/conf/test_experimental.config index 249084bd..56ca6a2e 100644 --- a/conf/test_experimental.config +++ b/conf/test_experimental.config @@ -29,7 +29,6 @@ params { input = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.samplesheet.csv' matrix = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv' contrasts = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.contrasts.csv' - tools = "$projectDir/assets/tools_samplesheet.csv" pathway = "propd,propd_fdr,pcorbshrink,propr,cor,propd_grea" //Features From 062c5a323710a885f58f2162566f617a4c3dbc6e Mon Sep 17 00:00:00 2001 From: bjlang <> Date: Wed, 23 Oct 2024 14:16:50 +0200 Subject: [PATCH 121/154] Temporarily remove pathway from meta to run processes only once per data/argument combination --- subworkflows/local/correlation/main.nf | 21 +++++++------ subworkflows/local/differential/main.nf | 39 ++++++++++++++----------- 2 files changed, 34 insertions(+), 26 deletions(-) diff --git a/subworkflows/local/correlation/main.nf b/subworkflows/local/correlation/main.nf index 4154cd84..f5d1bb53 100644 --- a/subworkflows/local/correlation/main.nf +++ b/subworkflows/local/correlation/main.nf @@ -3,8 +3,8 @@ // include {PROPR_PROPR as PROPR} from "../../../modules/local/propr/propr/main.nf" -def clean_meta = { meta, data -> - def meta_clone = meta.clone() +def correct_meta_data = { meta, data, pathway -> + def meta_clone = meta.clone() + pathway meta_clone.remove('cor_method') meta_clone.remove('args_cor') return [meta_clone, data] @@ -34,19 +34,22 @@ workflow CORRELATION { ch_counts .combine(ch_tools_single.propr) - .map { + .multiMap { metacounts, counts, pathway, metatools -> - [ metacounts+metatools+pathway, counts ] + input: [ metacounts+metatools, counts ] + pathway: [ metacounts+metatools, pathway ] } .set { ch_counts_propr } - PROPR(ch_counts_propr) - ch_matrix = ch_matrix.mix(PROPR.out.matrix) - ch_adjacency = ch_adjacency.mix(PROPR.out.adjacency) + PROPR(ch_counts_propr.input.unique()) + ch_matrix = PROPD.out.matrix + .join(ch_counts_propr.pathway).map(correct_meta_data).mix(ch_matrix) + ch_adjacency = PROPD.out.adjacency + .join(ch_counts_propr.pathway).map(correct_meta_data).mix(ch_adjacency) // TODO: divide propr module into cor, propr, pcor, pcorbshrink, etc. emit: - matrix = ch_matrix.map(clean_meta) - adjacency = ch_adjacency.map(clean_meta) + matrix = ch_matrix + adjacency = ch_adjacency } diff --git a/subworkflows/local/differential/main.nf b/subworkflows/local/differential/main.nf index d7ffc1ac..2cc67427 100644 --- a/subworkflows/local/differential/main.nf +++ b/subworkflows/local/differential/main.nf @@ -4,8 +4,8 @@ include { PROPR_PROPD as PROPD } from "../../../modules/local/propr/propd/main.nf" include { DESEQ2_DIFFERENTIAL } from '../../../modules/nf-core/deseq2/differential/main' -def clean_meta = { meta, data -> - def meta_clone = meta.clone() +def correct_meta_data = { meta, data, pathway -> + def meta_clone = meta.clone() + pathway meta_clone.remove('diff_method') meta_clone.remove('args_diff') return [meta_clone, data] @@ -43,20 +43,25 @@ workflow DIFFERENTIAL { .join(ch_samplesheet) .combine(ch_contrasts) .combine(ch_tools_single.propd) - .map { + .multiMap { meta_data, counts, samplesheet, meta_contrast, contrast_variable, reference, target, pathway, meta_tools -> - def meta = meta_data.clone() + ['contrast': meta_contrast.id] + meta_tools.clone() + pathway - [ meta, counts, samplesheet, contrast_variable, reference, target ] + def meta = meta_data.clone() + ['contrast': meta_contrast.id] + meta_tools.clone() + input: [ meta, counts, samplesheet, contrast_variable, reference, target ] + pathway: [ meta, pathway ] } - .unique() .set { ch_propd } - PROPD(ch_propd) - ch_results_pairwise = ch_results_pairwise.mix(PROPD.out.results) - ch_results_pairwise_filtered = ch_results_pairwise_filtered.mix(PROPD.out.results_filtered) - ch_results_genewise = ch_results_genewise.mix(PROPD.out.connectivity) - ch_results_genewise_filtered = ch_results_genewise_filtered.mix(PROPD.out.hub_genes) - ch_adjacency = ch_adjacency.mix(PROPD.out.adjacency) + PROPD(ch_propd.input.unique()) + ch_results_pairwise = PROPD.out.results + .join(ch_propd.pathway).map(correct_meta_data).mix(ch_results_pairwise) + ch_results_pairwise_filtered = PROPD.out.results_filtered + .join(ch_propd.pathway).map(correct_meta_data).mix(ch_results_pairwise_filtered) + ch_results_genewise = PROPD.out.connectivity + .join(ch_propd.pathway).map(correct_meta_data).mix(ch_results_genewise) + ch_results_genewise_filtered = PROPD.out.hub_genes + .join(ch_propd.pathway).map(correct_meta_data).mix(ch_results_genewise_filtered) + ch_adjacency = PROPD.out.adjacency + .join(ch_propd.pathway).map(correct_meta_data).mix(ch_adjacency) // ---------------------------------------------------- // Perform differential analysis with DESeq2 @@ -82,9 +87,9 @@ workflow DIFFERENTIAL { // .mix(DESEQ2_DIFFERENTIAL.out.results) emit: - results_pairwise = ch_results_pairwise.map(clean_meta) - results_pairwise_filtered = ch_results_pairwise_filtered.map(clean_meta) - results_genewise = ch_results_genewise.map(clean_meta) - results_genewise_filtered = ch_results_genewise_filtered.map(clean_meta) - adjacency = ch_adjacency.map(clean_meta) + results_pairwise = ch_results_pairwise + results_pairwise_filtered = ch_results_pairwise_filtered + results_genewise = ch_results_genewise + results_genewise_filtered = ch_results_genewise_filtered + adjacency = ch_adjacency } From 4075a803e221a710e78ebc87090cc7467a9dc6b8 Mon Sep 17 00:00:00 2001 From: bjlang <> Date: Wed, 23 Oct 2024 14:32:45 +0200 Subject: [PATCH 122/154] fix typo --- subworkflows/local/correlation/main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/correlation/main.nf b/subworkflows/local/correlation/main.nf index f5d1bb53..cc742e63 100644 --- a/subworkflows/local/correlation/main.nf +++ b/subworkflows/local/correlation/main.nf @@ -42,9 +42,9 @@ workflow CORRELATION { .set { ch_counts_propr } PROPR(ch_counts_propr.input.unique()) - ch_matrix = PROPD.out.matrix + ch_matrix = PROPR.out.matrix .join(ch_counts_propr.pathway).map(correct_meta_data).mix(ch_matrix) - ch_adjacency = PROPD.out.adjacency + ch_adjacency = PROPR.out.adjacency .join(ch_counts_propr.pathway).map(correct_meta_data).mix(ch_adjacency) // TODO: divide propr module into cor, propr, pcor, pcorbshrink, etc. From f4e816404940e2b49018cd4c73da0ab3723979ed Mon Sep 17 00:00:00 2001 From: bjlang <> Date: Wed, 23 Oct 2024 19:05:11 +0200 Subject: [PATCH 123/154] Move pathway related logic out of differential and correlation SWF --- subworkflows/local/correlation/main.nf | 24 +++++------------ subworkflows/local/differential/main.nf | 35 ++++++++----------------- subworkflows/local/experimental/main.nf | 31 +++++++++++++++------- 3 files changed, 40 insertions(+), 50 deletions(-) diff --git a/subworkflows/local/correlation/main.nf b/subworkflows/local/correlation/main.nf index cc742e63..f7e2d85a 100644 --- a/subworkflows/local/correlation/main.nf +++ b/subworkflows/local/correlation/main.nf @@ -3,16 +3,9 @@ // include {PROPR_PROPR as PROPR} from "../../../modules/local/propr/propr/main.nf" -def correct_meta_data = { meta, data, pathway -> - def meta_clone = meta.clone() + pathway - meta_clone.remove('cor_method') - meta_clone.remove('args_cor') - return [meta_clone, data] -} - workflow CORRELATION { take: - ch_tools // [ pathway_name, correlation_map ] + ch_tools // [ correlation_map ] with the keys: cor_method, args_cor ch_counts main: @@ -24,7 +17,7 @@ workflow CORRELATION { // branch tools to select the correct correlation analysis method ch_tools .branch { - propr: it[1]["cor_method"] == "propr" + propr: it["cor_method"] == "propr" } .set { ch_tools_single } @@ -34,18 +27,15 @@ workflow CORRELATION { ch_counts .combine(ch_tools_single.propr) - .multiMap { - metacounts, counts, pathway, metatools -> + .map { + metacounts, counts, metatools -> input: [ metacounts+metatools, counts ] - pathway: [ metacounts+metatools, pathway ] } .set { ch_counts_propr } - PROPR(ch_counts_propr.input.unique()) - ch_matrix = PROPR.out.matrix - .join(ch_counts_propr.pathway).map(correct_meta_data).mix(ch_matrix) - ch_adjacency = PROPR.out.adjacency - .join(ch_counts_propr.pathway).map(correct_meta_data).mix(ch_adjacency) + PROPR(ch_counts_propr.unique()) + ch_matrix = PROPR.out.matrix.mix(ch_matrix) + ch_adjacency = PROPR.out.adjacency.mix(ch_adjacency) // TODO: divide propr module into cor, propr, pcor, pcorbshrink, etc. diff --git a/subworkflows/local/differential/main.nf b/subworkflows/local/differential/main.nf index 2cc67427..111d686d 100644 --- a/subworkflows/local/differential/main.nf +++ b/subworkflows/local/differential/main.nf @@ -4,16 +4,9 @@ include { PROPR_PROPD as PROPD } from "../../../modules/local/propr/propd/main.nf" include { DESEQ2_DIFFERENTIAL } from '../../../modules/nf-core/deseq2/differential/main' -def correct_meta_data = { meta, data, pathway -> - def meta_clone = meta.clone() + pathway - meta_clone.remove('diff_method') - meta_clone.remove('args_diff') - return [meta_clone, data] -} - workflow DIFFERENTIAL { take: - ch_tools // [ pathway_name, differential_map ] + ch_tools // [ differential_map ] with the keys: diff_method, args_diff ch_counts ch_samplesheet ch_contrasts // [meta, contrast_variable, reference, target] @@ -30,8 +23,8 @@ workflow DIFFERENTIAL { // branch tools to select the correct differential analysis method ch_tools .branch { - propd: it[1]["diff_method"] == "propd" - deseq2: it[1]["diff_method"] == "deseq2" + propd: it["diff_method"] == "propd" + deseq2: it["diff_method"] == "deseq2" } .set { ch_tools_single } @@ -43,25 +36,19 @@ workflow DIFFERENTIAL { .join(ch_samplesheet) .combine(ch_contrasts) .combine(ch_tools_single.propd) - .multiMap { - meta_data, counts, samplesheet, meta_contrast, contrast_variable, reference, target, pathway, meta_tools -> + .map { + meta_data, counts, samplesheet, meta_contrast, contrast_variable, reference, target, meta_tools -> def meta = meta_data.clone() + ['contrast': meta_contrast.id] + meta_tools.clone() input: [ meta, counts, samplesheet, contrast_variable, reference, target ] - pathway: [ meta, pathway ] } .set { ch_propd } - PROPD(ch_propd.input.unique()) - ch_results_pairwise = PROPD.out.results - .join(ch_propd.pathway).map(correct_meta_data).mix(ch_results_pairwise) - ch_results_pairwise_filtered = PROPD.out.results_filtered - .join(ch_propd.pathway).map(correct_meta_data).mix(ch_results_pairwise_filtered) - ch_results_genewise = PROPD.out.connectivity - .join(ch_propd.pathway).map(correct_meta_data).mix(ch_results_genewise) - ch_results_genewise_filtered = PROPD.out.hub_genes - .join(ch_propd.pathway).map(correct_meta_data).mix(ch_results_genewise_filtered) - ch_adjacency = PROPD.out.adjacency - .join(ch_propd.pathway).map(correct_meta_data).mix(ch_adjacency) + PROPD(ch_propd.unique()) + ch_results_pairwise = PROPD.out.results.mix(ch_results_pairwise) + ch_results_pairwise_filtered = PROPD.out.results_filtered.mix(ch_results_pairwise_filtered) + ch_results_genewise = PROPD.out.connectivity.mix(ch_results_genewise) + ch_results_genewise_filtered = PROPD.out.hub_genes.mix(ch_results_genewise_filtered) + ch_adjacency = PROPD.out.adjacency.mix(ch_adjacency) // ---------------------------------------------------- // Perform differential analysis with DESeq2 diff --git a/subworkflows/local/experimental/main.nf b/subworkflows/local/experimental/main.nf index 5376b592..640f6412 100644 --- a/subworkflows/local/experimental/main.nf +++ b/subworkflows/local/experimental/main.nf @@ -5,6 +5,19 @@ include { DIFFERENTIAL } from '../differential/main.nf' include { CORRELATION } from '../correlation/main.nf' include { ENRICHMENT } from '../enrichment/main.nf' +def postprocess_subworkflow_output( ch_results, ch_tools_args ) { + // 1) join results with pathway data + // 2) clean up meta data by removing tool arguments and adding pathway name + return ch_results + .combine(ch_tools_args) + .filter{ meta, data, pathway, arg_map -> meta.subMap(arg_map.keySet()) == arg_map } + .map{ meta, data, pathway, arg_map -> + def meta_clone = meta.clone() + pathway + meta_clone.removeAll{it.key in arg_map.keySet()} + return [meta_clone, data] + } +} + workflow EXPERIMENTAL { take: ch_contrasts // [ meta, contrast_variable, reference, target ] @@ -39,27 +52,27 @@ workflow EXPERIMENTAL { // ---------------------------------------------------- DIFFERENTIAL( - ch_tools.diff, + ch_tools.diff.map{ it[1] }, ch_counts, ch_samplesheet, ch_contrasts ) - ch_results_pairwise = ch_results_pairwise.mix(DIFFERENTIAL.out.results_pairwise) - ch_results_pairwise_filtered = ch_results_pairwise_filtered.mix(DIFFERENTIAL.out.results_pairwise_filtered) - ch_results_genewise = ch_results_genewise.mix(DIFFERENTIAL.out.results_genewise) - ch_results_genewise_filtered = ch_results_genewise_filtered.mix(DIFFERENTIAL.out.results_genewise_filtered) - ch_adjacency = ch_adjacency.mix(DIFFERENTIAL.out.adjacency) + ch_results_pairwise = postprocess_subworkflow_output(DIFFERENTIAL.out.results_pairwise,ch_tools.diff).mix(ch_results_pairwise) + ch_results_pairwise_filtered = postprocess_subworkflow_output(DIFFERENTIAL.out.results_pairwise_filtered,ch_tools.diff).mix(ch_results_pairwise_filtered) + ch_results_genewise = postprocess_subworkflow_output(DIFFERENTIAL.out.results_genewise,ch_tools.diff).mix(ch_results_genewise) + ch_results_genewise_filtered = postprocess_subworkflow_output(DIFFERENTIAL.out.results_genewise_filtered,ch_tools.diff).mix(ch_results_genewise_filtered) + ch_adjacency = postprocess_subworkflow_output(DIFFERENTIAL.out.adjacency,ch_tools.diff).mix(ch_adjacency) // ---------------------------------------------------- // CORRELATION ANALYSIS BLOCK // ---------------------------------------------------- CORRELATION( - ch_tools.corr, + ch_tools.corr.map{ it[1] }, ch_counts ) - ch_matrix = ch_matrix.mix(CORRELATION.out.matrix) - ch_adjacency = ch_adjacency.mix(CORRELATION.out.adjacency) + ch_matrix = postprocess_subworkflow_output(CORRELATION.out.matrix,ch_tools.corr).mix(ch_matrix) + ch_adjacency = postprocess_subworkflow_output(CORRELATION.out.adjacency,ch_tools.corr).mix(ch_adjacency) // ---------------------------------------------------- // FUNCTIONAL ENRICHMENT BLOCK From bd7d5d4035f5f32c77d38e2744a0f0bc1c58482d Mon Sep 17 00:00:00 2001 From: suzannejin Date: Thu, 24 Oct 2024 14:14:14 +0200 Subject: [PATCH 124/154] fix bug with number_of_cutoffs in propd.R --- modules/local/propr/propd/templates/propd.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/propr/propd/templates/propd.R b/modules/local/propr/propd/templates/propd.R index 2467b398..6954d636 100644 --- a/modules/local/propr/propd/templates/propd.R +++ b/modules/local/propr/propd/templates/propd.R @@ -469,7 +469,7 @@ if (opt\$permutation == 0) { pd <- updateCutoffs( pd, - number_of_cutoffs = 100, + number_of_cutoffs = opt\$number_of_cutoffs, ncores = opt\$ncores ) From 8db59cc4be5419b70044ee6de3e5d53b147445d9 Mon Sep 17 00:00:00 2001 From: suzannejin Date: Fri, 25 Oct 2024 13:08:16 +0200 Subject: [PATCH 125/154] update toolsheet --- assets/tools_samplesheet.csv | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/assets/tools_samplesheet.csv b/assets/tools_samplesheet.csv index efdf5457..1345355a 100644 --- a/assets/tools_samplesheet.csv +++ b/assets/tools_samplesheet.csv @@ -1,8 +1,10 @@ pathway_name,diff_method,args_diff,cor_method,args_cor,enr_method,args_enr propd,propd,,,,, propd_fdr,propd,--permutation 100,,,, +propd_grea,propd,,,,grea, +propd_ora,propd,,,,gprofiler2, +deseq2_gsea,deseq2,,,,gsea, +deseq2_ora,deseq2,,,,gprofiler2, pcorbshrink,,,propr,--metric pcor.bshrink,, propr,,,propr,--metric rho,, cor,,,propr,--metric cor,, -propd_grea,propd,,,,grea, -deseq2,deseq2,,,,gsea, From dab58e5a6f7bec585f1c332680543759908dc5bf Mon Sep 17 00:00:00 2001 From: suzannejin Date: Fri, 25 Oct 2024 13:10:53 +0200 Subject: [PATCH 126/154] updated propr container and modified propd.R to loop through FDR testing when no meaningful cutoff is found --- conf/test_experimental.config | 6 ++- modules/local/propr/grea/main.nf | 4 +- modules/local/propr/propd/main.nf | 4 +- modules/local/propr/propd/templates/propd.R | 53 ++++++++++++++++----- modules/local/propr/propr/main.nf | 4 +- subworkflows/local/differential/main.nf | 3 ++ 6 files changed, 55 insertions(+), 19 deletions(-) diff --git a/conf/test_experimental.config b/conf/test_experimental.config index 56ca6a2e..8c97d31c 100644 --- a/conf/test_experimental.config +++ b/conf/test_experimental.config @@ -29,7 +29,11 @@ params { input = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.samplesheet.csv' matrix = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv' contrasts = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.contrasts.csv' - pathway = "propd,propd_fdr,pcorbshrink,propr,cor,propd_grea" + pathway = "propd,propd_fdr,propd_grea,propr" + + // some pathways are not included in the test, because they don't make sense to test for this dataset + // for example propd_fdr don't give significant results on this dataset, and the permutation will be scaped + // and pcor.bshrink is taking too long for this test (15min), and it should be tested on matrices with n > p, or n close to p. (eg. specific pathways, or on DE genes only, etc) //Features features_metadata_cols = 'gene_id,gene_name' diff --git a/modules/local/propr/grea/main.nf b/modules/local/propr/grea/main.nf index 4c37cc58..2b503133 100644 --- a/modules/local/propr/grea/main.nf +++ b/modules/local/propr/grea/main.nf @@ -4,8 +4,8 @@ process PROPR_GREA { // conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'oras://community.wave.seqera.io/library/bioconductor-limma_r-ggplot2_r-propr:75e6dfd62a2313a9': - 'community.wave.seqera.io/library/bioconductor-limma_r-ggplot2_r-propr:fbd569ab00953cb0' }" + 'oras://community.wave.seqera.io/library/bioconductor-limma_r-ggplot2_r-propr:209490acb0e524e3' : + 'community.wave.seqera.io/library/bioconductor-limma_r-ggplot2_r-propr:17abd3f137436739' }" input: tuple val(meta), path(adj) diff --git a/modules/local/propr/propd/main.nf b/modules/local/propr/propd/main.nf index 7f3c7f94..8bfd9e3a 100644 --- a/modules/local/propr/propd/main.nf +++ b/modules/local/propr/propd/main.nf @@ -4,8 +4,8 @@ process PROPR_PROPD { // conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'oras://community.wave.seqera.io/library/bioconductor-limma_r-ggplot2_r-propr:75e6dfd62a2313a9': - 'community.wave.seqera.io/library/bioconductor-limma_r-ggplot2_r-propr:fbd569ab00953cb0' }" + 'oras://community.wave.seqera.io/library/bioconductor-limma_r-ggplot2_r-propr:209490acb0e524e3' : + 'community.wave.seqera.io/library/bioconductor-limma_r-ggplot2_r-propr:17abd3f137436739' }" input: tuple val(meta), path(count), path(samplesheet), val(contrast_variable), val(reference), val(target) diff --git a/modules/local/propr/propd/templates/propd.R b/modules/local/propr/propd/templates/propd.R index 6954d636..c4aae21a 100644 --- a/modules/local/propr/propd/templates/propd.R +++ b/modules/local/propr/propd/templates/propd.R @@ -465,21 +465,50 @@ if (opt\$permutation == 0) { warning('Permutation tests are used to compute FDR values.') - # update FDR values using permutation tests + # calculate FDR values using permutation tests + # this part will call the updateCutoffs function iteratively + # as far as it does not find a meaningful theta value + # and does not reach the maximum number of iterations + + theta_cutoff <- FALSE + max_cutoff <- 1 + ntry <- 0 + while (!theta_cutoff & max_cutoff > 0 & ntry < 10) { + ntry <- ntry + 1 + + # get theta cutoffs to test the FDR + + if (ntry > 1) { + part <- pd@fdr[which(pd@fdr\$truecounts > 0),] + if (nrow(part) > 1) { + max_cutoff <- min(part\$cutoff) + } else { + break + } + } - pd <- updateCutoffs( - pd, - number_of_cutoffs = opt\$number_of_cutoffs, - ncores = opt\$ncores - ) + cutoffs <- as.numeric(quantile( + pd@results[pd@results\$theta < max_cutoff, 'theta'], + seq(0, 1, length.out = opt\$number_of_cutoffs) + )) - # get theta cutoff + # update FDR values + + pd <- updateCutoffs( + pd, + custom_cutoffs = cutoffs, + ncores = opt\$ncores + ) + + # check if any theta value has FDR below desired threshold + + theta_cutoff <- getCutoffFDR( + pd, + fdr=opt\$fdr, + window_size=1 + ) + } - theta_cutoff <- getCutoffFDR( - pd, - fdr=opt\$fdr, - window_size=1 - ) if (theta_cutoff) { warning('Significant theta value found: ', theta_cutoff) diff --git a/modules/local/propr/propr/main.nf b/modules/local/propr/propr/main.nf index efe25569..99e7770e 100644 --- a/modules/local/propr/propr/main.nf +++ b/modules/local/propr/propr/main.nf @@ -4,8 +4,8 @@ process PROPR_PROPR { // conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'oras://community.wave.seqera.io/library/bioconductor-limma_r-ggplot2_r-propr:75e6dfd62a2313a9': - 'community.wave.seqera.io/library/bioconductor-limma_r-ggplot2_r-propr:fbd569ab00953cb0' }" + 'oras://community.wave.seqera.io/library/bioconductor-limma_r-ggplot2_r-propr:209490acb0e524e3' : + 'community.wave.seqera.io/library/bioconductor-limma_r-ggplot2_r-propr:17abd3f137436739' }" input: tuple val(meta), path(count) diff --git a/subworkflows/local/differential/main.nf b/subworkflows/local/differential/main.nf index 2cc67427..bd45178d 100644 --- a/subworkflows/local/differential/main.nf +++ b/subworkflows/local/differential/main.nf @@ -39,6 +39,9 @@ workflow DIFFERENTIAL { // Perform differential analysis with propd // ---------------------------------------------------- + // TODO propd currently don't support blocking, so we should not run propd with same contrast_variable, reference and target, + // but different blocking variable, since it will simply run the same analysis again. + ch_counts .join(ch_samplesheet) .combine(ch_contrasts) From 094452b58635d90df13986d10f84a1a393118de3 Mon Sep 17 00:00:00 2001 From: Suzanne Jin Date: Mon, 28 Oct 2024 11:25:12 +0100 Subject: [PATCH 127/154] shorten test_experimental into the essential tests --- conf/test_experimental.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/test_experimental.config b/conf/test_experimental.config index 56ca6a2e..f7da1c4a 100644 --- a/conf/test_experimental.config +++ b/conf/test_experimental.config @@ -29,7 +29,7 @@ params { input = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.samplesheet.csv' matrix = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv' contrasts = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.contrasts.csv' - pathway = "propd,propd_fdr,pcorbshrink,propr,cor,propd_grea" + pathway = "propd,propr,cor,propd_grea" //Features features_metadata_cols = 'gene_id,gene_name' From e345168c080c65dcbce03c813901c2d8b6efbf5a Mon Sep 17 00:00:00 2001 From: Suzanne Jin Date: Mon, 28 Oct 2024 11:33:18 +0100 Subject: [PATCH 128/154] trim trailing --- conf/test_experimental.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/test_experimental.config b/conf/test_experimental.config index 4e54ecf1..88506222 100644 --- a/conf/test_experimental.config +++ b/conf/test_experimental.config @@ -30,7 +30,7 @@ params { matrix = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv' contrasts = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.contrasts.csv' pathway = "propd,propr,cor,propd_grea" - + // some pathways are not included in the test, because they don't make sense to test for this dataset // for example propd_fdr don't give significant results on this dataset, and the permutation will be scaped // and pcor.bshrink is taking too long for this test (15min), and it should be tested on matrices with n > p, or n close to p. (eg. specific pathways, or on DE genes only, etc) From af86bb2e68e029e9e08cdc4ac78695967f7f6599 Mon Sep 17 00:00:00 2001 From: Stephanie Yang Date: Mon, 28 Oct 2024 16:36:26 +0100 Subject: [PATCH 129/154] Modify differential/main.nf to include limma --- assets/schema_tools.json | 4 ++-- assets/tools_samplesheet.csv | 2 ++ subworkflows/local/differential/main.nf | 24 ++++++++++++++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/assets/schema_tools.json b/assets/schema_tools.json index 347a14f0..dcbbe9f8 100644 --- a/assets/schema_tools.json +++ b/assets/schema_tools.json @@ -12,9 +12,9 @@ }, "diff_method": { "type": "string", - "errorMessage": "choose a differential analysis method (eg. deseq2, propd) or none", + "errorMessage": "choose a differential analysis method (eg. deseq2, limma, propd) or none", "meta": ["diff_method"], - "enum": ["propd", "deseq2", "none"] + "enum": ["propd", "deseq2", "limma", "none"] }, "args_diff": { "type": "string", diff --git a/assets/tools_samplesheet.csv b/assets/tools_samplesheet.csv index 1345355a..2289918d 100644 --- a/assets/tools_samplesheet.csv +++ b/assets/tools_samplesheet.csv @@ -5,6 +5,8 @@ propd_grea,propd,,,,grea, propd_ora,propd,,,,gprofiler2, deseq2_gsea,deseq2,,,,gsea, deseq2_ora,deseq2,,,,gprofiler2, +limma,limma,,,,, +limma_gsea,limma,,,,gsea, pcorbshrink,,,propr,--metric pcor.bshrink,, propr,,,propr,--metric rho,, cor,,,propr,--metric cor,, diff --git a/subworkflows/local/differential/main.nf b/subworkflows/local/differential/main.nf index bd45178d..94cec0a7 100644 --- a/subworkflows/local/differential/main.nf +++ b/subworkflows/local/differential/main.nf @@ -3,6 +3,7 @@ // include { PROPR_PROPD as PROPD } from "../../../modules/local/propr/propd/main.nf" include { DESEQ2_DIFFERENTIAL } from '../../../modules/nf-core/deseq2/differential/main' +include { LIMMA_DIFFERENTIAL } from '../../../modules/nf-core/limma/differential/main' def correct_meta_data = { meta, data, pathway -> def meta_clone = meta.clone() + pathway @@ -32,6 +33,7 @@ workflow DIFFERENTIAL { .branch { propd: it[1]["diff_method"] == "propd" deseq2: it[1]["diff_method"] == "deseq2" + limma: it[1]["diff_method"] == "limma" } .set { ch_tools_single } @@ -89,6 +91,28 @@ workflow DIFFERENTIAL { // ch_results = ch_results // .mix(DESEQ2_DIFFERENTIAL.out.results) + // ---------------------------------------------------- + // Perform differential analysis with limma + // ---------------------------------------------------- + + ch_counts + .join(ch_samplesheet) //samplesheet + counts have the same meta + .combine(ch_contrasts) // meta is different + .combine(ch_tools_single.limma) + .multiMap { + meta_data, counts, samplesheet, meta_contrast, contrast_variable, reference, target, pathway, meta_tools -> + def meta = meta_data.clone() + meta_contrast.clone() + meta_tools.clone() + input1: [ meta, contrast_variable, reference, target ] + input2: [ meta, samplesheet, counts ] + pathway: [ meta, pathway ] + } + .set { ch_limma } + + LIMMA_DIFFERENTIAL(ch_limma.input1.unique(), ch_limma.input2.unique()) + + ch_results_genewise = LIMMA_DIFFERENTIAL.out.results + .join(ch_limma.pathway).map(correct_meta_data).mix(ch_results_genewise) + emit: results_pairwise = ch_results_pairwise results_pairwise_filtered = ch_results_pairwise_filtered From aca5f24a386f9ee5acd828c7a62792d345204451 Mon Sep 17 00:00:00 2001 From: Suzanne Jin Date: Tue, 29 Oct 2024 10:41:38 +0100 Subject: [PATCH 130/154] modify limma input --- subworkflows/local/differential/main.nf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/subworkflows/local/differential/main.nf b/subworkflows/local/differential/main.nf index 94cec0a7..4365ce92 100644 --- a/subworkflows/local/differential/main.nf +++ b/subworkflows/local/differential/main.nf @@ -15,9 +15,9 @@ def correct_meta_data = { meta, data, pathway -> workflow DIFFERENTIAL { take: ch_tools // [ pathway_name, differential_map ] - ch_counts - ch_samplesheet - ch_contrasts // [meta, contrast_variable, reference, target] + ch_counts // [ meta_data, counts ] + ch_samplesheet // [ meta_data, samplesheet ] + ch_contrasts // [ meta_contrast, contrast_variable, reference, target ] main: @@ -108,7 +108,7 @@ workflow DIFFERENTIAL { } .set { ch_limma } - LIMMA_DIFFERENTIAL(ch_limma.input1.unique(), ch_limma.input2.unique()) + LIMMA_DIFFERENTIAL(ch_limma.input1, ch_limma.input2) ch_results_genewise = LIMMA_DIFFERENTIAL.out.results .join(ch_limma.pathway).map(correct_meta_data).mix(ch_results_genewise) From afd752220bd3e6a69d0e06599f0f82a9218faee5 Mon Sep 17 00:00:00 2001 From: Suzanne Jin Date: Tue, 29 Oct 2024 10:43:57 +0100 Subject: [PATCH 131/154] modify limma input --- subworkflows/local/differential/main.nf | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/subworkflows/local/differential/main.nf b/subworkflows/local/differential/main.nf index 4365ce92..18ba24d4 100644 --- a/subworkflows/local/differential/main.nf +++ b/subworkflows/local/differential/main.nf @@ -96,9 +96,10 @@ workflow DIFFERENTIAL { // ---------------------------------------------------- ch_counts - .join(ch_samplesheet) //samplesheet + counts have the same meta - .combine(ch_contrasts) // meta is different - .combine(ch_tools_single.limma) + .join(ch_samplesheet) + .combine(ch_contrasts) + .combine(ch_tools_single.limma) + .unique() .multiMap { meta_data, counts, samplesheet, meta_contrast, contrast_variable, reference, target, pathway, meta_tools -> def meta = meta_data.clone() + meta_contrast.clone() + meta_tools.clone() @@ -110,8 +111,10 @@ workflow DIFFERENTIAL { LIMMA_DIFFERENTIAL(ch_limma.input1, ch_limma.input2) - ch_results_genewise = LIMMA_DIFFERENTIAL.out.results - .join(ch_limma.pathway).map(correct_meta_data).mix(ch_results_genewise) + ch_results_genewise = LIMMA_DIFFERENTIAL.out.results + .join(ch_limma.pathway).map(correct_meta_data).mix(ch_results_genewise) + + // TODO add filtering step for limma emit: results_pairwise = ch_results_pairwise From e8067ac48506eed235162d0b85ed6f384c1b8397 Mon Sep 17 00:00:00 2001 From: Suzanne Jin Date: Tue, 29 Oct 2024 10:49:11 +0100 Subject: [PATCH 132/154] trim trailing --- subworkflows/local/differential/main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/differential/main.nf b/subworkflows/local/differential/main.nf index 18ba24d4..5a1f758a 100644 --- a/subworkflows/local/differential/main.nf +++ b/subworkflows/local/differential/main.nf @@ -110,9 +110,9 @@ workflow DIFFERENTIAL { .set { ch_limma } LIMMA_DIFFERENTIAL(ch_limma.input1, ch_limma.input2) - + ch_results_genewise = LIMMA_DIFFERENTIAL.out.results - .join(ch_limma.pathway).map(correct_meta_data).mix(ch_results_genewise) + .join(ch_limma.pathway).map(correct_meta_data).mix(ch_results_genewise) // TODO add filtering step for limma From 4477e1c88ccbd216e62d435ab6e157ecb14d380f Mon Sep 17 00:00:00 2001 From: Suzanne Jin Date: Tue, 29 Oct 2024 11:48:29 +0100 Subject: [PATCH 133/154] add limma to test_experimental --- assets/tools_samplesheet.csv | 2 +- conf/test_experimental.config | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/tools_samplesheet.csv b/assets/tools_samplesheet.csv index 2289918d..c0e1c1c8 100644 --- a/assets/tools_samplesheet.csv +++ b/assets/tools_samplesheet.csv @@ -6,7 +6,7 @@ propd_ora,propd,,,,gprofiler2, deseq2_gsea,deseq2,,,,gsea, deseq2_ora,deseq2,,,,gprofiler2, limma,limma,,,,, -limma_gsea,limma,,,,gsea, +limma_ora,limma,,,,gprofiler2, pcorbshrink,,,propr,--metric pcor.bshrink,, propr,,,propr,--metric rho,, cor,,,propr,--metric cor,, diff --git a/conf/test_experimental.config b/conf/test_experimental.config index 88506222..0fdeff51 100644 --- a/conf/test_experimental.config +++ b/conf/test_experimental.config @@ -29,7 +29,7 @@ params { input = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.samplesheet.csv' matrix = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv' contrasts = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.contrasts.csv' - pathway = "propd,propr,cor,propd_grea" + pathway = "propd,propd_grea,limma,propr,cor" // some pathways are not included in the test, because they don't make sense to test for this dataset // for example propd_fdr don't give significant results on this dataset, and the permutation will be scaped From 898af4339f603b520f7e6663f55481214c0f90c7 Mon Sep 17 00:00:00 2001 From: Suzanne Jin Date: Tue, 29 Oct 2024 11:57:18 +0100 Subject: [PATCH 134/154] add filtering step for limma --- subworkflows/local/differential/main.nf | 28 ++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/subworkflows/local/differential/main.nf b/subworkflows/local/differential/main.nf index 5a1f758a..59c7c47a 100644 --- a/subworkflows/local/differential/main.nf +++ b/subworkflows/local/differential/main.nf @@ -2,8 +2,9 @@ // Perform differential analysis // include { PROPR_PROPD as PROPD } from "../../../modules/local/propr/propd/main.nf" -include { DESEQ2_DIFFERENTIAL } from '../../../modules/nf-core/deseq2/differential/main' +include { DESEQ2_DIFFERENTIAL } from '../../../modules/nf-core/deseq2/differential/main' include { LIMMA_DIFFERENTIAL } from '../../../modules/nf-core/limma/differential/main' +include { FILTER_DIFFTABLE as FILTER_DIFFTABLE_LIMMA } from '../../../modules/local/filter_difftable' def correct_meta_data = { meta, data, pathway -> def meta_clone = meta.clone() + pathway @@ -14,10 +15,10 @@ def correct_meta_data = { meta, data, pathway -> workflow DIFFERENTIAL { take: - ch_tools // [ pathway_name, differential_map ] - ch_counts // [ meta_data, counts ] - ch_samplesheet // [ meta_data, samplesheet ] - ch_contrasts // [ meta_contrast, contrast_variable, reference, target ] + ch_tools // [ pathway_name, differential_map ] + ch_counts // [ meta_exp, counts ] + ch_samplesheet // [ meta_exp, samplesheet ] + ch_contrasts // [ meta_contrast, contrast_variable, reference, target ] main: @@ -95,6 +96,8 @@ workflow DIFFERENTIAL { // Perform differential analysis with limma // ---------------------------------------------------- + // combine the input channels with the tools information + // in this way, limma will only be run if the user have specified it, as informed by ch_tools ch_counts .join(ch_samplesheet) .combine(ch_contrasts) @@ -109,12 +112,23 @@ workflow DIFFERENTIAL { } .set { ch_limma } + // run limma LIMMA_DIFFERENTIAL(ch_limma.input1, ch_limma.input2) + // filter results + ch_logfc = Channel.value([ params.differential_fc_column, params.differential_min_fold_change ]) + ch_padj = Channel.value([ params.differential_qval_column, params.differential_max_qval ]) + FILTER_DIFFTABLE_LIMMA( + LIMMA_DIFFERENTIAL.out.results, + ch_logfc, + ch_padj + ) + + // collect results ch_results_genewise = LIMMA_DIFFERENTIAL.out.results .join(ch_limma.pathway).map(correct_meta_data).mix(ch_results_genewise) - - // TODO add filtering step for limma + ch_results_genewise_filtered = FILTER_DIFFTABLE_LIMMA.out.results + .join(ch_limma.pathway).map(correct_meta_data).mix(ch_results_genewise_filtered) emit: results_pairwise = ch_results_pairwise From c6db7ff29a17c18d47536db5e023ff64eab97a55 Mon Sep 17 00:00:00 2001 From: Suzanne Jin Date: Tue, 29 Oct 2024 12:04:26 +0100 Subject: [PATCH 135/154] fix bug --- subworkflows/local/differential/main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/differential/main.nf b/subworkflows/local/differential/main.nf index 59c7c47a..9be8480b 100644 --- a/subworkflows/local/differential/main.nf +++ b/subworkflows/local/differential/main.nf @@ -34,7 +34,7 @@ workflow DIFFERENTIAL { .branch { propd: it[1]["diff_method"] == "propd" deseq2: it[1]["diff_method"] == "deseq2" - limma: it[1]["diff_method"] == "limma" + limma: it[1]["diff_method"] == "limma" } .set { ch_tools_single } @@ -127,7 +127,7 @@ workflow DIFFERENTIAL { // collect results ch_results_genewise = LIMMA_DIFFERENTIAL.out.results .join(ch_limma.pathway).map(correct_meta_data).mix(ch_results_genewise) - ch_results_genewise_filtered = FILTER_DIFFTABLE_LIMMA.out.results + ch_results_genewise_filtered = FILTER_DIFFTABLE_LIMMA.out.filtered .join(ch_limma.pathway).map(correct_meta_data).mix(ch_results_genewise_filtered) emit: From 3b398ac77c99fbe7b5f5807fb19fbf0366094416 Mon Sep 17 00:00:00 2001 From: Suzanne Jin Date: Tue, 29 Oct 2024 12:47:23 +0100 Subject: [PATCH 136/154] change filter_difftable_limma input column names --- subworkflows/local/differential/main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/differential/main.nf b/subworkflows/local/differential/main.nf index 9be8480b..e536f619 100644 --- a/subworkflows/local/differential/main.nf +++ b/subworkflows/local/differential/main.nf @@ -116,8 +116,8 @@ workflow DIFFERENTIAL { LIMMA_DIFFERENTIAL(ch_limma.input1, ch_limma.input2) // filter results - ch_logfc = Channel.value([ params.differential_fc_column, params.differential_min_fold_change ]) - ch_padj = Channel.value([ params.differential_qval_column, params.differential_max_qval ]) + ch_logfc = Channel.value([ "logFC", params.differential_min_fold_change ]) + ch_padj = Channel.value([ "adj.P.Val", params.differential_max_qval ]) FILTER_DIFFTABLE_LIMMA( LIMMA_DIFFERENTIAL.out.results, ch_logfc, From f97ba6b3e619f9ab0dff1f3c54604e277e4f5e59 Mon Sep 17 00:00:00 2001 From: Suzanne Jin Date: Tue, 29 Oct 2024 12:48:48 +0100 Subject: [PATCH 137/154] add todo --- subworkflows/local/differential/main.nf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/subworkflows/local/differential/main.nf b/subworkflows/local/differential/main.nf index e536f619..b7a94b5c 100644 --- a/subworkflows/local/differential/main.nf +++ b/subworkflows/local/differential/main.nf @@ -116,6 +116,8 @@ workflow DIFFERENTIAL { LIMMA_DIFFERENTIAL(ch_limma.input1, ch_limma.input2) // filter results + // note that these are column names specific for limma output table + // TODO modify the module to accept these parameters as meta/ext.args in the same way how propd does ch_logfc = Channel.value([ "logFC", params.differential_min_fold_change ]) ch_padj = Channel.value([ "adj.P.Val", params.differential_max_qval ]) FILTER_DIFFTABLE_LIMMA( From f2b63224df1df82324a5caa5dcfb92294a1f3d6c Mon Sep 17 00:00:00 2001 From: Breeshey Roskams-Hieter Date: Tue, 29 Oct 2024 15:36:12 +0000 Subject: [PATCH 138/154] add GPROFILER2 module to ENRICHMENT subworkflow --- subworkflows/local/enrichment/main.nf | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/subworkflows/local/enrichment/main.nf b/subworkflows/local/enrichment/main.nf index 936ddfcc..d868f509 100644 --- a/subworkflows/local/enrichment/main.nf +++ b/subworkflows/local/enrichment/main.nf @@ -3,6 +3,7 @@ // include { MYGENE } from "../../../modules/nf-core/mygene/main.nf" include { PROPR_GREA as GREA } from "../../../modules/local/propr/grea/main.nf" +include { GPROFILER2_GOST } from "../../../modules/nf-core/gprofiler2/gost/main.nf" workflow ENRICHMENT { take: @@ -45,7 +46,7 @@ workflow ENRICHMENT { } .set { ch_adjacency } - GREA(ch_adjacency.grea, ch_gmt.collect()) + GREA(ch_adjacency.grea, ch_gmt.collect()) //currently, ch_gmt.collect() returns an empty channel, so this does not run ch_enriched = ch_enriched.mix(GREA.out.results) // ---------------------------------------------------- @@ -60,6 +61,21 @@ workflow ENRICHMENT { // todo: add gprofiler2 here + // Define background file + if (!params.gprofiler2_background_file) { + // If deactivated, use empty list as "background" + ch_background = [] + } else if (params.gprofiler2_background_file == "auto") { + // If auto, use input matrix as background + ch_background = ch_counts.map { meta, counts -> counts } + } else { + ch_background = Channel.from(file(params.gprofiler2_background_file, checkIfExists: true)) + } + + // rearrage channel for GPROFILER2_GOST process + ch_gmt = ch_gmt.map { meta, gmt -> gmt } + GPROFILER2_GOST(ch_results_genewise_filtered, ch_gmt, ch_background) + emit: enriched = ch_enriched } From 94d3c8e7e48b0ad9e4c892f4078f0a20e809e980 Mon Sep 17 00:00:00 2001 From: bjlang <> Date: Tue, 29 Oct 2024 16:56:29 +0100 Subject: [PATCH 139/154] Once more reorganize the pathway logic --- conf/modules.config | 20 +------ subworkflows/local/correlation/main.nf | 20 ++----- subworkflows/local/differential/main.nf | 23 ++++---- subworkflows/local/enrichment/main.nf | 33 +++++------ subworkflows/local/experimental/main.nf | 77 ++++++++++++++++--------- 5 files changed, 85 insertions(+), 88 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index a0f8c56f..1bb43755 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -507,10 +507,7 @@ process { "--number_of_cutoffs ${params.propr_ncutoffs}" ].join(' ').trim() } publishDir = [ - path: { - meta.args_cor ? "${params.outdir}/correlation_analysis/propr-${meta.args_cor.replace('--','').replace(' ', '_')}" : - "${params.outdir}/correlation_analysis/propr" - }, + path: { "${params.outdir}/correlation_analysis/propr-${meta.pathway_name ?: params.pathway}" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -534,10 +531,7 @@ process { "--weighted_degree ${params.propd_weighted_degree}" ].join(' ').trim() } publishDir = [ - path: { - meta.args_diff ? "${params.outdir}/differential_analysis/propd-${meta.args_diff.replace('--','').replace(' ', '_')}/${meta.contrast}" : - "${params.outdir}/differential_analysis/propd/${meta.contrast}" - }, + path: { "${params.outdir}/differential_analysis/propr-${meta.pathway_name ?: params.pathway}" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -555,15 +549,7 @@ process { "--permutation ${params.grea_permutation}" ].join(' ').trim() } publishDir = [ - path: { - meta.args_enr ? "${params.outdir}/enrichment_analysis/grea-${meta.args_enr.replace('--','').replace(' ', '_')}" : - "${params.outdir}/enrichment_analysis/grea" - }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - publishDir = [ - path: { "${params.outdir}/enrichment_analysis/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, + path: { "${params.outdir}/enrichment_analysis/propr-${meta.pathway_name ?: params.pathway}" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] diff --git a/subworkflows/local/correlation/main.nf b/subworkflows/local/correlation/main.nf index f7e2d85a..d62f435f 100644 --- a/subworkflows/local/correlation/main.nf +++ b/subworkflows/local/correlation/main.nf @@ -5,8 +5,7 @@ include {PROPR_PROPR as PROPR} from "../../../modules/local/propr/propr/main.nf" workflow CORRELATION { take: - ch_tools // [ correlation_map ] with the keys: cor_method, args_cor - ch_counts + ch_counts // [ meta, counts] with meta keys: method, args_cor main: @@ -15,25 +14,16 @@ workflow CORRELATION { ch_adjacency = Channel.empty() // branch tools to select the correct correlation analysis method - ch_tools + ch_counts .branch { - propr: it["cor_method"] == "propr" + propr: it[0]["method"] == "propr" } - .set { ch_tools_single } + .set { ch_counts } // ---------------------------------------------------- // Perform correlation analysis with propr // ---------------------------------------------------- - - ch_counts - .combine(ch_tools_single.propr) - .map { - metacounts, counts, metatools -> - input: [ metacounts+metatools, counts ] - } - .set { ch_counts_propr } - - PROPR(ch_counts_propr.unique()) + PROPR(ch_counts.propr.unique()) ch_matrix = PROPR.out.matrix.mix(ch_matrix) ch_adjacency = PROPR.out.adjacency.mix(ch_adjacency) diff --git a/subworkflows/local/differential/main.nf b/subworkflows/local/differential/main.nf index 111d686d..b497a664 100644 --- a/subworkflows/local/differential/main.nf +++ b/subworkflows/local/differential/main.nf @@ -6,8 +6,7 @@ include { DESEQ2_DIFFERENTIAL } from '../../../modules/nf-core/deseq2/different workflow DIFFERENTIAL { take: - ch_tools // [ differential_map ] with the keys: diff_method, args_diff - ch_counts + ch_counts // [ meta, counts] with meta keys: method, args_diff ch_samplesheet ch_contrasts // [meta, contrast_variable, reference, target] @@ -21,25 +20,25 @@ workflow DIFFERENTIAL { ch_adjacency = Channel.empty() // branch tools to select the correct differential analysis method - ch_tools + ch_counts .branch { - propd: it["diff_method"] == "propd" - deseq2: it["diff_method"] == "deseq2" + propd: it[0]["method"] == "propd" + deseq2: it[0]["method"] == "deseq2" } - .set { ch_tools_single } + .set { ch_counts } // ---------------------------------------------------- // Perform differential analysis with propd // ---------------------------------------------------- - ch_counts - .join(ch_samplesheet) + ch_counts.propd + .combine(ch_samplesheet) + .filter{ meta_counts, counts, meta_samplesheet, samplesheet -> meta_counts.subMap(meta_samplesheet.keySet()) == meta_samplesheet } .combine(ch_contrasts) - .combine(ch_tools_single.propd) .map { - meta_data, counts, samplesheet, meta_contrast, contrast_variable, reference, target, meta_tools -> - def meta = meta_data.clone() + ['contrast': meta_contrast.id] + meta_tools.clone() - input: [ meta, counts, samplesheet, contrast_variable, reference, target ] + meta_data, counts, meta_samplesheet, samplesheet, meta_contrast, contrast_variable, reference, target -> + def meta = meta_data.clone() + ['contrast': meta_contrast.id] + return [ meta, counts, samplesheet, contrast_variable, reference, target ] } .set { ch_propd } diff --git a/subworkflows/local/enrichment/main.nf b/subworkflows/local/enrichment/main.nf index 936ddfcc..54609af1 100644 --- a/subworkflows/local/enrichment/main.nf +++ b/subworkflows/local/enrichment/main.nf @@ -6,7 +6,6 @@ include { PROPR_GREA as GREA } from "../../../modules/local/propr/grea/main.nf" workflow ENRICHMENT { take: - ch_tools // [ pathway_name, enrichment_map ] ch_counts ch_results_genewise ch_results_genewise_filtered @@ -17,6 +16,14 @@ workflow ENRICHMENT { // initialize empty results channels ch_enriched = Channel.empty() + ch_gmt = Channel.empty() + + ch_adjacency + .branch { + grea: it[0]["method"] == "grea" + gsea: it[0]["method"] == "gsea" + } + .set { ch_adjacency } // ---------------------------------------------------- // Construct gene set database @@ -24,28 +31,20 @@ workflow ENRICHMENT { // TODO this should be optional, only run when there is no gene set data provided by user + // empty counts channel of ch_adjacency is empty to skip unnecessary MYGENE computations + ch_counts + .combine(ch_adjacency.grea) + .map{ meta_counts, counts, meta_adjacency, adjacency -> [meta_counts, counts]} + .unique() + .set{ch_counts} + MYGENE(ch_counts.take(1)) // only one data is provided to this pipeline ch_gmt = MYGENE.out.gmt // ---------------------------------------------------- // Perform enrichment analysis with GREA // ---------------------------------------------------- - - ch_adjacency - .map { meta, matrix -> [meta.subMap(["pathway_name"]), meta, matrix] } - .join(ch_tools, by: [0]) - .map { - pathway_name, meta, matrix, meta_tools -> - def new_meta = meta.clone() + meta_tools.clone() - [ new_meta, matrix ] - } - .branch { - grea: it[0]["enr_method"] == "grea" - gsea: it[0]["enr_method"] == "gsea" - } - .set { ch_adjacency } - - GREA(ch_adjacency.grea, ch_gmt.collect()) + GREA(ch_adjacency.grea.unique(), ch_gmt.collect()) ch_enriched = ch_enriched.mix(GREA.out.results) // ---------------------------------------------------- diff --git a/subworkflows/local/experimental/main.nf b/subworkflows/local/experimental/main.nf index 640f6412..0679ab6c 100644 --- a/subworkflows/local/experimental/main.nf +++ b/subworkflows/local/experimental/main.nf @@ -5,15 +5,24 @@ include { DIFFERENTIAL } from '../differential/main.nf' include { CORRELATION } from '../correlation/main.nf' include { ENRICHMENT } from '../enrichment/main.nf' -def postprocess_subworkflow_output( ch_results, ch_tools_args ) { - // 1) join results with pathway data - // 2) clean up meta data by removing tool arguments and adding pathway name - return ch_results +def preprocess_subworkflow_output( ch_input, ch_tools_args, method_field_name) { + // add method arguments to channel meta + return ch_input .combine(ch_tools_args) - .filter{ meta, data, pathway, arg_map -> meta.subMap(arg_map.keySet()) == arg_map } - .map{ meta, data, pathway, arg_map -> - def meta_clone = meta.clone() + pathway - meta_clone.removeAll{it.key in arg_map.keySet()} + .filter{ meta, input, pathway, arg_maps -> meta["pathway_name"] ? meta["pathway_name"] == pathway["pathway_name"] : true } + .map{ meta, input, pathway, arg_map -> + def meta_clone = meta.clone() + pathway + arg_map.clone() + meta_clone["method"] = meta_clone.remove(method_field_name) + return [meta_clone, input] + } +} + +def postprocess_subworkflow_output( ch_results, field_name ) { + // clean up meta data by removing tool arguments + return ch_results + .map{ meta, data -> + def meta_clone = meta.clone() + meta_clone.removeAll{it.key in field_name} return [meta_clone, data] } } @@ -28,16 +37,17 @@ workflow EXPERIMENTAL { main: // split toolsheet into channels - ch_tools + ch_tools.count() + .combine(ch_tools) .multiMap{ - pathway_name, differential_map, correlation_map, enrichment_map -> + n, pathway, differential_map, correlation_map, enrichment_map -> + def pathway_name = n == 1 ? ["pathway_name":""] : pathway diff: [ pathway_name, differential_map ] corr: [ pathway_name, correlation_map ] enr: [ pathway_name, enrichment_map ] } .set{ ch_tools } - // initialize empty results channels ch_results_pairwise = Channel.empty() // differential results for pairwise analysis - it should be a table ch_results_pairwise_filtered = Channel.empty() // differential results for pairwise analysis - filtered - it should be a table @@ -51,39 +61,52 @@ workflow EXPERIMENTAL { // DIFFERENTIAL ANALYSIS BLOCK // ---------------------------------------------------- + preprocess_subworkflow_output(ch_counts, ch_tools.diff, "diff_method") + .set{ ch_counts_diff } + ch_counts_diff.view{"diff: "+it} DIFFERENTIAL( - ch_tools.diff.map{ it[1] }, - ch_counts, + ch_counts_diff, ch_samplesheet, ch_contrasts ) - ch_results_pairwise = postprocess_subworkflow_output(DIFFERENTIAL.out.results_pairwise,ch_tools.diff).mix(ch_results_pairwise) - ch_results_pairwise_filtered = postprocess_subworkflow_output(DIFFERENTIAL.out.results_pairwise_filtered,ch_tools.diff).mix(ch_results_pairwise_filtered) - ch_results_genewise = postprocess_subworkflow_output(DIFFERENTIAL.out.results_genewise,ch_tools.diff).mix(ch_results_genewise) - ch_results_genewise_filtered = postprocess_subworkflow_output(DIFFERENTIAL.out.results_genewise_filtered,ch_tools.diff).mix(ch_results_genewise_filtered) - ch_adjacency = postprocess_subworkflow_output(DIFFERENTIAL.out.adjacency,ch_tools.diff).mix(ch_adjacency) + ch_results_pairwise = postprocess_subworkflow_output(DIFFERENTIAL.out.results_pairwise,["method", "args_diff"]).mix(ch_results_pairwise) + ch_results_pairwise_filtered = postprocess_subworkflow_output(DIFFERENTIAL.out.results_pairwise_filtered,["method", "args_diff"]).mix(ch_results_pairwise_filtered) + ch_results_genewise = postprocess_subworkflow_output(DIFFERENTIAL.out.results_genewise,["method", "args_diff"]).mix(ch_results_genewise) + ch_results_genewise_filtered = postprocess_subworkflow_output(DIFFERENTIAL.out.results_genewise_filtered,["method", "args_diff"]).mix(ch_results_genewise_filtered) + ch_adjacency = postprocess_subworkflow_output(DIFFERENTIAL.out.adjacency,["method", "args_diff"]).mix(ch_adjacency) // ---------------------------------------------------- // CORRELATION ANALYSIS BLOCK // ---------------------------------------------------- + preprocess_subworkflow_output(ch_counts, ch_tools.corr, "cor_method") + .set{ ch_counts_corr } + ch_counts_corr.view{"corr: "+it} + CORRELATION( - ch_tools.corr.map{ it[1] }, - ch_counts + ch_counts_corr ) - ch_matrix = postprocess_subworkflow_output(CORRELATION.out.matrix,ch_tools.corr).mix(ch_matrix) - ch_adjacency = postprocess_subworkflow_output(CORRELATION.out.adjacency,ch_tools.corr).mix(ch_adjacency) + ch_matrix = postprocess_subworkflow_output(CORRELATION.out.matrix,["method", "args_cor"]).mix(ch_matrix) + ch_adjacency = postprocess_subworkflow_output(CORRELATION.out.adjacency,["method", "args_cor"]).mix(ch_adjacency) // ---------------------------------------------------- // FUNCTIONAL ENRICHMENT BLOCK // ---------------------------------------------------- + preprocess_subworkflow_output(ch_counts, ch_tools.enr, "enr_method") + .set{ ch_counts_enr } + preprocess_subworkflow_output(ch_results_genewise, ch_tools.enr, "enr_method") + .set{ ch_results_genewise_enr } + preprocess_subworkflow_output(ch_results_genewise_filtered, ch_tools.enr, "enr_method") + .set{ ch_results_genewise_filtered_enr } + preprocess_subworkflow_output(ch_adjacency, ch_tools.enr, "enr_method") + .set{ ch_adjacency_enr } + ENRICHMENT( - ch_tools.enr, - ch_counts, - ch_results_genewise, - ch_results_genewise_filtered, - ch_adjacency + ch_counts_enr, + ch_results_genewise_enr, + ch_results_genewise_filtered_enr, + ch_adjacency_enr ) ch_enriched = ch_enriched.mix(ENRICHMENT.out.enriched) From 02a38bbc1d78c2d810583679874b60859b13e191 Mon Sep 17 00:00:00 2001 From: Breeshey Roskams-Hieter Date: Tue, 29 Oct 2024 16:20:21 +0000 Subject: [PATCH 140/154] add new pathway_names to test gprofiler2 --- conf/test_experimental.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/test_experimental.config b/conf/test_experimental.config index 0fdeff51..fc96b721 100644 --- a/conf/test_experimental.config +++ b/conf/test_experimental.config @@ -29,7 +29,7 @@ params { input = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.samplesheet.csv' matrix = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv' contrasts = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.contrasts.csv' - pathway = "propd,propd_grea,limma,propr,cor" + pathway = "propd,propd_grea,limma,propr,cor,propd_ora,limma_ora,deseq2_ora" // some pathways are not included in the test, because they don't make sense to test for this dataset // for example propd_fdr don't give significant results on this dataset, and the permutation will be scaped From 067c592e47e6eaa93e1e6a2b11fa504b31d90781 Mon Sep 17 00:00:00 2001 From: Breeshey Roskams-Hieter Date: Tue, 29 Oct 2024 16:21:20 +0000 Subject: [PATCH 141/154] run GPROFILER2 only when enr_method is specified in the ch_tools channel --- subworkflows/local/enrichment/main.nf | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/subworkflows/local/enrichment/main.nf b/subworkflows/local/enrichment/main.nf index d868f509..660bdc82 100644 --- a/subworkflows/local/enrichment/main.nf +++ b/subworkflows/local/enrichment/main.nf @@ -74,6 +74,20 @@ workflow ENRICHMENT { // rearrage channel for GPROFILER2_GOST process ch_gmt = ch_gmt.map { meta, gmt -> gmt } + + ch_results_genewise_filtered + .map { meta, matrix -> [meta.subMap(["pathway_name"]), meta, matrix] } + .join(ch_tools, by: [0]) + .map { + pathway_name, meta, matrix, meta_tools -> + def new_meta = meta.clone() + meta_tools.clone() + [ new_meta, matrix ] + } + .filter { + it[0].enr_method == "gprofiler2" + } + .set { ch_results_genewise_filtered } + GPROFILER2_GOST(ch_results_genewise_filtered, ch_gmt, ch_background) emit: From 47bb6597df5cce912ed26532034aabae20f30714 Mon Sep 17 00:00:00 2001 From: Breeshey Roskams-Hieter Date: Tue, 29 Oct 2024 16:32:45 +0000 Subject: [PATCH 142/154] remove trailing whitespace --- subworkflows/local/enrichment/main.nf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/subworkflows/local/enrichment/main.nf b/subworkflows/local/enrichment/main.nf index 660bdc82..f5f52c2f 100644 --- a/subworkflows/local/enrichment/main.nf +++ b/subworkflows/local/enrichment/main.nf @@ -83,13 +83,13 @@ workflow ENRICHMENT { def new_meta = meta.clone() + meta_tools.clone() [ new_meta, matrix ] } - .filter { - it[0].enr_method == "gprofiler2" + .filter { + it[0].enr_method == "gprofiler2" } .set { ch_results_genewise_filtered } - + GPROFILER2_GOST(ch_results_genewise_filtered, ch_gmt, ch_background) emit: enriched = ch_enriched -} +} \ No newline at end of file From 90001a2159a782a9e716a5b3664f139d617cae1c Mon Sep 17 00:00:00 2001 From: Breeshey Roskams-Hieter Date: Tue, 29 Oct 2024 16:34:18 +0000 Subject: [PATCH 143/154] add new line at end of file --- subworkflows/local/enrichment/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/enrichment/main.nf b/subworkflows/local/enrichment/main.nf index f5f52c2f..8a395556 100644 --- a/subworkflows/local/enrichment/main.nf +++ b/subworkflows/local/enrichment/main.nf @@ -92,4 +92,4 @@ workflow ENRICHMENT { emit: enriched = ch_enriched -} \ No newline at end of file +} From f7c5c773135b750c9b60674c43d10022a64d399a Mon Sep 17 00:00:00 2001 From: bjlang <> Date: Tue, 29 Oct 2024 18:35:24 +0100 Subject: [PATCH 144/154] Adapt Limma call --- subworkflows/local/differential/main.nf | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/subworkflows/local/differential/main.nf b/subworkflows/local/differential/main.nf index 799c372b..95679387 100644 --- a/subworkflows/local/differential/main.nf +++ b/subworkflows/local/differential/main.nf @@ -84,17 +84,16 @@ workflow DIFFERENTIAL { // combine the input channels with the tools information // in this way, limma will only be run if the user have specified it, as informed by ch_tools - ch_counts - .join(ch_samplesheet) + ch_counts.limma + .combine(ch_samplesheet) + .filter{ meta_counts, counts, meta_samplesheet, samplesheet -> meta_counts.subMap(meta_samplesheet.keySet()) == meta_samplesheet } .combine(ch_contrasts) - .combine(ch_tools_single.limma) .unique() .multiMap { - meta_data, counts, samplesheet, meta_contrast, contrast_variable, reference, target, pathway, meta_tools -> - def meta = meta_data.clone() + meta_contrast.clone() + meta_tools.clone() + meta_data, counts, meta_samplesheet, samplesheet, meta_contrast, contrast_variable, reference, target -> + def meta = meta_data.clone() + meta_contrast.clone() input1: [ meta, contrast_variable, reference, target ] input2: [ meta, samplesheet, counts ] - pathway: [ meta, pathway ] } .set { ch_limma } @@ -113,10 +112,8 @@ workflow DIFFERENTIAL { ) // collect results - ch_results_genewise = LIMMA_DIFFERENTIAL.out.results - .join(ch_limma.pathway).map(correct_meta_data).mix(ch_results_genewise) - ch_results_genewise_filtered = FILTER_DIFFTABLE_LIMMA.out.filtered - .join(ch_limma.pathway).map(correct_meta_data).mix(ch_results_genewise_filtered) + ch_results_genewise = LIMMA_DIFFERENTIAL.out.results.mix(ch_results_genewise) + ch_results_genewise_filtered = FILTER_DIFFTABLE_LIMMA.out.filtered.mix(ch_results_genewise_filtered) emit: results_pairwise = ch_results_pairwise From 953eb5188ddd0dd3e2bcc40a9f835b3f2c6cd941 Mon Sep 17 00:00:00 2001 From: bjlang <> Date: Wed, 30 Oct 2024 12:15:10 +0100 Subject: [PATCH 145/154] Implement review comments --- subworkflows/local/enrichment/main.nf | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/subworkflows/local/enrichment/main.nf b/subworkflows/local/enrichment/main.nf index 47e5045d..50736a62 100644 --- a/subworkflows/local/enrichment/main.nf +++ b/subworkflows/local/enrichment/main.nf @@ -22,7 +22,6 @@ workflow ENRICHMENT { ch_adjacency .branch { grea: it[0]["method"] == "grea" - gsea: it[0]["method"] == "gsea" } .set { ch_adjacency } @@ -32,13 +31,6 @@ workflow ENRICHMENT { // TODO this should be optional, only run when there is no gene set data provided by user - // empty counts channel of ch_adjacency is empty to skip unnecessary MYGENE computations - ch_counts - .combine(ch_adjacency.grea) - .map{ meta_counts, counts, meta_adjacency, adjacency -> [meta_counts, counts]} - .unique() - .set{ch_counts} - MYGENE(ch_counts.take(1)) // only one data is provided to this pipeline ch_gmt = MYGENE.out.gmt @@ -72,7 +64,7 @@ workflow ENRICHMENT { ch_background = Channel.from(file(params.gprofiler2_background_file, checkIfExists: true)) } - // rearrage channel for GPROFILER2_GOST process + // rearrange channel for GPROFILER2_GOST process ch_gmt = ch_gmt.map { meta, gmt -> gmt } ch_results_genewise_filtered From 4a5aa60e70e38f8d7c306ccdc59fb7ca6dc9254e Mon Sep 17 00:00:00 2001 From: Breeshey Roskams-Hieter Date: Wed, 30 Oct 2024 11:21:12 +0000 Subject: [PATCH 146/154] add deseq2 pathway name --- assets/tools_samplesheet.csv | 1 + 1 file changed, 1 insertion(+) diff --git a/assets/tools_samplesheet.csv b/assets/tools_samplesheet.csv index c0e1c1c8..94592a22 100644 --- a/assets/tools_samplesheet.csv +++ b/assets/tools_samplesheet.csv @@ -10,3 +10,4 @@ limma_ora,limma,,,,gprofiler2, pcorbshrink,,,propr,--metric pcor.bshrink,, propr,,,propr,--metric rho,, cor,,,propr,--metric cor,, +deseq2,deseq2,,,,, From 3546cb0ddb97d6ab9d1c1ebf174ee89fd0ba0ba3 Mon Sep 17 00:00:00 2001 From: Breeshey Roskams-Hieter Date: Wed, 30 Oct 2024 11:23:41 +0000 Subject: [PATCH 147/154] add DESEQ2 block to this workflow --- subworkflows/local/differential/main.nf | 93 +++++++++++++++++++------ 1 file changed, 71 insertions(+), 22 deletions(-) diff --git a/subworkflows/local/differential/main.nf b/subworkflows/local/differential/main.nf index b7a94b5c..4c913761 100644 --- a/subworkflows/local/differential/main.nf +++ b/subworkflows/local/differential/main.nf @@ -3,8 +3,10 @@ // include { PROPR_PROPD as PROPD } from "../../../modules/local/propr/propd/main.nf" include { DESEQ2_DIFFERENTIAL } from '../../../modules/nf-core/deseq2/differential/main' +include { DESEQ2_DIFFERENTIAL as DESEQ2_NORM } from "../../../modules/nf-core/deseq2/differential/main" include { LIMMA_DIFFERENTIAL } from '../../../modules/nf-core/limma/differential/main' include { FILTER_DIFFTABLE as FILTER_DIFFTABLE_LIMMA } from '../../../modules/local/filter_difftable' +include { FILTER_DIFFTABLE as FILTER_DIFFTABLE_DESEQ2 } from '../../../modules/local/filter_difftable' def correct_meta_data = { meta, data, pathway -> def meta_clone = meta.clone() + pathway @@ -73,24 +75,70 @@ workflow DIFFERENTIAL { // Perform differential analysis with DESeq2 // ---------------------------------------------------- - // ToDo: In order to use deseq2 the downstream processes need to be updated to process the output correctly - // if (params.transcript_length_matrix) { ch_transcript_lengths = Channel.of([ exp_meta, file(params.transcript_length_matrix, checkIfExists: true)]).first() } else { ch_transcript_lengths = [[],[]] } - // if (params.control_features) { ch_control_features = Channel.of([ exp_meta, file(params.control_features, checkIfExists: true)]).first() } else { ch_control_features = [[],[]] } - - // ch_samplesheet - // .join(ch_counts) - // .first() - // .combine(ch_tools_single.deseq2) - // .set { ch_counts_deseq2 } - - // DESEQ2_DIFFERENTIAL ( - // ch_contrasts, - // ch_counts_deseq2, - // ch_control_features, - // ch_transcript_lengths - // ) - // ch_results = ch_results - // .mix(DESEQ2_DIFFERENTIAL.out.results) + if (params.transcript_length_matrix) { ch_transcript_lengths = Channel.of([ exp_meta, file(params.transcript_length_matrix, checkIfExists: true)]).first() } else { ch_transcript_lengths = Channel.of([[],[]]) } + if (params.control_features) { ch_control_features = Channel.of([ exp_meta, file(params.control_features, checkIfExists: true)]).first() } else { ch_control_features = Channel.of([[],[]]) } + + ch_counts + .join(ch_samplesheet) + .combine(ch_contrasts) + .combine(ch_transcript_lengths) + .combine(ch_control_features) + .combine(ch_tools_single.deseq2) + .multiMap { + meta_data, counts, samplesheet, meta_contrast, contrast_variable, reference, target, meta_lengths, lengths, meta_control, control, pathway, meta_tools -> + def meta = meta_data.clone() + meta_contrast.clone() + meta_lengths.clone() + meta_control.clone() + meta_tools.clone() + contrast: [ meta, contrast_variable, reference, target ] + samplesheet: [ meta, samplesheet, counts ] + control_features: [ meta, control ] + transcript_lengths: [ meta, lengths ] + pathway: [ meta, pathway ] + } + .set { ch_deseq2 } + + // do we need this process DESEQ2_NORM? + DESEQ2_NORM ( + ch_deseq2.contrast.first(), + ch_deseq2.samplesheet, + ch_deseq2.control_features, + ch_deseq2.transcript_lengths + ) + + DESEQ2_DIFFERENTIAL ( + ch_deseq2.contrast, + ch_deseq2.samplesheet, + ch_deseq2.control_features, + ch_deseq2.transcript_lengths + ) + + ch_norm_deseq2 = DESEQ2_NORM.out.normalised_counts + ch_differential_deseq2 = DESEQ2_DIFFERENTIAL.out.results + ch_model_deseq2 = DESEQ2_DIFFERENTIAL.out.model + + ch_processed_matrices = ch_norm_deseq2 + if ('rlog' in params.deseq2_vs_method){ + ch_processed_matrices = ch_processed_matrices.join(DESEQ2_NORM.out.rlog_counts) + } + if ('vst' in params.deseq2_vs_method){ + ch_processed_matrices = ch_processed_matrices.join(DESEQ2_NORM.out.vst_counts) + } + ch_processed_matrices = ch_processed_matrices + .map{ it.tail() } + + // TODO modify the module to accept these parameters as meta/ext.args in the same way how propd does + ch_logfc_deseq2 = Channel.value([ "log2FoldChange", params.differential_min_fold_change ]) + ch_padj_deseq2 = Channel.value([ "padj", params.differential_max_qval ]) + + FILTER_DIFFTABLE_DESEQ2( + ch_differential_deseq2, + ch_logfc_deseq2, + ch_padj_deseq2 + ) + + ch_results_genewise = DESEQ2_DIFFERENTIAL.out.results + .join(ch_deseq2.pathway).map(correct_meta_data).mix(ch_results_genewise) + + ch_results_genewise_filtered = FILTER_DIFFTABLE_DESEQ2.out.filtered + .join(ch_deseq2.pathway).map(correct_meta_data).mix(ch_results_genewise_filtered) // ---------------------------------------------------- // Perform differential analysis with limma @@ -112,18 +160,19 @@ workflow DIFFERENTIAL { } .set { ch_limma } + // run limma LIMMA_DIFFERENTIAL(ch_limma.input1, ch_limma.input2) // filter results // note that these are column names specific for limma output table // TODO modify the module to accept these parameters as meta/ext.args in the same way how propd does - ch_logfc = Channel.value([ "logFC", params.differential_min_fold_change ]) - ch_padj = Channel.value([ "adj.P.Val", params.differential_max_qval ]) + ch_logfc_limma = Channel.value([ "logFC", params.differential_min_fold_change ]) + ch_padj_limma = Channel.value([ "adj.P.Val", params.differential_max_qval ]) FILTER_DIFFTABLE_LIMMA( LIMMA_DIFFERENTIAL.out.results, - ch_logfc, - ch_padj + ch_logfc_limma, + ch_padj_limma ) // collect results From ba1ea24f3912d7b174fa619bd0c5dc14326bab5a Mon Sep 17 00:00:00 2001 From: Breeshey Roskams-Hieter Date: Wed, 30 Oct 2024 11:23:57 +0000 Subject: [PATCH 148/154] set nsub to lower numebr given nature of test data --- conf/test_experimental.config | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/conf/test_experimental.config b/conf/test_experimental.config index 0fdeff51..027cf86b 100644 --- a/conf/test_experimental.config +++ b/conf/test_experimental.config @@ -29,7 +29,8 @@ params { input = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.samplesheet.csv' matrix = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv' contrasts = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.contrasts.csv' - pathway = "propd,propd_grea,limma,propr,cor" + pathway = "propd,propd_grea,limma,propr,cor,deseq2" + deseq2_vst_nsub = 900 // only 982 features in this dataset, so nsub=1000 not feasible // some pathways are not included in the test, because they don't make sense to test for this dataset // for example propd_fdr don't give significant results on this dataset, and the permutation will be scaped From a2ddd8a111dcd46a850bb345b194016057fd5702 Mon Sep 17 00:00:00 2001 From: Breeshey Roskams-Hieter Date: Wed, 30 Oct 2024 11:34:53 +0000 Subject: [PATCH 149/154] fix linting --- subworkflows/local/differential/main.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/subworkflows/local/differential/main.nf b/subworkflows/local/differential/main.nf index 4c913761..c06d1d0a 100644 --- a/subworkflows/local/differential/main.nf +++ b/subworkflows/local/differential/main.nf @@ -94,7 +94,7 @@ workflow DIFFERENTIAL { pathway: [ meta, pathway ] } .set { ch_deseq2 } - + // do we need this process DESEQ2_NORM? DESEQ2_NORM ( ch_deseq2.contrast.first(), @@ -102,7 +102,7 @@ workflow DIFFERENTIAL { ch_deseq2.control_features, ch_deseq2.transcript_lengths ) - + DESEQ2_DIFFERENTIAL ( ch_deseq2.contrast, ch_deseq2.samplesheet, @@ -133,7 +133,7 @@ workflow DIFFERENTIAL { ch_logfc_deseq2, ch_padj_deseq2 ) - + ch_results_genewise = DESEQ2_DIFFERENTIAL.out.results .join(ch_deseq2.pathway).map(correct_meta_data).mix(ch_results_genewise) From a282a4755be195ac986fc32b712ba19a584cbc67 Mon Sep 17 00:00:00 2001 From: Breeshey Roskams-Hieter <42788995+roskamsh@users.noreply.github.com> Date: Wed, 30 Oct 2024 14:21:45 +0000 Subject: [PATCH 150/154] update channel name to samples_and_matrix Co-authored-by: WackerO <43847497+WackerO@users.noreply.github.com> --- subworkflows/local/differential/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/differential/main.nf b/subworkflows/local/differential/main.nf index c06d1d0a..18d019ee 100644 --- a/subworkflows/local/differential/main.nf +++ b/subworkflows/local/differential/main.nf @@ -88,7 +88,7 @@ workflow DIFFERENTIAL { meta_data, counts, samplesheet, meta_contrast, contrast_variable, reference, target, meta_lengths, lengths, meta_control, control, pathway, meta_tools -> def meta = meta_data.clone() + meta_contrast.clone() + meta_lengths.clone() + meta_control.clone() + meta_tools.clone() contrast: [ meta, contrast_variable, reference, target ] - samplesheet: [ meta, samplesheet, counts ] + samples_and_matrix: [ meta, samplesheet, counts ] control_features: [ meta, control ] transcript_lengths: [ meta, lengths ] pathway: [ meta, pathway ] From 0e4a84d2a64ae4cee81e642da32d461b55b1cc2c Mon Sep 17 00:00:00 2001 From: Breeshey Roskams-Hieter <42788995+roskamsh@users.noreply.github.com> Date: Wed, 30 Oct 2024 14:22:03 +0000 Subject: [PATCH 151/154] update channel name to samples_and_matrix Co-authored-by: WackerO <43847497+WackerO@users.noreply.github.com> --- subworkflows/local/differential/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/differential/main.nf b/subworkflows/local/differential/main.nf index 18d019ee..84a58592 100644 --- a/subworkflows/local/differential/main.nf +++ b/subworkflows/local/differential/main.nf @@ -98,7 +98,7 @@ workflow DIFFERENTIAL { // do we need this process DESEQ2_NORM? DESEQ2_NORM ( ch_deseq2.contrast.first(), - ch_deseq2.samplesheet, + ch_deseq2.samples_and_matrix, ch_deseq2.control_features, ch_deseq2.transcript_lengths ) From a88511687cb348034b4a881abc951170ad3b1e16 Mon Sep 17 00:00:00 2001 From: Breeshey Roskams-Hieter <42788995+roskamsh@users.noreply.github.com> Date: Wed, 30 Oct 2024 14:22:13 +0000 Subject: [PATCH 152/154] update channel name to samples_and_matrix Co-authored-by: WackerO <43847497+WackerO@users.noreply.github.com> --- subworkflows/local/differential/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/differential/main.nf b/subworkflows/local/differential/main.nf index 84a58592..862a200d 100644 --- a/subworkflows/local/differential/main.nf +++ b/subworkflows/local/differential/main.nf @@ -105,7 +105,7 @@ workflow DIFFERENTIAL { DESEQ2_DIFFERENTIAL ( ch_deseq2.contrast, - ch_deseq2.samplesheet, + ch_deseq2.samples_and_matrix, ch_deseq2.control_features, ch_deseq2.transcript_lengths ) From 1cba7e68500e3be42d5350ed59e39ba7087960ef Mon Sep 17 00:00:00 2001 From: Suzanne Jin Date: Mon, 4 Nov 2024 17:59:17 +0100 Subject: [PATCH 153/154] fix the channels properly with the new preprocess/postprocess scheme for input/output channels --- assets/tools_samplesheet.csv | 10 +-- conf/test_experimental.config | 8 +- subworkflows/local/differential/main.nf | 100 +++++++++++++----------- subworkflows/local/enrichment/main.nf | 45 ++++++----- subworkflows/local/experimental/main.nf | 96 ++++++++++++++++++----- 5 files changed, 167 insertions(+), 92 deletions(-) diff --git a/assets/tools_samplesheet.csv b/assets/tools_samplesheet.csv index 94592a22..ad8dfab4 100644 --- a/assets/tools_samplesheet.csv +++ b/assets/tools_samplesheet.csv @@ -1,13 +1,13 @@ pathway_name,diff_method,args_diff,cor_method,args_cor,enr_method,args_enr -propd,propd,,,,, -propd_fdr,propd,--permutation 100,,,, -propd_grea,propd,,,,grea, -propd_ora,propd,,,,gprofiler2, +deseq2,deseq2,,,,, deseq2_gsea,deseq2,,,,gsea, deseq2_ora,deseq2,,,,gprofiler2, limma,limma,,,,, limma_ora,limma,,,,gprofiler2, +propd,propd,,,,, +propd_fdr,propd,--permutation 100,,,, +propd_grea,propd,,,,grea, +propd_ora,propd,,,,gprofiler2, pcorbshrink,,,propr,--metric pcor.bshrink,, propr,,,propr,--metric rho,, cor,,,propr,--metric cor,, -deseq2,deseq2,,,,, diff --git a/conf/test_experimental.config b/conf/test_experimental.config index e1ad60d7..d18e2627 100644 --- a/conf/test_experimental.config +++ b/conf/test_experimental.config @@ -29,8 +29,9 @@ params { input = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.samplesheet.csv' matrix = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv' contrasts = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/mus_musculus/rnaseq_expression/SRP254919.contrasts.csv' - deseq2_vst_nsub = 900 // only 982 features in this dataset, so nsub=1000 not feasible - pathway = "propd,propd_grea,limma,propr,cor,propd_ora,limma_ora,deseq2_ora,deseq2" + + // tool combinations to test + pathway = "deseq2,deseq2_ora,limma,limma_ora,propd,propd_grea,propd_ora,propr,cor" // some pathways are not included in the test, because they don't make sense to test for this dataset // for example propd_fdr don't give significant results on this dataset, and the permutation will be scaped @@ -48,4 +49,7 @@ params { // Exploratory exploratory_main_variable = 'contrasts' + + // deseq2 specific + deseq2_vst_nsub = 900 // only 982 features in this dataset, so nsub=1000 not feasible } diff --git a/subworkflows/local/differential/main.nf b/subworkflows/local/differential/main.nf index 4271787d..680e0c91 100644 --- a/subworkflows/local/differential/main.nf +++ b/subworkflows/local/differential/main.nf @@ -2,11 +2,11 @@ // Perform differential analysis // include { PROPR_PROPD as PROPD } from "../../../modules/local/propr/propd/main.nf" -include { DESEQ2_DIFFERENTIAL } from '../../../modules/nf-core/deseq2/differential/main' include { DESEQ2_DIFFERENTIAL as DESEQ2_NORM } from "../../../modules/nf-core/deseq2/differential/main" +include { DESEQ2_DIFFERENTIAL } from '../../../modules/nf-core/deseq2/differential/main' include { LIMMA_DIFFERENTIAL } from '../../../modules/nf-core/limma/differential/main' -include { FILTER_DIFFTABLE as FILTER_DIFFTABLE_LIMMA } from '../../../modules/local/filter_difftable' include { FILTER_DIFFTABLE as FILTER_DIFFTABLE_DESEQ2 } from '../../../modules/local/filter_difftable' +include { FILTER_DIFFTABLE as FILTER_DIFFTABLE_LIMMA } from '../../../modules/local/filter_difftable' workflow DIFFERENTIAL { take: @@ -17,13 +17,18 @@ workflow DIFFERENTIAL { main: // initialize empty results channels - ch_results_pairwise = Channel.empty() - ch_results_pairwise_filtered = Channel.empty() + // NOTE that ch_results pairwise and adjacency are a special case of results, which stores pairwise DE results (see propd) + // whereas ch_results stores gene-wise DE results (traditional methods like deseq2 and limma only provide gene-wise results) + ch_results_genewise = Channel.empty() ch_results_genewise_filtered = Channel.empty() + ch_results_pairwise = Channel.empty() + ch_results_pairwise_filtered = Channel.empty() ch_adjacency = Channel.empty() + ch_norm = Channel.empty() // channel to store the normalized data + ch_norm_for_plotting = Channel.empty() // channel to store the normalized data for plotting - // branch tools to select the correct differential analysis method + // branch the data channel to the correct differential analysis method, based on the method key specified in the meta data ch_counts .branch { propd: it[0]["method"] == "propd" @@ -33,7 +38,7 @@ workflow DIFFERENTIAL { .set { ch_counts } // ---------------------------------------------------- - // Perform differential analysis with propd + // Perform differential analysis with PROPD // ---------------------------------------------------- // TODO propd currently don't support blocking, so we should not run propd with same contrast_variable, reference and target, @@ -48,40 +53,45 @@ workflow DIFFERENTIAL { def meta = meta_data.clone() + ['contrast': meta_contrast.id] return [ meta, counts, samplesheet, contrast_variable, reference, target ] } + .unique() .set { ch_propd } - PROPD(ch_propd.unique()) - ch_results_pairwise = PROPD.out.results.mix(ch_results_pairwise) - ch_results_pairwise_filtered = PROPD.out.results_filtered.mix(ch_results_pairwise_filtered) + PROPD(ch_propd) + ch_results_genewise = PROPD.out.connectivity.mix(ch_results_genewise) ch_results_genewise_filtered = PROPD.out.hub_genes.mix(ch_results_genewise_filtered) + ch_results_pairwise = PROPD.out.results.mix(ch_results_pairwise) + ch_results_pairwise_filtered = PROPD.out.results_filtered.mix(ch_results_pairwise_filtered) ch_adjacency = PROPD.out.adjacency.mix(ch_adjacency) // ---------------------------------------------------- - // Perform differential analysis with DESeq2 + // Perform differential analysis with DESEQ2 // ---------------------------------------------------- + // parse input channels for deseq2 modules + if (params.transcript_length_matrix) { ch_transcript_lengths = Channel.of([ exp_meta, file(params.transcript_length_matrix, checkIfExists: true)]).first() } else { ch_transcript_lengths = Channel.of([[],[]]) } if (params.control_features) { ch_control_features = Channel.of([ exp_meta, file(params.control_features, checkIfExists: true)]).first() } else { ch_control_features = Channel.of([[],[]]) } - - ch_counts - .join(ch_samplesheet) + ch_counts.deseq2 + .combine(ch_samplesheet) .combine(ch_contrasts) .combine(ch_transcript_lengths) .combine(ch_control_features) - .combine(ch_tools_single.deseq2) + .unique() .multiMap { - meta_data, counts, samplesheet, meta_contrast, contrast_variable, reference, target, meta_lengths, lengths, meta_control, control, pathway, meta_tools -> - def meta = meta_data.clone() + meta_contrast.clone() + meta_lengths.clone() + meta_control.clone() + meta_tools.clone() + meta_counts, counts, meta_samplesheet, samplesheet, meta_contrast, contrast_variable, reference, target, meta_lengths, lengths, meta_control, control -> + def meta = meta_counts.clone() + ['contrast': meta_contrast.id] contrast: [ meta, contrast_variable, reference, target ] samples_and_matrix: [ meta, samplesheet, counts ] control_features: [ meta, control ] transcript_lengths: [ meta, lengths ] - pathway: [ meta, pathway ] } .set { ch_deseq2 } - // do we need this process DESEQ2_NORM? + // normalize the data using deseq2 + // NOTE that for the moment the output of this module is only needed for plot_exploratory, + // and as input for GSEA (for the moment GSEA cannot take the preranked DE results from DESEQ2_DIFFERENTIAL) + DESEQ2_NORM ( ch_deseq2.contrast.first(), ch_deseq2.samples_and_matrix, @@ -89,6 +99,15 @@ workflow DIFFERENTIAL { ch_deseq2.transcript_lengths ) + ch_norm = DESEQ2_NORM.out.normalised_counts.mix(ch_norm) + ch_norm_for_plotting = DESEQ2_NORM.out.normalised_counts + .join(DESEQ2_NORM.out.rlog_counts) + .join(DESEQ2_NORM.out.vst_counts) // CHECK if this is correct, otherwise add only if these outputs are present + .map{ it.tail() } + .mix(ch_norm_for_plotting) + + // run DE analysis using deseq2 + DESEQ2_DIFFERENTIAL ( ch_deseq2.contrast, ch_deseq2.samples_and_matrix, @@ -96,78 +115,69 @@ workflow DIFFERENTIAL { ch_deseq2.transcript_lengths ) - ch_norm_deseq2 = DESEQ2_NORM.out.normalised_counts - ch_differential_deseq2 = DESEQ2_DIFFERENTIAL.out.results - ch_model_deseq2 = DESEQ2_DIFFERENTIAL.out.model + ch_results_genewise = DESEQ2_DIFFERENTIAL.out.results.mix(ch_results_genewise) - ch_processed_matrices = ch_norm_deseq2 - if ('rlog' in params.deseq2_vs_method){ - ch_processed_matrices = ch_processed_matrices.join(DESEQ2_NORM.out.rlog_counts) - } - if ('vst' in params.deseq2_vs_method){ - ch_processed_matrices = ch_processed_matrices.join(DESEQ2_NORM.out.vst_counts) - } - ch_processed_matrices = ch_processed_matrices - .map{ it.tail() } + // filter results // TODO modify the module to accept these parameters as meta/ext.args in the same way how propd does ch_logfc_deseq2 = Channel.value([ "log2FoldChange", params.differential_min_fold_change ]) ch_padj_deseq2 = Channel.value([ "padj", params.differential_max_qval ]) FILTER_DIFFTABLE_DESEQ2( - ch_differential_deseq2, + DESEQ2_DIFFERENTIAL.out.results, ch_logfc_deseq2, ch_padj_deseq2 ) - ch_results_genewise = DESEQ2_DIFFERENTIAL.out.results - .join(ch_deseq2.pathway).map(correct_meta_data).mix(ch_results_genewise) - - ch_results_genewise_filtered = FILTER_DIFFTABLE_DESEQ2.out.filtered - .join(ch_deseq2.pathway).map(correct_meta_data).mix(ch_results_genewise_filtered) + ch_results_genewise_filtered = FILTER_DIFFTABLE_DESEQ2.out.filtered.mix(ch_results_genewise_filtered) // ---------------------------------------------------- // Perform differential analysis with limma // ---------------------------------------------------- - // combine the input channels with the tools information - // in this way, limma will only be run if the user have specified it, as informed by ch_tools + // parse input channels for limma + // TODO provide the normalized data to limma + ch_counts.limma .combine(ch_samplesheet) .filter{ meta_counts, counts, meta_samplesheet, samplesheet -> meta_counts.subMap(meta_samplesheet.keySet()) == meta_samplesheet } .combine(ch_contrasts) .unique() .multiMap { - meta_data, counts, meta_samplesheet, samplesheet, meta_contrast, contrast_variable, reference, target -> - def meta = meta_data.clone() + meta_contrast.clone() + meta_counts, counts, meta_samplesheet, samplesheet, meta_contrast, contrast_variable, reference, target -> + def meta = meta_counts.clone() + meta_contrast.clone() input1: [ meta, contrast_variable, reference, target ] input2: [ meta, samplesheet, counts ] } .set { ch_limma } - // run limma + LIMMA_DIFFERENTIAL(ch_limma.input1, ch_limma.input2) + ch_results_genewise = LIMMA_DIFFERENTIAL.out.results.mix(ch_results_genewise) + // filter results + // note that these are column names specific for limma output table // TODO modify the module to accept these parameters as meta/ext.args in the same way how propd does ch_logfc_limma = Channel.value([ "logFC", params.differential_min_fold_change ]) ch_padj_limma = Channel.value([ "adj.P.Val", params.differential_max_qval ]) + FILTER_DIFFTABLE_LIMMA( LIMMA_DIFFERENTIAL.out.results, ch_logfc_limma, ch_padj_limma ) - // collect results - ch_results_genewise = LIMMA_DIFFERENTIAL.out.results.mix(ch_results_genewise) ch_results_genewise_filtered = FILTER_DIFFTABLE_LIMMA.out.filtered.mix(ch_results_genewise_filtered) emit: - results_pairwise = ch_results_pairwise - results_pairwise_filtered = ch_results_pairwise_filtered results_genewise = ch_results_genewise results_genewise_filtered = ch_results_genewise_filtered + results_pairwise = ch_results_pairwise + results_pairwise_filtered = ch_results_pairwise_filtered adjacency = ch_adjacency + ch_norm = ch_norm + ch_norm_for_plotting = ch_norm_for_plotting } diff --git a/subworkflows/local/enrichment/main.nf b/subworkflows/local/enrichment/main.nf index 50736a62..7508cef3 100644 --- a/subworkflows/local/enrichment/main.nf +++ b/subworkflows/local/enrichment/main.nf @@ -17,13 +17,6 @@ workflow ENRICHMENT { // initialize empty results channels ch_enriched = Channel.empty() - ch_gmt = Channel.empty() - - ch_adjacency - .branch { - grea: it[0]["method"] == "grea" - } - .set { ch_adjacency } // ---------------------------------------------------- // Construct gene set database @@ -38,7 +31,12 @@ workflow ENRICHMENT { // Perform enrichment analysis with GREA // ---------------------------------------------------- - GREA(ch_adjacency.grea.unique(), ch_gmt.collect()) + ch_adjacency + .filter { it[0]["method"] == "grea" } + .unique() + .set { ch_adjacency_to_grea } + + GREA(ch_adjacency_to_grea, ch_gmt.collect()) ch_enriched = ch_enriched.mix(GREA.out.results) // ---------------------------------------------------- @@ -51,30 +49,37 @@ workflow ENRICHMENT { // Perform enrichment analysis with gprofiler2 // ---------------------------------------------------- - // todo: add gprofiler2 here + // parse input channels + // TODO we need to find a way to combine these information with also args coming from toolsheet and modules.config - // Define background file - if (!params.gprofiler2_background_file) { - // If deactivated, use empty list as "background" + if (!params.gprofiler2_background_file) { // If deactivated, use empty list as "background" ch_background = [] - } else if (params.gprofiler2_background_file == "auto") { - // If auto, use input matrix as background + } else if (params.gprofiler2_background_file == "auto") { // If auto, use input matrix as background ch_background = ch_counts.map { meta, counts -> counts } } else { ch_background = Channel.from(file(params.gprofiler2_background_file, checkIfExists: true)) } - // rearrange channel for GPROFILER2_GOST process ch_gmt = ch_gmt.map { meta, gmt -> gmt } ch_results_genewise_filtered - .branch { - grea: it[0]["method"] == "gprofiler2" - } - .set { ch_results_genewise_filtered } + .filter { it[0]["method"] == "gprofiler2" } + .unique() + .set { ch_for_gprofiler2 } + + // run gprofiler2 + + GPROFILER2_GOST( + ch_for_gprofiler2, + ch_gmt, + ch_background + ) + + // collect results - GPROFILER2_GOST(ch_results_genewise_filtered, ch_gmt, ch_background) + ch_enriched = ch_enriched.mix(GPROFILER2_GOST.out.all_enrich) + // TODO also collect the files for report purposes emit: enriched = ch_enriched } diff --git a/subworkflows/local/experimental/main.nf b/subworkflows/local/experimental/main.nf index ce83ccf5..dd7563c6 100644 --- a/subworkflows/local/experimental/main.nf +++ b/subworkflows/local/experimental/main.nf @@ -1,15 +1,31 @@ -// -// Run experimental analysis -// +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + IMPORT LOCAL MODULES/SUBWORKFLOWS +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + include { DIFFERENTIAL } from '../differential/main.nf' include { CORRELATION } from '../correlation/main.nf' include { ENRICHMENT } from '../enrichment/main.nf' -def preprocess_subworkflow_output( ch_input, ch_tools_args, method_field_name) { - // add method arguments to channel meta +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + DEFINE AUXILIARY FUNCTIONS +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +// function used to preprocess the input of a subworkflow +// Basically, given ch_input and ch_tools_args, +// it updates the meta data of ch_input with the required method value and args + +def preprocess_subworkflow_input( ch_input, ch_tools_args, method_field_name) { return ch_input .combine(ch_tools_args) + // filter the tools_args to match the pathway_name + // if no pathway_name is provided, then it will match all + // NOTE that no pathway_name is provided when ch_tools only have one element. By doing this, it avoids the recomputation of processes that use the same tool/args but belong to different pathways .filter{ meta, input, pathway, arg_maps -> meta["pathway_name"] ? meta["pathway_name"] == pathway["pathway_name"] : true } + // update meta with method value and args .map{ meta, input, pathway, arg_map -> def meta_clone = meta.clone() + pathway + arg_map.clone() meta_clone["method"] = meta_clone.remove(method_field_name) @@ -17,8 +33,11 @@ def preprocess_subworkflow_output( ch_input, ch_tools_args, method_field_name) { } } +// function used to postprocess the output of a subworkflow +// Basically, given ch_results and field_name, +// it removes the field_name from the meta data + def postprocess_subworkflow_output( ch_results, field_name ) { - // clean up meta data by removing tool arguments return ch_results .map{ meta, data -> def meta_clone = meta.clone() @@ -27,6 +46,12 @@ def postprocess_subworkflow_output( ch_results, field_name ) { } } +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + RUN WORKFLOW +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + workflow EXPERIMENTAL { take: ch_contrasts // [ meta, contrast_variable, reference, target ] @@ -36,7 +61,10 @@ workflow EXPERIMENTAL { main: - // split toolsheet into channels + // split toolsheet into channels: diff, corr, enr + // NOTE that when only one tools pathway is provided, the pathway_name is not needed, and hence removed + // by doing so, it avoids the recomputation of processes that use the same tool/args but belong to different pathways + ch_tools.count() .combine(ch_tools) .multiMap{ @@ -49,63 +77,91 @@ workflow EXPERIMENTAL { .set{ ch_tools } // initialize empty results channels - ch_results_pairwise = Channel.empty() // differential results for pairwise analysis - it should be a table - ch_results_pairwise_filtered = Channel.empty() // differential results for pairwise analysis - filtered - it should be a table + ch_results_genewise = Channel.empty() // differential results for genewise analysis - it should be a table ch_results_genewise_filtered = Channel.empty() // differential results for genewise analysis - filtered - it should be a table + ch_results_pairwise = Channel.empty() // differential results for pairwise analysis - it should be a table + ch_results_pairwise_filtered = Channel.empty() // differential results for pairwise analysis - filtered - it should be a table ch_adjacency = Channel.empty() // adjacency matrix showing the connections between the genes, with values 1|0 - ch_matrix = Channel.empty() // correlation matrix + ch_correlation = Channel.empty() // correlation matrix ch_enriched = Channel.empty() // output table from enrichment analysis // ---------------------------------------------------- // DIFFERENTIAL ANALYSIS BLOCK // ---------------------------------------------------- - preprocess_subworkflow_output(ch_counts, ch_tools.diff, "diff_method") + // preprocess the input of the subworkflow, by adding 'method' and 'args_diff' + // NOTE that here we only preprocess ch_counts, to use it as the carrier of the method information + // since the rest of data channels would be combined with the ch_counts correspondingly, we don't need to preprocess them all + // This MUST be changed, if this is not the case (eg. if one wants to use a specific ch_contrasts element for a specific method, etc) + + preprocess_subworkflow_input(ch_counts, ch_tools.diff, "diff_method") .set{ ch_counts_diff } + + // run differential subworkflow + DIFFERENTIAL( ch_counts_diff, ch_samplesheet, ch_contrasts ) - ch_results_pairwise = postprocess_subworkflow_output(DIFFERENTIAL.out.results_pairwise,["method", "args_diff"]).mix(ch_results_pairwise) - ch_results_pairwise_filtered = postprocess_subworkflow_output(DIFFERENTIAL.out.results_pairwise_filtered,["method", "args_diff"]).mix(ch_results_pairwise_filtered) + + // collect and postprocess the output of the subworkflow, by removing 'method' and 'args_diff' + ch_results_genewise = postprocess_subworkflow_output(DIFFERENTIAL.out.results_genewise,["method", "args_diff"]).mix(ch_results_genewise) ch_results_genewise_filtered = postprocess_subworkflow_output(DIFFERENTIAL.out.results_genewise_filtered,["method", "args_diff"]).mix(ch_results_genewise_filtered) + ch_results_pairwise = postprocess_subworkflow_output(DIFFERENTIAL.out.results_pairwise,["method", "args_diff"]).mix(ch_results_pairwise) + ch_results_pairwise_filtered = postprocess_subworkflow_output(DIFFERENTIAL.out.results_pairwise_filtered,["method", "args_diff"]).mix(ch_results_pairwise_filtered) ch_adjacency = postprocess_subworkflow_output(DIFFERENTIAL.out.adjacency,["method", "args_diff"]).mix(ch_adjacency) // ---------------------------------------------------- // CORRELATION ANALYSIS BLOCK // ---------------------------------------------------- - preprocess_subworkflow_output(ch_counts, ch_tools.corr, "cor_method") + // preprocess the input of the subworkflow, by adding 'method' and 'args_cor' + + preprocess_subworkflow_input(ch_counts, ch_tools.corr, "cor_method") .set{ ch_counts_corr } + // run correlation subworkflow + CORRELATION( ch_counts_corr ) - ch_matrix = postprocess_subworkflow_output(CORRELATION.out.matrix,["method", "args_cor"]).mix(ch_matrix) - ch_adjacency = postprocess_subworkflow_output(CORRELATION.out.adjacency,["method", "args_cor"]).mix(ch_adjacency) + + // collect and postprocess the output of the subworkflow, by removing 'method' and 'args_cor' + + ch_correlation = postprocess_subworkflow_output(CORRELATION.out.matrix,["method", "args_cor"]).mix(ch_correlation) + ch_adjacency = postprocess_subworkflow_output(CORRELATION.out.adjacency,["method", "args_cor"]).mix(ch_adjacency) // ---------------------------------------------------- // FUNCTIONAL ENRICHMENT BLOCK // ---------------------------------------------------- - preprocess_subworkflow_output(ch_counts, ch_tools.enr, "enr_method") + // preprocess the input of the subworkflow, by adding 'method' and 'args_enr' + // this is done by matching the 'pathway_name' in ch_tools + + preprocess_subworkflow_input(ch_counts, ch_tools.enr, "enr_method") .set{ ch_counts_enr } - preprocess_subworkflow_output(ch_results_genewise, ch_tools.enr, "enr_method") + preprocess_subworkflow_input(ch_results_genewise, ch_tools.enr, "enr_method") .set{ ch_results_genewise_enr } - preprocess_subworkflow_output(ch_results_genewise_filtered, ch_tools.enr, "enr_method") + preprocess_subworkflow_input(ch_results_genewise_filtered, ch_tools.enr, "enr_method") .set{ ch_results_genewise_filtered_enr } - preprocess_subworkflow_output(ch_adjacency, ch_tools.enr, "enr_method") + preprocess_subworkflow_input(ch_adjacency, ch_tools.enr, "enr_method") .set{ ch_adjacency_enr } + // run enrichment subworkflow + // TODO don't run if no enrichment analysis is needed + ENRICHMENT( ch_counts_enr, ch_results_genewise_enr, ch_results_genewise_filtered_enr, ch_adjacency_enr ) + + // collect the output of the subworkflow + ch_enriched = ch_enriched.mix(ENRICHMENT.out.enriched) // ---------------------------------------------------- From 2a1d9b2652f9e3bb557a4615641165cf6945e7af Mon Sep 17 00:00:00 2001 From: Suzanne Jin Date: Mon, 4 Nov 2024 18:14:12 +0100 Subject: [PATCH 154/154] modify preprocess_subworkflow_input to filter the elements where method == [] --- subworkflows/local/experimental/main.nf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/subworkflows/local/experimental/main.nf b/subworkflows/local/experimental/main.nf index dd7563c6..143a8305 100644 --- a/subworkflows/local/experimental/main.nf +++ b/subworkflows/local/experimental/main.nf @@ -31,6 +31,7 @@ def preprocess_subworkflow_input( ch_input, ch_tools_args, method_field_name) { meta_clone["method"] = meta_clone.remove(method_field_name) return [meta_clone, input] } + .filter{ meta, input -> meta["method"] != []} } // function used to postprocess the output of a subworkflow @@ -65,6 +66,7 @@ workflow EXPERIMENTAL { // NOTE that when only one tools pathway is provided, the pathway_name is not needed, and hence removed // by doing so, it avoids the recomputation of processes that use the same tool/args but belong to different pathways + ch_tools.view() ch_tools.count() .combine(ch_tools) .multiMap{ @@ -151,7 +153,6 @@ workflow EXPERIMENTAL { .set{ ch_adjacency_enr } // run enrichment subworkflow - // TODO don't run if no enrichment analysis is needed ENRICHMENT( ch_counts_enr,